Анимация черепахи случайно ускоряется / замедляется - PullRequest
0 голосов
/ 26 мая 2019

Как остановить случайное ускорение / замедление анимации черепахи?

Я пытался сделать игру понг с Python; однако мяч, кажется, время от времени ускоряется и замедляется случайным образом. Как мне предотвратить это?

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

import turtle

# Window settings
wn = turtle.Screen()
wn.title('Classic Pong v1.0')
wn.bgcolor('black')
wn.setup(width=800, height=600)
wn.tracer(0)

# Ball
ball = turtle.Turtle()
ball.speed(0)
ball.shape('square')
ball.color('white')
ball.penup()
ball.dx = 0.1   # Ball moves by 0.1 pixels every time
ball.dy = 0.1

# Main game loop
while True:
    wn.update()

    # Moving the ball
    ball.setx(ball.xcor() + ball.dx)    # Updates the position of the ball every time
    ball.sety(ball.ycor() + ball.dy)

    # Border collision checking
    if ball.ycor() > 290:
        ball.sety(290)
        ball.dy *= -1

    if ball.ycor() < -280:      # Set to 280 to account for extra space
        ball.sety(-280)
        ball.dy *= -1

    if ball.xcor() > 380:       # Set to 280 to account for extra space
        ball.goto(0, 0)
        ball.dx *= -1


    if ball.xcor() < -390:
        ball.goto(0, 0)
        ball.dx *= -1

Я ожидаю, что анимация мяча будет плавной; однако скорость анимации меняется случайным образом.

1 Ответ

0 голосов
/ 26 мая 2019

Я не понимаю, почему ваша анимация ускоряется и замедляется. Независимо от того, как я написал бы этот код на основании следующих вопросов:

  • Цикл while True: не имеет места в среде, основанной на событиях, такой как черепаха - если это не проблема в настоящее время, она станет одной. Я заменил его событиями таймера.

  • Пиксельное движение 0.1 очень мало и всегда будет казаться медленным черепаха.

  • Старайтесь не просить черепаху делать все, что ей не нужно, в критическом цикле. Между звонками на номера setx(), sety(), xcor(), ycor() и goto() вы делаете дюжину вызовов методов в своем экземпляре turtle. В моем переписать у меня только два вызова черепахи в критическом цикле, position() и setposition().

  • Я упал tracer() и update(), когда я инструктировал мой критическая петля и был только один звонок черепахи, который изменил экран при каждом обновлении, и это значение по умолчанию для tracer() - так ничего не получилось.

Пересмотренный код:

from turtle import Screen, Turtle

WIDTH, HEIGHT = 800, 600
CURSOR_SIZE = 20

ball_dx = 1
ball_dy = -2.5

def move():
    global ball_dx, ball_dy

    x, y = ball.position()

    y += ball_dy

    # Border collision checking
    if not CURSOR_SIZE - HEIGHT/2 < y < HEIGHT/2 - CURSOR_SIZE:
        ball_dy *= -1

    x += ball_dx

    if not CURSOR_SIZE - WIDTH/2 < x < WIDTH/2 - CURSOR_SIZE:
        x = y = 0
        ball_dx *= -1

    ball.setposition(x, y)

    screen.ontimer(move, 50)

# Window settings
screen = Screen()
screen.title('Classic Pong v1.1')
screen.setup(WIDTH, HEIGHT)
screen.bgcolor('black')

# Ball
ball = Turtle()
ball.shape('square')
ball.color('white')
ball.speed('fastest')
ball.penup()

move()
screen.mainloop()
...