Problem bei Jump and Run

Previous topic - Next topic

Lloyd

Hallo,

Ich bin noch ganz frisch bei GLBasic und mache deshalb grade einige Tutorials. Mein erstes erklärtes Ziel ist es ne Simple "Rechts-Links" Steuerung mit 6 Bildern pro Animation und 2 für Stillstand zu machen (6 Bilder für die Animation "Nach Rechts gehen", 6 Bilder für die Animation "Nach Links gehen" und jeweils ein Bild für Stillstand für Links und Rechts).

Code (glbasic) Select
// --------------------------------- //
// Project: Test
// Start: Friday, November 09, 2007
// IDE Version: 5.071
// --------------------------------- //


// --------------------------------- //
// --->Grafiken laden
// --------------------------------- //


// --->Charakter: Deidara

//Stillstand

LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/stanceR.png", 0
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/stanceL.png", 1

//Gehen - Rechts

LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk1R.png", 2
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk2R.png", 3
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk3R.png", 4
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk4R.png", 5
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk5R.png", 6
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk6R.png", 7

//Gehen - Links

LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk1L.png", 8
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk2L.png", 9
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk3L.png", 10
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk4L.png", 11
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk5L.png", 12
LOADSPRITE "Ressourcen/Grafiken/Charakters/Deidara/walk6L.png", 13


// --------------------------------- //
// --->Animationsdeklaration
// --------------------------------- //


// --->Charakter: Deidara

DIM WalkRechts[7]      //7 Bilder pro Animation
DIM WalkLinks[7]       //7 Bilder pro Animation

//Die Bilder werden ins Array (Datenfeld) geladen

WalkRechts[0] = 0
WalkRechts[1] = 2
WalkRechts[2] = 3
WalkRechts[3] = 4
WalkRechts[4] = 5
WalkRechts[5] = 6
WalkRechts[6] = 7

WalkLinks[0] = 1
WalkLinks[1] = 8
WalkLinks[2] = 9
WalkLinks[3] = 10
WalkLinks[4] = 11
WalkLinks[5] = 12
WalkLinks[6] = 13


// --------------------------------- //
// --->Globale Variablen
// --------------------------------- //


GLOBAL Richtung = 0            //Richtung merken (0=Rechts, 1=Links)
GLOBAL Geschwindigkeit = 2     //Geschwindigkeit der Bewegung in Pixel/s
GLOBAL AniVerzoegerung = 100   //Animationsverzögerung
GLOBAL Spieler_X = 100         //Position des Spielers auf der X-Achse
GLOBAL Spieler_Y = 100         //Position des Spielers auf der Y-Achse


// --------------------------------- //
// --->Hauptprogramm
// --------------------------------- //


WHILE TRUE  //EndlosSchleife für das Hauptprogramm
   LOCAL Bewegung = 0 //Lokale Variable "Bewegung" wird Null gesetzt -> keine Bewegung!

// --->Nach Rechts gehen


   IF KEY (205) AND KEY (203) = 0    //Wenn Taste "Rechts" gedrückt ist und Taste "Links" nicht
      Richtung = 0                   //0 = Rechts
      Bewegung = 1                   //Bewegung findet statt
      INC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Rechts versetzt
     
      DRAWSPRITE WalkRechts[WR], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen
     
      IF Timer < GETTIMERALL()
        INC WR, 1                               //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung  //Timer erhöhen (Verzögerung)
      ENDIF
     
      IF WR > BOUNDS (WalkRechts[], 0) THEN WR = 0  //Wenn WR größer als die Anzahl der Felder im Array WalkRechts[] ist dann 0
     
   ELSE
      WR = 0 //WR wird Null gesetzt, da "Rechts" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF
   
   
// --->Nach Links gehen

   
   IF KEY (203) AND KEY (205) = 0    //Wenn Taste "Links" gedrückt ist und Taste "Rechts" nicht
      Richtung = 1                   //1 = Links
      Bewegung = 1                   //Bewegung findet statt
      DEC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Links versetzt
     
      DRAWSPRITE WalkLinks[WL], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen
     
      IF Timer < GETTIMERALL()
        INC WL, 1                               //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung  //Timer erhöhen (Verzögerung)
      ENDIF
     
      IF WL > BOUNDS (WalkRechts[], 0) THEN WL = 0  //Wenn WL größer als die Anzahl der Felder im Array WalkLinks[] ist dann 0
     
   ELSE
      WL = 0 //WL wird Null gesetzt, da "Links" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF
   
