精灵为什么不向上移动?

时间:2014-08-27 02:26:33

标签: python image pygame blit

我为我的游戏上了一堂课:

class Magazine(pygame.sprite.Sprite):
    def __init__(self, image, shooter):
        self.image = image
        self.xCoord = shooter.xCoord + (shooter.image.get_width()/2) - (self.image.get_width()/2)
        self.yCoord = shooter.yCoord - self.image.get_height()

    def update(self):
        self.yCoord -= 5
        if self.yCoord <= 0 - self.image.get_height():
            self.kill()

我创建了这个类的一个项目,在游戏循环中使用xCoord和yCoord进行blitting:

    for gameObject in gameObjects:
        gameObject.update()
gameObjectsBlittingCounter = 0

for gameObject in gameObjects:
    screen.blit(gameObjects[gameObjectBlittingCounter].image,       ((gameObjects[gameObjectBlittingCounter].xCoord),         (gameObjects[gameObjectBlittingCounter].yCoord)))
    gameObjectBlittingCounter += 1

该项目位于gameObjects列表中。但是,它只会在同一个地方一遍又一遍地点亮物体,而不会移动。为什么呢?

2 个答案:

答案 0 :(得分:1)

我没有看到你在blitting的代码,但是如果你使用图像自己的rect来自MySprite.image.get_rect()或者其他什么,那么它的x和y坐标需要更新(或者也)。只需移动obj.xCoord和obj.yCoord就不会自动更新rect;在这种情况下,您可以做的一件事是在调用get_rect()时传递rect的位置参数。例如:

target_rect = MySprite.image.get_rect(topleft=(MySprite.xCoord, MySprite.yCoord))
MyScreen.blit(MySprite.image, target_rect)

每次绘制图像时都需要调用上面的代码。

另一种选择是将精灵的rect属性与yCoord一起更新。有几种方法可以做到这一点。你可以明确地做到这一点:

def update(self):
    self.y -= 5
    self.rect.y -= 5

您还可以使用属性来确保您的对象始终引用并更新rect的x和y坐标,但这会变成相当多的代码。

class MySprite(pygame.sprite.Sprite):
    def __init__(self, image, x, y):
        super(MySprite, self).__init__()
        self.image = image
        self.rect = image.get_rect(topleft=(x, y))
        self._x = x
        self._y = y

    @property
    def x(self):
        return self._x

    @x.setter
    def x(self, v):
        self._x = v
        self.rect.x = self._x

    @property
    def y(self):
        return self._y

    @y.setter
    def y(self, v):
        self._y = v
        self.rect.y = self._y

通过这种方式,MySprite.x始终是rect对象的x,MySprite.y也是如此。

无论如何,用于绘制精灵的任何坐标都需要与精灵的独立x和y坐标一起更新。

答案 1 :(得分:0)

检查你的self.yCoord是&gt; = 0,它有可能不会导致没有移动。

另外,你不能替换

gameObjectBlittingCounter = 0
for gameObject in gameObjects:
    gameObjects[gameObjectBlittingCounter].update()
    gameObjectBlittingCounter += 1 

使用:

for gameObject in gameObjects:
    gameObject.update()