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
等)或其属性。
我试图让玩家精灵停止掉落在平台矩形顶部。在过去的两天里,我尝试了很多事情,但我比以往任何时候都更加迷茫。太感谢了。我正在使用 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
等)或其属性。