【发布时间】:2016-10-03 16:38:54
【问题描述】:
我有一个用“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)
【问题讨论】:
-
你看过this链接吗?那里提供的答案有一些有用的建议。如果您需要 60 fps,则需要 vsync,我不确定 pygame 是否提供,除非您使用 pyopengl 之类的东西进行 pygame 渲染。
-
我不知道 PyOpenGL。谢谢!
-
如果您以前没有使用过 OpenGL,从头开始学习 OpenGL 可能会非常具有挑战性。如果有帮助,我可以发布一个演示,复制您已经使用 pygame 和 pyopengl 编写的内容。
-
那太棒了
-
我运行了您的代码,但没有遇到任何明显的卡顿。你得到什么FPS?如果它以 60 fps 运行,则不应该有任何明显的卡顿。我还建议创建一个时钟变量,例如
clock = pygame.time.Clock()然后调用clock.tick(fps)而不是你的最后一行,这样每帧都会创建一个新的时钟对象。