问题描述
我正在尝试创建一个简单的程序来刺激双星系统中的恒星旋转,但是当我运行该程序时,其中一个“恒星”出现故障,实际上是围绕给定的路径传送到不同的位置。我怎样才能解决这个问题?代码如下:
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
在每一帧中增加两次。