敌人被杀后继续射击

问题描述

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.Grouppygame.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()获取。