如何解决简单 pygame 刺激中的对象滞后/传送
我正在尝试创建一个简单的程序来刺激双星系统中的恒星旋转,但是当我运行该程序时,其中一个“恒星”出现故障,实际上是围绕给定的路径传送到不同的位置。我怎样才能解决这个问题?代码如下:
import pygame,sys,math,keyboard
run = True
black = (255,255,255)
white = (0,0)
angle = 0
size = width,height = 1550,800
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
screen.fill(black)
while run:
msElapsed = clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
def star1():
global angle
screen.fill(white)
x = int(math.cos(angle) * 70) + 775
y = int(math.sin(angle) * 100) + 400
pygame.draw.circle(screen,black,(x,y),10)
pygame.display.flip()
angle += 0.05
def star2():
global angle
screen.fill(white)
x = int(math.cos(angle) * 100) + 775
y = int(math.sin(angle) * 70) + 400
pygame.draw.circle(screen,10)
pygame.display.flip()
angle += 0.05
star1()
star2()
if keyboard.is_pressed('Esc'):
print("System Terminated ('ESC')")
sys.exit(0)
pygame.quit()
解决方法
问题是由 screen.fill(white)
和多次调用 pygame.display.flip()
引起的。 fill()
函数用纯色填充整个 Surface。在应用程序循环开始时调用 fill 一次。在应用程序循环结束时更新显示就足够了。多次调用 pygame.display.update()
或 pygame.display.flip()
会导致闪烁。
从您的代码中删除对 pygame.display.flip()
的所有调用,但在应用程序循环结束时调用一次。
您根本不需要 keboard
包。改用 pygame.key.get_pressed()
。
while run:
msElapsed = clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
def star1():
global angle
# screen.fill(white) <--- DELTE
x = int(math.cos(angle) * 70) + 775
y = int(math.sin(angle) * 100) + 400
pygame.draw.circle(screen,black,(x,y),10)
# pygame.display.flip() <--- DELTE
angle += 0.05
def star2():
global angle
# screen.fill(white) <--- DELTE
x = int(math.cos(angle) * 100) + 775
y = int(math.sin(angle) * 70) + 400
pygame.draw.circle(screen,10)
# pygame.display.flip() <--- DELTE
angle += 0.05
screen.fill(white) # <--- ADD
star1()
star2()
pygame.display.flip() # <--- ADD
keys = pygame.key.get_pressed() # <--- CHANGE
if keys[pygame.K_ESCAPE]:
print("System Terminated ('ESC')")
sys.exit(0)
请注意,您对两个对象使用相同的 angle
。因此,angle
在每一帧中增加两次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。