Ich gruppiere derzeit Sprites und wende dann beim Zeichnen eine Rotationstransformation an:
private void UpdateMatrix(ref Vector2 origin, float radians)
{
Vector3 matrixorigin = new Vector3(origin, 0);
_rotationMatrix = Matrix.CreateTranslation(-matrixorigin) * Matrix.CreateRotationZ(radians) * Matrix.CreateTranslation(matrixorigin);
}
Wo der Ursprung der zentralste Punkt meiner Gruppe von Sprites ist. Ich wende diese Transformation auf jedes Sprite in der Gruppe an.
Mein Problem ist, dass sich meine gesamte Sprite-Gruppe beim Anpassen des Ursprungspunkts auf dem Bildschirm neu positioniert.
Wie kann ich den in der Transformation verwendeten Drehpunkt von der Position der Sprite-Gruppe unterscheiden? Gibt es eine bessere Möglichkeit, diese Transformationsmatrix zu erstellen?
BEARBEITEN
Hier ist der relevante Teil der Draw () -Funktion:
Matrix allTransforms = _rotationMatrix * camera.GetTransformation();
spriteBatch.Begin(SpriteSortMode.BackToFront, null, null, null, null, null, allTransforms);
for (int i = 0; i < _map.AllParts.Count; i++)
{
for (int j = 0; j < _map.AllParts[0].Count; j++)
{
spriteBatch.Draw(_map.AllParts[i][j].Texture, _map.AllParts[i][j].Position, null, Color.White, 0, _map.AllParts[i][j].Origin, 1.0f, SpriteEffects.None, 0f);
}
}
Dies alles funktioniert wieder einwandfrei. Das Problem besteht wiederum darin, dass die Position der Sprite-Gruppe auf dem Bildschirm versetzt wird, wenn eine Drehung festgelegt und der Ursprungspunkt geändert wird.
Ich versuche einen Weg zu finden, um den Ursprungspunkt anzupassen, ohne eine Positionsverschiebung zu verursachen.
BEARBEITEN 2 An dieser Stelle suche ich nach Problemumgehungen, da dies nicht funktioniert. Kennt jemand einen besseren Weg, um eine Gruppe von Sprites in XNA zu drehen? Ich benötige eine Methode, mit der ich den Drehpunkt (Ursprung) ändern kann, ohne die Position der Sprite-Gruppe auf dem Bildschirm zu beeinflussen.
BEARBEITEN 3 Ich denke, wenn ich die Bildschirmkoordinaten an meiner Sprite-Position auf (0,0) zurücksetzen könnte, würde es mir im Wesentlichen ermöglichen, den Ursprung ohne Bewegung neu zu positionieren. Ich brauche im Wesentlichen eine Möglichkeit, die aktuelle Position / Drehung einzustellen und dann von vorne zu beginnen. Weiß jemand, ob es möglich ist, mein Sprite zum neuen Bildschirmursprung zu machen?
URSPRUNG OHNE DREHUNG BEWEGEN:
URSPRUNG MIT DREHUNG BEWEGEN (beachten Sie, wie er sich nach oben verschoben hat):