2009-08-04 59 views
1

我想知道是否有人可以讓我開始如何使用openGL構建迷宮。我是否需要編寫代碼來繪製迷宮,還是像在單獨的窗口中繪製圖片一樣?我是否需要創建一個遊戲引擎以此開始?我正在爲iPhone開發這樣做,所以任何建議對我來說都是一個很好的開始。感謝大家的回覆。如何使用openGL爲iPhone開發繪製迷宮?

+0

如果您的問題是關於iphone開發的,請在問題的主體中編輯並說明;這有很大的不同。 – Ricket 2009-08-05 18:04:04

回答

1

使用地圖編輯器。開始使用類似QuArK的內容。

也檢查出Game Level Builder。這可能不僅僅是你要找的東西,但我想我會在這裏引用它。

2

生成迷宮的代碼應該獨立於繪圖。您可以嘗試先在控制檯中生成視覺效果,然後再使用OpenGL。

這是您可以在控制檯中使用的佈局類型,其中S == Start et E == End。

+=+=+=+ 
|S| | 
+ + + + 
| |E| 
+-+-+-+ 

底層結構可能是結構的二維陣列,告訴在那裏你可以從一個特定的位置在迷宮中移動:

struct { 
    bool Left; 
    bool Right; 
    bool Up; 
    bool Down; 
} 

立即生成迷宮,我敢肯定有很多方法可以做到這一點。一個簡單的解決方案:用牆壁初始化迷宮(每個布爾值爲false),然後在S和E之間建立一條可行走的路徑。然後在不影響路徑的情況下隨機設置布爾值。

玩得開心:)

0

你可能甚至不需要使用OpenGL來做到這一點。約翰布萊克本有一個post,他展示瞭如何僅使用核心動畫製作迷宮般的結構。如果這種解決方案的性能足以滿足您的需求,則可以節省大量代碼。

0

我已經完成了這項工作,而且我建議您要做的是以前所說的組合。

1)寫一個能夠真正創建迷宮的算法,這裏有幾個選項,一些非常簡單的(IMHO),是Kruskal和Primm。你應該看看Here

2)如果你打算做一些精靈的工作,或者事實上移動的遊戲,我會推薦使用預製的遊戲引擎,只是爲了保存一些工作給你。如果你想深入研究遊戲引擎技術,你可以稍後再做。一個優秀的OpenSource 2D遊戲引擎就是我所推薦的。

祝你好運,迷宮世代是我在幾年前進入C++(然後從它:P)的方式。

5

一個非常簡單的方法,這將讓你類似德軍總部3D的一些結果(但與OpenGL的善良是容易:-P)是擁有世界等製成的二維網格:

+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 

每個單元格應該包含有關單元格的信息,例如單元格是空的還是實體的,如果它是堅實的,它具有什麼樣的材料,或者它是否是空的,地板和天花板有什麼材料。如果它是空的,您還可以添加其他信息,如光照投射,對某個實體的引用(用於添加遊戲模型或其他東西),邏輯標誌(例如「退出」或「開始」或「危險」的標誌)等一種簡單的結構將是這樣(在C):

#define SOLID 0x0001 
#define START 0x0002 
#define EXIT 0x0004 
#define HAZARD 0x0008 

struct _cell_t 
{ 
    unsigned int flags; 
    GLuint texture; 
    entity_t* entity; 
} cell_t; 

在上述結構中,flags是細胞的標誌。如果設置了SOLID標誌,則單元格爲固定(牆壁),如果設置了標誌START,則單元格爲玩家的起始位置,如果設置了EXIT標誌,則單元格爲迷宮的退出位置,最後如果設置HAZARD這個單元對玩家造成傷害。當然,你可以在那裏添加更多的標誌(例如LIGHT標誌可以投射光線,SECRET標誌將標誌着該單元標誌爲祕密區域的一部分,等等),但你明白了:-)。

