在 pygame 中用 wasd 和箭头键分别移动两个反应?

Move two rects seperately with wasd and arrow keys in pygame?

我不熟悉 pygame 和 python 本身的编程。我正在尝试使用 pygame 制作一个简单的本地多人游戏。我在观看有关仅移动一个矩形的教程时编写了我的代码,因为我没有找到任何有关我正在尝试做的事情的信息。完成后,我复制了脚本的一部分,其中包含变量和矩形的移动,然后粘贴并更改了变量名称,这样它就不会崩溃或发生其他问题。现在,我的问题来了:因为移动很简单,如果我按下按钮移动,它会打印一个新的矩形。因此,背景一直在刷新它的颜色(或类似的东西)所以只显示了我想移动的 one 矩形。但是如果有第二个矩形,颜色会覆盖它,并且始终只有一个可见。我该如何解决?

代码如下:

import pygame
pygame.init()

win = pygame.display.set_mode((500, 500))

pygame.display.set_caption("local multiplayer")

#variables player 1

X = 200
Y = 200
Width = 40
Height = 60
Vel = 5

#variables player 2

x = 50
y = 50
width = 40
height = 60
vel = 5

run = True
while run:
    pygame.time.delay(100)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

#player 1

    if keys[pygame.K_a]:
        X -= Vel
    if keys[pygame.K_d]:
        X += Vel
    if keys[pygame.K_w]:
        Y -= Vel
    if keys[pygame.K_s]:
        Y += Vel

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 255, 255), (X, Y, Width, Height))
    pygame.display.update()

#player 2

    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 255, 255), (x, y, width, height))
    pygame.display.update()

pygame.quit()

您在显示玩家 1 后立即执行 win.fill((0, 0, 0))。在显示第二个角色之前删除此代码。此外,将填充行保持在应用程序循环的顶部。这将给出:

pygame.init()

win = pygame.display.set_mode((500, 500))

pygame.display.set_caption("local multiplayer")

#variables player 1

X = 200
Y = 200
Width = 40
Height = 60
Vel = 5

#variables player 2

x = 50
y = 50
width = 40
height = 60
vel = 5

run = True
while run:
    win.fill((0, 0, 0))
    pygame.time.delay(100)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()

#player 1

    if keys[pygame.K_a]:
        X -= Vel
    if keys[pygame.K_d]:
        X += Vel
    if keys[pygame.K_w]:
        Y -= Vel
    if keys[pygame.K_s]:
        Y += Vel

    pygame.draw.rect(win, (255, 255, 255), (X, Y, Width, Height))

#player 2

    if keys[pygame.K_LEFT]:
        x -= vel
    if keys[pygame.K_RIGHT]:
        x += vel
    if keys[pygame.K_UP]:
        y -= vel
    if keys[pygame.K_DOWN]:
        y += vel

    pygame.draw.rect(win, (255, 255, 255), (x, y, width, height))
    pygame.display.update()

pygame.quit()

每个循环只更新一次屏幕也是一个好习惯。我要做的另一件事是将输入全部放在同一个 if 块中(但这不是必需的)。为了进一步改进您的代码 - 考虑制作一个具有渲染功能的播放器 class 来显示自己,以及一个更新功能来处理控制。

当您调用 win.fill((0, 0, 0)) 时,整个显示都被清除。清除显示后必须立即绘制矩形。
在应用程序循环结束时更新显示。多次调用 pygame.display.update()pygame.display.flip() 会导致闪烁(请参阅 )。

简化代码,使用pygame.Rect objects to represent the players. Use pygame.Rect.clamp_ip防止玩家离开画面

import pygame

pygame.init()
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("local multiplayer")
clock = pygame.time.Clock()

player1 = pygame.Rect(200, 200, 40, 60)
vel1 = 1
player2 = pygame.Rect(50, 40, 40, 60)
vel2 = 1

run = True
while run:
    clock.tick(50)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    keys = pygame.key.get_pressed()
    player1.x += (keys[pygame.K_d] - keys[pygame.K_a]) * vel1
    player1.y += (keys[pygame.K_s] - keys[pygame.K_w]) * vel1
    player2.x += (keys[pygame.K_RIGHT] - keys[pygame.K_LEFT]) * vel2
    player2.y += (keys[pygame.K_DOWN] - keys[pygame.K_UP]) * vel2
    player1.clamp_ip(win.get_rect())
    player2.clamp_ip(win.get_rect())

    win.fill((0, 0, 0))
    pygame.draw.rect(win, (255, 255, 255), player1)
    pygame.draw.rect(win, (255, 255, 255), player2)
    pygame.display.update()

pygame.quit()

典型的 PyGame 应用程序循环必须: