python - 射击时我无法在 python 太空入侵者游戏中移动我的角色(使用 Zelle 图形包)
问题描述
我必须使用 Zelle 图形包为我的中间 python 类制作太空侵略者游戏。我一直对弹丸有一些问题,它会运行代码,射击子弹,并继续移动子弹,但是当子弹移动时,我无法移动角色。我认为这是一个非常简单的问题,但我对编程的经验还不够。谢谢。
from graphics import *
from time import *
game_over = False
win = GraphWin("skulls and bones", 500, 500)
skull = Image(Point(250, 450), "skull_2.gif")
skull.draw(win)
bullet = Circle(Point(250, 250), 10)
bullet.setFill("red")
def bone():
value = 0
key = win.getKey()
if key == "x":
bullet.draw(win)
return bullet
def space_ship_move():
key = win.getKey()
if key == "a":
skull.move(-10, 0)
if key == "d":
skull.move(10, 0)
if key == "x":
bone()
for i in range(100):
sleep(1)
bone().move(0, -5)
return key
while not game_over:
space_ship_move()'''
解决方案
有两个问题:首先,win.getKey()
阻塞直到用户按下一个键。你不想这样做 - 使用win.checkKey()
. 其次,您需要解耦动画和输入处理,因为如果没有输入,您希望子弹也移动。您可以使用以下结构执行此操作:
def space_ship_move():
handle_input()
animate()
sleep(0.1)
handle_input()
大部分是您已经拥有的:
bullet = None
bulletAnimStep = -1
def bone():
global bullet, bulletAnimStep
if bullet is not None:
bullet.undraw()
bullet = Circle(Point(250, 250), 10)
bullet.setFill("red")
bullet.draw(win)
bulletAnimStep = 0
def handle_input():
key = win.checkKey()
if key == "a":
skull.move(-10, 0)
if key == "d":
skull.move(10, 0)
if key == "x":
bone()
我认为bone()
应该负责制造新子弹。这就是当前函数的作用。它还将 a 设置bulletAnimStep
为0
,表示我们处于子弹动画的开头。我们animate()
可以使用该信息来决定何时停止子弹动画。这就是它的外观:
def animate():
global bulletAnimStep
#animate bullet
if bulletAnimStep >= 0:
bulletAnimStep += 1
bullet.move(0, -5)
if bulletAnimStep >= 100:
#the bullet has gone far enough
bullet.undraw()
bulletAnimStep = -1
推荐阅读
- javascript - 如何在单击图标播放/暂停时打开音频
- android-studio - 在 Android Studio 上找不到 SDK 设置
- react-native - 当我导航到本机反应的新页面时,如何强制卸载组件?
- html - 修复 Bootstrap tbody 滚动与父级
- powershell - 有没有办法指定 PowerShell 脚本的编码
- python - 在 pandas Dataframe 中,如何插入行,然后将单元格值复制/粘贴到插入的行中?
- r - 如何按行数显示某些列表元素
- android - 哪一个是最流行的框架\技术栈来构建移动(安卓\苹果)应用程序
- java - 我对 Java NIO 感到困惑
- node.js - Node +Express 动态路由