Я изучаю питон *\(^o^)/*
Простого Pygame анимация заикание
У меня есть простое окно подпрыгивания окна нарисованного с помощью Pygame
. Кажется, что все работает нормально, за исключением одного незначительного раздражения. Он постоянно заикается! Я понятия не имею, что может вызвать заикание. Я думал, что это может быть отставание, поэтому я применил фиксированный временной шаг, чтобы петля могла догнать, но это не повлияло.
#--- initialize pygame window ---#
import pygame
import time
pygame.init()
size = (1200,500)
screen = pygame.display.set_mode(size, pygame.RESIZABLE)
fps = 60
#--- define color palette ---#
black = (0,0,0)
white = (255,255,255)
#--- define the player ---#
class player:
def __init__(self,screen,surface, color):
self.speed = 3
self.direction_x = 1
self.direction_y = 1
self.screen = screen
self.surface = surface
self.rect = self.surface.get_rect()
self.color = color
def set_pos(self, x,y):
self.rect.x = x
self.rect.y = y
def advance_pos(self):
screen_width, screen_height = screen.get_size()
if self.rect.x + self.rect.width > screen_width or player1.rect.x < 0:
player1.direction_x *= -1
player1.speed = 3
elif player1.rect.y + player1.rect.height > screen_height or player1.rect.y < 0:
player1.direction_y *= -1
player1.speed = 3
else:
player1.speed -= 0.001
self.rect.x += self.speed * self.direction_x
self.rect.y += self.speed * self.direction_y
def draw(self):
pygame.draw.rect(self.surface, self.color, [0,0,self.rect.width,self.rect.height])
def blit(self):
screen.blit(self.surface, self.rect)
player1 = player(screen, pygame.Surface((50,50)), white)
player1.set_pos(50,50)
player1.draw()
#--- define game variables ---#
previous = time.time() * 1000
lag = 0.0
background = black
done = False
#--- game ---#
while not done:
#--- update time step ---#
current = time.time() * 1000
elapsed = current - previous
lag += elapsed
previous = current
#--- process events ---#
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
break
if event.type == pygame.VIDEORESIZE:
screen = pygame.display.set_mode((event.w, event.h), pygame.RESIZABLE)
#--- update logic ---#
while True:
player1.advance_pos()
lag -= fps
if lag <= fps:
break
#--- draw to screen ---#
screen.fill(background)
player1.blit()
pygame.display.update()
pygame.time.Clock().tick(fps)
Принимали ли вы посмотрите на [этой] ссылке (http://gamedev.stackexchange.com/questions/102586/locking-the-frame-rate-in-pygame)? Полученный ответ дает некоторые полезные советы. Если вам нужно ровно 60 кадров в секунду, вам нужен vsync, который я не уверен в pygame, если вы не используете что-то вроде pyopengl для рендеринга pygame. – CodeSurgeon
Я не знал о PyOpenGL. Благодаря! – Jace
Изучение OpenGL с нуля может быть довольно сложным, если вы раньше не работали с ним. Если это поможет, я могу опубликовать демоверсию, которая повторяет то, что вы уже написали, используя pygame и pyopengl. – CodeSurgeon