Python добавление в неправильный список? - PullRequest
1 голос
/ 26 марта 2020

Я не могу понять эту проблему. У меня есть Player объект и некоторые Enemy объекты, которые оба наследуются от класса Actor. И Player, и Enemy имеют shoot(self) методы, которые заставляют их стрелять пулями. Предполагается, что эта пуля будет добавлена ​​в соответствующий список снарядов, но когда программа вызывает self.projectiles.append(Projectile()) для врага, она добавляет его в список снарядов игрока.

Я запустил программу, где только актер, стреляющий в любые пули, был врагами, и я наблюдаю, как len(player.projectiles) возвращает все большие и большие значения, даже если он не должен расти. Любая помощь приветствуется. Этот блок запускается каждый раз, когда программа обновляется, проходит список врагов объекта Game и обновляет каждого из них соответственно:

for enemy in self.enemies:
    enemy.update(self.player)

Вот класс Enemy:

class Enemy(Actor):

    def shoot(self):
        image = pygame.transform.rotate(ProjectileImage, self.angle)
        self.projectiles.append(Projectile(self.getCenter()[0] - 6, self.getCenter()[1] - 16, 12, 32, image, 5, self.angle, True))
        shootingSound.play()

    def tryToShoot(self):
        if self.attackCoolDown >= 30:
            self.attackCoolDown = 0
            self.shoot()

    def update(self, player):
        self.pointTowards(player.x, player.y)
        Actor.update(self)
        self.tryToShoot()

Класс Actor инициализирует projectiles:

class Actor(Entity):
    projectiles = []

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Ваш опубликованный код показывает projectiles как атрибут class , а не атрибут instance . Таким образом, все Actor имеют общий список projectiles. Чтобы создать отдельные списки, инициализируйте атрибут внутри метода __init__.

0 голосов
/ 26 марта 2020

Когда вы добавляете projectiles в качестве класса varable, оба Enemy и Player наследуют один и тот же объект списка .

Кроме того, когда вы Если что-то использовать self (и его нельзя найти в словаре экземпляров), то по умолчанию используется класс varable, поэтому длина вашего игрока и врага оба растут: они имеют одинаковые значения объект списка .

Чтобы исправить это, поместите строку projectiles=[] в метод __init__:

Изменение:

class Actor(Entity):
    projectiles = []

Кому:

class Actor(Entity):
    def __init__(self):
        self.projectiles = []

Чтобы исправить ошибку.

PS: У вас, похоже, нет метода update в классе Actor , И если вы это сделаете, использование super().update() будет больше Pythoni c, чем Actor.update(self).

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