WEND
END
Hab das nach einem Tutorial hier im Forum gemacht (bisschen verändert und angepasst), bringe das aber nicht zum Laufen. Er spuckt keine Fehlermeldungen aus, sondern bleib einfach bei der Ausführung der EXE hängen, Auf dem Bildschirm steht dann einfach "Loading......", bis ich das Programm schließen will und dann Windows meldet, das das Prog nicht reagiert^^

Woran liegt das? Muss da ja wohl irgendwas falsch gemacht haben:/

Danke schonmal im voraus;)

D2O

Na dann mal Hallo hier :)

OK, folgendes,
1. Du hast "Showscreen " vergessen :)
2. Dann, wenn Du es am schleifen ende setzt, wird dir nur was angezeigt wenn Du eine Steuerungstaste drückst.

Mach für das Sprite objekt nur ein Drawsprite im Mainprogram und verändere nur die Animations variable in den If abfragen.
Gemeint in etwa so ;) nur Pseudo code ;)


QuoteWhile...
if
blablabla... dann animation = alkRechts[WR]
end
if
blablabla... dann animation = alkRechts[WR]
end

DRAWSPRITE animation, Spieler_X, Spieler_Y
showscreen
wend
Ich hoffe Du verstehst was ich meine.
Ich möchte Dir hier nicht denn ganzen Code vorkauen, ein kleines bisschen selber Denken :)

Wenns dann immer noch nicht klabt, einfach nochmals fragen und wir werden etwas genauer darin eintauchen.

Edit://
Jepp, Dein Code ist sehr schön Kommentiert :good:
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

Liest sich sehr gut dein Code!
Aber Showscreen sollte man nicht vergessen ;)

Und D²0 hat recht!

Wenn kein DRAWSPRITE ausserhalb der IF-Schleife steht gibts kein bild!

Also muss du noch machen das wenn keine Taste gedrückt ist das Standbild der jeweiligen seite noch angezeigt wird:

Pseudo:
Code (glbasic) Select
If key(rechts)
    standbild = standbildrechts
    ....
endif

if key(links)
    standbild = standbildlinks
    ....
endif

//some code

If key(rechts) = 0 and key(links)= 0
    Drawsprite standbild,pos_x,pos_y
endif
Naja ausserdem war das tutorial von mir, und nicht so der hit ^^
Weiss ich selber....
Würd es jetzt mit Types machen denke ich ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Lloyd

Oh verdammt, Showscreen xD Man nimmt sich so vor das man es nie vergisst und dann passiert es trotzdem xD

Naja, habs mit eurer Hilfe dann jetzt zum laufen bekommen, habe sogar noch ne Rennanimation hinzugefügt, wenn man "Shift" drückt^^

Code (glbasic) Select
// --->Keine Bewegung

   IF Richtung = 0 AND Bewegung = 0                    //Wenn man nach "Rechts" schaut und keine Bewegung macht,....
      DRAWSPRITE WalkRechts[0], Spieler_X, Spieler_Y   //...dann Standbild "Rechts"
   ENDIF

   IF Richtung = 1 AND Bewegung = 0                    //Wenn man nach "Links" schaut und keine Bewegung macht,....
      DRAWSPRITE WalkLinks[0], Spieler_X, Spieler_Y    //...dann Standbild "Links"
   ENDIF


SHOWSCREEN
WEND
END
Das da oben hat dann am Ende noch gefehlt:)

Wenn ich jetzt aber ne Sprunganimation zusätzlich machen will wird es echt unübersichtlich. Ich weiß zwar wie ich das realisieren kann, aber ich muss dann ja erstmal was für Springen auf der Stelle und dann noch für Springen aus dem Rennen raus deklarieren. Und das auch noch 2 mal (für Links und Rechts). Werde da mal irgendwie versuchen das zu vereinfachen^^

Kann man eigentlich auch mehrere gbas-Dateien in ein Projekt einfügen und wenn ja, wie Verknüpft man diese? Weil dann könnte ich ja zum Beispiel eine gbas-Datei nur für die Steuerung machen, usw.

S.O.P.M.

Ja das geht. Einfach neue Datei öffnen (nicht Projekt) und dann in der Projektübersicht rechte Maustaste auf die entsprechende Datei und "Datei hinzufügen".
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Lloyd

