不能显示超过 1 个精灵 - PyGame



>问题

我的问题是我有一个游戏在游戏开始时生成 8 个障碍。问题是,当我循环浏览障碍物列表并更新精灵组时,它只会生成 1 个精灵。

我想发生什么

当游戏加载时,我希望 8 个方块以随机速度从窗口顶部飞下来,并从随机位置开始。

当前正在发生的事情

目前,当游戏加载时,只有一个方块从屏幕上掉落。

密码

OBSTICLES_AMOUNT = 8
class Obstacle(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.image = pygame.Surface((30, 30))
    self.image.fill(BLUE)
    self.rect = self.image.get_rect()
    self.rect.x = random.randrange(0, WIDTH - self.rect.width)
    self.rect.y = random.randrange(-100, -40)
    self.velY = 6
def animate(self):
    self.rect.y += self.velY
class Game(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    pygame.init()
    pygame.mixer.init()
    self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
    pygame.display.set_caption(TITLE)
    self.running = True
    self.clock = pygame.time.Clock()
    self.obstaclesList = []
    self.allSprites = pygame.sprite.Group()
    self.obstacles = pygame.sprite.Group()
def new(self):
    # create a new game
    # add obstacles to list
    for i in range(OBSTICLES_AMOUNT):
        self.obstacle = Obstacle()
        self.obstaclesList.append(self.obstacle)
    # make new sprite using list
    for i in self.obstaclesList:
        self.allSprites.add(i)
        self.obstacles.add(i)
    self.gameLoop()
def gameLoop(self):
    # main game loop
    while self.running:
        self.draw()
def draw(self):
    self.screen.fill(WHITE)
    self.allSprites.draw(self.screen)
    for sprites in self.obstaclesList:
        sprites.update()
    self.allSprites.update()

您的代码由

  • 添加缺少的导入
  • 添加缺少的常量
  • animate重命名为 Obstacle类中的update
  • 绘制后调用pygame.display.update
  • 使用Clock限制帧速率
  • 添加事件处理
  • 添加代码以创建Game实例

更多改进:

  • 如果您已经有obstacles,则无需obstaclesList
  • 您可以将Groups直接传递给Sprite__init__函数
  • 删除不再显示在屏幕上的Sprite

代码如下:

import pygame
import random
OBSTICLES_AMOUNT = 8
WIDTH, HEIGHT = 800,600
TITLE='some game of falling stuff'
BLUE = pygame.color.THECOLORS['blue']
WHITE = pygame.color.THECOLORS['white']
class Obstacle(pygame.sprite.Sprite):
    def __init__(self, *args):
        pygame.sprite.Sprite.__init__(self, *args)
        self.image = pygame.Surface((30, 30))
        self.image.fill(BLUE)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0, WIDTH - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.velY = 6
    def update(self):
        self.rect.y += self.velY
        if self.rect.y > HEIGHT:
            self.kill()
class Game(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        pygame.init()
        pygame.mixer.init()
        self.clock = pygame.time.Clock()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption(TITLE)
        self.running = True
        self.clock = pygame.time.Clock()
        self.allSprites = pygame.sprite.Group()
        self.obstacles = pygame.sprite.Group()
    def new(self):
        # create a new game
        # add obstacles to list
        for i in range(OBSTICLES_AMOUNT):
            Obstacle(self.allSprites, self.obstacles)
        while self.running:
            self.allSprites.update()
            for e in pygame.event.get():
                if e.type == pygame.QUIT:
                    self.running = False
            self.draw()
            self.clock.tick(60)
    def draw(self):
        self.screen.fill(WHITE)
        self.allSprites.draw(self.screen)
        for sprites in self.obstacles:
            sprites.update()
        pygame.display.update()
if __name__ == '__main__':
    Game().new()

最新更新