Farseer получает доступ к классу из OnCollision

Я использую Farseer для физики в игре и имею несколько ключевых классов: Planet и PlanetProp. Каждая планета имеет большое круглое тело и «поле». Это поле представляет собой большой датчик вокруг тела. PlanetProps притягивается к тому полю планеты, в котором они находятся в данный момент (структура, называемая PlanetInfo). Итак, я установил обработчик столкновений в PlanetProp, который будет (когда бы он ни вызывался) определять, является ли прибор, с которым он столкнулся, датчиком.

Затем я планирую: а) определить, принадлежит ли датчик Planet, и б) установить PlanetProp, который будет притягиваться к планете.

Другими словами, можно ли получить доступ к классу, используя обратный вызов коллизии с фикстурой из тела в этом классе?

РЕДАКТИРОВАТЬ: включает ли это UserData? Если бы я использовал С++, я мог бы поместить в него указатель на класс, но я использую С#.


person William Osborne    schedule 10.02.2013    source источник
comment
Я не хочу помещать всю планету в пользовательские данные ее тела, потому что у нее большое изображение.   -  person William Osborne    schedule 10.02.2013


Ответы (1)


В C# у вас есть "ссылочные типы" и "типы значений". Ссылочные типы создаются с помощью ключевого слова class. Типы значений создаются с помощью ключевого слова struct. (Расширенное объяснение в MSDN.)

Ссылка (например, переменная "Planet myPlanet", если у вас есть class Planet) очень похожа на указатель. Он занимает такое же место (32 бита или 64 бита, в зависимости от вашей архитектуры) и "указывает" (ссылается) на экземпляр ссылочного типа. В отличие от указателей, вы не можете выполнять над ними арифметические действия, и это делается для того, чтобы сборщик мусора мог делать свое дело и отслеживать, на какие объекты все еще ссылаются (чтобы они не собирались).

Таким образом, вы вполне можете установить UserData на экземпляр объекта планеты. Он будет ссылаться на тот же объект, и копия не будет сделана.

Другое дело, если у вас есть тип значения (т.е.: struct Planet). Это будет скопировано, когда вы его назначите. (На самом деле, в этом случае, поскольку UserData имеет тип object и ожидает ссылочный тип, фреймворк "упакует" ваш тип значения, скопировав его в неизменяемый ссылочный тип.)

Лично я считаю полезным — особенно при разработке игр, где вы заботитесь о памяти — использовать разные цвета подсветки синтаксиса для ссылочных типов и типов значений.

person Andrew Russell    schedule 10.02.2013
comment
Я совершенно не подозревал, что это так. Большое спасибо, это значительно облегчит задачу. - person William Osborne; 10.02.2013
comment
Ссылки не обязательно должны быть указателями и иметь тот же размер, что и указатели. То, что реализация Microsoft CLR использует фактические указатели на элементы в управляемых сборщиком мусора таблицах объектов, является деталью реализации. Другая реализация может вместо этого использовать целочисленные индексы, и поэтому ссылки могут иметь размер, отличный от указателей, например. на ОС LLP64, таких как Win64. - person Hristo Iliev; 10.02.2013
comment
@HristoIliev Технически верно. Но даже в этом случае разумно рассматривать их как указатели и обращаться с ними как с таковыми на практике. - person Andrew Russell; 11.02.2013