在IF语句中绑定键盘触发事件:Python瓦片RPG游戏攻击功能问题
核心修改思路
你当前的逻辑写反了:spaceBar是系统触发的按键回调函数,本身不会返回布尔值,也不能在业务逻辑里主动调用等待触发,应该调整为空格键按下时主动校验攻击条件,符合GUI事件驱动的设计规则。
修改后代码
# strike 仅处理同位置判定和扣血逻辑,返回攻击是否生效 def strike() -> bool: if hero.x == skeleton.xx and hero.y == skeleton.yy: skeleton.chp -= hero.sp return True return False # battle 保持原有的属性显示逻辑即可 def battle(): if hero.x == skeleton.xx and hero.y == skeleton.yy: canvas.create_text(123, 760, text=f"Skeleton (Level {skeleton.mlvl}) HP: {skeleton.chp}/{skeleton.mhp} | DP: {skeleton.mdp} | SP: {skeleton.msp}") # 空格键回调:触发时先判断是否可攻击,攻击生效再播放动画 def spaceBar(event): if strike(): # 注:这里循环400次创建图片可能会导致画布残留大量无效元素,建议后续优化为定时清除的帧动画 for i in range(400): canvas.create_image(hero.x * IMG_SIZE, hero.y * IMG_SIZE, image=getattr(root, "strike"), anchor=NW) # 全局绑定空格键事件,放在界面初始化逻辑中(比如root实例创建后) root.bind('<space>', spaceBar)
可选方案:支持按住空格连续攻击
如果需要实现按住空格连续攻击的效果,可以用全局变量存储空格按下状态,再在strike中判断:
# 全局变量存储空格按下状态 is_space_pressed = False def on_space_press(event): global is_space_pressed is_space_pressed = True def on_space_release(event): global is_space_pressed is_space_pressed = False # 绑定按下、释放事件 root.bind('<KeyPress-space>', on_space_press) root.bind('<KeyRelease-space>', on_space_release) # 此时strike可以直接读取按键状态 def strike(): if hero.x == skeleton.xx and hero.y == skeleton.yy and is_space_pressed: skeleton.chp -= hero.sp
内容的提问来源于stack exchange,提问作者MarvAkel
相关产品推荐
相关产品推荐

