Проблема в том, что вы увеличиваете 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])