Я предполагаю, что он как-то связан с циклом while
Да, его там быть не должно!В мире, управляемом событиями, как черепаха, не должно быть петли while True:
.Вместо этого нам нужно событие таймера, которое запускается через регулярные промежутки времени, которое выполняет постепенные обновления движущихся объектов (врага и пули), чтобы они, казалось, двигались одновременно.Ниже моя переделка вашего кода с использованием события таймера:
from turtle import Screen, Turtle
# moving left and right
def left_move():
player.setx(player.xcor() - player_speed)
def right_move():
player.setx(player.xcor() + player_speed)
# screen setup
screen = Screen()
screen.bgcolor('black')
screen.title('SPACE.INVADERS')
# border
border = Turtle(visible=False)
border.speed('fastest')
border.color('green')
border.penup()
border.setposition(-300, -300)
border.pendown()
for _ in range(4):
border.forward(600)
border.left(90)
# player
player = Turtle('triangle')
player.speed('fastest')
player.color('red')
player.penup()
player.setposition(0, -250)
player.setheading(90)
player_speed = 15
# enemy
enemy = Turtle('square')
enemy.speed('fast')
enemy.shapesize(1.25)
enemy.color('orange')
enemy.penup()
enemy.setpos(-250, 250)
enemy_speed = 6 # enemy speed
enemy_direction = 1 # enemy direction
# bullet
bullet = Turtle('triangle', visible=False)
bullet.speed('fastest')
bullet.color('white')
bullet.shapesize(0.5)
bullet.penup()
bullet.left(90)
bullet_speed = 9 # bullet speed
# shooting
def shoot():
if not bullet.isvisible():
bullet.goto(player.position())
bullet.showturtle()
def move():
global enemy_direction
if bullet.isvisible():
if bullet.ycor() > 275:
bullet.hideturtle()
else:
bullet.forward(bullet_speed)
# enemy movement
enemy.forward(enemy_direction * enemy_speed)
enemy.settiltangle(enemy.tiltangle() + 3) # just for fun
x, y = enemy.position()
if x > 250 or x < -250:
enemy_direction *= -1
enemy.sety(y - 25)
screen.ontimer(move, 50)
# bindings
screen.onkey(left_move, 'Left')
screen.onkey(right_move, 'Right')
screen.onkey(shoot, 'space')
screen.listen()
move()
screen.mainloop()
Это должно дать вам основные функциональные возможности, необходимые для продвижения вперед и добавления обнаружения столкновений (пуля врагу, враг игроку, игрок к стене)и выигрыш.
Также обратите внимание, что черепахи являются глобальными сущностями, поэтому создание новой пули каждый раз, когда она вам нужна, плохая идея.Даже если вы равномерно разрешаете наложение пуль, сохраняйте для этой цели повторно используемый набор пуль.