Как добавить одну и ту же переменную несколько раз, определяющую класс - PullRequest
0 голосов
/ 10 июля 2020

Вот класс NPC:

class NPC:
    def __init__(self):
        self.x = randint(0,800)
        self.y = randint(0,60)
        self.velocity_x = 5
        self.drop_y = 60
        self.img = "my image path here"

npc = NPC()

num_npc = 5
list = []

for i in range(num_npc):
    list.append(npc)

В игре l oop отображается только одно изображение и оно неподвижно. Я пытаюсь написать старый код, чтобы он был объектно-ориентированным, и не могу понять, как лучше всего отобразить npcs

Ниже приведен старый код, который я использовал, и он работал, как ожидалось

npc_img = []
npc_x = []
npc_y = []
npc_vel_x = []
npc_vel_y = []
num_of_npc = 5

for i in range(num_of_npc):
    npc_img.append("my img path")
    npc_x.append(random.randint(0, 800))
    npc_y.append(random.randint(0, 60))
    npc_vel_x.append(4)
    npc_vel_y.append(40)

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Ваш код уже в значительной степени правильный. Однако способ создания экземпляров объектов NPC не совсем правильный. Я предполагаю, что вы хотели добавить в список 5 NPC, а не 5 ссылок на тот же объект NP C. Это то, о чем говорится в заголовке вашего вопроса!

npc = NPC()

...

for i in range(num_npc):
    list.append(npc)              # <<-- HERE, same object, 5 times

Код должен вызывать конструктор NP C в l oop, а не за его пределами.

for i in range( num_npc ):
    new_npc = NPC()
    list.append( new_npc )

Хотя вы переписываете код, возможно, стоит сохранить координаты и размеры изображения в Pygame Rect , поскольку это позволяет легко обнаруживать столкновения и другие приятные вещи.

Что-то вроде:

class NPC:
    def __init__(self):
        self.image  = pygame.image.load( "image path here" ).convert_alpha()
        self.rect   = self.image.get_rect()
        self.rect.x = randint(0,800)
        self.rect.y = randint(0,60)
        self.velocity_x = 5
        self.drop_y = 60
        
    def draw( self, screen ):
        screen.blit( self.image, self.rect )

    def hitBy( self, arrow_rect ):
        hit = self.rect.colliderect( arrow_rect )
        return hit
0 голосов
/ 10 июля 2020

Если я правильно понял, должно работать что-то вроде этого:

class NPC:
    def __init__(self):
        self.x = randint(0,800)
        self.y = randint(0,60)
        self.velocity_x = 5
        self.drop_y = 60
        self.image_list = []
        self_image_load_dict = {}

    def add_image(self, image_path):
        self.image_list.append(image_path)

    def load_images(self):
        self.image_load_dict[]
        for i in len(self.get_image_list()):
            self.image_load_dict[i] = pygame.image.load(self.get_image_list()[i])
    
    def get_image_list(self):
        return self.image_list

    def get_image_load_dict(self):
        return self.image_load_dict

Я использовал fstring, чтобы было легче загружать изображения и отслеживать номер изображения:

npc = NPC()
for i in range(NUMBER_OF_NPC):
    npc.add_image(f"image_path_{i}")

Теперь у вас есть image_paths в списке объектов, я предполагаю, что вы хотите их загрузить, отсюда и метод load_images.

ПРИМЕЧАНИЕ. При необходимости вы можете создать дополнительные методы для загрузки изображений. . Например, если у вас есть анимация для движения «влево» и «вправо»

Надеюсь, это ответит на ваш вопрос, если я что-то пропустил, скажите, пожалуйста, в комментарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...