pygame 和平铺地图碰撞

pygame and tiled map collsions

我试图让玩家精灵停止掉落在平台矩形顶部。在过去的两天里,我尝试了很多事情,但我比以往任何时候都更加迷茫。太感谢了。我正在使用 tmx 加载平铺地图。我在每次检测到名称时添加一个 Platform 对象,然后将其添加到列表中。我枚举列表以使用 sprite.collide(self.player, plat) 检查碰撞。这行不通。

def update(self):
    for plat in self.platList:
        self.hits = pg.sprite.spritecollide(self.player,self.platList,False)
        if self.hits:
            if self.player.pos.y > self.hits[0].y:
                self.player.pos.y = self.hits[0].rect.top

 for tile in self.map.tmxdata.objects:
        if tile.name == "player":
            self.player = Player(self,tile.x,tile.y)
        if tile.name == "Platform":
            self.platList.append(Platform(self, tile.x, tile.y,tile.width,tile.height))
class Platform(pg.sprite.Sprite):
def __init__(self,game,x,y,width,height):
    self.game = game
    pg.sprite.Sprite.__init__(self)
    self.rect = pg.Rect(x,y,width,height)
    self.y = y
    self.rect.x = x
    self.rect.y = y

我猜你的问题是你没有使用玩家的 rect 属性来定义玩家的位置。您正在使用 pygame 的精灵,因此请按预期方式使用它们。

所有处理精灵的 pygame 函数(例如 spritecollide)将使用 rect 属性,但在您的代码中播放器 class 有一个额外的 pos 属性,Platform 也有一个 y 属性。

删除它们,并使用 rect 专门存储精灵的大小和位置。

当你想移动精灵时,只需更改其 rect(例如 move_ip 等)或其属性。