Я хотел бы знать, как я могу управлять определением «касание» с помощью клавиатуры, а не с помощью мыши
Это должно быть так же просто, как заменить:
onscreenclick(tap)
с
onkey(tap, "Up")
listen()
и сбросом аргументов x
и y
в tap()
.Я переработал ваш код ниже, чтобы внести это изменение и устранить:
from freegames import vector
и заставить его работать только с тем, что доступно в turtle.Я также изменил логику сохранения векторов и размещения по умолчанию точек на черепахах, чтобы вместо них сделать шары и птицу всеми черепахами и просто перемещать их по мере необходимости.Так как черепахи не собирают мусор нормально, я держу список шаров, которые ушли за пределы экрана для повторного использования:
from random import randrange
from turtle import Turtle, Screen
BIRD_RADIUS = 10
BALL_RADIUS = 20
CURSOR_SIZE = 20
WINDOW_WIDTH, WINDOW_HEIGHT = 420, 420
GALLERY_WIDTH, GALLERY_HEIGHT = WINDOW_WIDTH - BALL_RADIUS, WINDOW_HEIGHT - BIRD_RADIUS
def click():
"Move bird up in response to screen key click."
bird.forward(min(BIRD_RADIUS * 3, WINDOW_HEIGHT/2 - bird.ycor())) # flying higher
def is_ball_inside(turtle):
"Return True if point on screen."
x = turtle.xcor()
return -GALLERY_WIDTH/2 < x
def is_bird_inside(turtle):
"Return True if point on screen."
y = turtle.ycor()
return -GALLERY_HEIGHT/2 < y < GALLERY_HEIGHT/2
def draw(is_alive):
"Draw screen objects."
if not is_alive:
bird.color('red')
screen.update()
def move():
"Update object positions."
if not is_bird_inside(bird):
draw(False) # flew or fell out of gallery
return
bird.backward(BIRD_RADIUS/2) # falling to earth
for ball in balls:
ball.forward(3)
for ball in balls:
if ball.distance(bird) < (BIRD_RADIUS + BALL_RADIUS) / 2:
draw(False)
return
while balls and not is_ball_inside(balls[0]):
ball = balls.pop(0)
ball.hideturtle()
spare_balls.append(ball) # reduce, reuse, recycle
if randrange(10) == 0:
ball = spare_balls.pop() if spare_balls else Turtle("circle", visible=False)
ball.shapesize(BALL_RADIUS / CURSOR_SIZE)
ball.setheading(180)
ball.penup()
ball.goto(GALLERY_WIDTH/2, randrange(BALL_RADIUS - GALLERY_HEIGHT/2, GALLERY_HEIGHT/2 - BALL_RADIUS))
ball.showturtle()
balls.append(ball)
draw(True)
screen.ontimer(move, 50)
screen = Screen()
screen.setup(WINDOW_WIDTH, WINDOW_HEIGHT + 10) # little bit added for title bar
bird = Turtle("circle", visible=False)
bird.shapesize(BIRD_RADIUS / CURSOR_SIZE)
bird.color("green")
bird.setheading(90)
bird.penup()
bird.showturtle()
balls = []
spare_balls = []
screen.tracer(False)
screen.onkey(click, "Up")
screen.listen()
move()
screen.mainloop()
Чтобы сделать окно черепахи слушателем клавиатуры, вам нужно прикоснуться к нему мышью, чтобы сделать его активным, прежде чем нажимать клавишу со стрелкой вверх.
Перед добавлением текущей оценки в окно, вам необходимо определить, какая из них оценивается.(Это номер мяча, который успешно уклонен?) Здесь я бы использовал дополнительную невидимую черепаху, расположенную в фиксированном положении, которая просто делает undo()
и write()
для обновления экрана.