прохождение игрового указателя на юниты (циклические включения, питон) - PullRequest
0 голосов
/ 08 июля 2011

редактировать: я прошу совета / правильную структуру для кода

Текущий макет (что, вероятно, неправильно):

  • Game хранит player, screen и units.
  • Game обрабатывает логику верхнего уровня, пользовательский ввод и т. Д.
  • screen и player используются во всей программе
  • units список изменен (добавлен + удален) в игре

Если я хочу получить доступ к списку units или Game.spawn_foo() или Game.width, как мне реструктурировать мой код?

  1. Так что unit.py может иметь доступ к экземпляру Game()?

Код: (обновлено)

game.py

class Game(object):
    def __init__(self):
        self.screen = # video
        self.player = Player()
        self.units = [Unit(), Unit()]

    def loop(self):            
        while True:
            self.screen.blit( self.player.sprite, self.player.location )
            for u in self.units:
                self.screen.blit( u.sprite, u.location )

    def spawn_foo(self):
        # tried to call from Unit() or Player()
        self.units.append( ...rand Unit()... )

if __name__ == '__main__':
    game = Game()
    game.loop()

unit.py, использует func или методы

class Unit(object):
    def __init__(self, game):
        self.sprite = # image
        self.location = (0, 0)

    def teleport(self):
        # attempt to use game here
        x = game.width / 2, 
        y = game.height / 2
        self.location = (x, y)

1 Ответ

0 голосов
/ 09 июля 2011

Есть ли причина не хранить ссылку на игру внутри каждого юнита - то есть добавить строку к Unit.__init__(...) как self.game = game и затем использовать это в своем методе телепортации.

Единственная причина, по которой я могуСмысл в том, что вы можете быть обеспокоены созданием циклических ссылок, которые не будут собирать мусор, и в этом случае вы можете взглянуть на пакет weakref , хотя в вашем примере это может не быть большой проблемой.

...