无法在 Pong 游戏中正确刷新显示

Unable to properly refresh display in Pong game

import pygame, sys

pygame.init()

display_width = 800
display_height = 500

white = (255, 255, 255)

display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Pong')
clock = pygame.time.Clock()

platform_y = display_height * 0.38

def platform(color, x, y):
    global platform_y

    pygame.draw.rect(display, color, (x, y, 25, 100))

    pygame.display.update()
    clock.tick(80)

def ball():
    pygame.draw.circle(display, white, (400, 250), 12)
    pygame.display.update()

def game():
    global platform_y
    y_change = 0
    while True:
        platform(white, 100, platform_y)
        platform(white, 675, platform_y)
        ball()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                sys.exit(0)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change -= 2
                if event.key == pygame.K_DOWN:
                    y_change += 2

            if event.type == pygame.KEYUP:
                    if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                        y_change = 0

        platform_y += y_change
        pygame.display.update()
        clock.tick(80)

if __name__ == '__main__':
    game()

我想这不是最好的代码,但我一直在弄乱 pygame 并且到了必须创建 Pong 的地步,尽管我不确定为什么矩形(平台)是只是越来越高而不是上下(我知道两个平台会一起上升,会解决这个问题,这只是为了测试)

您的代码有几个问题:

  1. 您只需调用 pygame.display.update 一次,而不是在每个 pygame.draw
  2. 之后调用
  3. clock.tick设置在主游戏循环中,其他地方没有,
  4. 绘图前必须清屏。

以下可能会如您所愿:

import pygame, sys

pygame.init()

display_width = 800
display_height = 500

white = (255, 255, 255)

display = pygame.display.set_mode((display_width, display_height))
pygame.display.set_caption('Pong')
clock = pygame.time.Clock()

platform_y = display_height * 0.38


def platform(color, x, y):
    global platform_y

    pygame.draw.rect(display, color, (x, y, 25, 100))


def ball():
    pygame.draw.circle(display, white, (400, 250), 12)


def game():
    global platform_y
    y_change = 0

    while True:
        platform(white, 100, platform_y)
        platform(white, 675, platform_y)
        ball()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
            elif event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
                sys.exit(0)

            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_UP:
                    y_change -= 2
                if event.key == pygame.K_DOWN:
                    y_change += 2

            if event.type == pygame.KEYUP:
                if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                    y_change = 0

        platform_y += y_change

        pygame.display.update()
        clock.tick(80)
        display.fill((0, 0, 0))


if __name__ == '__main__':
    game()

几个建议:

  1. 不要使用global!它是坏代码的味道。当然有更好的方法可以在不使用它的情况下实现你想要的。
  2. 尽量避免大量的条件嵌套。读起来很吃力,一两天后读起来需要很大的脑力。

编码愉快!