Gerade jetzt für die Drehung habe ich einen separaten Rahmen für jeden Drehwinkel, aber ich habe viel eher ein Bild, das ich rotiere. Meine Frage ist, wie mache ich eine Matrix-Transformation in XNA/C#, so dass die Farbdaten ebenfalls genauso gedreht werden, wie das Sprite auf dem Bildschirm gerendert wird? Ich habe dieses alte SO question gefunden, aber ich verstehe die Antwort wirklich nicht, und ich würde gerne wissen, wie der Code funktioniert, falls er später geändert werden muss.XNA: Kollisionen zwischen rotierenden Sprites
Alle erforderlichen Positions-/Rotationsinformationen werden in der Entität gespeichert, die das Sprite enthält, und es wird angenommen, dass beide Sprites rotieren.
Hier ist mein Code so weit:
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;
}