Связывание событий нажатия клавиш с использованием Turtle - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в Python и пробую кучу разных проектов для изучения.Я хочу использовать Turtle для создания игры, и я нашел этого парня на YouTube, который просматривает воссоздание Space Invaders.

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

Другая необычная вещь заключается в том, что каждая функция запускается один раз.Я включил оператор печати в каждую функцию, чтобы обнаружить это.Почему он запускает каждое нажатие клавиши один раз, но не привязывает мою настоящую клавиатуру?

import turtle

#Screen setup
screen = turtle.Screen()
screen.bgcolor('black')
screen.title("Space Invaders")

#Create player
player = turtle.Turtle()
player.color('blue')
player.shape('triangle')
player.penup()
player.speed(0)
player.setposition(0, -250)
player.setheading(90)

playerspeed = 15

#Move the player left and right
def move_left():
    x = player.xcor()
    x -= playerspeed
    player.setx(x)
    screen.listen()
    print("Move left.") #for debugging

def move_right():
    x = player.xcor()
    x += playerspeed
    player.setx(x)
    screen.listen()
    print("Move right.") #for debugging

#Create keyboard binding
screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()

#Play game
screen.mainloop()

Ответы [ 2 ]

0 голосов
/ 16 августа 2019

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

Вместо

screen.onkey(move_left(), 'Left')
screen.onkey(move_right(), 'Right')
screen.listen()

Вы должны использовать

screen.listen()
screen.onkeypress(move_left, 'Left')
screen.onkeypress(move_right, 'Right')
0 голосов
/ 28 февраля 2019

Проблема с этими двумя строками кода:

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()

Конечно, вы должны помнить, когда стреляете снарядом, что ваша черепаха направлена ​​вправо, и соответственно перенаправлять его!

...