Обнаружение столкновений с повернутыми спрайтами SharpDX

Я пишу игру SharpDx.Toolkit (XNA). Я искал в Интернете, как запрограммировать обнаружение столкновений, и нашел вот что:

static bool perPixel(Rectangle rectangleA, Color[] dataA, Rectangle rectangleB, Color[] dataB)
        {
            // Find the bounds of the rectangle intersection
            int top = Math.Max(rectangleA.Top, rectangleB.Top);
            int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
            int left = Math.Max(rectangleA.Left, rectangleB.Left);
            int right = Math.Min(rectangleA.Right, rectangleB.Right);

            // Check every point within the intersection bounds
            for (                      
                int y = top; y < bottom; y++)
            {
                for (int x = left; x < right; x++)
                {
                    if (dataA[(x - rectangleA.Left) + (y - rectangleA.Top) * rectangleA.Width] != new Color(0, 0, 0, 0) && dataB[(x - rectangleB.Left) + (y - rectangleB.Top) * rectangleB.Width] != new Color(0, 0, 0, 0))
                    {
                        // Get the color of both pixels at this point
                        Color colorA = dataA[(x - rectangleA.Left) +
                                             (y - rectangleA.Top) * rectangleA.Width];
                        Color colorB = dataB[x - rectangleB.Left) +
                                             (y - rectangleB.Top) * rectangleB.Width];

                        // If both pixels are not completely transparent,
                        if (colorA.A != 0 && colorB.A != 0)
                        {
                            // then an intersection has been found
                            return true;
                        }
                    }
                }
            }

            // No intersection found
            return false;
        }

Этот код работает нормально, но только на невращающихся спрайтах. Итак, я попытался добавить преобразование матрицы, но это не сработало.

Есть у кого-нибудь идеи, как это сделать?

Спасибо, Кристиан

РЕДАКТИРОВАТЬ: Игра представляет собой 2D-игру.


person Matt126    schedule 31.08.2014    source источник
comment
вам действительно нужно попиксельное столкновение?   -  person Davor Mlinaric    schedule 01.09.2014


Ответы (1)


Попиксельная коллизия в большинстве случаев является излишней, и я бы не рекомендовал ее ни для чего другого, кроме практики программирования.

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

Вы можете использовать физический движок или найти другой метод.

Некоторые методы, которые, как мне кажется, будут хорошо работать в вашем случае:

  1. OBB-OBB столкновение
  2. Столкновение круг-круг

С помощью этих методов вы просто проверяете, пересекаются ли границы, вместо того, чтобы сравнивать каждый пиксель друг с другом.

person DOOMDUDEMX    schedule 01.09.2014