在Pygame中与角色精灵碰撞时加载爆炸图像

时间:2017-04-15 23:47:05

标签: python pygame

当弹丸与特朗普精灵发生碰撞时,我正在使用教程中的逐字代码来触发爆炸。我已经粘贴在爆炸类下面,加载了爆炸图像的代码部分,以及我在更新部分中进行碰撞的代码。我收到以下错误self.image = explosion_anim [self.size] [0] NameError:name' explosion_anim'没有定义。我开始认为这是因为我在代码中稍后定义了explosion_anim,但是教程中的人有他的代码就像我的代码。如果有人可以请求帮助。

class Explosion(pg.sprite.Sprite):
    def __init__(self, center, size):
        pg.sprite.Sprite.__init__(self)
        self.size = size
        self.image = explosion_anim[self.size][0]
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.frame = 0
        self.last_update = pg.time.get_ticks()
        self.frame_rate = 50

    def update(self):
        now = pg.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame += 1
            if self.frame == len(explosion_anim[self.size]):
                self.kill()
            else:
                center = self.rect.center
                self.image = explosion_anim[self.size][self.frame]
                self.rect = self.image.get_rect()
                self.rect.center = center

我忘了注意这个东西在load_images下。它可能不是最好的地方。

def load_images
        #other images loaded here
        explosion_anim = {}
        explosion_anim['lg'] = []
        explosion_anim['sm'] = []
        for i in range(9):
            filename = 'regularExplosion0{}.png'.format(i)
            img = pg.image.load(filename).convert()
            img.set_colorkey(BLACK)
            img_lg = pg.transform.scale(img, (75, 75))
            explosion_anim['lg'].append(img_lg)
            img_sm = pg.transform.scale(img, (32, 32))
            explosion_anim['sm'].append(img_sm)

执行冲突的代码部分如下。

 def update:
       TrumpHits = pg.sprite.spritecollide(self.trump, self.projectiles, True)
        for hit in TrumpHits:
            print("TRUMP HIT!!!")
            expl = Explosion(hit.rect.center, 'lg')
            all_sprites.add(expl)

3 个答案:

答案 0 :(得分:2)

self.image = explosion_anim[self.size][0]

这就是错误所在。抛出错误是因为在初始化对象时(即在explosion_anim方法中)引用字典__init()__但字典在您the update()方法中创建它之前甚至不存在1}}方法。

而不是self.image = explosion_anim[self.size][0]尝试:

img = pg.image.load('regularExplosion00.png').convert()
img.set_colorkey(BLACK)
if size == 'lg':
    self.image = pg.transform.scale(img, (75, 75))
elif size == 'sm':
    self.image = pg.transform.scale(img, (32, 32))

明确地说,这应该是您的新__init()__

def __init__(self, center, size):
    pg.sprite.Sprite.__init__(self)
    self.size = size

    img = pg.image.load('regularExplosion00.png').convert()
    img.set_colorkey(BLACK)
    if size == 'lg':
        self.image = pg.transform.scale(img, (75, 75))
    elif size == 'sm':
        self.image = pg.transform.scale(img, (32, 32))

    self.rect = self.image.get_rect()
    self.rect.center = center
    self.frame = 0
    self.last_update = pg.time.get_ticks()
    self.frame_rate = 50

答案 1 :(得分:1)

首先全局加载图像。 (我已将它们放入名为' Explosions'的目录中。)

EXPLOSION_IMGS = [pg.image.load(os.path.join('Explosions', img)).convert_alpha()
                  for img in os.listdir('Explosions')]

然后将Explosions类减少到此版本。它访问全局常量EXPLOSION_IMGS列表,然后在经过所需时间后,在update方法中递增帧计数器。

class Explosion(pg.sprite.Sprite):
    def __init__(self, center):
        pg.sprite.Sprite.__init__(self)
        self.image = EXPLOSION_IMGS[0]
        self.rect = self.image.get_rect(center=center)
        self.frame = 0
        self.last_update = pg.time.get_ticks()
        self.frame_rate = 50

    def update(self):
        now = pg.time.get_ticks()
        if now - self.last_update > self.frame_rate:
            self.last_update = now
            self.frame += 1
        if self.frame == len(EXPLOSION_IMGS):
            self.kill()
        else:
            self.image = EXPLOSION_IMGS[self.frame]
            self.rect = self.image.get_rect(center=self.rect.center)

在游戏类的update方法中,创建expl实例并将其添加到self.all_sprites组。完成。

class Game:

    def update(self):
        # ...
        TrumpHits = pg.sprite.spritecollide(self.trump, self.projectiles, True)
        for hit in TrumpHits:
            print("TRUMP HIT!!!")
            expl = Explosion(hit.rect.center)
            self.all_sprites.add(expl)

答案 2 :(得分:0)

我必须为Explosion类定义我的图像。应该知道的。更新。我只显示了9中的一个图像。我已经完成了上述所有更改,但显然它并没有循环显示。