#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()
Это также должно позволить нам выйти из программы чисто, щелкнув по окну, без создания всех этих предупреждающих сообщений.