C#: несколько экземпляров класса делают одно и то же - PullRequest
0 голосов
/ 19 января 2020

У меня есть 3 различных класса: Entity, Control и Environment

Внутри класса Entity у меня есть переменная Control:

readonly Control m_Control

Внутри конструктора мой класс Entity, я создаю экземпляр класса Control. В классе Entity есть метод Update, который проверяет состояние перечисления в классе Control:

public class Entity
{

   public float Rotate {get; private set;}

   readonly Control m_Control

   public Entity(float rot)
   {
     Rotate = rot;
     m_control = new Control();
   }

    public void Update(float time)
    {

            switch (m_control.Rotating())
            {
                case Control.Rotator.Right:
                    Rotate += time * 1.5f;
                    break;
                case Control.Rotator.Left:
                    Rotate -= time * 1.5f;
                    break;
                case Control.Rotator.Still:
                    break;
                default:
                    break;          
            }
     }



}

Класс управления:

public class Control
{
        private Random rnd = new Random();
        private int _randomTurn;

        public enum Rotator
        {
            Still,
            Right,
            Left
        }

        public Control()
        {
            TimerSetup(); // Initialize timer for Entity
        }

 public Rotator Rotating()
        {

                switch(_randomTurn)
                {
                    case 1:
                        return Rotator.Right;
                    case 2:
                        return Rotator.Left;
                    default:
                        return Rotator.Still;
                }

            }

 private void TimerSetup()
 {
            DispatcherTimer dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += new EventHandler(GameTickTimer_Tick);
            dispatcherTimer.Interval = new TimeSpan(0, 0, 2);
            dispatcherTimer.Start();
 }


 private void GameTickTimer_Tick(object sender, EventArgs e)
 {
     RandomTurn();
 }


 private void RandomTurn() 
 {
    _randomTurn = rnd.Next(1, 4);
 }


}


В классе Environment я Реализую каждую сущность. Поэтому у меня будет 2 экземпляра Entity.

public class Environment
{

readonly Entity m_entity;
readonly Entity m_entity2;

public Environment()
{
   m_entity = new Entity(90.0f);
   m_entity2 = new Entity(180.0f);
}


 public void Update(float time)
        {
            m_entity.Update(time);

            m_entity2.Update(time);
        }
}

Моя проблема в том, что когда я создаю несколько сущностей, каждая из этих сущностей делает одно и то же.

Например, класс Control имеет функцию поворота, но каждый созданный объект перемещается точно таким же образом в одно и то же время.

Что было бы для меня лучшим способом go об этом, чтобы каждый созданный объект действовал независимо друг от друга?

1 Ответ

1 голос
/ 19 января 2020

проблема, с которой вы сталкиваетесь, трудно понять.

Проблема заключается в том, как создается экземпляр класса Random. Случайные генераторы начинаются со начального значения, и это начальное значение определяет все числа, возвращаемые этим генератором. Таким образом, 2 экземпляра генератора случайных чисел с одинаковыми начальными значениями будут генерировать одинаковую последовательность чисел. Теперь, если вы не предоставите начальное значение при создании генератора случайных чисел, оно само создаст начальное значение из системных часов. Однако если вы создадите 2 генератора случайных чисел сразу после друг друга, системные часы еще не изменятся, и они получат одинаковое начальное число и, следовательно, произведут одинаковую последовательность.

Поэтому всегда важно убедиться, что вы не создание нескольких Random экземпляров одновременно.

Если вы измените свойство rnd в своем классе Control следующим образом:

private static Random rnd = new Random();

Это должно работать. Stati c гарантирует, что это свойство является общим для всех экземпляров вашего Control класса (поэтому создается только один экземпляр Random).

Надеюсь, это поможет и удачи в вашем проекте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...