我为我的敌人制作了一个pygame.sprite.group。 我可以在屏幕上显示它们,但我不知道如何让它们全部移动? 我想让他们在平台上来回踱步(如左右不断)。 我知道如何使用一个精灵的动作,但不是一组精灵。
这就是我现在所拥有的:
class Platform(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('levoneplatform.png')
self.rect = self.image.get_rect()
class Enemy(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('enemy.png')
self.rect = self.image.get_rect()
class LevOne():
def __init__(self):
self.background_image = pygame.image.load('night.png').convert_alpha()
platforms_one = [ (200,300),
(50,500),
(550,650),
(300,200),
(120,100)
]
for k,v in platforms_one:
platform = Platform()
enemy = Enemy()
platform.rect.x = k
enemy.rect.x = k
platform.rect.y = v
enemy.rect.y = v - 44
platform_list.add(platform)
enemy_list.add(enemy)
def update(self):
screen.blit(self.background_image, [0, 0])
screen = pygame.display.set_mode((800,600))
enemy_list = pygame.sprite.Group()
platform_list = pygame.sprite.Group()
其余的基本上就像我的状态变化和更新。 我不知道如何移动整个精灵组。我知道如何在一个列表中移动一个精灵,但不是一堆精灵。
答案 0 :(得分:0)
我会向您的Enemy类引入2个新属性: dx 和 platform 。 dx 是x方向的当前速度,平台是敌人所处的平台。您必须将平台作为参数传递给您的敌人对象,这不应该是一个问题(只是在创建平台和敌人时传递它)。你的敌人课程现在看起来像这样:
class Enemy(pygame.sprite.Sprite):
def __init__(self, platform):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('enemy.png')
self.rect = self.image.get_rect()
self.dx = 1 # Or whatever speed you want you enemies to walk in.
self.platform = platform
由于你的敌人继承了pygame.sprite.Sprite,你可以使用以下内容覆盖update()方法:
class Enemy(pygame.sprite.Sprite):
def __init__(self, platform):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load('enemy.png')
self.rect = self.image.get_rect()
self.dx = 1 # Or whatever speed you want you enemies to walk in.
self.platform = platform
def update(self):
# Makes the enemy move in the x direction.
self.rect.move(self.dx, 0)
# If the enemy is outside of the platform, make it go the other way.
if self.rect.left > self.platform.rect.right or self.rect.right < self.platform.rect.left:
self.dx *= -1
你现在可以做的就是在你的游戏循环中调用精灵组enemy_list.update()
,它会调用你所有敌人的更新方法,让它们移动。
我不知道您项目的其余部分是什么样的,但考虑到您提供的代码,这应该可行。你以后可以做的是在更新方法中消磨时间,这样你的敌人就不会根据fps移动,而是按时间移动。只要该组中的所有对象都具有带相同参数的update方法,pygame.sprite.Group.update()方法就会接受任何参数。
有关详细信息,请查看此talk或阅读pygame docs。