python中的碰撞检测算法

时间:2013-11-14 16:08:46

标签: python tkinter

我正在写一个小游戏,包括一个迷宫,一个玩家角色和一定数量的敌人。 PC和敌人都属于一个给定的类,它们根据我指定的标准每几毫秒更新一次它们的移动。 (所有这些限制都是作业的一部分)。现在,我正在尝试编写一个标准,以便敌人和PC都不会移动到迷宫墙所占据的方格。为此,我使用了以下方法(所有这些都在我正在制作的Game类中):

def isNotWall(self,x,y):

        self.wallXI = 0
        self.wallXF = 0
        self.wallYI = 0
        self.wallYF = 0
        for wall in self.wallList:
            self.wallXI = wall[0]*self.grid + 1
            self.wallXF = (wall[0]+1)*self.grid
            self.wallYI = wall[1]*self.grid + 1
            self.wallYF = (wall[1]+1)*self.grid
            if self.wallXI < x < self.wallXF and self.wallYI < y < self.wallYF:
                return False


        return True

其中wallList是一个列表,其中包含数组坐标中每个墙的x和y坐标,而grid是每个网格正方形的大小(在这种情况下为32像素)。

现在,举一个我如何实现这个的例子:

if snake[1] > self.heroe_x:
            if self.isNotWall(snake[1] - 30,snake[2]):
                snake[1] = snake[1] - 30 * segundos

其中snake [1]是以像素为单位的x坐标,snake [2]是y,而segundos是经过了多少毫秒,因此敌人将移动适当数量的像素。

根据这一点,如果蛇(和角色)在运动结束时的位置被墙壁占据,则它不应朝某个方向移动。然而,这只能部分起作用,行为不稳定,有些墙只能在一个方向上工作,而且角色经常卡在墙内或无缘无故地停止冷。

任何有关修复这些缺陷的帮助都将受到赞赏。我意识到这个问题并不简洁,但由于我对语言缺乏经验,我想不出一种方法可以使问题更具体,而且以前的答案都没有帮助我。提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果你只检查最后的位置,如果挡路的话蛇就不会撞到墙上。 说距离蛇只有15平方的墙?

此外,蛇正在移动30 * segundos,但你只是检查是否有30平方公尺的墙

if snake[1] > self.heroe_x:
    next_position_x = snake[1] - (30 * segundos)
    if self.isNotWall(next_position_x,snake[2]):
        snake[1] = next_position_x

如果我是你,我会实现一个真正的路径寻找算法,并使墙壁成本无限,以便它永远不会越过一个。

http://en.wikipedia.org/wiki/Pathfinding

同时检查此库

http://lib2dp.sourceforge.net/