如何使多个克隆在python turtle中同时运行

时间:2019-10-26 17:57:24

标签: python turtle-graphics

我正在尝试编写一个可以按空格键的代码,一个对象将不断向前移动。我希望能够同时移动多个这些对象,而不必分别编写数百个对象。

这是我当前的代码:

子弹:

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 个答案:

答案 0 :(得分:1)

您的while stop == False:循环和time.sleep(0.5)在像Turtle这样的事件驱动环境中没有位置。相反,当我们发射每个子弹时,下面的代码将附加一个计时器事件,该事件将其移动直到消失。此时子弹被回收。

这个简化的示例只是从屏幕中心向随机方向发射子弹。您可以继续按空格键以同时生成子弹,所有子弹都朝着自己的方向移动,直到它们足够远为止:

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