Прямо сейчас, чтобы сделать поворот У меня есть отдельный кадр для каждого угла поворота, но у меня есть скорее одно изображение, которое я поворачиваю. Мой вопрос: как мне преобразовать матрицу в XNA/C#, чтобы данные цвета также вращаются так же, как спрайт отображается на экране? Я нашел этот старый SO question, но я действительно не понимаю ответа, и я хотел бы знать, как работает код, если он нуждается в дальнейшем изменении.XNA: Столкновения между вращающимися спрайтами
Любая необходимая информация о местоположении и ротации сохраняется в объекте, который содержит спрайт, и предполагается, что оба спрайта вращаются.
Вот мой код до сих пор:
private static bool PixelPerfect(PhysicsEntity a, PhysicsEntity b)
{
if (!BoundingBox(a, b)) return false;
var colorDataA = new Color[a.Sprite.Source.Width * a.Sprite.Source.Height];
var colorDataB = new Color[b.Sprite.Source.Width * b.Sprite.Source.Height];
a.Sprite.Texture.GetData(0, a.Sprite.Source, colorDataA, 0, colorDataA.Length);
b.Sprite.Texture.GetData(0, b.Sprite.Source, colorDataB, 0, colorDataB.Length);
var top = (int) Math.Max(a.BoundingBox.Top, b.BoundingBox.Top);
var bottom = (int) Math.Min(a.BoundingBox.Bottom, b.BoundingBox.Bottom);
var left = (int) Math.Max(a.BoundingBox.Left, b.BoundingBox.Left);
var right = (int) Math.Min(a.BoundingBox.Right, b.BoundingBox.Right);
for (var y = top; y < bottom; y++)
{
for (var x = left; x < right; x++)
{
var colorA = colorDataA[(int) ((y - a.BoundingBox.Top) * (a.BoundingBox.Width) + (x - a.BoundingBox.Left))];
var colorB = colorDataB[(int) ((y - b.BoundingBox.Top) * (a.BoundingBox.Width) + (x - a.BoundingBox.Left))];
if (colorA.A == 0 || colorB.A == 0) continue;
a.CollisionPoint.ChangePositon(x, y);
b.CollisionPoint.ChangePositon(x, y);
return true;
}
}
return false;
}