【问题标题】:Pygame Sprite. How to create different enemies/images from same class?Pygame 精灵。如何从同一类创建不同的敌人/图像?
【发布时间】:2013-07-25 13:06:08
【问题描述】:

我正在使用 Pygame 构建一个基于平台的小型游戏。我想从为我的敌人提供一个图形到几个不同的图形。我的想法是将它们全部放在一个数组中,并在初始化时从中随机绘制,以获得几个带有随机选择图形的精灵。

但结果是我得到了所有精灵的enemy1.png 或enemy2.png。我不确定这是否真的很简单并且我只是看不到它,或者我是否需要为我希望敌人拥有的每个新图形扩展敌人类?

我尝试了两件本质上相同的事情,并且我从两者中得到了相同的结果。

第一个想法:

class Enemy(pygame.sprite.Sprite):

    enemyArray = [pygame.image.load('enemy1.png'), pygame.image.load('enemy2.png')]

    def __init__(self, location, *groups):
        super(Enemy, self).__init__(*groups)

        for i in self.enemyArray:
            self.image = choice(self.enemyArray)

        self.rect = pygame.rect.Rect(location, self.image.get_size())
        self.direction = 1

第二个想法:

class Enemy(pygame.sprite.Sprite):

    enemyArray = [pygame.image.load('enemy.png'), pygame.image.load('bomb.png')]
    for i in enemyArray:
        image = choice(enemyArray)

    def __init__(self, location, *groups):
        super(Enemy, self).__init__(*groups)

        self.rect = pygame.rect.Rect(location, self.image.get_size())
        self.direction = 1

我已经使用互联网找到了一些指导,但我找不到任何似乎可以解决此问题的方法。任何东西都有帮助,从现成的代码 sn-ps 到可能启发我的链接。

更新:

class Game(object):
    def main(self, screen):
        ...
        self.enemies = tmx.SpriteLayer()
        for enemy in self.tilemap.layers['triggers'].find('enemy'):
            Enemy((enemy.px, enemy.py), self.enemies)
        self.tilemap.layers.append(self.enemies)

我使用我在 Tiled 中创建的瓷砖地图,因此对于每个敌人触发,都会产生一个敌人。这够了吗?

【问题讨论】:

  • 能否请您展示您如何实例化和使用您的 Enemy 类?
  • 是的,这有帮助吗?

标签: python pygame sprite


【解决方案1】:

在第二个想法中你有一行:

image = choice(enemyArray)

这应该不起作用,因为您正在制作一个局部变量图像,它根本不会存储到 Enemy 类中。但是你在第一个想法中没有这个错误。设置属性的正确方法是这样的:

self.image = choice(enemyArray)

然后你可以改变:

 for i in enemyArray:
     image = choice(enemyArray)

进入:

image = choice(enemyArray)

因为它应该没有区别,当你有 2 张图片在enemyArray 中时,你只是掷骰子 2 次。

【讨论】:

  • 这个想法是有 10 个不同的敌人,行为相同,但看起来不同。游戏的目标只是杀死敌人,让他们看起来不同只是为了我自己的乐趣。但是,是的,那是一回事,但你的建议并没有达到我想要的效果。
  • 是的,我已经尝试减少代码并将enemyArray 替换为[1,2],并且我能够在2 个实例中生成不同的选择,您能否显示更多代码?
  • 我没有将敌人存储在列表中,它们是在敌人的瓷砖地图触发器上生成的。
  • 您的触发器生成如何?你只是在某个地方设置了xyz = Enemy吗? (不带括号和参数)这将引用在您声明类后存在的单个 Enemy 实例,因此它们都将具有相同的图片。
猜你喜欢
  • 2020-05-11
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2015-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多