Завершите рисование круга за определенное время - PullRequest
0 голосов
/ 19 декабря 2018

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

from math import pi
import pygame


pygame.init()

(x, y) = (800, 600)
screen = pygame.display.set_mode((x, y))
clock = pygame.time.Clock()

radius = 50
# Just to place the circle in the center later on
top_left_corner = ((x / 2) - (radius / 2), (y / 2) - (radius / 2))
outer_rect = pygame.Rect(top_left_corner, (radius, radius))

countdown = 1000  # seconds

angle_per_frame = 2 * pi / (countdown * 60)
angle_drawn = 0
new_angle = angle_per_frame
while True:
    if angle_drawn < 2 * pi:
        new_angle += angle_drawn + angle_per_frame
        pygame.draw.arc(screen, (255, 255, 255), outer_rect, angle_drawn, new_angle, 10)
        angle_drawn += angle_per_frame
    clock.tick(60)
    pygame.display.update(outer_rect)

Итак fps = 60, и в каждом кадре я рисую 2 * pi / countdown * fps, разделяя полный круг на кадры.И затем в каждом кадре рисуется часть круга.Кажется, что круг хорошо нарисован, но его нельзя использовать для таймера по двум причинам:

  1. Кажется, что круг завершен за меньшее время, чем указано.

  2. При рисовании круга кажется, что последняя часть круга нарисована быстрее.

Кто-нибудь может указать, что я делаю неправильно?

1 Ответ

0 голосов
/ 19 декабря 2018

Проблема в том, что вы увеличиваете new_angle на angle_drawn + angle_per_frame, и поскольку вы добавляете angle_per_frame к angle_drawn, оно будет больше с каждым кадром.

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

Кроме того, поскольку pygame.draw.arc не работает, если разница между углами слишком мала, мне пришлось вычесть 0,2 из начального угла и добавить небольшую задержку перед началом рисования.

from math import pi
import pygame
from pygame import freetype


pygame.init()

x, y = 800, 600
screen = pygame.display.set_mode((x, y))
clock = pygame.time.Clock()
FONT = freetype.Font(None, 32)
WHITE = pygame.Color('white')

radius = 50
# Just to place the circle in the center later on
top_left_corner = (x/2 - radius/2, y/2 - radius/2)
outer_rect = pygame.Rect(top_left_corner, (radius, radius))

countdown = 10  # seconds
angle_per_second = 2*pi / countdown
angle = 0
dt = 0  # dt is the time since the last clock.tick call in seconds.
time = 0

done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    time += dt
    angle += angle_per_second * dt
    # Delay the drawing a little bit, because draw.arc doesn't work
    # with very small angle differences.
    if angle > 0.2:
        pygame.draw.arc(screen, WHITE, outer_rect, angle-0.2, angle, 10)

    rect = pygame.draw.rect(screen, (50, 50, 50), (400, 340, 100, 50))
    FONT.render_to(screen, (410, 350), str(round(time, 2)), WHITE)
    dt = clock.tick(60) / 1000  # / 1000 to convert it to seconds.
    pygame.display.update([outer_rect, rect])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...