我为我的游戏上了一堂课:
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列表中。但是,它只会在同一个地方一遍又一遍地点亮物体,而不会移动。为什么呢?
答案 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()