问题描述
我正在用 pygame 制作一个基于 tile 的 plaformer 游戏。这是我的播放器精灵:
这是碰撞检测器代码:
for tile in world.tile_list:
# check for collision in x direction
if tile[1].colliderect(self.rect.x + dx,self.rect.y,self.width,self.height):
dx = 0
# check for collision in y direction
if tile[1].colliderect(self.rect.x,self.rect.y + dy,self.height):
# check if below the ground i.e. jumping
if self.vel_y < 0:
dy = tile[1].bottom - self.rect.top
self.vel_y = 0
# check if above the ground i.e. falling
elif self.vel_y >= 0:
dy = tile[1].top - self.rect.bottom
self.vel_y = 0
我需要获得正确的玩家宽度,所以当我使用 width = player_png.get_width()
时,我得到了这个图像的总宽度,但我只想要第一条腿到第二条腿的宽度,这样碰撞检测器只会将该宽度视为播放器宽度。
我可以手动将宽度分配给从第一条腿到第二条腿的宽度,但是当我这样做时,碰撞检测器会检测到图像中间的宽度并且没有正确对齐
解决方法
对此没有自动解决方案。您需要为碰撞测试定义一个子区域:
offset_x = # offset_x is the first distance to the "black" pixel
foot_width = # width of the foots
foot_x = self.rect.x + offset_x
for tile in world.tile_list:
# check for collision in x direction
if tile[1].colliderect(self.rect.x + dx,self.rect.y,self.width,self.height):
dx = 0
# check for collision in y direction
# check if below the ground i.e. jumping
if self.vel_y < 0:
if tile[1].colliderect(self.rect.x,self.rect.y + dy,self.height):
dy = tile[1].bottom - self.rect.top
self.vel_y = 0
# check if above the ground i.e. falling
if self.vel_y >= 0:
if tile[1].colliderect(foot_x,foot_width,self.height):
dy = tile[1].top - self.rect.bottom
self.vel_y = 0