首页 > 解决方案 > 为什么我的敌人子弹碰到我的玩家时没有删除

问题描述

所以我一直在努力让它当我的敌人子弹碰到我的玩家时,它会消失。我的问题是子弹会随机工作几次,然后在下一次击中玩家时出现此错误。

eguns.pop(eguns.index(egun))
ValueError: <__main__.main_loop.<locals>.enemybullets object at 0x06F69E50> is not in list

这里还有一个短片,显示正在发生的事情。 https://gyazo.com/f7718fd6b1200af3cf2f77d1a559fa46

当我被子弹击中时,我的游戏就冻结了。

这是不工作的部分

for egun in eguns:
            for one in range(len(eguns)-1-1-1):
                if egun.rect.colliderect(playerman.rect):
                    eguns.pop(eguns.index(egun)) # this is the code that was spouse to make the bullet dissaper
                    Lives -= 1
                    text2 = font.render("Lives = "+str(Lives),True,(0,0,0))
                    textRect2.center = ((600,65))

我的完整代码

import pygame
pygame.init()

# Build The Screen
window = pygame.display.set_mode((700,500))

fps = (10)
clock = pygame.time.Clock()

# COLORS
white = (255,255,255)

darkred = (200,0,0)

darkgreen = (0,200,0)

green = (0,255,0)

red = (255,0,0)

black = (0,0,0)

#######
# Start Screen 
def text_objects(text, font):
    textSurface = font.render(text, True, black)
    return textSurface, textSurface.get_rect()

