Как запустить код через ключевые события, но не остановить другие запущенные функции - PullRequest
0 голосов
/ 04 апреля 2019

Большая часть этого кода работает, но когда я нажимаю «пробел», пуля должна выстрелить и двигаться вместе с инопланетянином. Вместо этого пуля движется, и инопланетянин просто останавливается на своем пути, как если бы функция enemy_move() была остановлена ​​при запуске функции shoot(). Если у вас есть идеи, как заставить их работать одновременно, это было бы здорово.

bulletState = TRUE
bulletHealth = 0
enemyHealth = 100
def SpaceInvaders():
    window.destroy()
    SpaInv=Tk()
    s = Canvas(SpaInv, height=HEIGHT, width=WIDTH, bg='black')
    s.pack()
    ship = s.create_polygon(590, 485, 630, 485, 610, 430, fill='red')
    bullet = s.create_oval(600, 425, 620, 400, fill='yellow', state=HIDDEN)
    enemy = s.create_rectangle(4, 4, 34, 34, fill = 'green')
    def enemy_move():
        global enemyHealth
        while enemyHealth > 0:
            pos = s.coords(enemy)
            s.move(enemy, 3, 0)
            time.sleep(0.01)
            SpaInv.update()
    def shoot(event):
        global bulletHealth
        global WIDTH
        global bulletState
        s.itemconfig(bullet, state=NORMAL)
        bulletState = FALSE
        while bulletHealth == 0:
            s.move(bullet, 0, -3)
            time.sleep(0.01)
            SpaInv.update()
    s.bind_all('<Key>', move_ship)
    s.bind_all('<space>', shoot)
    enemy_move()

1 Ответ

0 голосов
/ 05 апреля 2019

Ниже приведена очень упрощенная переделка вашего примера кода, которая позволяет пришельцу и пуле двигаться одновременно. Решение состоит не в том, чтобы написать цикл для выполнения всего движения, а в функции, которая выполняет небольшой шаг, а затем вызывает себя через after():

from tkinter import *

WIDTH, HEIGHT = 900, 600

def enemy_move():
    s.move(enemy, 3, 0)
    SpaInv.after(10, enemy_move)

def shoot(event=None):
    s.itemconfig(bullet, state=NORMAL)
    s.move(bullet, 0, -3)
    SpaInv.after(10, shoot)

SpaInv = Tk()
s = Canvas(SpaInv, height=HEIGHT, width=WIDTH, bg='black')
s.pack()

ship = s.create_polygon(590, 485, 630, 485, 610, 430, fill='red')
bullet = s.create_oval(600, 425, 620, 400, fill='yellow', state=HIDDEN)
enemy = s.create_rectangle(4, 4, 34, 34, fill='green')

s.bind_all('<space>', shoot)

enemy_move()

SpaInv.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...