Я хочу, чтобы дракон прыгнул, но препятствие продолжает двигаться
Чтобы сделать это, мы сначала подбрасываем while True:
, которому нет места в мире, управляемом событиями, как черепаха. На его место мы помещаем событие таймера, которое срабатывает через равные промежутки времени. Далее мы разбиваем горизонтальное движение препятствия и вертикальное движение дракона на маленькие чередующиеся движения. Ниже моя переделка вашего кода на основе вышеизложенного - я упростила вашу логику препятствий, чтобы этот пример был простым:
from turtle import Screen, Turtle
def jump_dragon():
global dragon_state, dragon_direction
if dragon_state == "steady":
dragon_state = "jump"
dragon_direction = 1
dragon.forward(10)
def play():
global dragon_state, dragon_direction
if dragon_state == "jump":
dragon.forward(dragon_direction * 10)
y = dragon.ycor()
if y >= 100:
dragon_direction *= -1
elif y <= 10:
dragon_state = "steady"
obstacle.forward(10)
if obstacle.xcor() < -290:
obstacle.hideturtle()
obstacle.goto(290, 20)
obstacle.showturtle()
elif dragon.distance(obstacle) < 20:
print("Collision")
obstacle.hideturtle()
obstacle.goto(290, 20)
obstacle.showturtle()
win.ontimer(play, 75)
win = Screen()
win.title("Dragon game")
win.setup(width=800, height=300)
base_line = Turtle(visible=False)
base_line.speed('fastest')
base_line.back(300)
base_line.forward(600)
dragon = Turtle("square", visible=False)
dragon.speed('slow')
dragon.setheading(90)
dragon.penup()
dragon.goto(-250, 10)
dragon.showturtle()
dragon_state = "steady"
dragon_direction = 1
obstacle = Turtle("square", visible=False)
obstacle.shapesize(2, 1)
obstacle.speed('fastest')
obstacle.penup()
obstacle.setheading(180)
obstacle.setposition(290, 20)
obstacle.showturtle()
win.onkey(jump_dragon, "space")
win.listen()
play()
win.mainloop()
Я также переработал другие части кода для стиля и ясности.