библиотека python — ursina и распределение информации между классами

#python #class #object

Вопрос:

Я пишу небольшую игру на python, в которой игрок перемещается и стреляет в других существ. Я определил три класса следующим образом:

 class Player(Entity):
    def update(self):
        self.direction = Vec3(self.forward * (held_keys['w'] - held_keys['s']) 
                              self.right * (held_keys['a'] - held_keys['d'])).normalized()
        
        self.position  = self.direction * 3 * time.dt
    
    def on_click():
        Bullet(Entity(model='cube', origin=self.position, color=color.orange, collider='box'), mouse.position)


class Bullet(Entity, dir):
    def update(self):
        self.position  = dir * 6 * time.dt
        if self.intersects() # see if the bullet intersects any object of class Enemy


class Enemy(Entity):
    def update(self):
        self.direction = player.position - self.position # have enemy travel in dir of player
        self.position  = self.direction * 1.5 * time.dt

 

Однако у меня возникли проблемы с распределением информации между классами. Например, в классе Bullet я хочу проверить , пересекается ли маркер с какой-либо Enemy сущностью, но поскольку я не инициализировал никаких врагов, как мне программно выразить любую сущность класса Enemy вместо инициализированного объекта класса Enemy ?

Кроме того, в классе Enemy я хочу изменить направление Enemy объекта в зависимости от текущего положения Игрока. Однако возможно ли это без подачи инициализированной Player сущности (скажем p1 ) в Enemy следующее:

 class Enemy(Entity, p1):
    def update(self):
        self.direction = p1.position - self.position # have enemy travel in dir of player
        self.position  = self.direction * 1.5 * time.dt
 

Этот метод может работать для класса Enemy , потому что должен быть только один Player , но как он будет работать для класса Bullet , где много врагов?

Комментарии:

1. Этот вопрос не очень хорошо подходит для переполнения стека, поскольку он больше касается проектных решений, чем кодирования. Одним из способов сделать это было бы определить другой объект, например, Arena который отслеживает все объекты и обрабатывает их взаимодействия. В моем мире для пуль не имело бы смысла отслеживать все остальные объекты. Возможно, имело бы смысл, чтобы игроки могли транслировать свои позиции врагам, но это во многом связано с тем, как определена и должна работать ваша модель.