2D Spiel: Flüssige Laufbewegung der Spielfigur



  • Hallo!

    Ich habe vor kurzem angefangen mein erstes kleines Spiel zu schreiben. C/C++ programmieren kann ich ganz gut und mit DirectX komme ich bis jetzt auch klar. Es soll ein einfacher 2D Sidescroller werden. Nun stehe ich vor meinem ersten Problem: Zu Sprites habe ich einiges gelesen aber das reicht mir nicht aus. Ich möchte flüssige Bewegungen der Spielfigur (zB beim Laufen) erreichen. Mein Problem ist nicht es umzusetzen sondern Informationen dazu zu finden.

    1.) Nur diese Animation ist mir wichtig: Wie geht das? Welche verschiedenen Möglichkeiten gibt es? Reagieren auf Tastendrücke ist kein Problem.

    Die Spielfigur soll eine recht hohe Auflösung haben.

    2.) Das Spiel wird wie schon gesagt 2D... könnte ich trotzdem ein 3D Model für den Charakter verwenden um Richtungswechsel realistischer zu machen? Alternativen?

    Danke im Voraus 🙂



  • Soweit ich informiert bin könntest du ein 3D Modell benutzen und es Orthogonal Projezieren.
    Ich meine das ganze so gelesen zu haben.

    Angaben ohne Gewähr, es könnte auch totaler Mist sein.
    Aber dass man 3D Modelle auch 2D rendern kann ist klar. (: Nur ob einem das Framework die Arbeit abnimmt... Wie gesagt, ich denke mit der Projektion müsste es gehen.



  • 1.) Nur diese Animation ist mir wichtig: Wie geht das? Welche verschiedenen Möglichkeiten gibt es? Reagieren auf Tastendrücke ist kein Problem.

    Die Spielfigur soll eine recht hohe Auflösung haben.

    Naja, ganz einfach, du speicherst die Position der Figur in 2 Variablen (oder einem Vektor), und addierst dann pro Frame die Geschwindigkeit multipliziert mit der Zeitspanne drauf die zwischen dem vorletzten und dem letzten Frame vergangen ist. (Anders gesagt: von dem Zeitpunkt wo du angefangen hast das letzte Frame zu berechnen bis zu dem Zeitpunkt wo du angefangen hast "dieses" Frame zu berechnen)
    Also quasi (nur mal grob, schematisch):

    class Sprite
    {
    public:
        void Update(double currentTime);
        // ...
    
    private:
        // ...
        double m_speedX;
        double m_speedY;
        double m_posX;
        double m_posY;
    };
    
    void Sprite::Update(double currentTime)
    {
        // vergangene Zeit ausrechnen
        double deltaTime = currentTime - m_lastUpdateTime;
    
        // ggf. neue Geschwindigkeit ausrechnen, wenn die Spielfigur z.B. langsam 
        // beschleunigen/abbremsen soll statt gleich mit voller Geschwindigkeit loszulaufen
        // bzw. abrubt stehen zu bleiben
        // ...
    
        // neue Position ausrechnen
        m_posX += m_speedX * deltaTime;
        m_posY += m_speedY * deltaTime;
    
        m_lastUpdateTime = currentTime;
    }
    

    Und dann halt einfach an Position m_posX, m_posY malen. Fertig.

    2.) Das Spiel wird wie schon gesagt 2D... könnte ich trotzdem ein 3D Model für den Charakter verwenden um Richtungswechsel realistischer zu machen?

    Ja klar geht das. Machen einige Spiele, siehe z.B. Gradius V. Da werden alle Grafiken mit 3D Models gemacht -- das Spiel selbst ist aber 2D (Steuerung, Layout etc.).

    Alternativen?

    Haufenweise kleine Grafiken vorrendern bzw. von einem Grafiker "malen" lassen. Wenn z.B. eine Sequenz (sagen wir Drehung der Spielfigur wenn man die Richtung wechselt) 1/4 Sekunde dauert, dann werden wohl 60/4 = 15 Frames reichen um eine 100% ultimativ butterweiche Bewegung zu haben. Also brauchst du max. 15 Frames um diese Bewegung flüssig darstellen zu können. 5 oder 10 tuns wahrscheinlich genauso.



  • Danke für die Antworten 👍

    Leider komme ich damit nicht wirklich weiter...

    @hustbaer
    So ähnlich mache ich das bisher auch 🙂
    Bewegung an sich ist ja einfach, ich möchte den Spieler halt nur laufen lassen, nicht verschieben. Zu genau diesen Animationen finde ich nichts.

    Ein weiteres Beispiel: Der Spieler springt: Ich möchte den Spieler nicht nur für einen kurzen Moment in die Luft heben er soll sich auch realistisch mit dem Beinen / Armen verhalten. Also nicht ein einfaches Bild sondern schon ein richtiges "Ragdoll" (Begriff nicht ganz so passend) mit beweglichen Gliedmaßen etc.

    Nun kann ich mir da bestimmt was ausdenken und umsetzen, ich würde aber gerne noch ein bisschen mehr wissen, bevor ich einen unnötig komplizierten Weg wähle.

    Haufenweise kleine Grafiken vorrendern...

    Eine gute Idee daran habe ich auch gedacht aber letzendlich beinahe genauso umständlich wie das Erstellen von 3D Models. Die Models sind nicht besonders auf Realistik ausglegt daher wirds eh nicht so schwer.



  • Nun ja, du koenntest ja die Gliedmassen aufteilen und dann entsprechend einzelne Animationen festlegen. Das sieht dann aber sicher bei 2D etwas komisch aus, ist auch nicht gerade einfach zu implementieren (muesstest du dich vielleicht mit inverser Kinematik beschaeftigen), und am Ende also auch nicht einfacher 😉
    Der Vorteil waere allerdings, dass du weniger Grafiken haettest, dynamisch Bewegungen machen kannst und diese zudem nur so doll ruckeln koennen wie der Computer langsam laeuft 😉 (wenn du linear interpolierst)



  • Wie wird das ganze denn bei der Woldview von 3D Shootern gelößt? Ist doch im Prinzip das gleiche. Beispiele brauche ich wohl nicht zu nennen...

    Wenn man auf andere Spieler schaut sieht man auch eine absolut flüssige Laufbewegung bei einem komplexen 3D Model - mit Gelenken.



  • Klar, wenn du richtige 3D-Modelle hast, hast du natürlich mehr Möglichkeiten.
    Da werden dann zum Beispiel Bones verwendet, also du hast im Grunde einfache Skelette, und jeder Punkt des 3D-Modells gehört zu einem bestimmten Teil des Skeletts. Bewegt sich das Skelett, werden auch die Punkte entsprechend neu angeordnet.



  • Danke!

    Fragen haben sich erledigt 🙂



  • Na ich glaub das ist Zeitverschwendung, weil du es nicht hinbekommen wirst. Nimm lieber ein paar Sprites... f'`8k

    Autocogito

    Gruß, TGGC (Der neue Game Star)



  • Zeitverschwendung ist nur dein Beitrag.

    weil du es nicht hinbekommen wirst

    Falsch... jeder Trottel kann es hinbekommen... alles nur eine Frage der Zeit solange die Motivation stimmt.

    Danke für den überflüsssigen Link 🙄
    Vielleicht solltest du dir die Seite besser mal genauer anschauen denn dämlich ist allein deine Annahme dass jemand der einfach keine Ahnung hat gleich dumm ist.
    Wissen hat mit Intelligenz in diesem Fall herzlich wenig zu tun.

    Nimm lieber ein paar Sprites

    Ich habe mich leider schon für 3D Models entschieden :p

    Zu diesem Knochenmodell habe ich auch was gefunden... das gibts ja wirklich 😃
    Habe halt noch nie ein richtiges 3D Model erstellt (nur ein bisschen mit den Polygonnetzen rumprobiert) aber die Ausrüstung ist recht einfach zu machen weil sie wie schon gesagt nicht sonderlich komplex wird.



  • Du darfst mir auch gern spaeter noch fuer meine Weitsicht danken. f'`8k

    Autocogito

    Gruß, TGGC (Der neue Game Star)



  • Du darfst mir auch gern spaeter noch fuer meine Weitsicht danken.

    Mache ich falls es wirklich nichts werden sollte 😉

    Aber dann darf ich dir im anderen Fall auch einen Vortrag über Pessimismus halten.



  • Aber dann darf ich dir im anderen Fall auch einen Vortrag über Pessimismus halten.

    Ich glaube das hat mehr mit Erfahrung und Realismus zu tun...

    Die meisten Hobby-Projekte werden nie fertig (nichtmal annähernd fertig - und "die meisten" sind vermutlich weit über 90%). Sich nicht zu übernehmen steigert die Chancen fertig zu werden ungemein.



  • Die meisten Hobby-Projekte werden nie fertig (nichtmal annähernd fertig - und "die meisten" sind vermutlich weit über 90%). Sich nicht zu übernehmen steigert die Chancen fertig zu werden ungemein.

    Ist kaum zu übersehen. Scheinbar wollen immer mehr Leute gleich ein MMORPG o.ä. machen, haben aber nichtmals Programmiererfahrung. Dann darf man jedem einzelnen erklären wie komplex das ganze Thema ist etc.

    Ich habe selber auch keine Erfahrung mit der gesamten Umsetzung von Spielen. Dafür kann ich aber gut mit C++/C#/Java programmieren. Auch wenn meine Erwartungen an mein erstes Spiel vielleicht schon etwas hoch sind, bin ich mir sicher, dass ich es schaffen kann.

    Meine Aussage bezog sich ja auch "nur" die Verwendung von 3D Models. Sicher macht das einen großen Teil aus aber von mehr habe ich ja nicht gesprochen. Mir reicht es wenn ich auf einer geraden Linie mit einer Figur nach links und rechts laufen kann. Nur so einfach wie bei Mario solls halt nicht sein. Das schaffe ich in ein paar Minuten mit C#/GDI+ (auch wenns wohl nicht schön aussehen würde).

    Zu den Sprites... die Idee ist nicht schlecht und garantiert mit weniger Aufwand verbunden. Eigentlich brauche ich auch gar keine 3D Models für gute Animationen, denn wenn ich genug Bilder habe werden die Bewegungen eh flüssig.
    Andererseits ist 3D Modeling schon spannend 🙂
    Ich habs mit Blender versucht und komme mittlerweile ganz gut damit klar.
    3ds Max wär auch was Schönes aber soweit wollte ich nicht gehen :p

    Ich überleg es mit nochmal... vielleicht versuche ich ja beides... auch wenns ewig dauert. Mit Sprites komme ich bestimmt schneller zu Ergebnissen.



  • Mit Sprites komme ich bestimmt schneller zu Ergebnissen.

    Genau das ist der Punkt. Das Problem an dem die meisten Hobby-Projekte erfahrungsgemäss scheitern ist dass die Motivation nicht lange genug hält. Daher sind sachen gut die schnell gehen. "Übernehmen" war also nicht so gemeint dass man etwas nicht schaffen könnte *wenn* man genug Zeit reinsteckt, sondern dass die Motivation es nicht überlebt und man halt einfach irgendwann den Hut drauf haut.

    Du könntest es ja erstmal mit Sprites machen. Wenn das ganze Teil ferig ist und es dich dann immer noch interessiert kannst du immer noch 3D Models einbauen.



  • Du könntest es ja erstmal mit Sprites machen.

    Ich fange gleich mal an 🙂

    Wenn das ganze Teil ferig ist und es dich dann immer noch interessiert kannst du immer noch 3D Models einbauen.

    Falls das überhaupt Verbesserungen mit sich bringt. Ich meine wenn ich mir mit den Sprites Mühe gebe ist es später wahrscheinlich egal. Schließlich ist es ein 2D Spiel. Für die wenigen Drehungen mache ich dann einfach ne Menge Zwischenbilder.

    Ich fange mal mit einem Strichmännchen an 😛
    Das reicht mir eigentlich auch schon.... wenns einigermaßen gut ausschaut.

    Danke für die Antworten!
    Jetzt weiß ich zumindest wie ich es anstellen werde.

    Edit
    Eine Frage habe ich noch:

    Wenn ich nur ein Strichmännchen zeichnen möchte... lohnt es sich eventuell einfach eine Strichmännchen-Klasse zu programmieren und so mit Primitives (welche ausreichen würden) zu zeichnen oder bleibe ich lieber bei Einzelbildern?

    Ich könnte mir gut vorstellen das die Zeichenfunktion der 1. Version (Klasse) ziemlich schnell wäre und man könnte auch gut zoomen (keine Rastergrafik).



  • Wenn du eh mit Direct3D programmierst, kannst du doch die Drehungen auch von der Grafikkarte erledigen lassen.



  • Bake schrieb:

    Wenn ich nur ein Strichmännchen zeichnen möchte... lohnt es sich eventuell einfach eine Strichmännchen-Klasse zu programmieren und so mit Primitives (welche ausreichen würden) zu zeichnen oder bleibe ich lieber bei Einzelbildern?

    Natürlich kannst Du das auch machen, aber die Einbußen in puncto Flexibilität sind halt sehr groß. Statt einfach mal die Bilder gegen was anderes auszutauschen mußt Du jedes mal den Code ändern, wenn sich die Grafik ändern soll.



  • Natürlich kannst Du das auch machen, aber die Einbußen in puncto Flexibilität sind halt sehr groß.

    Ja das ist klar.

    Ich glaube ich mache es trotzdem, denn es hat ja auch einige Vorteile. Eigene Sprites zu erstellen ist ja auch nicht die schönste Aufgabe 😛

    Interessant wäre doch eine Funktion die automatisch Zwischenbilder generiert. Dann müsste ich nicht jede Bewegung einzeln durch die vielen Punkte ausdrücken (oder durch hunderte Bilder). Fragt sich nur ob die auch schnell genug wäre.

    Wenn du eh mit Direct3D programmierst, kannst du doch die Drehungen auch von der Grafikkarte erledigen lassen.

    Dann habe ich gleich ne dumme Frage: Geht das mehr oder weniger automatisch? Oder meinst du einfach ich kann gleich alles durch Primitives ausdrücken? Das hatte ich vor.

    Wenn ich mich nicht irre, könnte ich bei der Variante mit Direct3D gleich noch einen Schritt weiter gehen: Bilder sind "fest" aber die Striche kann ich ja gleich je nach Untergrund berechnen lassen. Falls ich also weitermache und unebene Maps hinzukommen ist das Ganze realistischer.



  • Irgendwelche Strich-/Klotz-/Primitive-Grafiken einbauen wird auch mehr Aufwand als einfache Sprites sein - zumindest auf der Programmier-Seite.

    Machen kann man viel, die Frage ist was du willst, und was Sinn macht (Aufwand vs. Lerneffekt + Spassfaktor).


Anmelden zum Antworten