Ich hab das jetzt mal versucht und es ging auch, aber das Programm ging nicht^^ Der schreibt jetzt dauernd das der und der Befehl weder in einer Sub, noch in einer Function sind xD Wenn ich die dann aber in eine Function setzte kommt ein Fatal Error und nix geht mehr xD

Und wie kann man das vereinfachen? Hab das versucht mit Types zu machen, aber mehr als Mist ist dabei nicht herausgekommen xD Bitte nicht zu viel verraten, einfach nur nen Gedankenanstoß, sonst lern ich das nie xD

Schranz0r

Project öffnen
Dann Datei/Datei/Neu
Diese dann mit "Speichern unter" in den Projectordner speichern.
Neben dem Codefenster auf die Tab-Karte Dateien wechseln

Dadrin dann rechtsklick, Datei hinzufügen und die datei aus dem Projectordner auswählen fertig!

 ;)

Ganz einfach da kannst du dann deine Subs/Functionen reinpacken


Ach, und nochmal ein LOB für den schön Formierten Code !
Echt ein Musterbeispiel an übersicht!
Sehr gute Arbeit!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Lloyd

Quote from: Schranz0rProject öffnen
Dann Datei/Datei/Neu
Diese dann mit "Speichern unter" in den Projectordner speichern.
Neben dem Codefenster auf die Tab-Karte Dateien wechseln

Dadrin dann rechtsklick, Datei hinzufügen und die datei aus dem Projectordner auswählen fertig!

 ;)

Ganz einfach da kannst du dann deine Subs/Functionen reinpacken
Das hab ich schon geschafft, hab wohl einfach nur ein paar Probs mit den Funktionen, da die nicht so gut erklärt sind und ich deshalb nicht die geringste Ahnung hab für was die gut sind und warum man die verwenden muss xD Aber schaff ich schon noch^^

Quote from: Schranz0rAch, und nochmal ein LOB für den schön Formierten Code !
Echt ein Musterbeispiel an übersicht!
Sehr gute Arbeit!
Vielen Dank für das Lob:)

Aniel

Jetzt wo dus sagst wäre es tatsächlich mal gut wenn man mal ein Tutorial über Funktionen machen würde, weil wenn jemand ohne Programmierkenntnisse herkommt schafft er es nie und nimmer mit denen aus der GLBasic Hilfe das zu verstehen. Die machen das Unverständnis fast noch schlimmer>.<

Aniel

Code (glbasic) Select
// ------------------------------------------------------------- //
// -=#  Steuerung der Hauptperson  #=-
// ------------------------------------------------------------- //


SUB HeldSteuerung:

// ------------------------------------------------------------- //
// -=#  Globale Variablen und Datenfelder  #=-
// ------------------------------------------------------------- //


LOCAL Richtung = 0            //Richtung merken (0=Rechts, 1=Links)
LOCAL Geschwindigkeit = 0     //Geschwindigkeit der Bewegung in Pixel/s
LOCAL Sprungkraft = 0         //Wie hoch der Spieler springt in Pixel/s
LOCAL AniVerzoegerung = 100   //Animationsverzögerung
LOCAL Spieler_X = 100         //Position des Spielers auf der X-Achse
LOCAL Spieler_Y = 100         //Position des Spielers auf der Y-Achse

DIM WalkRechts[7]      //7 Bilder pro Animation
DIM WalkLinks[7]       //7 Bilder pro Animation
DIM RunRechts[6]       //6 Bilder pro Animation
DIM RunLinks[6]        //6 Bilder pro Animation
DIM JumpRechts[5]      //5 Bilder pro Animation
DIM JumpLinks[5]       //5 Bilder pro Animation


//Die Bilder werden ins Array (Datenfeld) geladen

   WalkRechts[0] = 0
   WalkRechts[1] = 2
   WalkRechts[2] = 3
   WalkRechts[3] = 4
   WalkRechts[4] = 5
   WalkRechts[5] = 6
   WalkRechts[6] = 7

   WalkLinks[0] = 1
   WalkLinks[1] = 8
   WalkLinks[2] = 9
   WalkLinks[3] = 10
   WalkLinks[4] = 11
   WalkLinks[5] = 12
   WalkLinks[6] = 13

   RunRechts[0] = 14
   RunRechts[1] = 15
   RunRechts[2] = 16
   RunRechts[3] = 17
   RunRechts[4] = 18
   RunRechts[5] = 19

   RunLinks[0] = 20
   RunLinks[1] = 21
   RunLinks[2] = 22
   RunLinks[3] = 23
   RunLinks[4] = 24
   RunLinks[5] = 25

   JumpRechts[0] = 26
   JumpRechts[1] = 27
   JumpRechts[2] = 28
   JumpRechts[3] = 29
   JumpRechts[4] = 30

   JumpLinks[0] = 31
   JumpLinks[1] = 32
   JumpLinks[2] = 33
   JumpLinks[3] = 34
   JumpLinks[4] = 35