def button(msg,x,y,w,h,ic,ac,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()
    #print(click)
    if x+w > mouse[0] > x and y+h > mouse[1] > y:
        pygame.draw.rect(window, ac,(x,y,w,h))

        if click[0] == 1 and action != None:
            action()         
    else:
        pygame.draw.rect(window, ic,(x,y,w,h))

    smallText = pygame.font.SysFont("comicsansms",40)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    window.blit(textSurf, textRect)

def quitgame():
    pygame.quit()

    
def game_intro():

    intro = True

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        window.fill((255,255,255))    
        largeText = pygame.font.Font('freesansbold.ttf',95)
        TextSurf, TextRect = text_objects("AIR FLIGHT", largeText)
        TextRect.center = ((700/2),(500/2))
        window.blit(TextSurf, TextRect)

        button("Fly!",50,350,200,100,green,darkgreen,main_loop)
        button("Land!",450,350,200,100,red,darkred,quitgame)

        pygame.display.update()
        clock.tick(fps)

# Start Screen
###

def main_loop():
    global Dead

    # Name Screen
    pygame.display.set_caption("Noobs first Game")

    bg = pygame.image.load("skybg1.png")
    bg_shift = 0


    # Class Player
    class player:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 6
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("heroplane1.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))
        def draw(self):
            self.rect.topleft=(self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            player_rect = self.ss1.get_rect(center = self.rect.center)
            player_rect.centerx += -7
            player_rect.centery += -6
            window.blit(self.ss1,player_rect)

    # Class Enemy
    class Enemy:
        def __init__(self,x,y,width,height,color,imagefile):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 4
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load(imagefile)
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))

            self.etimer = 0 # <---

        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            enemy_rect = self.ss1.get_rect(center = self.rect.center)
            enemy_rect.centerx += -2
            enemy_rect.centery += -6
            window.blit(self.ss1,enemy_rect)


    # Class Enemy2
    class Enemy2:
        def __init__(self,x,y,width,height,color,imagefile):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 4
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load(imagefile)
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))

            self.etimer = 0 # <---

        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            enemy_rect = self.ss1.get_rect(center = self.rect.center)
            enemy_rect.centerx += -4
            enemy_rect.centery += -6
            window.blit(self.ss1,enemy_rect)


    class enemy3:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("enemyplane3.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))
        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            enemy3_rect = self.ss1.get_rect(center = self.rect.center)
            enemy3_rect.centerx += -4
            enemy3_rect.centery += -6
            window.blit(self.ss1,enemy3_rect)

            
    # Class Enemy3
    class Star:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("skycoin.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//12,self.ss1.get_height()//12))
        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            enemy3_rect = self.ss1.get_rect(center = self.rect.center)
            enemy3_rect.centerx += -4
            enemy3_rect.centery += -4
            window.blit(self.ss1,enemy3_rect)



    class projectile(object):
       def __init__(self, x, y,color):
           self.x = x
           self.y = y
           self.slash = pygame.image.load("herogun1.png")
           self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//11,self.slash.get_height()//11))
           self.rect  = self.slash.get_rect()
           self.rect.topleft = ( self.x, self.y )
           self.speed = 10
           self.color = color

       def draw(self, window):
           self.rect.topleft = ( self.x,self.y )
           window.blit(self.slash, self.rect)

    class enemybullets(object):
       def __init__(self, x, y,color):
           self.x = x
           self.y = y
           self.slash = pygame.image.load("enemygun1.png")
           self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//11,self.slash.get_height()//11))
           self.rect  = self.slash.get_rect()
           self.rect.topleft = ( self.x, self.y )
           self.speed = 10
           self.color = color

       def draw(self, window):
           self.rect.topleft = ( self.x,self.y )
           window.blit(self.slash, self.rect)


    class Power:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.speed = 4
            self.rect = pygame.Rect(x,y,width,height)
        def draw(self):
            self.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            import pygame
    pygame.init()

    # Build The Screen
    window = pygame.display.set_mode((700,500))

    # Name Screen
    pygame.display.set_caption("Noobs first Game")

    bg = pygame.image.load("skybg1.png")
    bg_shift = 0


    # Class Player
    class player:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 6
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("heroplane1.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))
        def draw(self):
            self.rect.topleft=(self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            player_rect = self.ss1.get_rect(center = self.rect.center)
            player_rect.centerx += -7
            player_rect.centery += -6
            window.blit(self.ss1,player_rect)

    # Class Enemy
    class Enemy:
        def __init__(self,x,y,width,height,color,imagefile):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 4
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load(imagefile)
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))

            self.etimer = 0 # <---

        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            enemy_rect = self.ss1.get_rect(center = self.rect.center)
            enemy_rect.centerx += -2
            enemy_rect.centery += -6
            window.blit(self.ss1,enemy_rect)


    # Class Enemy2
    class Enemy2:
        def __init__(self,x,y,width,height,color,imagefile):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.speed = 4
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load(imagefile)
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))

            self.etimer = 0 # <---

        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            enemy_rect = self.ss1.get_rect(center = self.rect.center)
            enemy_rect.centerx += -4
            enemy_rect.centery += -6
            window.blit(self.ss1,enemy_rect)


    class enemy3:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("enemyplane3.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//9,self.ss1.get_height()//9))
        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            enemy3_rect = self.ss1.get_rect(center = self.rect.center)
            enemy3_rect.centerx += -4
            enemy3_rect.centery += -6
            window.blit(self.ss1,enemy3_rect)

            
    # Class Enemy3
    class Star:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.rect = pygame.Rect(x,y,width,height)
            self.ss1 = pygame.image.load("skycoin.png")
            self.ss1 = pygame.transform.scale(self.ss1,(self.ss1.get_width()//12,self.ss1.get_height()//12))
        def draw(self):
            self.rect.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)

            enemy3_rect = self.ss1.get_rect(center = self.rect.center)
            enemy3_rect.centerx += -4
            enemy3_rect.centery += -4
            window.blit(self.ss1,enemy3_rect)



    class projectile(object):
       def __init__(self, x, y,color):
           self.x = x
           self.y = y
           self.slash = pygame.image.load("herogun1.png")
           self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//11,self.slash.get_height()//11))
           self.rect  = self.slash.get_rect()
           self.rect.topleft = ( self.x, self.y )
           self.speed = 10
           self.color = color

       def draw(self, window):
           self.rect.topleft = ( self.x,self.y )
           window.blit(self.slash, self.rect)

    class enemybullets(object):
       def __init__(self, x, y,color):
           self.x = x
           self.y = y
           self.slash = pygame.image.load("enemygun1.png")
           self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//11,self.slash.get_height()//11))
           self.rect  = self.slash.get_rect()
           self.rect.topleft = ( self.x, self.y )
           self.speed = 10
           self.color = color

       def draw(self, window):
           self.rect.topleft = ( self.x,self.y )
           window.blit(self.slash, self.rect)


    class Power:
        def __init__(self,x,y,width,height,color):
            self.x = x
            self.y = y
            self.width = width
            self.height = height
            self.color = color
            self.speed = 4
            self.rect = pygame.Rect(x,y,width,height)
        def draw(self):
            self.topleft = (self.x,self.y)
            pygame.draw.rect(window,self.color,self.rect)
            
        


            
    # Color
    white = (255,255,255)

    black = (0,0,0)
    # Draw Player
    playerman = player(5,250,90,40,white)

    # For Enemy
    enemy1 = Enemy(400, 100, 90, 40, white, "enemyplane1.png")
    enemy4 = Enemy(400, 400, 90, 40, white, "enemyplane1.png")

    # For Enemy2
    enemy21 = Enemy2(400,300,90,40,white,"enemyplane2.png")
    enemy22 = Enemy2(400,100,90,40,white,"enemyplane2.png")

    # For Coins

    star1 = Star(300,250,45,45,white)
    star2 = Star(300,350,45,45,white)

    # For Enemy3
    ememy31 = enemy3(400,400,90,40,white)


    # For Enemy
    enemys = [enemy1,enemy4]

    #For Coin
    stars = [star1,star2]

    # enemys
    enemyGroup = pygame.sprite.Group()
    level1 = [
    "                        1    c    1        c   1              c         c            c                                                  ",
    "      c                      1         1       1   c  1    c     1      1    1    1    1    1     1   c   c   c    c         c      ",
    "      c                   1        c        1               1      1    c            1        c         1        c       c       c  ",
    "      c            1   c      1 c       1      1    1   c1      c 1   1    1 c  1    c    1     1  c          c                               ",
    "   c  c  c  c       1    1  c      1          c1         1    1                      1   1   c1     1  c  1    1    c   c   c    c    ",
    "                   c          1      c    1            c            c   1  c  1  c          c    c                                           ",
    "                      1   1   c   1   1 c     1   c1     1   c 1    1      cc      1  c  1      1   c  1    c   c     c    c     c",]
     

    for iy, row in enumerate(level1):
        for ix, col in enumerate(row):
            if col == "1":
                new_enemy = Enemy(ix*70,iy*70,90,40,(255,255,255),"enemyplane1.png")
                enemys.append(new_enemy)
    for iy, row in enumerate(level1):
        for ix, col in enumerate(row):
            if col == "c":
                new_stars = Star(ix*70,iy*70,45,45,(255,255,255))
                stars.append(new_stars)


    enemy2Group = pygame.sprite.Group()
    level2 = [
    " ",
    " ",
    " ",
    " ",
    " ",
    " ",
    " ",]
    for iy, row in enumerate(level2):
        for ix, col in enumerate(row):
            if col == "2":
                new_enemy2 = Enemy2(ix*70,iy*70,90,40,(255,255,255),"enemyplane2.png")
                Enemy2.append(new_enemy2)


    Dead = False

    def quitgame():
        pygame.quit()

    def unpause():
        global Dead
        Dead = False

    def Die():

        largeText = pygame.font.SysFont("comicsansms",115)
        TextSurf, TextRect = text_objects("You Died!", largeText)
        TextRect.center = ((700/2),(500/2))
        window.blit(TextSurf, TextRect)

        while Dead:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()

            button("Fly!",50,350,200,100,green,darkgreen,main_loop)
            button("Land!",450,350,200,100,red,darkred,quitgame)
                

            pygame.display.update()
            clock.tick(fps)
        

    # Redrawwinodw
    def redrawwindow():
        window.fill((0,0,0))

        bg_width = bg.get_width()
        bg_offset = bg_shift % bg_width 
        
        window.blit(bg, (-bg_offset, 0)) 
        window.blit(bg, (bg_width - bg_offset, 0))

        
        # Draw playerman
        playerman.draw()

        # Draw enemy
        for enemy in enemys:
            enemy.draw()

        # Draw enemy2
        enemy21.draw()

        # Draw enemy3
        ememy31.draw()

        #Draw Coin
        for Star in stars:
            Star.draw()

        # Draw Enemy gun and playergun

        for bullet in bullets:
            bullet.draw(window)

        for egun in eguns:
            egun.draw(window)




        window.blit(text,textRect)
        window.blit(text2,textRect2)
        window.blit(text3,textRect3)
    # FPS Cnd Clock
    fps = (30)
    clock = pygame.time.Clock()

    font  = pygame.font.Font("freesansbold.ttf",30)
    score = 0
    text = font.render("Coins = "+str(score),True,(0,0,0))
    textRect = text.get_rect()
    textRect.center = ((600,40))

    font = pygame.font.Font("freesansbold.ttf",30)
    Lives = 10
    text2 = font.render("Lives = "+str(Lives),True,(0,0,0))
    textRect2 = text.get_rect()
    textRect2.center = ((600,65))

    font = pygame.font.Font("freesansbold.ttf",30)
    enemyd = 0
    text3 = font.render("Enemys Died = 10/ "+str(enemyd),True,(0,0,0))
    textRect3 = text.get_rect()
    textRect3.center = ((450,95))

    # For Bullets List And Timer
    bullets = []

    btimer = 0

    # For Enemy Bullets And Timer
    eguns = []

    etimer = 0

    # Main Loop
    run = True
    while run:
        clock.tick(fps)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False

        for Star in stars:
            for one in range(len(stars)-1,-1,-1):
                if playerman.rect.colliderect(stars[one].rect):
                    del stars[one]
                    score += 1
                    text = font.render("Coins = "+str(score),True,(0,0,0))
                    textRect.center = ((600,40))

        for enemy in enemys:
            for one in range(len(enemys)-1-1-1):
                if enemys[one].rect.colliderect(playerman.rect):
                    del enemys[one]
                    enemyd += 1
                    text3 = font.render("Enemys Died = 10/ "+str(enemyd),True,(0,0,0))
                    textRect3.center = ((450,95))
                    Lives -= 1
                    text2 = font.render("Lives = "+str(Lives),True,(0,0,0))
                    textRect2.center = ((600,65))


        for Enemys in enemys:
            if enemy.x < 0:
                enemy.x * playerman.x

        for Star in stars:
            Star.x -= playerman.speed

        ememy31.x -= playerman.speed

        


        # Timer for Bullets
        if btimer > 0:
            btimer += 1
        if btimer > 10:
            btimer = 0

        # Timer for Enemy Bullets
        if etimer > 0:
            etimer += 1
        if etimer > 13:
            etimer = 0

    # This Is Keys for bullet
        keys = pygame.key.get_pressed()

        # This is bullets and when player press Spacebar they come
        for bullet in bullets:
            if bullet.x < 700 and bullet.x > 0:
                bullet.x += bullet.speed 
            else:
                bullets.pop(bullets.index(bullet))

        if keys[pygame.K_SPACE] and btimer == 0:
            if len(bullets) < 5:
                    bullets.append(projectile(round(playerman.x+playerman.width//2),round(playerman.y + playerman.height-24),(0,0,0)))

            btimer = 1
    # Allow's enemy to disapper when it touches the player bullets
        for Enemy in enemys:
            for bullet in bullets:
                for one in range(len(enemys)-1,-1,-1):
                        if bullet.rect.colliderect(enemys[one].rect):
                            del enemys[one]
                            bullets.pop(bullets.index(bullet))
                            enemyd += 1
                            text3 = font.render("Enemys Died = 10/ "+str(enemyd),True,(0,0,0))
                            textRect3.center = ((450,95))

        #A PART OF THE Died FUNCTION
        if Lives < 1:
            Dead = True
            Die()




        # Timer for Enemy Bullets
        for enemy in enemys:
            if enemy.etimer > 0:
                enemy.etimer += 1
            if enemy.etimer > 40:
                enemy.etimer = 0

    # Allows enemy to shoot
        for egun in eguns:
            if egun.x < 700 and egun.x > 0:
                egun.x -= egun.speed 
            else:
                eguns.pop(eguns.index(egun))
                
        for Enemy in enemys:
            if Enemy.x < 700 and Enemy.etimer == 0:
                if len(eguns) < 15:
                    eguns.append(enemybullets(round(Enemy.x+Enemy.width//2),round(Enemy.y + Enemy.height-24),(0,0,0)))
                Enemy.etimer = 1

    # What make's the player lose live's when it touch the bullets for enenmy
        for egun in eguns:
            for one in range(len(eguns)-1-1-1):
                if egun.rect.colliderect(playerman.rect):
                    eguns.pop(eguns.index(egun))
                    Lives -= 1
                    text2 = font.render("Lives = "+str(Lives),True,(0,0,0))
                    textRect2.center = ((600,65))
                    


        # Makes enemy move
        for Enemy in enemys:
            Enemy.x -= Enemy.speed

        

        # For The Background Shifting
        bg_shift += round(3/2)


        # Keys For Playerman
        keys = pygame.key.get_pressed()

        if keys[pygame.K_a] and playerman.x > playerman.speed:
            playerman.x -= playerman.speed
           
            

        if keys[pygame.K_d] and playerman.x < 260 - playerman.width - playerman.speed:
            playerman.x += playerman.speed


        if keys[pygame.K_w] and playerman.y > playerman.speed:
            playerman.y -= playerman.speed


        if keys[pygame.K_s] and playerman.y < 500 - playerman.height - playerman.speed:
            playerman.y += playerman.speed

    
     

                
    # Update And Other Sutff    
        redrawwindow()
        pygame.display.update()
    pygame.quit()
    unpause()
game_intro()
main_loop()
            

标签: pythonpygame

解决方案


嵌套循环没用。由于one从未使用过,因此您无论如何都不需要内部循环。
当您想从列表中删除一个元素时,在迭代它时,您必须获取列表的副本 ( eguns[:])。请参阅如何在迭代时从列表中删除项目? . 遍历副本,但从原始列表中删除元素:

for egun in eguns[:]:
    if egun.rect.colliderect(playerman.rect):
        eguns.remove(egun)
        # [...]

无论如何,这会容易得多,并且您不会像pygame中预期的那样分别使用pygame.sprite.Sprite,pygame.sprite.Group和。pygame.sprite.spritecollide()pygame.sprite.Sprite.kill()


推荐阅读