Pygame Zero太空躲避游戏碰撞检测与速度控制问题求助
问题1:碰撞检测精度与报错修复
报错原因
Pygame Zero封装的screen对象没有直接暴露get_at方法,需要访问其底层原生Pygame surface属性调用该接口。同时你原来的代码逻辑存在两个问题:
- 像素读取代码要放在
draw()函数末尾,只有当前帧所有元素都渲染完成后,读取的像素才是正确的 - 原判断条件
if red and green and blue != 0逻辑错误,正确写法是if red != 0 and green !=0 and blue !=0
修复方案1:修正颜色检测代码
修改draw()函数如下:
def draw(): screen.clear() screen.fill((0, 0, 0)) foe.draw() foe2.draw() player.draw() title.draw() cont.draw() # 所有元素绘制完成后读取像素 pixel_colour = screen.surface.get_at((int(player.x), int(player.y))) red = pixel_colour[0] blue = pixel_colour[1] green = pixel_colour[2] if red != 0 and green !=0 and blue !=0: print("oof") gameover()
修复方案2(更推荐):使用像素级掩码碰撞
不需要手动读取像素,Pygame Zero的Actor自带碰撞掩码,直接实现高精度像素碰撞,效率比读像素高很多:
# 先在全局变量区新增游戏状态标记 game_active = True # 在update函数里添加碰撞判断 def update(): global vel, game_active if not game_active: return # 原有移动逻辑不变 keys = pygame.key.get_pressed() x, y = player.pos x += (keys[pygame.K_d] - keys[pygame.K_a]) * vel y += (keys[pygame.K_s] - keys[pygame.K_w]) * vel player.pos = x, y # 像素级碰撞检测 if player.colliderect(foe): # 计算两个Actor的偏移量 offset = (int(foe.x - player.x), int(foe.y - player.y)) # 判断掩码是否重叠(自动忽略透明区域) if player.mask.overlap(foe.mask, offset): gameover() # 同理添加foe2的碰撞检测 if player.colliderect(foe2): offset = (int(foe2.x - player.x), int(foe2.y - player.y)) if player.mask.overlap(foe2.mask, offset): gameover() if player.left > WIDTH: player.right = 0
问题2:游戏结束无法停止移动修复
报错是因为Python作用域问题,函数内部直接给vel赋值会被识别为局部变量,不会修改全局的vel,需要用global关键字声明,配合上面新增的game_active标记修改爆炸函数即可:
def gameover(): global game_active game_active = False # 爆炸触发时就停止响应操作 player.image = 'explode.png' clock.schedule_unique(game_over, 0.3) def game_over(): player.image = 'explode1.png' clock.schedule_unique(overgame, 0.3) def overgame(): global vel player.image = 'explode2.png' vel = 0
内容的提问来源于stack exchange,提问作者Whi_24
相关产品推荐
相关产品推荐

