Есть ли способ заставить объект вращаться с другим объектом в Python Turtle? - PullRequest
1 голос
/ 01 мая 2019

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

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

def left():
  t.left(15)
  k.left(20)

def right():
  t.right(15)
  k.right(20)

def shoot():
  k = turtle.Turtle()
  k.penup()
  k.color("orange")
  k.shape("arrow")



ts.onkey(shoot, "space")

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

Ответы [ 2 ]

2 голосов
/ 01 мая 2019

Чтобы сделать это правильно, с неограниченным количеством стрелок, требуется больше работы.Нам нужно иметь событие таймера, управляющее каждой активной стрелкой.Поскольку черепахи - это глобальные объекты, которые не собираются мусором, мы хотим повторно использовать использованные стрелки.Нам нужно заблокировать кнопку огня во время стрельбы, чтобы предотвратить наложение событий.Следующее должно делать то, что вы описываете:

from turtle import Screen, Turtle, mainloop

def left():
    player.left(15)

def right():
    player.right(15)

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

    if quiver:
        arrow = quiver.pop(0)
    else:
        arrow = Turtle('arrow', visible=False)
        arrow.speed('fastest')
        arrow.color('orange')
        arrow.penup()

    arrow.setposition(player.position())
    arrow.setheading(player.heading())

    flight(arrow)

    arrow.showturtle()

    screen.onkey(shoot, 'space')

def flight(arrow):
    if arrow.distance(0, 0) < 325:
        arrow.forward(10)
        screen.ontimer(lambda a=arrow: flight(a), 100)
    else:
        arrow.hideturtle()
        quiver.append(arrow)

screen = Screen()
screen.setup(500, 500)

quiver = []

player = Turtle('turtle')
player.color('dark green', 'light green')
player.speed('fastest')

screen.onkey(shoot, 'space')
screen.onkey(left, 'Left')
screen.onkey(right, 'Right')
screen.listen()

mainloop()

enter image description here

Чтобы ответить на исходный вопрос, вам не нужно поворачивать их вместе.Вы можете выровнять одно с другим, когда будете готовы к съемке, используя b.setposition(a.position()) и b.setheading(a.heading()).

0 голосов
/ 01 мая 2019

Попробуйте это:

k = turtle.Turtle()
def left():
    global t, k
    t.left(15)
    k.left(15)
def right():
    global t, k
    t.right(15)
    k.right(15)
def shoot():
    global k
    k.penup()
    k.color("orange")
    k.shape("arrow")
ts.onkey(shoot, "space")
ts.onkey(left, "left")
ts.onkey(right, "right")
...