// ------------------------------------------------------------- //
// -=#  STEUERUNG  #=-
// ------------------------------------------------------------- //


WHILE TRUE

   LOCAL Bewegung = 0 //Lokale Variable "Bewegung" wird Null gesetzt -> keine Bewegung!


// --->Nach Rechts gehen


   IF KEY (205) AND KEY (203) = 0 AND KEY (42) = 0    //Wenn Taste "Rechts" gedrückt ist und Taste "Links" und "Shift" nicht
      Richtung = 0                   //0 = Rechts
      Bewegung = 1                   //Bewegung findet statt
      Geschwindigkeit = 2            //Geschwindigkeit wird festgelegt
      INC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Rechts versetzt

      DRAWSPRITE WalkRechts[WR], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen

      IF Timer < GETTIMERALL()
        INC WR, 1                               //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung  //Timer erhöhen (Verzögerung)
      ENDIF

      IF WR = LEN(WalkRechts[]) THEN WR = 1  //Wenn WR gleich als die Anzahl der Felder im Array WalkRechts[] ist dann 0

   ELSE
      WR = 0 //WR wird Null gesetzt, da "Rechts" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF


// --->Nach Links gehen


   IF KEY (203) AND KEY (205) = 0 AND KEY (42) = 0  //Wenn Taste "Links" gedrückt ist und Taste "Rechts" und "Shift" nicht
      Richtung = 1                   //1 = Links
      Bewegung = 1                   //Bewegung findet statt
      Geschwindigkeit = 2            //Geschwindigkeit wird festgelegt
      DEC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Links versetzt

      DRAWSPRITE WalkLinks[WL], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen

      IF Timer < GETTIMERALL()
        INC WL, 1                              //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung  //Timer erhöhen (Verzögerung)
      ENDIF

      IF WL = LEN(WalkRechts[]) THEN WL = 1  //Wenn WL gleich als die Anzahl der Felder im Array WalkLinks[] ist dann 0

   ELSE
      WL = 0 //WL wird Null gesetzt, da "Links" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF


// --->Nach Rechts rennen


   IF KEY (205) AND KEY (42) AND KEY (203) = 0    //Wenn Taste "Rechts" und Taste "Shift" gedrückt sind und Taste "Links" nicht
      Richtung = 0                   //0 = Rechts
      Bewegung = 1                   //Bewegung findet statt
      Geschwindigkeit = 7            //Geschwindigkeit wird festgelegt
      INC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Rechts versetzt

      DRAWSPRITE RunRechts[RR], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen

      IF Timer < GETTIMERALL()
        INC RR, 1                               //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung   //Timer erhöhen (Verzögerung)
      ENDIF

      IF RR = LEN(RunRechts[]) THEN RR = 0  //Wenn RR gleich wie die Anzahl der Felder im Array RunRechts[] ist dann 0

   ELSE
      RR = 0 //RR wird Null gesetzt, da "Rechts" und "Shift" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF


// --->Nach Links rennen


   IF KEY (203) AND KEY (42) AND KEY (205) = 0    //Wenn Taste "Links" und Taste "Shift" gedrückt sind und Taste "Rechts" nicht
      Richtung = 1                   //1 = Links
      Bewegung = 1                   //Bewegung findet statt
      Geschwindigkeit = 7            //Geschwindigkeit wird festgelegt
      DEC Spieler_X,Geschwindigkeit  //Spieler wird um einen Pixel nach Rechts versetzt

      DRAWSPRITE RunLinks[RL], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen

      IF Timer < GETTIMERALL()
        INC RL, 1                               //Auf nächstes Sprite schalten
        Timer = GETTIMERALL()+AniVerzoegerung   //Timer erhöhen (Verzögerung)
      ENDIF

      IF RL = LEN(RunLinks[]) THEN RL = 0  //Wenn RR gleich wie die Anzahl der Felder im Array RunLinks[] ist dann 0

   ELSE
      RL = 0 //RL wird Null gesetzt, da "Links" und "Shift" nicht gedrückt ist und somit keine Bewegung stattfindet

   ENDIF
   
   
