Проблема с экземпляром и словарем - PullRequest
1 голос
/ 28 сентября 2010

Я пытаюсь работать над 2D-игрой на базе Force. У меня есть Силы, которые хранятся в Словаре для «Джетс» на корабле. Поэтому я просто должен назвать имя, амплитуду и дать двигателю ускорение / вращение.

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

Force f1 = new Force();
f1 = Player.JetsDict["RearRight"];
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));

пока этот код не изменяет экземпляр, хранящийся в словаре (но я не хочу его использовать, так как он длиннее, и у меня много сил для обработки):

Force f1 = new Force();
f1.Position = Player.JetsDict["RearRight"].Position;
f1.Vector = Player.JetsDict["RearRight"].Vector;
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));

Почему?

Грег Безумный

Ответы [ 3 ]

0 голосов
/ 28 сентября 2010

В словаре хранится ссылка на экземпляр Force (при условии, что это класс, а не структура). Если вы изменяете объект, на который ссылается значение, он остается неизменным.

Полагаю, в настоящее время у вас нет четкого представления о ссылочных типах и типах значений ... У меня есть статья , которая может вам помочь. Это действительно ключевая тема для понимания.

Это похоже на то, как два человека имеют адрес одного и того же друга в своей телефонной книге: если я посмотрю адрес моего друга, а затем покрасу входную дверь их дома в красный цвет, а затем вы посмотрите на тот же человек адрес и зайдите в их дом, вы увидите красную парадную дверь. Важно то, что house нет в телефонной книге - есть только адрес. Аналогично, объект Force отсутствует в словаре - есть только ссылка.

0 голосов
/ 28 сентября 2010

Поскольку Force определяется как класс (class Force), когда вы получаете копию из Словаря, вы просто получаете ссылку на экземпляр Force - тот же экземпляр Force, который хранится в Словаре.Внесение изменений в члены в этой ссылке будет отражено во всей вашей программе, которая его использует.

Единственный вариант здесь - создать новый экземпляр.Это то, что вы делаете во втором случае.

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

Однако вы можете сократить его, добавив новый конструктор, который принялСила в качестве аргумента, и скопировал Положение + Vecotr.Это позволило бы вам написать:

Force f1 = new Force(Player.JetsDict["RearRight"]);
f1.Position = Vector2.Transform(f1.Position, Matrix.CreateRotationZ(Player.Rotation));
0 голосов
/ 28 сентября 2010
Force f1 = new Force();
f1 = Player.JetsDict["RearRight"];

Этот код сбрасывает ссылку f1 на ссылку в вашем словаре.f1 - это псевдоним элемента словаря.Когда вы меняете его, вы изменяете то, что находится в словаре.

Вам нужна функция .clone () для Force:

Force f1 = Player.JetsDict["RearRight"].clone();

или конструктор копирования:

Force f1 = new Force(Player.JetsDict["RearRight"]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...