Доступ к созданному объекту из другого класса - С#

У меня есть игрок class, NPC class, BattleManager class и игра class.

Класс игрока хранит/получает/устанавливает статистику игрока, такую ​​как здоровье, выносливость, уровень, опыт. NPC похож, но для NPC. В игре class создаются экземпляры игрока class и NPC class. Игровое стекло имеет два игровых состояния: боевое и небоевое.

Когда игрок находится в бою, GameState переходит в режим боя, когда бой заканчивается, он переключается в режим без боя.

Что я пытаюсь сделать, так это заставить BattleManager class управлять битвами между NPC и игроком, однако, поскольку игрок и объект NPC создаются в классе Game, мне нужно знать, как передать этот объект или получить к нему доступ из BattleManager без создания экземпляра. новенький.

Может ли кто-нибудь предложить общий поток того, как это может работать? Я знаю, что это неправильно, но есть ли способ сделать что-то вроде Game.Player.Health -= damage;? Например, внутри игрока class есть public int Health get/set, как я могу редактировать здоровье из других классов, когда класс Player создан в классе Game? Есть ли способ обойти Player object или просто получить доступ к экземпляру объекта, созданному в классе Game, из других классов?


person Euthyphro    schedule 27.07.2012    source источник
comment
Я предлагаю вам прочитать о некоторых шаблонах проектирования. Это хорошо продуманные решения общих проблем, таких как ваша. Вы должны смоделировать проигрыватель со всем, что он должен делать (то есть с методами ), такими как TakeDamage. Цепочка ответственности также охватывается некоторыми шаблонами проектирования.   -  person Andre Calil    schedule 27.07.2012
comment
public event BattleStarted ITSON и public delegate void BattleStarted(object sended, BattleStartedEventArgs e) и class BattleStartedEventArgs : EventArgs { public Player One {get;set;} public NPC Two [get;set;} }   -  person    schedule 27.07.2012


Ответы (2)


Мне нравилось думать, что игроки и NPC являются актерами в сценарии... поэтому я использовал класс ActorManager с шаблоном singleton...

public interface IActor {
   Stats Stats {get;}
   Vector2 Position {get;}
   bool IsFighting {get;}
   bool IsActive {get;}  // Or whatever you need
}

public class ActorManager {

     public static readonly Instance = new ActorManager();

     ActorManager();

     List<IActor> _actors = new List<IActor>();

     public IEnumerable<IActor> Actors {get{ return _actors;}}

     public void Addactor(IActor actor) { ... }

     public IEnumerable<IActor> GetActorsNear(IActor actor, float Radius)
     {
         return _actors.Where( 
               secondary => actor != secondary 
               && Vector2.Distance(actor.Position, secondary.Position)<Radius);
     }

     // or whatever you want to do with actors

}

public abstract class Actor : IActor
{
   public Stats Stats {get; protected set;}
   public Vector2 Position {get;protected set;}
   public bool IsFighting {get;protected set;}
   public bool IsActive {get;protected set;} 

       public Actor() {
           ActorManager.Instance.Add(this);
       }

   public abstract void Controller();
}

public class Player : Actor { }  // Implements an input controller
public class Npc : Actor { } // Implements a cpu IA controller
person Blau    schedule 30.07.2012

Я согласен с первым комментарием, что было бы полезно изучить некоторые шаблоны проектирования.

Если вам нужен быстрый и грязный ответ, то:

Измените свой класс Player и NPC, чтобы принять экземпляр Game в конструкторе (другой шаблон состоит в том, чтобы объект Game был глобальным синглтоном... еще один шаблон для изучения).

Используя более простой подход здесь:

public class Game
{
    public Player PlayerProperty {get; set;}
    public NPC NPCProperty {get; set;}

    public foo() //some method to instantiate Player and NPC
    {
       PlayerProperty = new Player(this); //hand in the current game instance
       NPCProperty = new NPC(this);  //hand in the current game instance
    }
}

Затем в вашем классе Player и NPC...

//Only example for Player class here... NPC would be exact same implementation
public class Player
{

    public Game CurrentGame {get; set;}

    public Player(Game gameInstance)
    {
        CurrentGame = gameInstance;
    }

    //then anywhere else in your Player and NPC classes...
    public bar() //some method in your Player and NPC classes...
    {
        var pointerToNPCFromGame = this.CurrentGame.NPCProperty;
        //here you can access the game and NPC from the Player class
        //would be the exact same for NPC to access Player class
    }
}

Печатаю это из моего бедного уставшего мозга, так что простите за ошибки. Надеюсь это поможет.

person EdFred    schedule 27.07.2012