// --->Nach Rechts springen


// --->Nach Links springen


// --->Keine Bewegung


   IF Richtung = 0 AND Bewegung = 0                    //Wenn man nach "Rechts" schaut und keine Bewegung macht,....
      DRAWSPRITE WalkRechts[0], Spieler_X, Spieler_Y   //...dann Standbild "Rechts"
   ENDIF

   IF Richtung = 1 AND Bewegung = 0                    //Wenn man nach "Links" schaut und keine Bewegung macht,....
      DRAWSPRITE WalkLinks[0], Spieler_X, Spieler_Y    //...dann Standbild "Links"
   ENDIF


SHOWSCREEN
WEND
END

ENDSUB
So, das ist der bisherige Code für die Steuerung der Hauptperson. Jetzt will ich aber auch noch ne Sprunganimation machen, nur stoße ich da auf ein paar Probleme.

Ich habe für die Sprunganimation folgende Bilder in den Arrays:

JumpRechts[0]


JumpRechts[1]


JumpRechts[2]


JumpRechts[3]


JumpRechts[4]


Wie man sieht sind die ersten beiden Bilder für den Aufstieg, die Bilder 3 und 4 für den Abstieg und das letzte für das Aufkommen auf dem Boden. Nach dem bisherigen Muster geht es also schonmal nicht, da ich nicht einfach alle hintereinander abspulen kann wie bei den vorherigen.

Meine grundlegende Idee ist, das ich die Variable "Sprungkraft" einfüge um so den Anstieg der Höhe zu definieren. Die Variable "Geschwindigkeit" überlasse ich den anderen IF Abfragen, damit es dynamisch geregelt wird, sprich um so schneller ich laufe, umso weiter springe ich. Wenn "Geschwindigkeit" = 0 ist, wird es eben ein Sprung aus dem Stand.
Dann müsste ich noch eine Abfrage einbauen, die das mit dem Aufstieg/Abstieg regelt, spriche eine Abfrage die prüft ob "Player_Y = Player_Y + Sprungkraft" oder kleiner ist, wenn die Schleife den Punkt erreicht hat, an dem jetzt eigentlich die Abstiegsanimation beginnt (also zwischen JumpRechts[1] und jumpRechts[2]). Ist Player_Y kleiner, dann muss JumpRechts[] wieder auf Null gesetzt werden, wenn es gleich ist, dann muss dass Programm normal weiterlaufen.
Dann brauchen wir natürlich nochmal ne Abfrage, nämlich eine die sich drum kümmert, das während des Abstieges JumpRechts immer zwischen JumpRechts[2] und JumpRechts[3] wechselt und nicht auf JumpRechts[4] springt. Im Prinzip das gleiche wie oben.

Jetzt wie regle ich das mit dem Sprung? Mein Plan war es einfach unter der Bewegung auf der X-Achse einfach noch ein INC/DEC einzufügen halt mit "INC/DEC Player_Y, Sprungkraft". Und für den Abstieg, also wenn Player_Y = Player_Y + Sprungkraft ist dann eben wieder die entsprechende Reduzierung.

Klingt gut in der Theorie, aber ich kriegs net hin xD Kann das mal jemand Coden, oder mir zumindest erklären wie man das eben jetzt in Code umsetzt, weil mir die ganzen Tuts die es schon gibt null weiterhelfen, da es da nur 1 oder max. 2 Bilder als Animation gibt. Würde sicherlich auch anderen Leuten helfen, da man das dann mal als Jump and Run Tutorial reinstellen könnte^^

Danke schonmal im voraus:)

LG
Lloyd

Schranz0r

Grundlegend ist es ja so:

1. Absprung merken
2. Maximale Sprunghöhe errechnen (Alte Pos_Y vor dem Sprung + Maximale Sprunghöhe)
3. Wenn die Aktuelle Pos_Y < Max_Sprunghöhe dann DEC Pos_Y,Sprunggeschwindigkeit
4. Wenn erreicht(Max_sprunghöhe) dann INC Pos_Y
5. Wenn Collision mit Boden dann wie gehabt mit Laufen usw..

