2010-12-29 4 views
1

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

Я пытаюсь сделать столкновение прямоугольника в моей игре. Моя идея состоит в том, чтобы: 1) получить исходный прямоугольник, ограничивающий столкновение; 2) преобразовать текстуру (pos/rot/scale); 3) изменить параметры объекта в матрице, а затем использовать эту матрицу для изменения исходных границ столкновений элемента.

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

Моя проблема: Как создать прямоугольник, который формирует размеры, которые игнорируют прозрачность вокруг объекта. Изображение приведено ниже:

alt text

ответ

1

Я думаю, вы могли бы пройти через каждый ряд пикселей в ограничивающем прямоугольнике, начиная с вершины, проверяя, когда вы первый хит пикселя с цветом, проверяя его альфа-значение (Color.A! = 0).

Таким образом вы получите координату Y прямоугольника.

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

Вы получите X таким образом.

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

Надежда, что помогает

1

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

Color[] colorData = new Color[1]; 
Texture2D texture = //Get your Texture2D here 
texture.GetData<Color>(0, new Rectangle(targetPoint.X, targetPoint.Y, 1, 1), colorData, 0, 1); 

Чтобы проверить, если пиксель не прозрачен я делаю это:

if(colorData[0].A > 0) 

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

+0

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

1

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

Если в кругах нет вопросов, то муку или Дойз предоставили достойные ответы.

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