2013-05-30 2 views
0

Я попытался понять код, который проверяет столкновение между двумя объектами в игре - за столкновение пикселей. Код:Код столкновения Per-Pixel

/// <summary> 
/// Determines if there is overlap of the non-transparent pixels 
/// between two sprites. 
/// </summary> 
/// <param name="rectangleA">Bounding rectangle of the first sprite</param> 
/// <param name="dataA">Pixel data of the first sprite</param> 
/// <param name="rectangleB">Bouding rectangle of the second sprite</param> 
/// <param name="dataB">Pixel data of the second sprite</param> 
/// <returns>True if non-transparent pixels overlap; false otherwise</returns> 
static bool IntersectPixels(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++) 
     { 
      // 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; 
} 

Я нашел несколько объяснений, но никто не объяснил последние строки:

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

что это colorA.A недвижимости? почему это if-statement определяет, что произошло столкновение?

+0

Если оба пикселя непрозрачны, тогда два пикселя сталкиваются. Т.е. игнорировать прозрачные пиксели. «A» - это значение альфа – axon

ответ

4

Объект Color.A является alpha-value of the color. 0 означает полностью прозрачный, и 255 означает полностью непрозрачный.

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

Только в том случае, если оба они != 0, на самом деле есть два объекта в одном и том же месте, и необходимо выполнить столкновение.

Смотрите, например изображения: bb intersection

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

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

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

+0

, извините, но я не понимаю, что прозрачность имеет отношение к проверке столкновений. Может быть, я не понимаю весь код, а не смешаю эти строки. – Michael

+0

@Sefi см. Мое редактирование. Надеюсь, теперь это яснее. – pascalhein

+0

Спасибо большое, я наконец понял это сейчас. – Michael

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