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).
// --------------------------------- //
// 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;)
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:
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:
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 ;)
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^^
// --->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.
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".
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
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!
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:)
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>.<
// ------------------------------------------------------------- //
// -=# 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]
(http://img216.imageshack.us/img216/4974/jump1ryk5.png) (http://imageshack.us)
JumpRechts[1]
(http://img253.imageshack.us/img253/9444/jump2rds9.png) (http://imageshack.us)
JumpRechts[2]
(http://img253.imageshack.us/img253/9837/jump3riz8.png) (http://imageshack.us)
JumpRechts[3]
(http://img253.imageshack.us/img253/8717/jump4rsd9.png) (http://imageshack.us)
JumpRechts[4]
(http://img253.imageshack.us/img253/83/jump5rhu7.png) (http://imageshack.us)
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
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!
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"^^
IF KEY(57) = 0 AND Sprung = FALSE
Speicher Alte Position
ELSE
Sprung = TRUE
usw...
ENDIF
Das ist mir schon klar, nur WIE kann ich die alte Position speichern-.-
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:
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
Quote from: AnielDas ist mir schon klar, nur WIE kann ich die alte Position speichern-.-
Antwort: in einer Variablen ?!
IF KEY(57) = 0 AND Sprung = FALSE
Alt_Y = Pos_y
ELSE
Sprung = TRUE
Max_Hoehe = Alt_Y - Sprunghoehe
usw...
ENDIF
Sry, aber hilft mir irgendwie nicht wirklich weiter. Also entweder ich bin zu blöd oder eure Postings passen irgendwie net auf mein Problem......
Aber geschissen druff, ich hab jetzt mal was gecoded:
// --->Springen (Rechtsschauend)
IF KEY (57) AND Richtung = 0
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
// --->Springen (Linksschauend)
IF KEY (57) AND Richtung = 1
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 JumpLinksHoch[JLH], Spieler_X, Spieler_Y //Sprite auf den Bildschirm zeichen
IF Timer < GETTIMERALL()
INC JLH, 1 //Auf nächstes Sprite schalten
Timer = GETTIMERALL()+AniVerzoegerung //Timer erhöhen (Verzögerung)
ENDIF
IF JLH = LEN(JumpLinksHoch[]) THEN JLH = 0 //Wenn JLH gleich wie die Anzahl der Felder im Array JumpLinksHoch[] ist dann 0
ELSE
JLH = 0 //JLH 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 JumpLinksRunter[JLR], Spieler_X, Spieler_Y //Sprite auf den Bildschirm zeichen
IF Timer < GETTIMERALL()
INC JLR, 1 //Auf nächstes Sprite schalten
Timer = GETTIMERALL()+AniVerzoegerung //Timer erhöhen (Verzögerung)
ENDIF
IF JLR = LEN(JumpLinksRunter[]) THEN JLR = 0 //Wenn JLR gleich wie die Anzahl der Felder im Array JumpLinksRunter[] ist dann 0
ELSE
JLR = 0 //JLR wird Null gesetzt, da "Space" nicht gedrückt ist und somit keine Bewegung stattfindet
ENDIF
ENDIF
Was ist daran denn jetzt konkret falsch das die Pflaume nicht hüpfen will? xD Er springt zwar, hört aber nicht mehr damit auf..... also er bleibt dauernd in der Schleife wo Y vermindert wird und die zwei Aufsteigbilder sich abwechseln. WIESO?
Du musst abchecken ob die Collision mit dem Boden stattfindet!
Und ob der Sprung grade gemacht wird...
Wenn ja, dann keine AltY = Pos_y und Sprunghöhe errechnen!
Das ist dein fehler!
Aber ich habs ja schon oben mal gepostet, also mehr kann ich auch nicht tun für dich. Wenn du Ratschläge ignorierst und/oder nicht verstehst, kann dir kein Mensch helfen....
Ich bin grad am überlegen ob du schon Reif für ein Jump'n Run bist?!
Weil ein Jump ist eigentlich keine große Kunst zu programmieren.....
Da gibts schon schwerere Sachen die noch auf dich Warten!
Siehe: Gegner, Types in Verbindung mit Dimmaps(Gegner setzen) usw....
Alles kein leichtes!
Ach so, man wie doof war das denn xD Sry, habs jetzt begriffen und es funktioniert auch, hatte nen massiven Denkfehler wodurch das ganze etwas in die Länge gezogen wurde, sry xD
Super!
Wenn du Screens hast ... weist ja wo du Posten musst :D
PS.: die Figur schaut ja schonmal super aus, von der Grafik her!
Respekt an euren Grafiker!
Ich hab mal ne Frage^^ Wie ordnet GLBasic die Sprites eigentlich an die Koordinaten? Ich habe hier nämlich 2 verschiedene Sprites:
(http://img231.imageshack.us/img231/8843/walk1rvz5.png) (http://img215.imageshack.us/img215/728/attackexdown6rgt5.png)
Wenn jetzt die Ausrichtung unten Links wäre, wären beide auf der selben "Ebene", sind sie aber nicht, weshalb ich davon ausgehe, das die Ausrichtung Oben Links oder Rechts ist^^
Falls es wer noch nicht verstanden hat hier ein Bild zur Verdeutlichung:
(http://img220.imageshack.us/img220/1283/testui1.th.jpg) (http://img220.imageshack.us/my.php?image=testui1.jpg)
Obwohl beide den gleichen Y-Wert haben, ist die Position unterschiedlich und das ist Scheiße^^ Gibt es irgendeine Möglichkeit die Ausrichtung so zu ändern, das die Sprites immer unten Links ausgerichtet sind?
GETSPRITESIZE Spr, XX, YY
DRAWSPRITE Bild, Player_X, Player_Y -YY
Son ist der Fixpunkt unten links
Oder so ^^
FUNCTION DRAWPLAYER: Bild, X, Y
LOCAL XX,YY
GETSPRITESIZE Bild,XX,YY
DRAWSPRITE Bild,X,Y-YY
ENDFUNCTION
;)
Wenn ihr noch einen Berater braucht, ich steh euch gerne bei der Entwicklung bei!! Weil die Grafiken sind mal 1A Sahnemässig!!!!!!!!!!!
Bei solchen Grafiken würde es sich anbieten zu jeder Grafik eine "Hotspot" Datei anzulegen, die angibt, wo z.B. Mittelpunkt der Füße ist.
DRAWSPRITE x,y, is immer obere linke Ecke. GETSPRITESIZE evtl. von Bedeutung.
Quote from: GernotFrischBei solchen Grafiken würde es sich anbieten zu jeder Grafik eine "Hotspot" Datei anzulegen, die angibt, wo z.B. Mittelpunkt der Füße ist.
DRAWSPRITE x,y, is immer obere linke Ecke. GETSPRITESIZE evtl. von Bedeutung.
Ne, wäre viel zu viel Arbeit für die Menge an Sprites die wir verwenden^^ Da ist die Lösung von Schranz0r schon besser:)
@Schranz0r: Danke für die schnelle Hilfe:) Und danke für das Angebot, wir kommen eventuell darauf zurück:D
LG
Aniel