Я получил эту ошибку AttributeError: у объекта 'function' нет атрибута 'hlauncher' при попытке получить атрибут из другого файла - PullRequest
0 голосов
/ 20 февраля 2019

Итак, у меня ошибка:

launchercheck = game.update.hlauncher()
AttributeError: 'function' object has no attribute 'hlauncher'

Когда я хочу нажать пробел, чтобы выстрелить из моего оружия, это сработало до того, как я добавил это в код:

launchercheck = game.update.hlauncher()
if launchercheck is True:
    self.kill()

self.kill() просто для проверки работоспособности моей функции If.

game.update.hlauncher() относится к моему файлу main.py, который должен выглядеть в классе 'игра «для« обновления »и в« обновлении »она должна захватить хлаунчера Хлаунчер должен измениться с Ложного на Истину после того, как игрок поднимет самонаводящийся пусковой механизм.Вот обновление в игре:

def update(self):
    # update portion of the game loop
    self.all_sprites.update()
    self.camera.update(self.player)
    # game over
    if len(self.mobs) == 0:
        self.playing = False
    # player hits items
    hlauncher = False
    hits = pg.sprite.spritecollide(self.player, self.items, False)
    for hit in hits:
        if hit.type == 'health' and self.player.health < PLAYER_HEALTH:
            hit.kill()
            self.effects_sounds['health_up'].play()
            self.player.add_health(HEALTH_PACK_AMOUNT)
        if hit.type == 'pistol':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'pistol'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'shotgun':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'shotgun'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'rifle':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'rifle'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'sniperrifle':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'sniperrifle'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'launcher':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'launcher'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
        if hit.type == 'hominglauncher':
            hit.kill()
            self.effects_sounds['gun_pickup'].play()
            self.player.weapon = 'hominglauncher'
            game_folder = path.dirname(__file__)
            img_folder = path.join(game_folder, 'img')
            hlauncher = True
    # mobs hit player
    hits = pg.sprite.spritecollide(self.player, self.mobs, False, collide_hit_rect)
    for hit in hits:
        if random() < 0.7:
            choice(self.player_hit_sounds).play()
        self.player.health -= MOB_DAMAGE
        hit.vel = vec(0, 0)
        if self.player.health <= 0:
            self.playing = False
    if hits:
        self.player.hit()
        self.player.pos += vec(MOB_KNOCKBACK, 0).rotate(-hits[0].rot)
    # bullets hit mobs
    hits = pg.sprite.groupcollide(self.mobs, self.bullets, False, True)
    for mob in hits:
        for bullet in hits[mob]:
            mob.health -= bullet.damage
        mob.vel = vec(0, 0)

Я уже пытался поставить () позади True и False в главном файле, который выдал ту же ошибку, и я уже возился с game.update.hlauncher (), который должен смотреть на hlauncher при каждой попыткеснимать, чтобы подтвердить, что у меня в руках самонаводчик и наоборот.

Спасибо за помощь!

1 Ответ

0 голосов
/ 20 февраля 2019

Если update является экземпляром класса, а hlauncher является функцией-членом этого класса, то ваш синтаксис будет правильным.

Но hlauncher является локальным (?)переменная в функции update().Это также может быть глобальная переменная, но это невозможно узнать из кода.Предполагая, что он локальный, нет способа получить к нему доступ из-за пределов функции обновления, потому что он существует только во время выполнения этой функции - вот что значит быть локально определенным.Если hlauncher определено глобально, в любое время его можно установить: hlauncher = True.

Но, вероятно, было бы лучше добавить эту функцию в класс игрока:

class Player:
    def __init__( self ):
        pygame.sprite.Sprite.__init__(self)
        ... # other stuff
        self.has_hlauncher  = False
        self.hlauncher_ammo = 0

    def addHLauncher( self ):
        self.has_hlauncher = True
        self.hlauncher_ammo += 10

Тогда код может вызвать:

self.player.addHLauncher()

Если у вас возникли трудности со всем этим, возможно, кратко прочитайте, как переменная область действия работает в Python.

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