当弹丸与特朗普精灵发生碰撞时,我正在使用教程中的逐字代码来触发爆炸。我已经粘贴在爆炸类下面,加载了爆炸图像的代码部分,以及我在更新部分中进行碰撞的代码。我收到以下错误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
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)
答案 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中的一个图像。我已经完成了上述所有更改,但显然它并没有循环显示。