我正在尝试编写一个可以按空格键的代码,一个对象将不断向前移动。我希望能够同时移动多个这些对象,而不必分别编写数百个对象。
这是我当前的代码:
子弹:
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”已重新定义为我按下空格键时创建的新项目符号。有没有办法创建可以在彼此之上运行的多个克隆?
答案 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()