Проблема с этими двумя строками кода:
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
Вы не хотите вызывать move_left()
, вы хотите передать move_left
для вызова обработчиком события, когда ключнажата:
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
Включая скобки, вы передаете возвращаемое значение move_left()
, равное None
, фактически отключая событие вместо его включения!
Вот переделкавашего кода с помощью вышеуказанного исправления плюс еще одна хитрость: игры типа космического захватчика идеально подходят для того, чтобы воспользоваться преимуществом редко используемого turtle.settiltangle()
метода.Этот метод позволяет нам сделать так, чтобы черепаха указывала вертикально, в то время как фактически ориентирована горизонтально.Таким образом, мы можем просто использовать forward()
и backward()
, чтобы перемещать его по экрану:
from turtle import Screen, Turtle
PLAYER_SPEED = 15
# Move the player left and right
def move_left():
player.backward(PLAYER_SPEED)
def move_right():
player.forward(PLAYER_SPEED)
# Screen setup
screen = Screen()
screen.bgcolor('black')
screen.title("Space Invaders")
# Create player
player = Turtle('triangle')
player.speed('fastest')
player.color('blue')
player.penup()
player.sety(-250)
player.settiltangle(90)
# Create keyboard binding
screen.onkey(move_left, 'Left')
screen.onkey(move_right, 'Right')
screen.listen()
# Play game
screen.mainloop()
Конечно, вы должны помнить, когда стреляете снарядом, что ваша черепаха направлена вправо, и соответственно перенаправлять его!