2009-10-26 136 views
0

我正在使用Pygame在Python中進行冒險遊戲。我的主要問題是我如何定義房間的邊界,讓主角走路時不會碰到邊界。可悲的是,我從來沒有研究算法,所以我不知道如何計算路徑。我知道這個問題相當普遍,很難回答,但正確方向的一點非常值得讚賞。謝謝!冒險遊戲 - 在房間內走動

+0

你是否在控制自己的主角?或者它是一種自動移動的AI? –

回答

3

我建議您閱讀A*搜索算法,因爲它是遊戲中常用的路徑問題。

如果這個遊戲是二維(或2.5),我建議你使用瓷磚系統作爲檢查碰撞會更容易。網上有大量的信息可以讓你開始使用這些。

+0

非常感謝。我目前正在尋找這個http://www.pygame.org/project-astar-195-.html – kallepersson

3

不幸的是,我從來沒有研究算法,所以我不知道如何計算路徑。

在你開始編寫遊戲之前,你應該對自己進行教育。這需要在開始時花費更多的精力,但會爲您節省很多時間。

+0

謝謝!我目前正在研究A *算法。 – kallepersson

1

我對pygame並不熟悉,但許多應用程序通常使用bounding volumes來定義某個區域的邊緣。這個想法是,當你的角色走路時,你會檢查角色的體積是否與牆體的體積相交。然後您可以調整速度或停止移動角色。使用不同的形狀來獲得光滑的牆壁,使角色不會卡在尖角邊緣。

這些概念可以用於需要快速邊界和邊界檢測的任何應用。

4

有兩個簡單的方法來定義適合這種遊戲的邊界。

更簡單的方法是將您的區域劃分爲網格,並使用2D數組來跟蹤網格中的哪些方格是可通過的。通常情況下,這個數組也存儲你的地圖信息,所以在每個位置都有一個數字,表示該廣場是否包含草地或牆壁或道路或山脈等(以及因此顯示的圖片)。爲了給你一個粗略的畫面:

###### 
#.# # 
# ## # 
# # 
###### 

一個更復雜的方法,如果你想有一個排序的「迷宮」看這是必要的,以薄壁,是使用二維數組,表示是否有網格方塊之間的垂直壁,以及網格方塊之間是否有水平壁。粗略圖像(它看起來ASCII中的拉伸,但希望你會得到點):

- - - - 
| |  | 
    - - 
|  | 
- - - - 

接下來的事情來決定是什麼方向你的性格可能在移動(上/下/左/右是最容易,但對角線難得多)。然後,該計劃基本上必須「從精神上」探索該地區,從目前的位置開始,希望能夠通過目的地。

一個簡單的搜索,很容易實現上/下/左/右,並會找到你的最短路徑,如果有的話,被稱爲Breadth-First search。下面是一些僞代碼:

queue = new Queue #just a simple first-in-first-out 
queue.push(startNode) 
while not queue.empty(): 
    exploreNode = queue.pop() 
    if isWalkable(exploreNode): #this doesn't work if you use 
           #"thin walls". The check must go 
           #where the pushes are instead 

     if isTarget(exploreNode): 
      #success!!! 
     else: 
      #push all neighbours 
      queue.push(exploreNode.up) 
      queue.push(exploreNode.down) 
      queue.push(exploreNode.left) 
      queue.push(exploreNode.right) 

這種算法是針對大型地圖慢,但是它可以把你用一些圖搜索和尋路的概念。一旦你確認它可以正常工作,你可以嘗試用A *或類似的東西替換它,這應該在更短的時間內得到相同的結果!

A *和許多其他搜索算法使用優先隊列而不是FIFO隊列。這可以讓他們首先考慮「更可能」的路徑,但如果事實證明更直接的路徑被阻止,則繞過迂迴路徑。

+0

感謝LOT這個徹底的描述。它幫助我更好地理解算法!我可能正在爲A *算法做出決定,因爲它爲我做了大部分的思考:) 儘管我使用的是當前實現(http:// www。 pygame.org/project-AStar-195-.html)使用1024x768的地圖非常緩慢。也許我應該讓每個地圖塊更大,並減少總塊數。 – kallepersson

+0

爲什麼你的地圖如此之大? 1像素的圖塊太小了。如果你希望你的遊戲世界是「手繪的」,而不是從瓷磚上畫的,一個合理的解決方案是繪製一張(不可見的)可通過/不可通過區域的地圖,在這張地圖上的每個正方形都有4x4像素。您還可以通過各種方式使A *變得更加「智能」,例如區分「本地」旅行和「全球」旅行。或者,您可以限制A *願意看多遠,否則會強制用戶點擊更容易進入的地方。 – Artelius

+0

是的,1像素貼圖太小。爲了澄清,我正在使我的地圖適合2.5D視角的世界(例如猴島3)。即使如此,你是對的,我不需要1px的瓷磚。 4甚至10個像素的瓷磚就足夠了。瓷磚將不可見。謝謝你的建議。 – kallepersson

相關問題