Pygame游戏精灵墙体碰撞检测功能失效问题排查求助
Pygame精灵碰撞检测失效问题修复方案
你的代码存在3处核心逻辑错误,按优先级排列如下:
- 二维地图数组索引顺序颠倒:文本地图TEXT_LEVEL是按行存储的,第一个索引对应y轴的行号,第二个索引对应x轴的列号,你代码中使用
TEXT_LEVEL[x][y]读取格子属性,行列完全颠倒,读取到的是错误的地图数据。 - 碰撞判断逻辑写反:你预期的逻辑是「碰到墙体
=则回退坐标」,但代码中判断条件写为TEXT_LEVEL[x][y] != "=",变成了「不是墙体的时候才回退」,和需求完全相反。 - 精灵rect更新顺序错误:你在回退坐标前先把rect设置成了错误的新坐标,之后只修改了
self.x和self.y,没有同步更新rect的位置,后续渲染和碰撞检测用的还是错误的rect坐标。
修复后代码
def movement(self): prevX = self.x prevY = self.y key = pygame.key.get_pressed() if key[pygame.K_w]: self.y -= 32 elif key[pygame.K_s]: self.y += 32 elif key[pygame.K_a]: self.x -= 32 elif key[pygame.K_d]: self.x += 32 # 计算格子坐标,注意x对应列、y对应行 grid_col = int(self.x / 32) grid_row = int(self.y / 32) # 仅当目标格子是墙体时回退坐标 if TEXT_LEVEL[grid_row][grid_col] == "=": print("wall") print(grid_col, grid_row) print(TEXT_LEVEL[grid_row][grid_col]) # 先回退坐标,再同步更新rect self.x = prevX self.y = prevY self.rect.topleft = (self.x, self.y)
内容的提问来源于stack exchange,提问作者rob-roibu
相关产品推荐
相关产品推荐

