XNA-Sample: MoonTaxi (Teil 1)


Hallo lieber Leser dieses Blogs. Bedingt durch den Wechsel meines Arbeitgebers wurde dieser Blog inzwischen eingestellt und ich habe leider keine Chance, die Inhalte auf dem aktuellen Stand zu halten. Dank der hohen Nachfrage des XNA Tutorials, habe ich diesen Beitrag auf meinen neuen Blog umgezogen. Dort stehen dann auch die notwendigen Downloads zum Sourcecode zur Verfügung. Ich entschuldige mich für diese Weiterleitung, hoffe aber trotzdem auf größtmöglichen Spaß.

Das Tutorial befindet sich jetzt auf http://blog.tomwendel.net

Direkte Links zum MoonTaxi XNA Tutorial:

Comments (25)

  1. bigbasti says:

    Sehr schönes Tutorial, danke dafür! Werde ich heute noch ausprobieren! Freue mich schon auf die nächsten Teile!

  2. giorgio says:

    absolut der hammer dein Tutorial. danke dir vielmals für deine Mühe und deine super Erklärungen.

    werde sofort loslegen mit deinem Spiel

  3. er says:

    es ist gut aber ich kann irgend wie dieses moon taxi nict finde

  4. Nepochal says:

    Ich stimme zu. Ich habe den ersten Teil gerade ohne Vorkentnisse nachprogrammiert und sofort nachvollzogen. Aber eines stört mich: Die Gravitation wirkt sich nur auf die Y-Achse aus. Da mein mathematisches Wissen bereits sehr eingestaubt ist, würde ich mich freuen, wenn du dazu schreiben könntest, wie man das Taxi mathematisch korrekt auf der X-Achse durch Gravitation abbremsen lassen kann.

  5. Tom Wendel says:

    Hallo Nepochal. Die Gravitation wirkt nun leider nur nach unten, daher nur die Y-Achse. Was du vielleicht meinst ist die Dämpfung durch den Luftwiderstand? Also dass das Fahrzeug auch wieder langsamer wird, wenn du nichts tust?

    Das ist auch nicht so schwer. Was dabei physikalisch passiert ist, dass das Fahrzeug vom Luftwiederstand kontinuierlich langsamer wird. Dabei ist die Dämpfung prozentual und nicht linear. Das Fahrzeug verliert mehr Geschwindigkeit, je schneller das ist. Um es in Zahlen auszudrücken: Das Taxi wird pro Sekunde vielleicht um 10% langsamer.

    Am besten realisierst du das, indem du nach der ganzen Geschwindigkeitsberechnung einfach x Prozent pro Sekunde abziehst.

    // Geschwindigkeitsänderung auf das Taxi anwenden

    taxi.Speed = new Vector2(taxi.Speed.X + deltaX, taxi.Speed.Y + deltaY);

    taxi.Speed *= 0.9 * (float)gameTime.ElapsedGameTime.TotalSeconds;

    Etwa so. Aber vorsicht. Ich hab das jetzt nicht getestet.

  6. Nepochal says:

    Hallo Herr Wendel,

    vielen Dank für die schnelle Antwort. Ja genau, den Luftwiderstand meinte ich. Ich habe es wie beschrieben ausprobiert und es funktioniert wunderbar. Damit das Fahrzeug auf der X-Achse auch ganz zum stehen kommen kann, habe ich zusätzlich noch eine Konstante pro Sekunde abgezogen.

    mfG, Nepochal

  7. Sasasmack says:

    Hallo Herr Wendel,

    Ich bin gerade dabei mir dieses Tutorial mal näher zu Gemüte zu führen und muss Ihnen erst einmal ein Lob aussprechen, da dieses Tutorial wirklich ein sehr ausführlich beschriebenes und gut nachvollziehbares Tutorial ist, wie man sie im Internet nur selten findet. Jedoch habe ich momentan ein Problem, bei welchem ich auch nach längerem Rätseln und Ausprobieren keine Lösung finde. Vorweg ist zu sagen dass ich die Version 4.0 von XNA benutze. Ich habe die obigen Schritte wie beschrieben befolgt und versuchte nachdem die erste Textur in den entsprechend Ordner kopiert wurde diese mit "taxiTexture = Content.Load<Texture2D>("Taxi");" zu laden. Ich habe darauf geachtet, dass sie im passenden Ordner liegt und dass der String dem assetnamen entspricht. Wenn ich nun versuche das Programm auszuführen bekomme ich jedesmal die Meldung"ContentLoadException unhandled. Error loading "Taxi". File not found.". Die im Internet beschriebenen Lösungen für dieses Problem halfen in meinem Fall leider auch nicht. Ich wäre Ihnen sehr verbunden wenn Sie mir eventuell bei der Lösung des Problems zur Seite stehen könnten. Ich bitte Sie zu bedenken, dass ich mich gerade erst in C# als auch XNA reinarbeite und daher bisher erst ein grundliegendes Verständnis dieser Sprache habe, jedoch kein absoluter Programmierneuling bin, da ich sowohl Project Pascal als auch SML mächtig bin.

    Mit freundlichen Grüßen Sasasmack

  8. Tom Wendel says:

    Content.Load<Texture>("taxi") prüft auf den Asset Name. Zusätzlich kann man noch einen Pfad angeben, sollten die Assets in Ordnern angeordnet ist. Der Asset Name wird erstmal autogeneriert aus dem Dateinamen (Vorsicht! Groß/Kleinschreibung beachten), kann aber über die Eigenschaften des Assets geändert werden.

  9. messy says:

    Grandios! Ich habe im Rahmen meines Studiums bereits viel mit C# gearbeitet. Bisher waren das immer nur "langweilige" Übungsaufgaben. Privat wollte ich mich mal mit der "Gameentwicklung" beschäftigen und dafür ist dein Tutorial wunderbar geeignet. Zum Glück bin ich nach langem "Googeln" darauf gestoßen.

    Danke dafür.

  10. Freak! says:

    Super sache!

    Mache gerade eine Ausbildung als Anwendungsentwickler und mache privat sehr viel mit C#. Habe lange nach einem ausführlichen Tutorial gesucht  und bin jetzt zum glück fündig geworden! Top sache ^^

  11. Tom Wendel says:

    Vielen Dank!!! Ich arbeite auch schon an einer Fortsetzung. so stay tuned…

  12. mrt says:

    Vielen Dank! Und mach bitte bitte weitere Tuts. Ich weiß, man kann sowas nur vollständig beherrschen, wenn man einfach alles einzeln selber ausprobiert und sich informiert etc.pp., aber evtl kannst du ja auch weiterführendes, egal was(Buch, Seite..), empfehlen?

  13. Kumaro87 says:

    Hallo, super Tutorial, vielen vielen Dank dafür :). Ich hoffe wirklich es war nicht das letzte ;).

    Leider habe ich jetzt ein kleines Problem, und das beginnt schon bei der ersten Variablendeklarierung:

    Ich benutze das Visual Studio 2010 Express für Win Mobile und XNA 4.0.

    Wenn ich jetzt das Taxi als variable initialisieren will:

    taxiTexture = Content.Load<Texture2D>("Taxi");

    bekomm ich folgende Fehlermeldung:

    The name 'taxiTexture' does not exist in the current context

    Leider kann ich den Grund für die Fehlermeldung nicht finden, was mach ich falsch? Kann es an XNA 4.0 liegen?

    Ich hoffe Sie können mir helfen.

    mfg

  14. Tom Wendel says:

    Hey Kumaro. Der Grund für deine Fehlermeldung ist eine fehlende Variable in deiner Klasse. taxiTexture muss erst weiter oben noch deklariert werden. Das steht so nur im Fließtext – keine Quellcodevorlage. Du musst im oberen Bereich der Klasse noch "private Texture2D taxiTexture;" einfügen, dann gehts. Beschrieben ist das in Schritt 3, gleich nach Abbildung 6.

    Viel Erfolg weiterhin!

  15. steve83 says:

    Wo finde ich dein demo project und die resoucen bzw. bilder für das game??

  16. Tom Wendel says:

    Hallo Steve,

    am Ende jedes Artikels gibt es einen Link "Quellcode Teil x". Da würde ich es als erstes versuchen.

    Cheers

    Tom

  17. Marrokk says:

    Hey, ich hab ne frage und zwar:

    kennt ihr ein gutes Programm mit dem man 2DTexturen erstellen kann.

    Mit Paint funktioniert das ganze bei mir nicht so richtig

    Danke im Vorraus

  18. Tom Wendel says:

    Moinsen. ich mache mein Zeug normalerweise mit Paint.NET (www.paint.net).

  19. cead says:

    sehr schönes Tutorial danke dafür !!

  20. KarDa says:

    Hallo,

    sehr schönes tutorial, führt einen richtig gut ein.

    Nur noch einen Verbesserungsvorschlag:

    Ich würde das so machen die Bewegung mit der Bewegungsgleichung lösen:

    public void Bewegen(Microsoft.Xna.Framework.GameTime gametime,float powerX,float powerY)

           {

               Vector2 power = new Vector2(powerX * POWER, powerY * POWER);

               // Gravitation

               Speed.Y = Speed.Y + (float)(GRAVITY * gametime.ElapsedGameTime.TotalSeconds);

               Position.Y = Position.Y + Speed.Y   * (float)gametime.ElapsedGameTime.TotalSeconds + (float)(GRAVITY * Math.Pow(gametime.ElapsedGameTime.TotalSeconds, 2) / 2);

               //Power

               Speed = Speed + (power * (float)gametime.ElapsedGameTime.TotalSeconds);

               Position = Position + Speed * (float)gametime.ElapsedGameTime.TotalSeconds + Speed * (power * (float)Math.Pow(gametime.ElapsedGameTime.TotalSeconds,2))/2;

           }

  21. Marco says:

    Hallo Herr Wendel,

    ich möchte gerne die zeit wenn man die taste loslässt bis zum stoppen des objekts verkürzen bzw es direkt zum stehen zu bringen. Wie genau geht das?

    MfG

    Marco

  22. mcn says:

    Sehr geiles Tutorial.

    Habe das auf XNA 4 nachprogrammiert.

    Habe zwar ca. 2 Jahre Vorkenntnisse in C#, aber an Spieleentwicklung hab ich mich nimmer getraut – das war immer ein Heiliger Gral – dem DU nun die Heiligkeit genommen hast :)

    Leider fällt das Taxi bei mir zu schnell, als das auf Tastatureingaben reagiert wird.

    Habe deswegen GRAVITY = 9.81f / 10f sowie JETPOWER = 300f gesetzt.

    Sehr schön auch der Einwand mit dem Luftwiderstand – und nett gelöst.

    Verbesserungsvorschlag: Code NICHT im Fließtext unterbringen, sondern klar als Code kennzeichnen. Und evtl. bissl ausführlicher auf einzelne Dinge eingehen, wie z.B.: Was es mit der "gametime.ElapsedTime.xx" auf sich hat. Oder die (Vektor?)-Berechnung der Positionsänderung des Taxis mathematisch darstellen, also mit Tabellen (Matrizen?). OK, könnte dann auch wieder zu fachlich werden. Ich persönlich finds aber nicht uninteressant und auch (später) wichtig.

    Ansonsten… mach ich mich jetzt mal an Teil 2.

  23. PoStreMo says:

    Tolles Tutorial, hat mir sehr weitergeholfen!

    Finde ich sogar besser als das Buch, dass ich gerade über XNA lese ("Spieleprogrammierung mit dem XNA Framework")

    Ich hoffe es kommt noch mehr!

  24. Guardian says:

    Der Quellcode auf dem SkyDrive scheint nicht mehr verfügbar zu sein. Gibt es einen alternativ Link oder wie kann ich an die Sourcen kommen – Danke!

  25. Guardian says:

    Hallo Herr Wendel,

    können Sie bitte den Quellcode noch einmal zur Verfügung stellen – SkyDrive meldet, dass die Dateien nicht mehr vorhanden wären.

    Vielen Dank!