Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0 |
|
Collision
Итак, у нас есть спрайты. Они рисуются, двигаются, но не взаимодействуют друг с
другом. И вот для того, что бы мячики отскакивали, пули попадали во врага, а
герои не проваливались сквозь пол, в DelphiX есть замечательная вещь как
проверка на столкновение, которая в большинстве случаев поможет избежать
написание собственного движка. Есть два метода определение
столкновений. 1. Проверка столкновения рамок: Простой тип, слежение идет за
взаимным положением рамок спрайтов. При обнаружении пересечения координат,
ябъявляется событие "столкновение" 2. Проверка столкновения точек: Сложный
тип. Слежение ведется не только за взаимным положением рамок спрайтов, но и за
взаимным положением самих изображений. Событие "столкновение" объявляется при
обнаружении пересечения точек изображений.
|
Рамка Рамка определят размер спрайта, что дает взаимодействовать
спрайтам друг с другом. Так же рамка нужна для определения момента обрезания
спрайта, при выходе за экран. Одним словом вещь крайне важная. Если не указать
ширину и высоту рамки, DelphiX будет выводить спрайт, но не сможет определять
столкновения |
|
Столкновение рамок Как вы видите столкновение произошло. Но сами
спрайты не коснулись друг-друга.Это не очень красиво, но зато очень
быстро. |
|
Проверка на столкновение рамок 2 Есть ещё один способ проверки
столкновения без PixelCheck. const Border = ...; with TAnyObject.Create(MyForm.DXSpriteEngine.Engine) do begin Image:=...; Width:=Image.PatternWidth - 2*Border; Height:=Image.PatternHeight - 2*Border; ... end; В этом случае картинка будет выводиться полностью,
но квадрат столкновений уменьшится. Необходимо изменить также и DoMove,
ведь X = OldX + Border и Y = OldY + Border. Именно этот способ как
правило используется в аркадах. |
|
Проверка на столкновение точек Более точный и красивый. Проверка
на столкновение самих изображений. Больше подходит для сложных спрайтов. Требует
большей загрузки процессора.. |
|
Более точное определение столкновения Два пиксела проверяют
спрайты на столкновение. Как видно рамки давно столкнулись, но событие поизошло
только когда столкнулись непрозрачные части. |
|
Смешивание типов обнаружения столкновения Спрайты, использующие
разные методы определения столкновения то-же будут сталкиваться друг с другом.
Один спрайт использует определение по рамке, другой по точке. Иногда смешиванием
можно добиться неплохих, реалистичных результатов.. |
|
Альтернатива -(не лучшее решение, но альтернативное...) Как вы
видите это не слишком великолепно. Игрок может видет, что спрайты не столкнулись
на самом деле, а игра будет определять, что стокновение произошло после
попадания рамки одного спрайта на непрозрачную точку
другого. | Выбор метода зависит от игры. Если это
активная Аркада, то Проверка на столкновение точек в ней ни к чему. Глаз не
будет успевать замечать, что столкновения произошло на пяток пикселей раньше,
чем положено. А если это размеренная, несуетливая РПГ, то без этого метода не
обойтись.
Настройка обнаружения столкновений Основные шаги,
необходимые для этого. · Создаем класс спрайта в обычном порядке ·
Включаем DoMove процедуру · Включаем (override)DoCollision процедуру ·
Устанавливаем высоту и ширину спрайта. · В процедуре DoMove вызываем метод
Collision. · В методе DoCollision, помещаем код, для обработки последствий
столкновения. · Выбираем метод обнаружения столкновений.
|
Категория: DirectX и DelphiX | Добавил: Angel (12.07.2008)
|
Просмотров: 349
| Рейтинг: 0.0/0 |
|
|