Просмотр полной версии : Более корректный расчёт столкновений объектов
funkypanky
13.06.2013, 16:46
Всем привет!
Делаю тестовый платформер, но не получается сделать "чёткие" столкновения.
Когда квадрат соприкасается со стеной остаётся небольшой зазор(неплотное соприкосновение,или наоборот выход за предел небольшой бывает).
Для проверки столкновений я использовал hitTestObject();
Как сделать более точную проверку столкновений объектов?
Akopalipsis
13.06.2013, 16:58
Проще всего наверное будет поседеть немного за изучением алгоритмов пересечений...что то типа вот этого http://algolist.ru/maths/geom/intersect/ ..или ещё есть книги алгоритмы компютерной графики.Можно конечно поискать и готовые решения ,но это плохой совет!
KumoKairo
13.06.2013, 18:01
На самом деле ваш вариант вполне подходит для начала работы со столкновениями - при проверке объектов с помощью хиттестов используется покадровая проверка, поэтому точность проверки прямо зависит от ФПС.
В этом случае, такие вещи как перелет через стену или проваливание сквозь пол решается простым приведением координаты квадрата к какой-то координате платформы (например к верхнему, если кадрат "упал" на платформу, к левому, если квадрат слева от платформы и т.д.)
То есть проверяем столкновение, и после того, как оно найдено, насильно ставим квадрат на нужную нам координату
Но начинайте потихоньку работать с Box2D, благо есть AS3 порт этой библиотеки
Есть ещё Nape, более быстрый чем бокс и специально для флеш.
funkypanky
13.06.2013, 19:39
Проще всего наверное будет поседеть немного за изучением алгоритмов пересечений...что то типа вот этого http://algolist.ru/maths/geom/intersect/ ..или ещё есть книги алгоритмы компютерной графики.Можно конечно поискать и готовые решения ,но это плохой совет!
На самом деле ваш вариант вполне подходит для начала работы со столкновениями - при проверке объектов с помощью хиттестов используется покадровая проверка, поэтому точность проверки прямо зависит от ФПС.
В этом случае, такие вещи как перелет через стену или проваливание сквозь пол решается простым приведением координаты квадрата к какой-то координате платформы (например к верхнему, если кадрат "упал" на платформу, к левому, если квадрат слева от платформы и т.д.)
То есть проверяем столкновение, и после того, как оно найдено, насильно ставим квадрат на нужную нам координату
Но начинайте потихоньку работать с Box2D, благо есть AS3 порт этой библиотеки
Я пересмотрел много примеров, и да -там используется хиттест. Но есть непонятные моменты-
Первоначально создаётся массив и туда забиваются все элементы стен уровня:
var level:Array = new Array();
for (var i=0; i<numChildren; i++){
if (getChildAt(i) is platform){
level.push(getChildAt(i).getRect(this));
}
}
тут вроде всё просто -но я не понимаю запись .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: для блокового уровня с прямоугольниками это неплохо вроде, а как быть если есть наклонные поверхности другой формы? :o
KumoKairo
13.06.2013, 19:57
Ну если брать большие уровни, то придется забивать их все в массив и проверять столкновение с каждым в отдельности) Еще один способ - нарисовать уровень (если вы работаете во Flash IDE - это вообще дело пары минут) и проверять не .hitTestObject, не .intersects, а .hitTestPoint - проверка столкновения точки (обычно y - самая нижняя точка героя, а x - середина героя) с конкретными пикселями объекта - игнорируя прозрачные места.
Я тоже какое то время назад занимался "разработкой" "движка" столкновений (учить готовые движки Box2D или Nape было очень лень, а со столкновениями я до этого работал какое то время)а потом мне пришлось пересесть с обычной векторной флеш графики на растровую - на фреймворк Starling. Там столкновения представлены немного интересней - при наличии на сцене нескольких объектов - платформ, их не нужно забивать в массивы - стандартный старлинговский метод .hitTest возвращает объект, с которым сталкивается другой объект (за этим, конечно, стоит проверка столкновений в цикле, но она по крайней мере хорошо оптимизирована) и героя можно выравнивать уже по отношению к возвращенному объекту.
Что касается Ваших вопросов - самым дешевым способом проверить столкновения является проверка столкновений ограничивающих прямоугольников, то есть intersects (Кстати, в каком классе реализован этот метод? В классе платформы?). В данном случае .getRect() нужен для использования свойств .left и .right конкретной платформы (если этот метод в классе платформы)
funkypanky
13.06.2013, 20:12
Ну если брать большие уровни, то придется забивать их все в массив и проверять столкновение с каждым в отдельности) Еще один способ - нарисовать уровень (если вы работаете во Flash IDE - это вообще дело пары минут) и проверять не .hitTestObject, не .intersects, а .hitTestPoint - проверка столкновения точки (обычно y - самая нижняя точка героя, а x - середина героя) с конкретными пикселями объекта - игнорируя прозрачные места.
Я тоже какое то время назад занимался "разработкой" "движка" столкновений (учить готовые движки Box2D или Nape было очень лень, а со столкновениями я до этого работал какое то время)а потом мне пришлось пересесть с обычной векторной флеш графики на растровую - на фреймворк Starling. Там столкновения представлены немного интересней - при наличии на сцене нескольких объектов - платформ, их не нужно забивать в массивы - стандартный старлинговский метод .hitTest возвращает объект, с которым сталкивается другой объект (за этим, конечно, стоит проверка столкновений в цикле, но она по крайней мере хорошо оптимизирована) и героя можно выравнивать уже по отношению к возвращенному объекту.
Что касается Ваших вопросов - самым дешевым способом проверить столкновения является проверка столкновений ограничивающих прямоугольников, то есть intersects (Кстати, в каком классе реализован этот метод? В классе платформы?). В данном случае .getRect() нужен для использования свойств .left и .right конкретной платформы (если этот метод в классе платформы)
Ясно,попробую столкновения с точкой посмотреть. Про класс intersects если честно не знаю) вот этот пример на ютубе: http://www.youtube.com/watch?v=tD-t9DKvFJA
До экшнскрипта я сидел в гейммейкере:) там свой встроенный язык написания кода - GML, вероятно знаете.
Язык очень похож на флешеский экшенскрипт, но писать гораздо удобнее даже простые вещи. Там базовые столкновения реализованы очень просто -и сделать платформер гораздо проще, чем во флеш.
Сейчас осваиваю скрипт, но оказалось что тут просто необходимы хорошие знания тригонометрии и алгоритмов. Вообщем буду копать далее.)
Alex Lexcuk
14.06.2013, 13:05
Ясно,попробую столкновения с точкой посмотреть. Про класс intersects если честно не знаю) вот этот пример на ютубе: http://www.youtube.com/watch?v=tD-t9DKvFJA
До экшнскрипта я сидел в гейммейкере там свой встроенный язык написания кода - GML, вероятно знаете.
Язык очень похож на флешеский экшенскрипт, но писать гораздо удобнее даже простые вещи. Там базовые столкновения реализованы очень просто -и сделать платформер гораздо проще, чем во флеш.
Сейчас осваиваю скрипт, но оказалось что тут просто необходимы хорошие знания тригонометрии и алгоритмов. Вообщем буду копать далее.)
Вам же писали используйте box2d вот урок есть, в уроке платформер уже готовый.
http://demiart.ru/forum/index.php?showtopic=192710
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.