Как сделать так, чтобы несколько клонов запускались в Python Turtle одновременно - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать код, в котором вы можете нажать пробел, и объект будет постоянно двигаться вперед. Я надеюсь, что смогу одновременно перемещать несколько этих объектов без необходимости кодировать сотни из них по отдельности.

Это мой текущий код:

Пуля:

bullet = turtle.Turtle()
bullet.speed(0)
bullet.shape("circle")
bullet.color("red")
bullet.shapesize(stretch_wid=0.5, stretch_len=0.5)
bullet.penup()
bullet.goto(-200, -200)
bullet.hideturtle()

Движение:

def shoot_bullet():
    stop = False
    bullet2 = bullet.clone()
    bullet2.showturtle()
    while stop == False:
        y = bullet2.ycor()
        bullet2.sety(y + 20)
        wn.update()
        time.sleep(0.5)
...

onkeypress(shoot_bullet, "space")

Это работает, пока я снова не нажму пробел, и пуля не остановится, поскольку «bullet2» будет переопределено как новая пуля, которую я создаю, когда нажимаю пробел. Есть ли способ создать несколько клонов, которые могут работать друг над другом?

1 Ответ

1 голос
/ 27 октября 2019

Ваша while stop == False: петля и time.sleep(0.5) не имеют места в управляемой событиями среде, такой как черепаха. Вместо этого, когда мы запускаем каждую пулю, приведенный ниже код присоединяет событие таймера, которое перемещает его, пока оно не исчезнет. В этот момент пуля перерабатывается.

Этот упрощенный пример просто стреляет пулями в случайных направлениях от центра экрана. Вы можете продолжать нажимать пробел, чтобы генерировать одновременно пули, которые все движутся в своем направлении, пока они не уйдут достаточно далеко:

from turtle import Screen, Turtle
from random import randrange

def move_bullet(bullet):
    bullet.forward(15)

    if bullet.distance((0, 0)) > 400:
        bullet.hideturtle()
        bullets.append(bullet)
    else:
        screen.ontimer(lambda b=bullet: move_bullet(b), 50)

    screen.update()

def shoot_bullet():
    screen.onkey(None, 'space')  # disable handler inside hander

    bullet = bullets.pop() if bullets else bullet_prototype.clone()
    bullet.home()
    bullet.setheading(randrange(0, 360))
    bullet.showturtle()

    move_bullet(bullet)

    screen.onkey(shoot_bullet, 'space')  # reenable handler on exit

bullet_prototype = Turtle('circle')
bullet_prototype.hideturtle()
bullet_prototype.dot(10)  # just for this example, not for actual code
bullet_prototype.shapesize(0.5)
bullet_prototype.color('red')
bullet_prototype.penup()

bullets = []

screen = Screen()
screen.tracer(False)
screen.onkey(shoot_bullet, 'space')
screen.listen()
screen.mainloop()

enter image description here

...