2009-10-26 83 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

相关问题