微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单 pygame 刺激中的对象滞后/传送

如何解决简单 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 举报,一经查实,本站将立刻删除。