Thumby游戏开发:避免超级角色降级后触发endGame函数
解决方案:添加无敌帧计数器避免重复碰撞触发游戏结束
针对你的问题,最直接的解决方式是新增一个无敌帧计数器,用来在超级角色降级后的指定帧数内,阻止endGame()函数执行。这种方式不需要测试碰撞重叠点,逻辑简单易实现。
修改后的完整代码示例
SuperCharacter = False invincibility_frames = 0 # 记录剩余无敌帧数,0表示无无敌状态 while GameRunning: # 每帧先更新无敌帧计数 if invincibility_frames > 0: invincibility_frames -= 1 # 碰撞检测逻辑(先统一判断是否碰撞,再细分精灵类型) if CharacterPos == x and SpritePos == x: if Sprite == Cactus: if not SuperCharacter: # 非超级状态下,只有无敌帧为0时才触发游戏结束 if invincibility_frames == 0: endGame() else: # 超级状态被仙人掌撞击:降级并开启60帧无敌 SuperCharacter = False invincibility_frames = 60 # 设置60帧无敌,可根据需求调整 elif Sprite == Star: # 非超级状态下吃到星星,升级为超级角色 if not SuperCharacter: SuperCharacter = True
逻辑说明
- 无敌帧计数器:
invincibility_frames初始为0,当超级角色被仙人掌撞降级时,设置为60(你需要的帧数),之后每帧自动减1,直到回到0。 - 碰撞判断优先级:先统一判断角色与精灵是否碰撞,再根据精灵类型和角色状态执行对应逻辑,比原代码的多条件嵌套更清晰。
- 避免重复触发:在非超级状态下,只有无敌帧为0时才会触发
endGame(),完美解决了降级后下一帧仍被判定碰撞的问题。
原代码的小问题修正
原代码中Sprite = Star or Cactus的逻辑错误,这里应该是每帧检测当前与角色碰撞的具体精灵类型(是星星还是仙人掌),而不是提前赋值。
内容的提问来源于stack exchange,提问作者Steven Dezort
相关产品推荐
相关产品推荐

