玩家位置未在 pygame 中更新

Player position not being updated in pygame

我在 pygame 制作游戏,当我为菜单和播放时间添加不同的音乐时,我遇到了玩家位置未更新周期的问题,因此我将代码简化为只测试播放器,当我 运行 它作为

主文件


 import pygame

pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))

WIDTH = 800
HEIGHT = 600

wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

running = True
while running:
    p.move()
    p.render(wn)
    clock.tick(60)
    pygame.display.flip()

玩家class

import pygame
pygame.init()

class playerOBJ:
    def __init__(self, color, size, vel, pos):
        self.color = color
        self.width, self.height = size

        self.vel = vel
        self.diag = 3.5
        self.up = 1
        self.left = 1
        self.down = 1
        self.right = 1

        self.xpos, self.ypos = pos

        self.shape = (self.xpos, self.ypos, self.width, self.height)
        self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)
        self.dead = False

    def render(self, screen):
        pygame.draw.rect(screen, self.color, self.shape)
    
    def move(self):

        key = pygame.key.get_pressed()
        if key[pygame.K_w]:
            if key[pygame.K_w] and key[pygame.K_a]:
                self.xpos -= self.diag * self.left
                self.ypos -= self.diag * self.up
                

            elif key[pygame.K_w] and key[pygame.K_d]:
                self.xpos += self.diag * self.right
                self.ypos -= self.diag * self.up

            elif key[pygame.K_w]:
                self.ypos -= self.vel * self.up

            
        elif key[pygame.K_s]:
            if key[pygame.K_s] and key[pygame.K_a]:
                self.xpos -= self.diag * self.left
                self.ypos += self.diag *self.down
            
            elif key[pygame.K_s] and key[pygame.K_d]:
                self.xpos += self.diag * self.right
                self.ypos += self.diag * self.down     

            elif key[pygame.K_s]:
                self.ypos += self.vel * self.down
            
        elif key[pygame.K_a]:
            self.xpos -= self.vel * self.left
        
        elif key[pygame.K_d]:
            self.xpos += self.vel * self.right

        self.shape = (self.xpos, self.ypos, self.width, self.height)
        self.rect = pygame.Rect(self.xpos, self.ypos, self.width, self.height)

我从这个项目的测试版本

复制了一个工作移动class

尝试向您的 main.py 文件添加 pygame.event.get() 调用,来自:

import pygame

pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))

WIDTH = 800
HEIGHT = 600

wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

running = True
while running:
    p.move()
    p.render(wn)
    clock.tick(60)
    pygame.display.flip()

至:


import pygame

pygame.init()
from game.player import playerOBJ
p = playerOBJ((0, 255, 0), (5, 5), 5, (30, 30))

WIDTH = 800
HEIGHT = 600

wn = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    p.move()
    p.render(wn)
    clock.tick(60)
    pygame.display.flip()

pygame.quit()

实际上,如果您不关心检查诸如关闭 pygame window 之类的事件,则不需要额外的 for 循环;一个简单的 pygame.event.get() 调用就足够了。