首页 > 解决方案 > 射击时我无法在 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()'''

标签: pythongraphics

解决方案


有两个问题:首先,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 设置bulletAnimStep0,表示我们处于子弹动画的开头。我们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

推荐阅读