#python
#python #pygame
Вопрос:
Итак, у меня ошибка:
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
файл, там он должен искать в классе ‘game’ для ‘update’, а в ‘update’ он должен захватить hlauncher hlauncher должен измениться с False на True, когда игрок поднимает самонаводящийся лаунчер. Вот обновление в игре:
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 каждый раз, когда я пытаюсь стрелять, чтобы подтвердить, что я держу hominglauncher и наоборот.
Спасибо за вашу помощь!
Комментарии:
1. Почему вы ожидаете
update
иметь атрибутhlauncher
?2. @goyo Итак, у меня есть обычная ракетная установка, и я хочу иметь самонаводящуюся пусковую установку, поэтому я установил атрибут hlauncher her, чтобы определить, является ли это самонаводящейся пусковой установкой или нет.
3. Вы имеете в виду
hlauncher = False
? Это не установка атрибута в локальной переменной.4. @goyo на что мне нужно его изменить?
5. Может
self.hlauncher = False
быть, и тогдаlaunchercheck = game.hlauncher()
. Или, что еще лучше, взгляните на учебник по python и потренируйтесь с более короткими программами, чтобы улучшить ваше понимание языка и, в частности, того, как работают классы, объекты и атрибуты.
Ответ №1:
Если update
был экземпляром класса и hlauncher
был функцией-членом этого класса, тогда ваш синтаксис был бы правильным.
Но hlauncher
является локальной (?) переменной в функции update()
. Это также может быть глобальная переменная, но это невозможно узнать из кода. Предполагая, что он локальный, нет способа получить к нему доступ извне функции обновления, потому что он существует только во время выполнения этой функции — вот что значит быть локально определенным. Если hlauncher
определено глобально, в любое время его можно установить : hlauncher = True
.
Но, вероятно, было бы лучше добавить эту функциональность в класс player:
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.
Комментарии:
1. Я думаю, вы не совсем поняли мой вопрос. Я просто хотел знать, как я импортирую что-то из другого файла в текущий.
2. Ах!
import myfile
, илиfrom myfile import *
. Если вы хотите получить переменные, вероятно, последнее — это то, что вам нужно.