Обнаружение столкновений на пиксель в нарисованном пользовательском элементе управления - PullRequest
0 голосов
/ 19 июля 2011

Я создаю небольшую wpf-игру, где мне нужно некоторое обнаружение столкновений. У меня есть несколько рыб, которые нарисованы в смешанном выражении, и мне нужно знать, когда они сталкиваются. Но я не знаю, как это реализовать.

Я бы хотел использовать обнаружение столкновений на пиксель и использовать ограничивающий прямоугольник в качестве обрезки (не ищите столкновения снаружи)

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

Любая помощь будет по достоинству оценена:)

1 Ответ

1 голос
/ 26 сентября 2011

Это не было проверено, но попробуйте что-то вроде:

public bool CollidsWith(FrameworkElement sprite1, FrameworkElement sprite2, bool pixelPerfect)
{
    try
    {
        Rect r1 = Bounds(sprite1);
        Rect r2 = Bounds(sprite2);

        if (r1.IntersectsWith(r2))
        {
            if (!pixelPerfect)
                return true;
            else
            {
                Point pt = new Poin();                            
                for (int x = (int)r1.Left; x < (int)r1.Right; x++)
                {
                    for (int y = (int)r1.Top; y <(int)r1.Bottom; y++)
                    {
                        pt.X = x;
                        pt.Y = y;
                        if (VisualTreeHelper.HitTest(sprite2, pt) != null)
                            return true;
                    }
                }
                return false;
            }
            else
                return false;
        }
    }
    catch { }
    return false; // we should not get here
}

public Rect Bounds(FrameworkElement sprite)
{
    get
    {
        Point ptBottomRight = new Point(sprite.Position.X + sprite.RenderSize.Width, sprite.Position.Y + RenderSize.Height);
        return new Rect(sprite.Position, ptBottomRight);
    }
}
...