wie funktioniert das stehen auf verschiedenen Ebenen in einem Jump' n Run ???



  • hi, ich habe da mal ne frage, ich frage mich wie man es schaft eine spielfigur auf verschiedenen ebenen stehen zu lassen. zB. wenn meine figur von einem festen boden sagen wir (.../1 ) auf eine kiste springt (.../ 4 ), wie schaft man es das meine figur dann auf der neuen ebene in der höhe von 4LE stehen bleibt und nicht durch die kiste fällt und wieder auf (.../ 0 ) landet??? wie wird sowas gemacht?



  • mit kollisionsabfragen

    mfg

    ( www.nin.com )



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • heisst das dann ... das ich zB. eine bool var erstelle mit bool Stehe_auf_boden = true,

    0000000=====000000000000000 <-- hoehere ebene
    000000000000000000000000000 <-- nichts luft
    =========================== <-- boden

    also fuer boden waere die bool dann immer true, im sprung wird sie auf false gesetzt, und dann muss ich für jede kiste ect. immer extra angeben das die bool true ist oder wie???



  • das ist eine möglichkeit, ja

    mfg

    ( www.nin.com )



  • Eine andere Möglichkeit wäre: Du lässt jedes Objekt welches eine Kollision darstellt aus einer abstrakten Basisklasse ableiten. Dann erstellst du einen Container der alle Kollisionsobjekte beinhaltet und bei jedem Frame dort wo du die Spielfigur bewegst (am besten mit einem Vektor und relativer Bewegung zur Framelänge) eine virtuelle Funktion jedes Objekts in dem Container auf, welche auf eine Kollision prüft und entsprechend den Bewegungsvektor der Figur verändert.
    Falls du nicht bei jedem unterschiedlichen Objekt wieder die Kollisionsfunktion neu implementieren willst kannst du auch so was machen:

    CollisionObject
          |
          v
      Rectangle
      /       \
    Box       Player
    

    mfg.



  • irgendwie hab ich das gefühl das meine lösung einfacher klingt oO



  • Einfacher in der Anwendung vlt., aber auch in der Wartung?



  • Am einfachsten ist eine Kollisionsabfrage, wenn man sein Spielfelt wie ben dargestellt Rasterorientier darstellt. aber wir wollen ja nicht bei jedem Frame die kollision der objekte mit jedem Anderem berechnen, also rechnen wir mit unseren koordinaten aus weche koordinaten das auf dem raster sind, und fragen blos eine Kollision mit dem exaktem Feld, und den benachbarten Feldern ab, wie sonst könnte man auch kontrollieren, ob die Kollision oben, oder unten ist ---> hab ich aus blitzbasic)



  • Krux schrieb:

    Am einfachsten ist eine Kollisionsabfrage, wenn man sein Spielfelt wie ben dargestellt Rasterorientier darstellt.

    Da hast du recht. Das schließt meine Methode allerdings nicht aus.

    aber wir wollen ja nicht bei jedem Frame die kollision der objekte mit jedem Anderem berechnen, also rechnen wir mit unseren koordinaten aus weche koordinaten das auf dem raster sind, und fragen blos eine Kollision mit dem exaktem Feld, und den benachbarten Feldern ab,

    ist natürlich nicht so rechenintensiv, aber nicht umbeding einfacher.

    wie sonst könnte man auch kontrollieren, ob die Kollision oben, oder unten ist

    Stichwort Vektoren.

    mfg.



  • joomoo schrieb:

    ist natürlich nicht so rechenintensiv, aber nicht umbeding einfacher.

    Ich glaube er mein sowas.

    if (spielfeld[player.x][player.y+1] == STEIN)
    { 
       // Spieler steht auf Stein. Sonst weiterfallen lassen.
    }
    

    Also so schwer scheint das nicht zu sein. 😃



  • Netzwerk-Latenz schrieb:

    joomoo schrieb:

    ist natürlich nicht so rechenintensiv, aber nicht umbeding einfacher.

    Ich glaube er mein sowas.

    if (spielfeld[player.x][player.y+1] == STEIN)
    { 
       // Spieler steht auf Stein. Sonst weiterfallen lassen.
    }
    

    Also so schwer scheint das nicht zu sein. 😃

    jo, nur dass man bei einer Umsetzung, wie sie da steht sich nicht frei bewegen kann, aber dafür ist es verdammt einfach und absolut rechenleistungssparend. Besser wäre es, um etwas mehr dynamik reinzubringen, dass man ein erst folgendes tut

    if (spielfeld[(int)Player.x/RASTERBREITE,(int)Player.y/RASTERHOEHE])
    

    Player.x und Player.y sind natürlich fließkommazahlen, sonst sind spiele wie supermario nicht zu realisieren. Aber natürlich geht es auch ohne, z.B. black Throne oder Flashback sind dafür Beispiele.



  • Netzwerk-Latenz schrieb:

    joomoo schrieb:

    ist natürlich nicht so rechenintensiv, aber nicht umbeding einfacher.

    Ich glaube er mein sowas.

    if (spielfeld[player.x][player.y+1] == STEIN)
    { 
       // Spieler steht auf Stein. Sonst weiterfallen lassen.
    }
    

    Also so schwer scheint das nicht zu sein. 😃

    Stimmt, auf so was bin ich gar nicht gekommen 🙂
    Aber wenn man z.B. Gegner oder Items einbauen will wird es dann kompiliziert.

    mfg.



  • hmm scheint mir doch ein recht interessantes thema zu sein... drum waer ich auch gern mal so neugierig um zu fragen, wie so eine classe aus sehen könnte? würdet ihr mir vllt. mal ein beispiel bringen?? und vllt. wie man ein sprung fuer eine figur erstellt... weil ich hatte mal ausprobiert:
    bool sprung = false;
    if( taste == 'w' ) {

    int jump = 0;
    if( jump < 3 ) {

    player.y--;
    }
    sprung = false;
    }
    aber dies ging halt net, hmmm...

    also waer nett wenn ihr vllt. mal so Bsp.Code habt.



  • T0bi schrieb:

    hmm scheint mir doch ein recht interessantes thema zu sein... drum waer ich auch gern mal so neugierig um zu fragen, wie so eine classe aus sehen könnte? würdet ihr mir vllt. mal ein beispiel bringen?? und vllt. wie man ein sprung fuer eine figur erstellt... weil ich hatte mal ausprobiert:
    bool sprung = false;
    if( taste == 'w' ) {

    int jump = 0;
    if( jump < 3 ) {

    player.y--;
    }
    sprung = false;
    }
    aber dies ging halt net, hmmm...

    also waer nett wenn ihr vllt. mal so Bsp.Code habt.

    Am besten schau dir Vektoren an. Dann kannst du einfach wenn einer springt den Bewegungsvektor um einen Sprungvektore addieren. Das ganze wird dann automatisch von deinem Schwerkraftsvektor wieder auf den Boden geführt.

    mfg.



  • du meinst jetzt net den container vector oder?



  • nein



  • Vektoren aus der linearen Algebra!

    Mathematik, schonmal gehört?

    ::edit::
    Aber kannst es ja mal mit dem Container probieren 😃



  • xindon schrieb:

    Vektoren aus der linearen Algebra!

    Mathematik, schonmal gehört?

    ::edit::
    Aber kannst es ja mal mit dem Container probieren 😃

    std::vector kann man doch wunderbar als n-dimensionalen Vektor verwenden. Grundlegende mathematische Funktionalität sollte recht einfach zu implementieren sein! 🙂

    grüße



  • Nun ich habe das ganze auch gelöst.
    Und zwar habe ich anfangs einen Editor geschrieben, bei dem man verschiedene Objekte hinzufügen konnte.
    Später im Spiel frag ich dann nurnoch ab ob sich die x und y Koordinaten des Spielers innerhalb eines dieser Objekte befinden.
    Die Abfrage sähe dann ungefähr so aus:

    if(Spielerx > objekt->getposx() && spielerx < objekt->getposx()+objekt->getbreite()
    && Spielery > objekt->getposy() && spielery < objekt->getposy()+objekt->gethoehe()
    

    Ich denk das müsste schon so gehen 🙂
    cya
    David


Log in to reply