[XNA] beschleunigte Bewegung

3dsmaxer

Erfahrenes Mitglied
hallo

ich habe versucht eine beschleunigte Bewegung zu erstellen.
in Physik habe ich imemr gut aufgepasst und in Flash mit ActionScript hat das auch ganz gut funktioniert.

Nun habe ich e sin XNA Gamestudio versucht.
Mein Problem: mit konstanter Geschwindigkeit klappt alles, aber sobald ich eine konstante Beschleunigung mit reinrechne, bewegt sich das Objekt sehr alngsam und Geschwindigkeit ist trotzdem noch konstant.

Wenn mir jemand erklären könnte, wo mein Fehler liegt, wäre ich froh.

PHP:
  public class Game1 : Microsoft.Xna.Framework.Game
    {
            GraphicsDeviceManager graphics;
            SpriteBatch spriteBatch;
            Texture2D strand;
            Texture2D ball;
            Vector2 ballposition = Vector2.Zero;
            Vector2 ballgeschw = new Vector2(50.0f, 250.0f);
            Vector2 ballbeschl = new Vector2(0, 20f);
   }

  
void UpdateSprite(GameTime gameTime)
{
            float t = (float)gameTime.ElapsedGameTime.TotalSeconds;
            ballgeschw += ballbeschl * t;
            
            ballposition += ballgeschw * t; ;

            int MaxX = graphics.GraphicsDevice.Viewport.Width - ball.Width;
            int MinX = 0;
            int MaxY = graphics.GraphicsDevice.Viewport.Height - ball.Height;
            int MinY = 0;

        // Kollisionsabfrage
            if (ballposition.X > MaxX)
            {
                ballgeschw.X *= -1;
                ballposition.X = MaxX;
            }

            else if (ballposition.X < MinX)
            {
                ballgeschw.X *= -1;
                ballposition.X = MinX;
            }

            if (ballposition.Y > MaxY)
            {
                ballgeschw.Y *= -1;
                ballposition.Y = MaxY;
            }

            else if (ballposition.Y < MinY)
            {
                ballgeschw.Y *= -1;
                ballposition.Y = MinY;
            }
}
 
Ok soweit ich das sehe, liegt der Fehler hier:

ballgeschw += ballbeschl * t;

ballposition += ballgeschw * t; ;

weil wenn du ballposition += ballgeschw * t; rechnest, würdest du ja so tun also ob der Ball von Anfang der Zeit t (t=0) schon mit ballgeschw + ballbeschl fliegt, was ja falsch ist, denn der Ball hat erst zu dem Zeitpunkt t auch wirklich ballgeschw + ballbeschl.

ich würde das ganze so machen

s = 1/2 * a * t² (Formel für beschleunigte Bewegung)

also:

ballpostion.X += 1/2 * ballbeschl.X * t * t + ballgeschw.X * t;
ballgeschw.X += ballbeschl.X * t; //Erst jetzt der Geschwindigkeit zuweisen!!

das gleich dann auch noch für y

ICH BIN MIR DA JETZT ABER NICHT SICHER, müsste aber glaube ich stimmen...
 
hallo

danke für die antwort.

ich habe es ausprobiert:

einmal
PHP:
ballpostion.X += 1/2 * ballbeschl.X * t * t + ballgeschw.X * t;
ballgeschw.X += ballbeschl.X * t;

und einmal habe ich das t hinter ballgeschwindigkeit weggelassen:
PHP:
ballpostion.X += 1/2 * ballbeschl.X * t * t + ballgeschw.X;
ballgeschw.X += ballbeschl.X * t;

normalerweise müsste 1/2*a*t² + v*t stimmen....

in der ersten Version passiert genau das, was ich am anfang auch hatte. Der Ball bewegt sich mit konstanter Geschwindigkeit und sehr langsam.

in Version zwei bewegt sich der Ball auch mit konstanter Geschindikeit, aber viel schneller.
Eine beschleunigte Bewegung hab ich leider immer noch nicht.

Ich vermute so langsam, dass mit t etwas nicht stimmt.
 
Zuletzt bearbeitet:
Du muss schreiben:

ballpostion.X += 0.5f * ballbeschl.X * t * t + ballgeschw.X * t;
ballgeschw.X += ballbeschl.X * t;

so geht's, ich hab's mal bei mir getestet, allerdings jezt nicht xna sondern nur geschwind mit gdi+

wenn du 1 / 2 rechnest erhält der PC 0, weil er es als eine int Rechnung durchfüht, und so kann es auch niemals beschleunigt werden. Oder halt einfach 1f / 2f
 
Es erscheint mir alles logisch, was du schreibst.

Ich habe es nun auf beide Arten versucht, mit 0.5f und mit 1f/2f.
Der Ball bewegt sich nun nicht mehr so extrem langsam, aber leider ist die Beschleunigung immernoch nicht vorhanden, der Ball hat immer noch eine konstante Geschwindigkeit.
 
:suspekt:
Du kannst mal alle Teilberechnungen der Formel in einzelne Variablen speichern und dann mit dem Debugger schauen ob er noch etwas falsch rechnet. Wenn du willst kann ich dir auch mein kurzes Testprojekt schicken. Aber der Fehler kann eigentlich niht mehr in der Formel liegen, weil bei mir hat es ja auch funktioniert
 
Zuletzt bearbeitet:
ich hab jetzt alle Teilrechnungen in Variablen gespeichert.
Der Fehler ist immernoch der selbe.

Ich hab nun den Debugger gestartet, und unter jede Variable
PHP:
Console.Write(varibalennamen);
geschrieben.
Aber in der Console wird leider nichts ausgegeben.

Langsam glaube ich, dass XNA nicht ganz richtig läuft...
 
Auf die Konsole kannst du so nichts schreiben, das geht nur bei einer Konsolenanwendung, so weit ich weiß. Müsste man mal googeln ob oder wie man die so öffnen könnte.
Aber was ich meinte war, dass du im Debugger die Werte der Variablen anschaust. Wenn du im Debugg-Modus mit der Maus über eine Variable fährst, wird deren Wert angezeigt. So sparst du dir dann auch die Konsole.
 
Vielleicht ist zum Ausgeben das hier möglich:

Debug.Write("Huhu")

Dann sollte "Huhu" im Ausgabe-Fenster in Visual Studio landen...
 
funktioniert leider nicht....
Wenn ich
PHP:
Debug.Write("irgendwas");
schreibe, kommt: "Der Name Debug ist im aktuellen Kontext nicht vorhanden."

Komisch, da ich weiß, dass es die Klasse Debug in Visual Studio geben sollte.
 

Neue Beiträge

Zurück