Обнаружение столкновений с помощью растровых изображений на холсте SurfaceView в Android - PullRequest
2 голосов
/ 23 марта 2012

В Android я использую SurfaceView для отображения простой 2D-игры.Растровые изображения (.png) с alpha (представляющими игровые объекты) нарисованы на холсте.

Теперь я хотел бы сделать простое, но точное обнаружение столкновений.Проверить, перекрываются ли эти растровые изображения, довольно просто.

Но как мне проверить наличие коллизий, когда у этих растровых изображений есть прозрачные области?Моя задача - определить, сталкиваются ли два шара или нет.Они заполняют все растровое изображение по ширине и высоте, но по всем четырем ребрам, конечно, есть прозрачные области, поскольку это квадрат в квадрате. действительно сталкиваются, а не окружающее их растровое окно?

Нужно ли сохранять координаты как можно большего количества точек на контуре шара?Или Android может «игнорировать» альфа-канал при проверке на наличие коллизий?

Ответы [ 3 ]

11 голосов
/ 29 марта 2012

Другой метод, который я могу придумать, будет работать с простыми объектами, которые можно построить с использованием Path s.

Когда у вас есть два объекта, границы которых представлены путями, вы можете попробовать это:

Path path1 = new Path();
path1.addCircle(10, 10, 4, Path.Direction.CW);
Path path2 = new Path();
path2.addCircle(15, 15, 8, Path.Direction.CW);

Region region1 = new Region();
region1.setPath(path1, clip);
Region region2 = new Region();
region2.setPath(path2, clip);

if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) {
    // Collision!
}

Когда у вас есть объекты в виде контуров, вы можете нарисовать их напрямую, используя drawPath () .Вы также можете выполнить движение с помощью transform () по пути.

7 голосов
/ 23 марта 2012

Если это столкновение шара, вы можете выполнить аналитическое обнаружение столкновения - это будет намного быстрее, чем обнаружение на пиксель.Вам нужно только иметь два центра шаров (x1, y1) и (x2, y2) и радиус r1 для первого шара и r2 для второго.Теперь, если расстояние между центрами шара меньше или равно сумме радиуса, то шары сталкиваются:

    colide = sqrt((x1-x2)^2+(y1-y2)^2)<=r1+r2

, но немного более быстрый способ - сравнить квадрат этой величины:

   colide =  (x1-x2)^2+(y1-y2)^2<=(r1+r2)^2
2 голосов
/ 28 марта 2012

Гораздо проще использовать существующую библиотеку, такую ​​как AndEngine , а не изобретать велосипед. Я не уверен, что его можно использовать с SurfaceView. Проверьте эту статью: Pixel Perfect Collision Detection for AndEngine .

...