Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 13.06.2013, 16:46
funkypanky вне форума Посмотреть профиль Отправить личное сообщение для funkypanky Найти все сообщения от funkypanky
  № 1  
Ответить с цитированием
funkypanky

Регистрация: Jun 2013
Сообщений: 22
Question Более корректный расчёт столкновений объектов

Всем привет!
Делаю тестовый платформер, но не получается сделать "чёткие" столкновения.
Когда квадрат соприкасается со стеной остаётся небольшой зазор(неплотное соприкосновение,или наоборот выход за предел небольшой бывает).
Для проверки столкновений я использовал hitTestObject();
Как сделать более точную проверку столкновений объектов?

Старый 13.06.2013, 16:58
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 2  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Проще всего наверное будет поседеть немного за изучением алгоритмов пересечений...что то типа вот этого http://algolist.ru/maths/geom/intersect/ ..или ещё есть книги алгоритмы компютерной графики.Можно конечно поискать и готовые решения ,но это плохой совет!

Старый 13.06.2013, 18:01
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 3  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
На самом деле ваш вариант вполне подходит для начала работы со столкновениями - при проверке объектов с помощью хиттестов используется покадровая проверка, поэтому точность проверки прямо зависит от ФПС.

В этом случае, такие вещи как перелет через стену или проваливание сквозь пол решается простым приведением координаты квадрата к какой-то координате платформы (например к верхнему, если кадрат "упал" на платформу, к левому, если квадрат слева от платформы и т.д.)
То есть проверяем столкновение, и после того, как оно найдено, насильно ставим квадрат на нужную нам координату

Но начинайте потихоньку работать с Box2D, благо есть AS3 порт этой библиотеки

Старый 13.06.2013, 18:09
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Есть ещё Nape, более быстрый чем бокс и специально для флеш.
__________________
Дети не должны знать о своих родителях

Старый 13.06.2013, 19:39
funkypanky вне форума Посмотреть профиль Отправить личное сообщение для funkypanky Найти все сообщения от funkypanky
  № 5  
Ответить с цитированием
funkypanky

Регистрация: Jun 2013
Сообщений: 22
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Проще всего наверное будет поседеть немного за изучением алгоритмов пересечений...что то типа вот этого http://algolist.ru/maths/geom/intersect/ ..или ещё есть книги алгоритмы компютерной графики.Можно конечно поискать и готовые решения ,но это плохой совет!

Цитата:
Сообщение от KumoKairo Посмотреть сообщение
На самом деле ваш вариант вполне подходит для начала работы со столкновениями - при проверке объектов с помощью хиттестов используется покадровая проверка, поэтому точность проверки прямо зависит от ФПС.

В этом случае, такие вещи как перелет через стену или проваливание сквозь пол решается простым приведением координаты квадрата к какой-то координате платформы (например к верхнему, если кадрат "упал" на платформу, к левому, если квадрат слева от платформы и т.д.)
То есть проверяем столкновение, и после того, как оно найдено, насильно ставим квадрат на нужную нам координату

Но начинайте потихоньку работать с Box2D, благо есть AS3 порт этой библиотеки
Я пересмотрел много примеров, и да -там используется хиттест. Но есть непонятные моменты-
Первоначально создаётся массив и туда забиваются все элементы стен уровня:
Код 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) - это ставит ограничивающую область прямоугольника для всех элементов стен?
Или вот:
Код AS3:
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: для блокового уровня с прямоугольниками это неплохо вроде, а как быть если есть наклонные поверхности другой формы?

Старый 13.06.2013, 19:57
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 6  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Ну если брать большие уровни, то придется забивать их все в массив и проверять столкновение с каждым в отдельности) Еще один способ - нарисовать уровень (если вы работаете во Flash IDE - это вообще дело пары минут) и проверять не .hitTestObject, не .intersects, а .hitTestPoint - проверка столкновения точки (обычно y - самая нижняя точка героя, а x - середина героя) с конкретными пикселями объекта - игнорируя прозрачные места.

Я тоже какое то время назад занимался "разработкой" "движка" столкновений (учить готовые движки Box2D или Nape было очень лень, а со столкновениями я до этого работал какое то время)а потом мне пришлось пересесть с обычной векторной флеш графики на растровую - на фреймворк Starling. Там столкновения представлены немного интересней - при наличии на сцене нескольких объектов - платформ, их не нужно забивать в массивы - стандартный старлинговский метод .hitTest возвращает объект, с которым сталкивается другой объект (за этим, конечно, стоит проверка столкновений в цикле, но она по крайней мере хорошо оптимизирована) и героя можно выравнивать уже по отношению к возвращенному объекту.

Что касается Ваших вопросов - самым дешевым способом проверить столкновения является проверка столкновений ограничивающих прямоугольников, то есть intersects (Кстати, в каком классе реализован этот метод? В классе платформы?). В данном случае .getRect() нужен для использования свойств .left и .right конкретной платформы (если этот метод в классе платформы)

Старый 13.06.2013, 20:12
funkypanky вне форума Посмотреть профиль Отправить личное сообщение для funkypanky Найти все сообщения от funkypanky
  № 7  
Ответить с цитированием
funkypanky

Регистрация: Jun 2013
Сообщений: 22
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Ну если брать большие уровни, то придется забивать их все в массив и проверять столкновение с каждым в отдельности) Еще один способ - нарисовать уровень (если вы работаете во 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, вероятно знаете.
Язык очень похож на флешеский экшенскрипт, но писать гораздо удобнее даже простые вещи. Там базовые столкновения реализованы очень просто -и сделать платформер гораздо проще, чем во флеш.
Сейчас осваиваю скрипт, но оказалось что тут просто необходимы хорошие знания тригонометрии и алгоритмов. Вообщем буду копать далее.)

Старый 14.06.2013, 13:05
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 8  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Цитата:
Ясно,попробую столкновения с точкой посмотреть. Про класс intersects если честно не знаю) вот этот пример на ютубе: http://www.youtube.com/watch?v=tD-t9DKvFJA

До экшнскрипта я сидел в гейммейкере там свой встроенный язык написания кода - GML, вероятно знаете.
Язык очень похож на флешеский экшенскрипт, но писать гораздо удобнее даже простые вещи. Там базовые столкновения реализованы очень просто -и сделать платформер гораздо проще, чем во флеш.
Сейчас осваиваю скрипт, но оказалось что тут просто необходимы хорошие знания тригонометрии и алгоритмов. Вообщем буду копать далее.)
Вам же писали используйте box2d вот урок есть, в уроке платформер уже готовый.
http://demiart.ru/forum/index.php?showtopic=192710
__________________
Гоночка

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:36.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.