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 Notepg.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