2017-05-19 25 views
1

問題無法顯示超過1個精靈 - pygame的

我的問題是,我有一個遊戲,在遊戲開始產生8個障礙。問題是,當我遍歷障礙列表並更新精靈組時,它只會生成1個精靈。

我希望發生的

當遊戲加載,我想8個平方從速度隨意窗口頂部飛下來,並在隨機位置開始。

什麼是目前破天

目前,當遊戲加載,只有一個正方形從屏幕上落下。

Python代碼

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() 

回答

1

你的代碼是由

  • 添加缺失的進口
  • 添加缺失的常量
  • 重命名animateObstacle類固定update
  • 使用Clock限制幀率
  • 添加事件處理
  • 添加代碼來創建一個Game實例

一些更多的改進繪圖

  • 後調用pygame.display.update

    • 沒有必要對於obstaclesList如果您已經有obstacles
    • 你可以直接傳遞到GroupsSprite__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()