【问题标题】:Pygame Asteroid spawning issuesPygame小行星产卵问题
【发布时间】:2016-11-18 00:43:59
【问题描述】:

代码应该在岩石列表中的任何精灵与子弹精灵碰撞后生成一个临时的岩石精灵。目前,临时岩石不会生成。当我运行程序打印岩石列表的长度时,如果我射击一颗小行星,数字会增加,但不会产生新的。

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

【问题讨论】:

  • 使用按钮 {} 在 SO 上正确格式化代码。
  • 运行时是否收到错误消息?显示有问题的完整消息(回溯)。
  • 旧方法:使用print() 查看变量中的值以及执行的代码部分。这样你就可以找到问题所在。 (或学习如何使用调试器)
  • 没有错误。似乎所有代码都已执行,但没有生成新的精灵
  • 可能代码没有被执行——使用print()来检查。

标签: pygame


【解决方案1】:

问题很可能出在此处:

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(),这应该可以解决问题。

【讨论】:

  • self.rockGroup.add(self.tempRock)
  • @Sean 是的,这就是这样做的方式。
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多