2014-02-15 4 views
1

Я работаю над платформой XNA и нуждаюсь в некоторой помощи при столкновении. Игра проходит в пещере, и проблема в том, что художественный стиль будет отрывочным, и поэтому ландшафт (пещеры) будет отличаться LOT, поэтому я не могу использовать плитки. Но мне нужно проверить идеальное столкновение пикселей на персонаже и в пещере, но я не могу понять, как это сделать, когда я не могу поместить прямоугольники вокруг каждой плитки, так как их нет.Обнаружение столкновений в 2D-игре без плиток XNA

Я думал об этом много придумали некоторые идеи:

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

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

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

-Используйте двигатель столкновения. Я бы предпочел сделать игру с нуля.

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

ответ

5

Я думаю, вы должны использовать обнаружение столкновений на пикселях, чтобы делать то, что вы пытаетесь сделать. Вы можете иметь своего персонажа и сделать его текстуру прозрачной (используя изображение alpha), за исключением фактического символа. Тогда у вас может быть текстура terrain, которая будет вашей пещерой. Сделайте части пещеры, чтобы персонаж мог двигаться прозрачно, чтобы вы могли иметь другую текстуру, которая будет фоном всего уровня. Вот грубый пример:

Character (розовый BG прозрачный :)

enter image description here

Cave (белый прозрачный)

enter image description here

фона:

enter image description here

Все три суммироваться:

enter image description here

Это просто, чтобы дать вам очень приблизительное представление (так как я просто гугл фона и рисовал пещеру в краске). Затем вы можете использовать обнаружение столкновений альфа-пикселей между текстурой пещеры (НЕ фон пещеры) и текстурой персонажа. См. this для учебника о том, как вы можете легко использовать столкновение с пикселями. НТН. Вот код коллизии, который вы могли бы использовать (rectangleA должен быть прямоугольником символа, dataA пиксель данных персонажа, rectangleB прямоугольник пещеры (который, вероятно, будет весь экран), и dataB пиксельные данные пещеры (НЕ ПРЕДПОСЫЛКИ)) Поскольку вы не используете пиксельные данные фонового изображения, это столкновение не будет проверяться с этими данными:

/// <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; 
    } 
+0

@ user3313308, это помогло? – davidsbro

+0

Благодарим вас за ответ @davidsbro!Мне все еще нужно размещать прямоугольники, чтобы иметь столкновение пикселей на пиксель, не так ли? Или я пропустил понимание концепции столкновений с пикселями? Если я понял это правильно, он проверяет, сталкиваются ли два прямоугольника, а затем проверяет цвета внутри прямоугольников, чтобы увидеть, сталкивается ли он. Это правильно? Если это так, разве мне не нужно будет размещать прямоугольники вокруг пещеры? – user3313308

+0

Да, вы правы @ user3313308. Но вам нужно иметь только два прямоугольника; один вокруг всей текстуры пещеры (который, вероятно, будет весь экран) и один вокруг игрока; вам не нужно больше двух. Ссылка, которую я предоставил, представляет собой очень простой проект для создания пиксельных столкновений, чтобы вы могли понять, как это будет выглядеть. LMK, если что-то неясно. – davidsbro

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