2012-04-08 4 views
0

Hallo Stack Overflow Benutzer, ich habe ein lustiges Problem, das ich in meinem XNA-Spiel habe.XNA Rotation Hilfe (interessant ...)

Also im Grunde habe ich einen Asteroiden, 80x80, und ich setze den Ursprung als imageW/2, imageH/2 (Wenn Ordnung wäre, würde es nicht, der Asteroid ist ein Quadrat).

Hier ist ein Bild, das das Problem erklärt! Visualisierung FTW: D

http://i.imgur.com/dsawS.png

Also, alle Ideen auf, was ist der Grund dafür? I 1 Stunde lang, ich Beispiele sah, fand ich heraus, es soll so drehen:

http://www.riemers.net/images/Tutorials/XNA/Csharp/Series2D/rotation.jpg

Aber es ist nicht.

Hier ist ein Codebeispiel. Ich habe ein Objekt mit dem Namen Drawable, die Eigenschaften, die die Vektorposition halten hat usw.

Vector2 asteroidOrigin = new Vector2(asteroidImgs[asteroid.asteroidType].Width/2, asteroidImgs[asteroid.asteroidType].Height/2); 

drawableList.Add(new Drawable(asteroidImgs[asteroid.asteroidType], asteroid.asteroidPos, asteroid.angle, asteroidOrigin)); 

Hier ist die Draw-Methode:

foreach (Drawable drawable in renderManager.getRenderList) 
     { 
      spriteBatch.Draw(drawable.image, drawable.position, drawable.sourceRectangle, drawable.tint, drawable.angle, drawable.origin, drawable.imageScale, drawable.spriteEffects, drawable.depth); 
     } 

Und ja, die Auslosungs Klasse hat mehrere Konstrukteure und sie zuweisen Standard Werte.

+0

Bitte geben Sie Ihren relevanten Code ein, damit wir sehen können, wo das Problem liegt. – Asik

+0

Okay, ich habe gerade Dr_Asik gemacht, aber die Art, wie ich meine Sachen zeichne, ist sehr komplex: P –

+1

Haben Sie es debuggt? Setzen Sie einen Haltepunkt in die foreach-Schleife und durchlaufen Sie jede Iteration, während Sie den Mauszeiger über den Ursprung halten, um zu sehen, ob er den erwarteten Wert enthält. –

Antwort

0

Wenn Sie in SpriteBatch.Draw einen Ursprung definieren, definieren Sie den neuen Punkt in Ihrer Textur, der am Position-Argument gezeichnet wird. Offensichtlich beeinflusst dies sowohl die Übersetzung als auch die gewünschte Rotation. Wenn Sie den Ursprung auf die Mitte des Bildes setzen, wird das Bild so verschoben, dass sich das Zentrum an Ihrer Position befindet und dann um diesen Punkt gedreht wird. Wenn Sie den Ursprung auf Vector2.Zero festlegen, wird die Übersetzung nicht geändert, aber das Bild wird um die obere linke Ecke gedreht. Die Lösung ist entweder neu zu definieren, was Sie als "Position" für Sprites zu sein, wo das Zentrum des Bildes auf dem Bildschirm zeichnet (ich empfehle das, macht die Dinge nett) oder ein wenig Arbeit vor dem Zeichnen durch Hinzufügen der Origin zu der Position vor dem Aufruf von Draw.

Ich empfehle wiederum die erste Lösung, denn wenn Sie einen Kreis in der Mitte des Bildschirms zeichnen möchten, können Sie einfach seine Position als Mittelpunkt des Bildschirms festlegen und fertig sein. Sie müssen seine Größe nicht berücksichtigen. Und so weiter.

+0

Ja genau wie ich vermutet habe. –