如何解决敌人被杀后继续射击
class NPC(pg.sprite.Sprite):
def __init__(self,x,y,image):
self.copyimg = pg.image.load(image).convert_alpha()
pg.sprite.Sprite.__init__(self)
self.image = self.copyimg.copy()
#self.copyimg.fill(RED)
self.rect = self.image.get_rect()
self.radius = int(self.rect.width / 3)
#pg.draw.circle(self.copyimg,RED,self.rect.center,self.radius)
self.rect.center = (x,y)
self.pos = vec(x,y)
self.vel = vec(0,0)
self.acc = vec(0,0)
self.speed = 0.3
self.friction = -0.02
self.rot = 0
self.chasex = True
self.chasey = True
self.directing = 1
self.times = pg.time.get_ticks()
self.mainmenu = True
def rotate(self):
self.rot = self.rot % 360
newimage = pg.transform.rotate(self.copyimg,int(self.rot%360))
#pg.draw.rect(screen,WHITE,self.rect,5)
#old_center = self.rect.center
self.image = newimage
self.rect = self.image.get_rect()
#self.rect.center = old_center
def shoot(self):
bullet = BulletPlayer(self.pos.x,self.pos.y,self.rot,lasers['laserblue'][random.randint(0,len(lasers['laserblue'])-1)])
bulletgroupenemy.add(bullet)
pass
class Bullet(pg.sprite.Sprite):
def __init__(self,rotation,image):
pg.sprite.Sprite.__init__(self)
self.cop = pg.image.load(image).convert_alpha()
self.image = self.cop.copy()
self.rect = self.image.get_rect()
self.rect.bottom = y
self.rect.centerx = x
self.shootspeed = 10
self.rotation = rotation
def update(self):
self.rotation = self.rotation % 360
newimage = pg.transform.rotate(self.cop,int(self.rotation))
oldcenter = self.rect.center
self.image = newimage
self.rect = self.image.get_rect()
self.rect.center = oldcenter
keys = pg.key.get_pressed()
if self.rect.x < 0 or self.rect.x >WIDTH or self.rect.y > HEIGHT or self.rect.y < 0:
self.kill()
我有一个类似的 NPC 类和子弹类,当然还有我们可以控制的主要玩家。正如您所看到的,NPC 类中有拍摄方法。这是自动调用 当我用子弹射击 npc 并调用 spritecollide 函数时,它是由 npc 自己实现的
hitsenemy = pg.sprite.spritecollide(playerlist[i],bulletgroup,True)
if hitsenemy:
playerlist[i].kill()
NPC 被击杀是正确的,但不知何故它一直在射击。拍摄功能仍然有效,这怎么可能!。我刚刚用这个 hitsenemy
杀死了。我也使用这个 for 循环来添加 spride 组。我怎样才能防止我不希望它继续射击
playerlist = [Player(300,200,'playerShip2_blue.png')]
for players in playerlist:
allsprites.add(players)
playergroup.add(players)
我也有这个 allsprites 组 allsprites = pg.sprite.Group()
这个方法属于玩家类,我没有分享,因为这是我用玩家类拍摄的方式。
def shoot(self):
bullet = BulletPlayer(self.rect.centerx,self.rect.centery,lasers['lasergreen'])
bulletgroup.add(bullet)
allsprites.add(bullet)
解决方法
playerlist
是一个列表,但不是一个 pygame.sprite.Group
。 pygame.sprite.Sprite.kill
从所有组中删除精灵
因此,当您调用 kill
时,Sprite 会从所有 Groups 中删除,但它仍在 playerlist
中。
您必须从列表中删除 Sprite。见How to remove items from a list while iterating?
hitsenemy = pg.sprite.spritecollide(playerlist[i],bulletgroup,True)
if hitsenemy:
playerlist[i].kill()
playerlist.pop(i)
或者,考虑使用组而不是列表。注意 Group 中的 Sprites 可以迭代。而Group中的Sprites列表可以通过pygame.sprite.Group.sprites()
获取。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。