texture字段是OpenGL ES紋理名稱(由glGenTextures生成並填充了glTexImage2D)。這是用於渲染迷宮(這裏我只使用一個紋理爲了簡單起見,但如果你想顯示更有趣的世界,你應該爲實體單元指定四個紋理,爲空單元指定兩個紋理 - 四個紋理將是每個邊的紋理的細胞/牆壁,兩種紋理將是細胞的地板和天花板)。

entity字段只是對實體的引用,如果你想添加實體。靜態實體(如花瓶,燈,桌子等)通常由網格和材料製成。如果你想添加當然的動態實體(比如怪物,拾取物品等),你需要添加動畫信息到實體結構中,並將「動態」實體列表與單元格分開,因爲它們會移動因此不會「屬於」一個單元格(爲了優化的原因,您可能希望在每個單元格中分配一個「臨時」實體,但優化是之後之後您有引擎/遊戲運行)。

現在渲染迷宮,渲染所有單元格(稍後您可能需要進行一些洪水填充或光線投影測試,以僅渲染可見內容,但現在不用擔心)。對於每個單元格,檢查單元格的標誌是否包含SOLID標誌,如果是,則渲染組成單元格的四個四邊形(想象一下沒有頂部和底部的立方體)。如果單元格沒有SOLID標記,則渲染單元格的地板和天花板的兩個四邊形(想象同一個立方體,但現在只有,頂部和底部只有)。如果您要渲染的單元格的字段不爲空,那麼也會渲染該實體。

如果你這樣做,你會有一個迷宮:-)。一些優化技巧:

  • 你很快就會意識到你正在渲染許多不會被看到的四邊形。如果這對速度有影響(並且在您嘗試渲染可見單元格之後),則可能需要擴展包含單元格牆壁實際存在的標誌的結構。例如,將這三個單元格想象成一排:ABC。單元格AC有三個牆壁(左上,下,A,右上,下,B),單元格B有兩個牆(上和下)。爲了將牆標記爲存在或不存在,對於每個細胞檢查周圍的細胞。
    • 如果一個單元格上面有一個SOLID單元格,則其「上」牆不存在。對於它的左側單元格,右側單元格和單元格也是如此。
    • 如果一個單元格位於地圖的邊緣,則總是會丟失一個牆。如果它在一個角落,兩堵牆總是會丟失。
    • 在初始化遊戲時進行此計算,而不是在渲染時進行!
    • 做了這些測試之後你已經知道哪些細胞是可見的。在開始編寫代碼之前,先備份(希望你會使用一些像Subversion這樣的版本控制系統,但即使不只是將代碼複製到某個地方)和比較這兩個版本的結果。它可能實際上更快 - 特別是在iPhone 3GS上 - 不要移除空的牆壁,而是使用VBO爲所有牆壁使用相同的網格。
  • 如果添加了動態的實體,具有「臨時實體」我上面提到的,你其實可以自動丟棄不可見的動態實體,一旦你必須弄清楚哪些細胞是可見的,這不是一個方法:如果單元不可見,其關聯的動態實體也將不可見(但要注意:實體可以觸摸多個單元格)。
  • 一個非常簡單但非常粗略的方法不呈現所有細胞中,是隻使細胞攝像機周圍,例如:

+-+-+-+-+-+-+-+ 
| |X|X|X| | | | 
+-+-+-+-+-+-+-+ 
| |X|C|X| | | | 
+-+-+-+-+-+-+-+ 
| |X|X|X| | | | 
+-+-+-+-+-+-+-+ 
| | | | | | | | 
+-+-+-+-+-+-+-+ 

(這裏C是相機和X相機細胞周圍的細胞 - 當然我只用這只是一次電池除了攝像頭用於說明目的細胞,但你應該使用超過那就像 - 例如16個單元一樣,只要確保你的地圖永遠不會有空白區域,可以看到超過16個單元或任何你決定的區域)

當然投射射線可能會產生更好的結果:-)。

那麼,我認爲這是足夠的信息給你一個出發點:-)。當然,您也可以使用Stackoverflow來解決其他任何問題:-P