Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确检查碰撞?_Python_Pygame - Fatal编程技术网

Python 如何正确检查碰撞?

Python 如何正确检查碰撞?,python,pygame,Python,Pygame,我正在尝试制作一个基于瓷砖的游戏,我现在正在制作墙壁,但它不能正常工作 我尝试了pygame.sprite.spritecany(self,self.game.walls),但玩家被困在里面 游戏: 玩家: def collideWithWalls(self, dx=0, dy=0): if pg.sprite.spritecollideany(self, self.game.walls): return True def move(self, dx=0, dy=0)

我正在尝试制作一个基于瓷砖的游戏,我现在正在制作墙壁,但它不能正常工作

我尝试了
pygame.sprite.spritecany(self,self.game.walls)
,但玩家被困在里面

游戏:

玩家:

def collideWithWalls(self, dx=0, dy=0):

    if pg.sprite.spritecollideany(self, self.game.walls):
        return True

def move(self, dx=0, dy=0):
    if not self.collideWithWalls(dx, dy):
        self.x += dx * TileSize
        self.y += dy * TileSize

我只是希望它能阻止我进去,但它让我进去了,却没有出去。

仅仅确定玩家的当前位置是否与墙相撞是不够的。你必须检查玩家的新位置是否在墙上。如果确定发生碰撞,则必须放弃移动:

def移动(self,dx=0,dy=0):
#存储当前位置
x、 y=self.rect.x,self.rect.y
#移动播放器
self.rect.x+=dx*TileSize
self.rect.y+=dy*TileSize
#确定碰撞
如果pg.sprite.spriteany(self、self.game.walls):
#丢弃运动
self.rect.x,self.rect.y=x,y

在一些教程中,您可以看到方法:仅更改X,检查碰撞(并最终向后移动),下一步仅更改Y,然后再次检查碰撞。还有另外一个元素:当你碰撞时,你使用墙的位置(左、右、上或下)作为玩家的位置-即
player.rect.left=wall.rect.right
。这样,玩家只会触摸墙壁,而不会进入里面。不管发生什么,这都不能让他动。它看起来很管用,但实际上不管用。几乎。(我不知道出了什么问题。)@jaden.joyeak在这种情况下,您需要提供更多代码。请阅读。为了做到这一点,我必须复制并粘贴我使用的所有4个文件。这是数百行。@jaden.joyeak Note
pg.sprite.spritecollideany
使用
.rect
属性执行碰撞测试。所以我在答案中改变了self.rect.x和self.rect.y。但是在你问题的代码中也有
self.x
self.y
。但是你没有提供任何信息,<代码> > X.<代码>和>代码>。这可能是问题的一部分。rect中有内置变量。
def collideWithWalls(self, dx=0, dy=0):

    if pg.sprite.spritecollideany(self, self.game.walls):
        return True

def move(self, dx=0, dy=0):
    if not self.collideWithWalls(dx, dy):
        self.x += dx * TileSize
        self.y += dy * TileSize