2016-11-18 54 views
0

該代碼應該在岩石列表中的任何精靈與子彈精靈碰撞後產生一個臨時岩石精靈。目前,臨時岩石不會產卵。當我運行程序打印岩石列表的長度時,如果我拍攝一個小行星,但數量會增加,但新的不會產生。Pygame小行星產卵問題

class Rock(gameEngine.SuperSprite): 

    def __init__(self, scene): 
     gameEngine.SuperSprite.__init__(self, scene) 

     self.setImage("rock.gif") 
     self.reset() 
    def checkEvents(self): 
     self.rotateBy(self.rotSpeed) 

    def reset(self): 
     """ change attributes randomly """ 

     self.hitOnce = False 
     #set random position 
     x = random.randint(0, self.screen.get_width()) 
     y = random.randint(0, self.screen.get_height()) 
     self.setPosition((x, y)) 

     #set random size 
     scale = random.randint(20, 40) 
     self.scale = scale 
     self.setImage("rock.gif") 
     self.imageMaster = \ 
      pygame.transform.scale(self.imageMaster, (scale, scale)) 

     self.speed = random.randint(1,6) 
     self.angle = random.randint(0, 360) 
     self.setSpeed(self.speed) 
     self.setAngle(self.angle) 
     self.rotSpeed = random.randint(-5, 5)  


class Game(gameEngine.Scene, gameEngine.SuperSprite): 

    def __init__(self): 

     gameEngine.Scene.__init__(self) 
     self.ship = Ship(self) 
     self.bullet = Bullet(self) 

     self.rocks = [] 
     for i in range(10): 
      self.rocks.append(Rock(self)) 

     self.score = -50 
     self.lives = 11 

     self.lblInfo = gameEngine.Label() 
     self.lblInfo.center = (175, 20) 
     self.lblInfo.size = (350, 30) 

     self.rockGroup = self.makeSpriteGroup(self.rocks) 
     self.addGroup(self.rockGroup) 
     self.sprites = [self.bullet, self.ship, self.lblInfo] 
     self.setCaption("asteroids") 

    def update(self): 
     rockHitShip = self.ship.collidesGroup(self.rocks) 
     if rockHitShip: 
      rockHitShip.reset() 
      self.lives -= 1 

     rockHitBullet = self.bullet.collidesGroup(self.rocks) 
     if rockHitBullet: 
      if rockHitBullet.scale >= 20: 
       rockHitBullet.setSpeed(rockHitBullet.speed * -1) #inverts the direction 
       rockHitBullet.imageMaster = \ 
        pygame.transform.scale(rockHitBullet.imageMaster, (rockHitBullet.scale/2, rockHitBullet.scale/2)) 

       self.tempRock = Rock(self) 
       self.tempRock.rect.center = rockHitBullet.rect.center 
       self.tempRock.dir = (rockHitBullet.dir - 90) 
       self.rocks.append(self.tempRock) 

      else: 
       rockHitBullet.reset() 

      self.bullet.reset() 
      self.score += 50 
+0

使用按鈕'{}'在SO上正確格式化代碼。 – furas

+0

當你運行它時你會收到錯誤信息嗎?顯示**完整的信息(追溯)問題。 – furas

+0

舊方法:使用'print()'來查看變量中的值以及代碼的哪一部分被執行。這樣你可以找到問題。 (或學習如何使用debuger) – furas

回答

0

問題很可能就出在這裏:

self.tempRock = Rock(self) 
self.tempRock.rect.center = rockHitBullet.rect.center 
self.tempRock.dir = (rockHitBullet.dir - 90) 
self.rocks.append(self.tempRock) 

您正在創建一個新的搖滾,設置位置和方向。然後你將它添加到你的岩石列表中。所以你會看到岩石的數量增加,但你不會在屏幕上看到它,因爲你可能使用rockGroup()來繪製你的精靈。你在init中注意到了這一點,但不在更新方法中。 嘗試將tempRock添加到rockGroup(),並且應該做到這一點。

+0

'self.rockGroup.add(self.tempRock)' –

+0

@Sean是的,那將是實現它的方法。 – thebergh