![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2013
Сообщений: 22
|
Всем привет!
Делаю тестовый платформер, но не получается сделать "чёткие" столкновения. Когда квадрат соприкасается со стеной остаётся небольшой зазор(неплотное соприкосновение,или наоборот выход за предел небольшой бывает). Для проверки столкновений я использовал hitTestObject(); Как сделать более точную проверку столкновений объектов? |
|
|||||
|
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Проще всего наверное будет поседеть немного за изучением алгоритмов пересечений...что то типа вот этого http://algolist.ru/maths/geom/intersect/ ..или ещё есть книги алгоритмы компютерной графики.Можно конечно поискать и готовые решения ,но это плохой совет!
|
|
|||||
|
На самом деле ваш вариант вполне подходит для начала работы со столкновениями - при проверке объектов с помощью хиттестов используется покадровая проверка, поэтому точность проверки прямо зависит от ФПС.
В этом случае, такие вещи как перелет через стену или проваливание сквозь пол решается простым приведением координаты квадрата к какой-то координате платформы (например к верхнему, если кадрат "упал" на платформу, к левому, если квадрат слева от платформы и т.д.) То есть проверяем столкновение, и после того, как оно найдено, насильно ставим квадрат на нужную нам координату Но начинайте потихоньку работать с Box2D, благо есть AS3 порт этой библиотеки |
|
|||||
|
Регистрация: Jun 2013
Сообщений: 22
|
Цитата:
Цитата:
Первоначально создаётся массив и туда забиваются все элементы стен уровня: var level:Array = new Array(); for (var i=0; i<numChildren; i++){ if (getChildAt(i) is platform){ level.push(getChildAt(i).getRect(this)); } } Или вот: for (i=0; i<level.length; i++){ if (mHero.getRect(this).intersects(level[i])){ if (speedX > 0) { mHero.x = level[i].left- mHero.width/2; } if (speedX < 0) { mHero.x = level[i].right+ mHero.width/2; } speedX=0; } } )не совсем понял тут свойство .left - .right , применительно в одному клипу можно использовать это? типа if(mHero.right.intersects(wall.left)), чтобы потом также вычесть полуразмер героя из левой стороны клипа? И ещё хотел спросить про hitTestPoint(); Некоторые пишут что в мувиклип героя можно вставить маркеры(обычные мувиклипы внутри клипа) и проверять столкновения с препятствием по маркерам. Как такой метод проверки устроен? PS: для блокового уровня с прямоугольниками это неплохо вроде, а как быть если есть наклонные поверхности другой формы? ![]() |
|
|||||
|
Ну если брать большие уровни, то придется забивать их все в массив и проверять столкновение с каждым в отдельности) Еще один способ - нарисовать уровень (если вы работаете во Flash IDE - это вообще дело пары минут) и проверять не .hitTestObject, не .intersects, а .hitTestPoint - проверка столкновения точки (обычно y - самая нижняя точка героя, а x - середина героя) с конкретными пикселями объекта - игнорируя прозрачные места.
Я тоже какое то время назад занимался "разработкой" "движка" столкновений (учить готовые движки Box2D или Nape было очень лень, а со столкновениями я до этого работал какое то время)а потом мне пришлось пересесть с обычной векторной флеш графики на растровую - на фреймворк Starling. Там столкновения представлены немного интересней - при наличии на сцене нескольких объектов - платформ, их не нужно забивать в массивы - стандартный старлинговский метод .hitTest возвращает объект, с которым сталкивается другой объект (за этим, конечно, стоит проверка столкновений в цикле, но она по крайней мере хорошо оптимизирована) и героя можно выравнивать уже по отношению к возвращенному объекту. Что касается Ваших вопросов - самым дешевым способом проверить столкновения является проверка столкновений ограничивающих прямоугольников, то есть intersects (Кстати, в каком классе реализован этот метод? В классе платформы?). В данном случае .getRect() нужен для использования свойств .left и .right конкретной платформы (если этот метод в классе платформы) |
|
|||||
|
Регистрация: Jun 2013
Сообщений: 22
|
Цитата:
До экшнскрипта я сидел в гейммейкере там свой встроенный язык написания кода - GML, вероятно знаете.Язык очень похож на флешеский экшенскрипт, но писать гораздо удобнее даже простые вещи. Там базовые столкновения реализованы очень просто -и сделать платформер гораздо проще, чем во флеш. Сейчас осваиваю скрипт, но оказалось что тут просто необходимы хорошие знания тригонометрии и алгоритмов. Вообщем буду копать далее.) |
|
|||||
|
Цитата:
http://demiart.ru/forum/index.php?showtopic=192710
__________________
Гоночка |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|