Проверить столкновение между двумя фигурами

Я пишу небольшую игру в as3, и мне нужно проверить столкновение двух лодок. Мне не нужно идеальное столкновение пикселей, но столкновения границ тоже недостаточно. Лодка выглядит примерно так:

https://www.dropbox.com/s/197yqvzf2jaugtm/boats.JPG

Я думал создать один квадрат на задней части лодки и треугольник спереди, затем для каждой лодки проверить, не сталкивается ли квадрат с другим квадратом или треугольником лодки, и то же самое для треугольника.

Я просто не знаю, как это сделать, я не знаю, возможно ли это с помощью Shape.hitTest или это лучший способ сделать это.

Что я могу сделать?


person user2295471    schedule 27.06.2013    source источник
comment
У меня нет прямого ответа на этот вопрос, но я немного поиграл с некоторыми действительно базовыми разработками шутеров с видом сверху (без использования сторонних библиотек, только с AS3, и я, возможно, использовал класс Гранта Скиннера здесь freeactionscript.com/2009/05/pixel-perfect-collision-detection) и обнаружение попаданий с помощью PNG, казалось, работало просто отлично. Даже добавление множества врагов на экран и множество ракет не сильно отставало, учитывая отсутствие фреймворка/оптимизации.   -  person shaunhusain    schedule 27.06.2013
comment
У меня это не работает, я использую скворец в качестве основы для создания своей игры. Этот класс использует DiplayObjectContainer из flash, а я использую displayObjectContainer из starling. Уже пытался изменить импорт, но тоже не работает   -  person user2295471    schedule 27.06.2013
comment
Используя Starling, как вы говорите, вы в конечном итоге используете другой набор объектов, которые не наследуются от flash API, я считаю, что они, как правило, легче. Ознакомьтесь с обсуждением здесь: forum.starling-framework.org/topic/collision-detection Основной вывод: вы можете использовать пару прямоугольников для аппроксимации, поскольку текстуры находятся на графическом процессоре, а центральный процессор не может получить информацию о том, где находится каждый пиксель (без замедления графического процессора, тем самым сводя на нет точку с помощью GPU-ускорения).   -  person shaunhusain    schedule 27.06.2013
comment
Вот почему мне было интересно, не могу ли я создать форму в формате лодки (используя более или менее 5 точек) и использовать Shape.hitTest для каждой точки другой лодки, если один из них возвращает true, происходит столкновение , но я не знаю, как работает hitTest из Shapes. Это хорошее решение? и будет ли это работать?   -  person user2295471    schedule 27.06.2013
comment
Да, теперь я понимаю ваш дрейф, но я сам не пробовал, немного поищу в документах и ​​посмотрю, могу ли я что-нибудь указать. Я думаю, что то, что вы пытаетесь сделать, не сработает, вам лучше отказаться от скворца, если вы собираетесь отражать вещи, используя объекты отображения Flash для вычисления hitTest, я не думаю это будет работать для невидимых объектов отображения. Если вы придерживаетесь скворца, я думаю, вам лучше всего вручную выполнить обнаружение попаданий content.gpwiki.org/ index.php/Polygon_Collision кажется, что решение точки в многоугольнике будет работать.   -  person shaunhusain    schedule 28.06.2013
comment
Я должен остаться со Старлингом. Это выглядит как хорошее решение, но как насчет поворотов? :/   -  person user2295471    schedule 28.06.2013
comment
Я думаю, вам нужно будет определить многоугольник как массив точек и создать свой собственный объект формы, который сообщит вам, что представляют собой точки после поворота, чтобы вы могли разделить задачи определения точек многоугольника и обнаружения столкновений: stackoverflow.com/questions/10533403/ Учитывая сложность задачи, я бы настоятельно рекомендовал использовать вместо этого несколько прямоугольников и метод пересечения, используя 4 или около того прямоугольника, вы можете близко приблизиться к заостренной части лодки (вращение еще может все усложнить).   -  person shaunhusain    schedule 28.06.2013
comment
Это руководство может быть полезным: sevenson.com.au/actionscript/sat   -  person Marty    schedule 28.06.2013


Ответы (1)


Попробуй это,

var isTouched:Boolean = item1.bounds.intersects(item2.bounds);

когда оба коснутся, он вернет true;

person Saygın Karahan    schedule 13.08.2013