2013-12-15 7 views
0

Создание 2D Hell Theme Вертолет игра в XNA.Per Pixel обнаружение столкновения

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

Вот код для моего Per Pixel:

class PPCollisionDetection 
{ 
    public Rectangle rect1, rect2; 
    public Color[] data1, data2; 

    public PPCollisionDetection() 
    { 
    } 

    public Boolean Detect(Rectangle r1, Rectangle r2, Texture2D t1, Texture2D t2) 
    { 
     data1 = new Color[t1.Width * t1.Height]; 
     t1.GetData(data1); 
     data2 = new Color[t2.Width * t2.Height]; 
     t2.GetData(data2); 

     rect1 = r1; 
     rect2 = r2; 

     int top = Math.Max(rect1.Top, rect2.Top); 
     int bottom = Math.Min(rect1.Bottom, rect2.Bottom); 
     int left = Math.Max(rect1.Left, rect2.Left); 
     int right = Math.Min(rect1.Right, rect2.Right); 

     for (int y = top; y < bottom; y++) 
      for (int x = left; x < right; x++) 
      { 
       Color colour1 = data1[(x - rect1.Left) + 
             (y - rect1.Top) * rect1.Width]; 
       Color colour2 = data2[(x - rect2.Left) + 
             (y - rect2.Top) * rect2.Width]; 

       if (colour1.A != 0 && colour2.A != 0) 
        return true; 
      } 
     return false; 
    } 
} 

А вот где я называю Detect:

if (new Rectangle((int)Helicopter.position.X,(int) Helicopter.position.Y,(int)Helicopter.HelicopterAnimation.Rectangle.Width,(int)Helicopter.HelicopterAnimation.Rectangle.Height).Intersects(stalagtiteRectangle)) 
{ 
    if (collDetect.Detect(new Rectangle((int)Helicopter.position.X, (int)Helicopter.position.Y, (int)Helicopter.HelicopterAnimation.Rectangle.Width, (int)Helicopter.HelicopterAnimation.Rectangle.Height), stalagtiteRectangle, Helicopter.HelicopterAnimation.animation, 
     stalagtites)) 
    { 
     touched = true; 
    } 
    else 
    { 
     touched = false; 
    } 
} 
+0

Просто предложение, чтобы найти перекрывающийся площадь двух прямоугольников может быть, вы должны использовать [Rectangle.Intersect] (http://msdn.microsoft.com/en -us/library/microsoft.xna.framework.rectangle.intersect.aspx) – pinckerman

+0

В чем ваш вопрос? –

+0

Можете ли вы заметить какие-либо ошибки в моем коде? Это не работает для меня! Сожалею! – Eamomck

ответ

0

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

И я считаю, что это должно быть:

t1.GetData<Color>(data1); 
t2.GetData<Color>(data2); 
+0

Я так не думаю, что GetData может получить тип из структуры, которую вы передаете в качестве параметра, в этом случае Color []. – pinckerman

+0

Это то, что у меня есть в моем классе Collision, но вы правы, и получилось бы, если вы введете определенный тип данных или нет. – Brandon

+0

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

Смежные вопросы