Pygame 使用 pygame.Surface() 后 sprite 不会更新

Pygame sprite won't update after I use pygame.Surface()

我正在使用 pygame 制作一个简单的平台游戏,但我似乎无法弄清楚如何更新我的 sprite(目前它只是一个矩形)。每一个提示都将不胜感激。

这是我的代码:

class Player(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self) 
    self.image = pygame.Surface((50, 50))
    self.image.fill(WHITE)
    self.rect = self.image.get_rect()
    self.rect.center = (WIDTH / 2, HEIGHT / 2)
    self.pos = vect(WIDTH / 2, HEIGHT / 2)
    self.vel = vect(0, 0)
    self.acc = vect(0, 0)



def update(self):
    self.acc = vect(0, 0)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        self.acc.x = -0.5
    if keys[pygame.K_RIGHT]:
        self.acc.y = 0.5
    self.vel += self.acc
    self.pos += self.vel + 0.5 * self.acc
    self.rect.center = self.pos



player = Player()
FPS = 40
RECT_WIDTH = 50
RECT_HEIGHT = 50
run = True



while run:
pygame.time.Clock().tick(FPS)

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

screen.fill(LIGHT_PURPLE)

player.update()


pygame.display.flip()

我没有像颜色变量赋值那样把所有的东西都放在一起,但我很确定这里有错误

2 个选项:

A)。添加绘图功能并绘制精灵 -简单修复

B)。制作精灵组并绘制所有精灵 - 如果使用大量精灵则很好

绘图函数

 def update(self):
        self.acc = vect(0, 0)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.acc.x = -0.5
        if keys[pygame.K_RIGHT]:
            self.acc.y = 0.5
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        self.rect.center = self.pos
        self.draw() # draw the sprite

    def draw(self):
        screen.blit(self.image,self.rect)

精灵组:

Sprites = pygame.sprite.Group()

player = Player()
Sprites.add(player)

然后循环

Sprites.update() # calls the update function in every sprite
Sprites.draw(screen) # draws every sprite onto the screen

作为,使用群组来更新和绘制您所有的精灵。

这是一个基于您的代码的完整 运行 示例:

import pygame
pygame.init()

WHITE = pygame.Color('WHITE')
LIGHT_PURPLE = pygame.Color('PURPLE')
vect = pygame.Vector2

class Player(pygame.sprite.Sprite):
    def __init__(self, screen_r):
        pygame.sprite.Sprite.__init__(self) 
        self.image = pygame.Surface((50, 50))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = screen_r.center
        self.pos = vect(self.rect.center)
        self.vel = vect(0, 0)
        self.acc = vect(0, 0)



    def update(self):
        self.acc = vect(0, 0)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.acc.x = -0.5
        if keys[pygame.K_RIGHT]:
            self.acc.x = 0.5
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        self.rect.center = self.pos

screen = pygame.display.set_mode((800, 600))
screen_r = screen.get_rect()

player = Player(screen_r)
FPS = 60
RECT_WIDTH = 50
RECT_HEIGHT = 50
run = True


all_sprites = pygame.sprite.Group(player)

while run:
    pygame.time.Clock().tick(FPS)

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

    all_sprites.update()
    screen.fill(LIGHT_PURPLE)
    all_sprites.draw(screen)
    pygame.display.flip()