Как заставить снежинку вращаться более плавно?

#python #python-turtle

#python #python-черепаха

Вопрос:

Я новичок в анимации python, хотя мне удалось использовать анимацию, чтобы заставить снежинку вращаться, но она вращается не так плавно… Я приложил приведенный ниже код, может кто-нибудь, пожалуйста, подсказать мне, что мне сделать, чтобы она вращалась более плавно?

 import turtle
import time
bob = turtle.Turtle()
bob.ht()
screen = turtle.Screen()
bob.speed(100)
screen.tracer(0, 0)
n = 0
bob.pencolor("blue")
bob.pensize(5)

def vshape():
  bob.rt(25)
  bob.fd(50)
  bob.backward(50)
  bob.lt(50)
  bob.fd(50)
  bob.backward(50)
  bob.rt(25)

def snowflakeArm():
  for x in range(4):
    bob.fd(30)
    vshape()
  bob.backward(120)
    
def snowflake(n, x, y):
  bob.seth(n)
  bob.pu()
  bob.setpos(x ,y)
  bob.pd()
  for x in range(6):
    snowflakeArm()
    bob.rt(60)

while True:
  time.sleep(0.02)
  bob.update()
  bob.clear()
  snowflake(n, 0, 0)
  snowflake(n, 350, 0)
  snowflake(n, -350, 0)
  snowflake(n, 0, 350)
  snowflake(n, 0, -350)
  n  = 10
  

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

Комментарии:

1. Уменьшение количества вращения ( n ) и уменьшение времени ожидания, как вы предлагаете, делает вращение довольно плавным для меня. Можете ли вы объяснить, что, по вашему мнению, в этом не так гладко?

2. @cemper93 Какие значения вы сохранили для количества оборотов (n) и времени ожидания?

3. Я полностью удалил режим сна, поместил oldt = time.time() над вашим основным циклом и заменил n = 10 на t = time.time(); n = (oldt - t) * 20; oldt = t . Честно говоря, даже ваш опубликованный код работает для меня гладко. Задумывались ли вы о том, что на вашем компьютере может не хватить вычислительной мощности для рендеринга со скоростью 50 кадров в секунду? Улучшает ли уменьшение количества снежинок «гладкость»?

4. @cemper93 На самом деле я всего лишь новичок в анимации черепах на Python, и я действительно не проверял, поддерживает ли моя система необходимую вычислительную мощность… Что вы подразумеваете под oldt и что делает этот фрагмент кода?

5. код гарантирует, что скорость вращения снежинки не зависит от того, сколько времени требуется для рендеринга снежинки. Таким образом, код выдает похожие результаты на разных компьютерах, даже если у них разная производительность, а также субъективно кажется менее «лагающим». Смотрите gamedev.stackexchange.com/questions/70255 /…

Ответ №1:

Меня беспокоит, что вы можете успешно вызывать bob.update() , поскольку update() это не метод Turtle в стандарте turtle.py выпущен с Python 3 или Python 2. Возможно, вы используете более старую или нестандартную реализацию turtle, поэтому некоторые из приведенных ниже параметров могут потребоваться для корректировки.

Вместо того, чтобы вводить time.sleep() , который не синхронизирован с собственным обработчиком событий turtle, давайте использовать ontimer() событие turtle:

 from turtle import Screen, Turtle

def vshape():
    turtle.right(25)
    turtle.forward(50)
    turtle.backward(50)
    turtle.left(50)
    turtle.forward(50)
    turtle.backward(50)
    turtle.right(25)

def snowflakeArm():
    for _ in range(4):
        turtle.forward(30)
        vshape()

    turtle.backward(120)

def snowflake(angle, position):
    turtle.setheading(angle)

    turtle.penup()
    turtle.setposition(position)
    turtle.pendown()

    for _ in range(360 // 60):
        snowflakeArm()
        turtle.right(60)

angle = 0

def snowflakes():
    global angle

    turtle.clear()

    snowflake(angle, (0, 0))
    snowflake(angle, (350, 0))
    snowflake(angle, (-350, 0))
    snowflake(angle, (0, 350))
    snowflake(angle, (0, -350))

    screen.update()

    angle = (angle   10) % 360

    screen.ontimer(snowflakes, 25)  # repeat 25 milliseconds from now

screen = Screen()
screen.tracer(False)

turtle = Turtle()
turtle.hideturtle()
turtle.pencolor('blue')
turtle.pensize(5)

snowflakes()

screen.exitonclick()
  

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