Also für dich Coden ist so ne sache, dass solltest schon selber machen denke ich .....
Aber bei Problemen Helfe ich gerne!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Aniel

Code (glbasic) Select
IF KEY (57)
      Richtung = 0                            //0 = Rechts
      Bewegung = 1                            //Bewegung findet statt
      Sprungkraft = 5                         //Höhe des Sprungs
      SpielerUrsprung_Y = Spieler_Y     //Y-Koordinaten vor dem Absprung wird gespeichert
      MaxSprunghoehe = SpielerUrsprung_Y + Sprungkraft //Maximale Sprunghöhe wird errechnet
     
      IF Spieler_Y < MaxSprunghoehe  //Wenn die aktuelle Y-Position kleiner als die maximale Sprunghöhe ist
         DEC Spieler_Y,Sprungkraft   //Vermindere den Y-Wert von Spieler_Y
         
         DRAWSPRITE JumpRechtsHoch[JRH], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen
         
         IF Timer < GETTIMERALL()
            INC JRH, 1                               //Auf nächstes Sprite schalten
            Timer = GETTIMERALL()+AniVerzoegerung    //Timer erhöhen (Verzögerung)
         ENDIF
         
         IF JRH = LEN(JumpRechtsHoch[]) THEN JRH = 0  //Wenn JRH gleich wie die Anzahl der Felder im Array JumpRechtsHoch[] ist dann 0
         
      ELSE
         JRH = 0 //JRH wird Null gesetzt, da "Space" nicht gedrückt ist und somit keine Bewegung stattfindet
         
      ENDIF
     
      IF Spieler_Y = MaxSprunghoehe  //Wenn die aktuelle Y-Position gleich der maximalen Sprunghöhe ist
         INC Spieler_Y,Sprungkraft   //Erhöhe den Y-Wert von Spieler_Y
         
         DRAWSPRITE JumpRechtsRunter[JRR], Spieler_X, Spieler_Y  //Sprite auf den Bildschirm zeichen
         
         IF Timer < GETTIMERALL()
            INC JRR, 1                             //Auf nächstes Sprite schalten                            
            Timer = GETTIMERALL()+AniVerzoegerung  //Timer erhöhen (Verzögerung)
         ENDIF
         
         IF JRR = LEN(JumpRechtsRunter[]) THEN JRR = 0 //Wenn JRR gleich wie die Anzahl der Felder im Array JumpRechtsRunter[] ist dann 0
         
      ELSE
         JRR = 0 //JRR wird Null gesetzt, da "Space" nicht gedrückt ist und somit keine Bewegung stattfindet
         
      ENDIF
   ENDIF
So, so habe ich es jetzt mal gecoded. Funktioniert natürlich nicht, aber ich glaub ich weiß wo der Fehler liegt. Nämlich bei der Abspeicherung des Y-Wertes vor dem Absprung. Nur wie kann ich das anders machen? xD
Momentan habe ich ja "SpielerUrsprung_Y = Spieler_Y" , ist ja rein logisch falsch xD Aber ich weiß net wie sonst xD

PS: Ich habe jetzt 2 DIMs erstellt, eins für die 2 "Hoch-Sprites" und eins für die 3 "Runter-Sprites"^^

Schranz0r

Code (glbasic) Select
IF KEY(57) = 0 AND Sprung = FALSE
    Speicher Alte Position
ELSE
     Sprung = TRUE
     usw...
ENDIF
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Aniel

Das ist mir schon klar, nur WIE kann ich die alte Position speichern-.-

D2O

Position y = temp   ????
So hast Du den wert von Y in einer anderen Variable gespeichert und kannst Y weiter bearbeiten.
Brauchst Du denn alten wert, dann lese einfach die variable temp wieder aus.

Edit//
Mal was ganz simples,
sollte auch so lesbar sein:

Code (glbasic) Select
LOADSPRITE "jump1ryk5.png", 0



GLOBAL x = 200,ytemp,yMAX = 100,y = 300

GLOBAL ctrl




WHILE TRUE


IF KEY(57) AND ctrl = 0
ytemp = y
ctrl = 1
ENDIF

IF ctrl = 1 THEN DEC y,1


IF y < ytemp-yMAX THEN ctrl = 2

IF ctrl = 2 THEN  INC y,1

IF y > ytemp AND ctrl = 2
ctrl = 0
y = ytemp
ENDIF






DRAWSPRITE 0,x,y
SHOWSCREEN
WEND
END
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell