Удаление спрайтов из группы из другого класса создает имя ошибки не определено

В игре вы перемещаетесь как простой blitted изображение без анимации ходьбы или ничего и попытаться собрать ключи на пути, чтобы открыть двери С и в конечном итоге избежать тюрьмы вы находитесь в.

Я столкнулся с проблемой при попытке «ударить» охранника, который роняет ключ. Когда я пытаюсь удалить спрайт из группы, определенной в другом классе, он говорит мне, что элемент не определен.


Traceback (последний последний вызов):
Файл «C:/Users/-/Desktop/escapeprison/escape.py», строка 329, in
нынешний уровень.персонаж.удалить (npc)
NameError: имя ‘npc’ не определено


class Level(object):


    wall_list = None
    npcs = None

    def __init__(self):

        self.wall_list = pygame.sprite.Group()
        self.npcs = pygame.sprite.Group()



class Level1(Level):


    def __init__(self):

        super().__init__()

        #(x_pos, y_pos, width, height)
        #[x, y, width, height, color]

        npc = Npc(480, 40)
        npc.move = 0
        self.npcs.add(npc)
        walls = [[0, 0, 5, 500, WALL],
                 [0, 550, 5, 50, WALL],
                 [0, 0, 800, 5, WALL],
                 [0, 595, 800, 5, WALL],
                 [795, 0, 5, 600, WALL],

                 [390, 0, 5, 70, WALL],
                 [390, 120, 5, 150, WALL],
                 [390, 320, 5, 150, WALL],
                 [390, 520, 5, 80, WALL],

                 [550, 300, 5, 300, WALL],
                 [550, 300, 150, 5, WALL],
                 [750, 300, 50, 5, WALL],
                 [600, 380, 1, 150, WALL],
                 #Sellien väliseinät
                 [0, 195, 390, 5, WALL],
                 [0, 395, 390, 5, WALL]
                ]




        for item in walls:
            wall = Wall(item[0], item[1], item[2], item[3], item[4])
            self.wall_list.add(wall)

где магия должна произойти вне класса в моем игровом цикле, где, если я нажимаю пробел, он проверяет, достаточно ли я близок к npc и должен удалить его из списка

if player.rect.x >= 440 and player.rect.x <= 520 and player.rect.y >= 20 and player.rect.y <= 80:
                npc_scene = 1
                current_level.npcs.remove(npc)
                npc = Npc(480, 45)
                current_level.npcs.add(npc)

«может также понадобиться»

levels = []
level = Level1()
levels.append(level)

level = Level2()
levels.append(level)

current_level_no = 0
current_level = levels[current_level_no]

2 ответа

  1. Это исключение означает, что имя переменной npcне распознается интерпретатором в разделе кода, где вы пытались использовать его ( current_level.npcs.remove(npc)).
    Чтобы сделать его узнаваемым, вы должны получить его в качестве параметра или сделать его глобальным.

    Прочитайте о переменной области в python здесь .

  2. Добавьте метод проверки столкновений в класс Level и передайте игроку rect, а затем выполните цикл через группу npc и проверьте их на близость. Измените области, чтобы иметь все общие вещи, то каждый уровень просто стены и унаследованный код npc, что-то вроде этого? :-

    class Level(object):
    
        wall_list = None
        npcs = None
    
        def __init__(self, x, y, width, height, color):
    
            self.npcs = pygame.sprite.Group()
            self.wall_list = pygame.sprite.Group()
    
            self.add_npc(x, y, width, height)
    
        def add_npc(x, y, width, height):
            npc = Npc(x, y) #and width and height if that's what they are for
            npc.move = 0
            self.npcs.add(npc)
    
        def collision_check(player_rect):
             for npcs in self.npcs:
                 if npcs.rect.colliderect(player_rect)
                    #remove and call self.add_npc with new co-ords