В настоящее время я делаю игру. У меня есть 2 класса, и я хочу получить доступ к другим переменным экземпляра. Я не уверен, как это сделать или если это возможно.
Оба класса в некоторой точке наследуют класс gameEngine
gameEngine < - Игра
gameEngine < - SuperSprite < - Character < - Enemy
gameEngine < - SuperSprite < - Character < - Player
Класс My Game создает переменную экземпляра объекта self.player = Player(self)
, и я хочу иметь возможность использовать это в своем классе Enemy, чтобы он мог делать self.player.x
. Поэтому я могу сделать ИИ в классе врагов, чтобы он знал о моем игроке. Любые предложения о том, как это сделать, моя логика может быть неправильной, поэтому любая помощь будет благодарна. Если мне нужно опубликовать мой код или что-то еще, скажите мне.
Это или я пытаюсь передать объект функции. Таким образом, bob может получить enemyAI в игровом классе. Но я получаю ошибку. Объект "Враг" не может быть вызван. Тем не менее он передает его, и функция распечатывает информацию, а затем умирает. НО, если я перемещаю self.enemyAi(self.bob)
в состояние щелчка, он отлично работает.
if self.enemyWeakBtn.clicked:
print "spawning enemey"
self.bob = Enemy(self)
self.enemies.append(self.bob)
self.enemyGroup = self.makeSpriteGroup(self.enemies)
self.addGroup(self.enemyGroup)
self.enemyActive = True
elif self.enemyActive:
print self.bob
self.enemyAi(self.bob)
print " active"
Если вы правильно поняли, вы хотите, чтобы экземпляры Enermy получили доступ к экземпляру Player
Есть два способа сделать это. Я использую второй метод atm в своих программах и планирую добавить первый метод.
Первый способ включает в себя получение класса для экземпляра, а вызов метода класса позволяет получить этот экземпляр.
class Game:
instance = False
def __init__(self):
if self.__class__.instance:
raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point
self.__class__.instance = self
@classmethod
def getInstance(cls):
return cls.instance
##>>> g = Game()
##>>> g
##<__main__.Game instance at 0x02A429E0>
##>>> del g
##>>> Game.getInstance()
##<__main__.Game instance at 0x02A429E0>
##>>>
## Here you can have, in your enermy class, g = Game.getInstance(). And g.player will be able to access the player instance, and its properties
Второй способ сделать это - это то, с чем я работал. Это включает в себя класс игры, регулирующий ВСЕ в игре. Значение: все в переменной под игру. Кроме того, каждая отдельная игровая переменная (например, игрок) будет иметь атрибут, названный игрой, которая ссылается на экземпляр игры.
Пример:
class Player:
def __init__(self, game):
self.game = game
print self.game.enermy
class Game:
def __init__(self):
self.enermy = "Pretend I have an enermy object here"
self.player = Player(self)
##>>> g = Game()
##Pretend I have an enermy object here
##>>> g.player.game.enermy
##'Pretend I have an enermy object here'
##>>>
## Iin your enermy class, self.game.player will be able to access the player instance, and its properties
Некоторые могут возражать со вторым способом, я тоже вижу проблему с дополнительным шагом. Возможно, кто-то может пролить свет на сравнение между ними.
Комбинационный метод может быть тем, к чему я надеюсь перейти, однако это вызывает некоторую проблему, с которой вам нужно разместить первое место в файле, иначе вы можете установить, что игрок не определен или игра не определена. Хотя я думаю, что это можно решить, разделив 2 класса на разные файлы.
class Player:
def __init__(self):
self.game = Game.getInstance()
class Game:
instance = False
def __init__(self):
if self.__class__.instance:
raise RunTimeError("Game has already been initialized.") # RunTimeError might be a bad choice, but you get the point
self.__class__.instance = self
@classmethod
def getInstance(cls):
return cls.instance
Ошибка, скорее всего, отсутствие конструктора для класса Enemy. Путем выполнения:
self.bob = Enemy(self)
Он ищет функцию __init__(self, arg1)
в классе Enemy
. Если это не предусмотрено, Python не сможет рассматривать Enemy
как "вызываемый", что означает, что он не может использоваться как функция или в этом случае используется для вызова конструктора с одним аргументом.