Как поделиться слоем столкновения с каждым объектом?

В настоящее время каждый уровень имеет 3 слоя:

  • задний план
  • столкновения (стены, невидимые стены, земля и т. д.)
  • передний план

Спрайт моего персонажа имеет 1 пиксель для обнаружения столкновения. В этом классе символов есть Color[], содержащий все пиксели слоя столкновения.

Я вычисляю позицию обнаружения пикселя персонажа и получаю целое число, которое я могу использовать с Color[] ("CharactersPixel")

if ( Color[CharactersPixel].A != 0 )
    Then collision.

Это работает отлично.

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

Слой столкновения имеет около 3 800 000 пикселей. так что Color[] имеет то же самое.

Если я добавлю это Color[] к каждому объекту, это будет использовать слишком много оперативной памяти, верно?


person Sharpnel    schedule 29.08.2012    source источник


Ответы (1)


Вы бы только добавили ссылку на слой столкновения с объектами. Вы не копируете все в каждый объект. Добавление ссылки не добавит памяти вашим объектам.

Тем не менее, я бы предложил сделать столкновение доступным в каком-то более общем виде, выставив некоторые данные уровня в месте, доступном для любого объекта. Возможно, вы могли бы добавить данные в свой класс Game как свойство CurrentLevel с CollisionData в качестве доступного свойства.

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

person Dervall    schedule 29.08.2012
comment
Дерваль прав. Пиксель за пикселем — не лучший вариант. Гораздо предпочтительнее создавать рисуемые объекты с обнаружением на основе ограничивающей рамки/сферы/многоугольника. Таким образом, вы делитесь своими столкновениями между объектами, а не слоями. Это, и это намного эффективнее. - person Nick Funk; 30.08.2012
comment
Хорошо, спасибо за ваши ответы. я подожду несколько часов и посмотрю, может ли кто-нибудь дать мне еще несколько советов, и я подтвержу ваш ответ. Спасибо ! - person Sharpnel; 30.08.2012
comment
Итак, я оставлю обнаружение столкновений попиксельно для моего персонажа и монстров (из-за дизайна уровней со склонами и т. д.) и буду использовать обнаружение столкновений форм для других объектов. Спасибо за советы! (я не пытался добавлять ссылки, так что, возможно, мне снова понадобится ваша помощь) - person Sharpnel; 30.08.2012
comment
@Dervall Hum, для моего примера я должен поместить общедоступный статический уровень CurrentLevel в свой основной класс, чтобы мой класс символов мог получить Color [], верно? В моем классе персонажей код будет таким: Game.CurrentLevel.CollisionData[CharactersPixel]; я прав ? - person Sharpnel; 31.08.2012