Drawanim mit stopps zwischen den einzelnen animationen (Timer?)

Previous topic - Next topic

Metamorphose

Moin.
Ich bin immer noch an meinem kleinen minispiel und habe nun eine figur kreirt, die eine laufbewegung hat. geldaen mit loadanim, gestartet mit drawanim, doch wenn er l?uft wechselt es extrem schnell zwischen den bildern hin und her. wie kann man das ?ndern? hab in der hilfe nachgeschaut und im beispielverzeichniss, im bspverzeichnuiss gibts kein codesnippet zu loadanim, deshalb dacht ich, frag ich mal hier.
generell das etwaas nach einer gewissen zeit einsetzt, wie kriegt man das zustande? schafft man sicher nicht mit for a = 200 und wenn a=200 ergo mach was... oder?
also 2 anf?ngerfragen wiedermal. und wiedermal hoffe ich auf ne super hilfe wie bis anhin :)
warum gibts hier eigentlich keinen anf?ngerecken? oder ?berseh ich was? es ist mir immer ein bisschen peinlich das neben euren komplizierten threads zu schreiben.
lg
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Schau dir mal GETTIMERALL() an.

Code(Nicht getestet) :

IF timer < GETTIMERALL()
   INC Anim, 1
   IF Anim > Last_Anim_Image THEN Anim = 0
   timer = GETTIMERALL()+verzoegerung
ENDIF

DRAWANIM num, Anim, Player_x, Player_y

Hier gibst keine "Anf?ngerecke" weil bei uns alle gleich sind egal ob der super Coder, oder der noch am Anfang stehende!  :good:
Im gegensatz zu anderen "Basicdialekten" halten wir alle zusammen, egal ob engl?nder, spanier, russe oder Deutscher usw.
Jedem wird also geholfen, das zeichnet unteranderen GLBasic auch noch ein bisschen aus ;)
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

Metamorphose

Zitat: Gibt die Zeit seit dem Programmstart in 1/1000 sek zur?ck.
Ich schnall nicht, was mir das n?tzen sollte. ich dachte das sei eher etwas f?r fpsberechnungen oder sowas.

nun mein code sieht so aus bei einer anim von 2:
Code (glbasic) Select

LIMITFPS 70
LOADANIM "Media/p1.png", 1, 32, 32
Last_Anim_Image=1
Player_x=200
Player_y=200
verzoegerung=600

WHILE TRUE

IF timer < GETTIMERALL()
    INC Anim, 1
    IF Anim > Last_Anim_Image THEN Anim = 0
    timer = GETTIMERALL()+verzoegerung
ENDIF

IF KEY(208) THEN Player_y = Player_y+1
DRAWANIM 1, 0, Player_x, Player_y

SHOWSCREEN
WEND


Ich kapier nicht wie mi da Gettimerall helfen sollte. was soll es mir nutzen, wenn ich sehe, das die Zeit kleiner ist als die zeit des progammstartes? NAT?RLICH funktioniert es, wenn man weiss wie mans schreibt, doch ich glaub das ist mir grad zu hoch. bin nat?rlich auch in den ferien, da ist das gehirn eher auf offline ;)

ahja und noch wegen dem "jeder user egal woher und mit welchen f?higkeiten ist gleich" - das find ich einen super grundsatz. bin ?brigens schweizer, also ists jetzt schon was internationales ;)
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

amarliani

Gruezi in die Schweiz!

Dann versuch ich mal, dir das etwas aufzudr?seln:

Code (glbasic) Select
IF timer < GETTIMERALL()
    INC Anim, 1               
    IF Anim > Last_Anim_Image THEN Anim = 0
    timer = GETTIMERALL()+verzoegerung
ENDIF

DRAWANIM num, Anim, Player_x, Player_y


OK, der Trick ist folgender:

In der Variable timer speicherst du einen Zeitwert, und zwar die Zeit, zu der das letzte Mal die Z?hlervariable von DRAWANIM erh?ht wurde, plus der vor dir vorgegebenen Verz?gerung in Millisekunden (das ist die Zeile timer = GETTIMERALL()+verzoegerung).
Sobald jetzt die aktuelle Spielzeit diesen Zeitwert ?berschreitet (das macht dann der Vergleich IF timer < GETTIMERALL() !), wird der Z?hler erh?ht und die timer-Variable auf den aktuellen Zeitwert plus Verz?gerung gesetzt.

Und dann malst du halt au?erhalb der Zeitabfrage mit DRAWANIM das entsprechende Teilbild, das dir deine Z?hlervariable vorgibt. Das wars.

Ach ja, und in deinem Code ist ein kleiner Fehler:

Code (glbasic) Select
DRAWANIM 1, 0, Player_x, Player_y

Mit der Zeile malst du die Animation ganz normal, nicht aber gezielt das eine Teilbild der Animation, so wie es hier f?r den Code n?tig w?r. Die Zeile m??te so lauten, sonst funzt es nicht:

DRAWANIM 1, Anim, Player_x, Player_y

Und
Code (glbasic) Select
Last_Anim_Image=1
? Hast du wirklich nur zwei Teilframes in deiner Animation?

Schranz0r

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

amarliani


Metamorphose

Danke erstmals f?r die TOP-erkl?rung!
ich hab nun einen cde zusammengebastelt, in der der held nach unten l?uft wenn man pfeiltaste-unten dr?ckt und ein skelett, das einfach hoch und runter l?uft. beide haben die gleiche verz?gerung (verz1 und verz2). aber sie sind nicht gleich schnell. woran liegt das?

Code (glbasic) Select

LIMITFPS 60
LOADANIM "Media/p1.png", 1, 32, 32
LOADSPRITE "Media/skelett.png", 2
Last_Anim_Image=1
Player_x=200
Player_y=200
Gegner_x=300
Gegner_y=100
verz1=300
verz2=300
gricht =1

WHILE TRUE

PRINT timer + ":" + gricht + ":" + Gegner_y+":"+verz1+":"+verz2, 200, 20
PRINT GETTIMERALL(), 200, 30

IF KEY(208)
IF timer < GETTIMERALL()
    INC Anim, 1
    IF Anim > Last_Anim_Image THEN Anim = 0
    timer = GETTIMERALL()+verz1
ENDIF
Player_y = Player_y+1
ENDIF


IF timer2 < GETTIMERALL()
IF Gegner_y < 100
gricht=1
ELSEIF Gegner_y > 400
gricht = 2
ENDIF

IF gricht = 1
Gegner_y = Gegner_y + 3
ENDIF

IF gricht = 2
Gegner_y = Gegner_y - 3
ENDIF

    timer2 = GETTIMERALL()+verz2

ENDIF

DRAWANIM 1, Anim, Player_x, Player_y
DRAWSPRITE 2, Gegner_x, Gegner_y
SHOWSCREEN
WEND


lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Hemlos

Because timer2 is delimited to update once every 300 ms.

and at 300ms it increases the pixel position by 3...which isnt enough, its not relative to time.

Sorry if you dont understand english, im just trying to help, maybe someone can translate.
Bing ChatGpt is pretty smart :O

amarliani

Du hast da einen kleinen Denkfehler in deinen Routinen, die deine Figuren bewegen. Ich beschr?nk das mal auf die wichtigen Zeilen:

...
Player_y = Player_y+1   //Hier bewegst du deinen Held jeweils um 1px nach unten

....

IF gricht = 1
Gegner_y = Gegner_y + 3  //Dein Skelett bewegst du aber hier um 3px nach unten..
ENDIF

IF gricht = 2
Gegner_y = Gegner_y - 3  //und hier um 3px nach oben!!
ENDIF

Setz entweder bei Gegner_y auch eine 1 statt einer 3 oder bei Player_y eine 3 statt einer 1, dann m??ten die beiden gleich schnell sein.

Metamorphose

oh mein gott, klar timer 2. thank you hemlos.
und das wegen den unterschiedlichen werten: sorry hab die herumgespielte online gestellt, in dem test waren beide werte gleich.
nu is mir alles klar, danke leute.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Metamorphose

ich hab wieder ein timerproblem und schreibs der forumseinfachheit hier in diesen thread, da es sich denke ich nicht so viel unterscheidet vom anderen. ich will im spiel, das ab einem gewissen zeitpunkt ein timer läuft, mehrere levels durch, und dann wieder stoppt.
wenn ich nun die anfangszeit nehme und sage der timer hat die anfangszeit - anfangszeit ist er auf 0, aber wird er ja dann auch immer bleiben, weil er immer die anfangszeit minus rechnet. auch das stoppen wüsst ich nicht, wie es funktioniert, kann mir da wieder jemand helfen?

btw: hab mir nun glbasic gekauft und wenns gut geht, werd ich euch in ner woche mein erstes kleines minispiel aus dem fragengewurst heraus vorstellen :) wieso sind eigentlich nicht soviele sachen im showroom? hat sicher jeder mehrere sachen gemacht. item, wäre froh wenn die obrige frage mit den timern beantwortet werden würde. danke schonmal im voraus :)
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

So hab dir schnell was gebastelt:

Code (glbasic) Select
TYPE TTimer
time% // timervalue
time_ms% // time in MS
delay% // delay in MS
stop% // if time stops?
dir% // 0 = count up, 1 = count down
ENDTYPE

// set the array global so we can use it in a function!
GLOBAL _TTimer[] AS TTimer



// Create Timer
LOCAL timer AS TTimer
timer = T_CreateTimer(1000) // this timer count up


//Create Timer2
LOCAL timer2 AS TTimer
timer2 = T_CreateTimer(1000,10,TRUE) // this timer count down, from 10



WHILE TRUE

// Print the timervalue
PRINT T_GetTimer(timer),10,10
PRINT T_GetTimer(timer2),50,10


// Some tests to see if all works correct :)
IF T_GetTimer(timer2) = 0 THEN T_StopTimer(timer)

IF T_GetTimer(timer2) = -5
T_StopTimer(timer,FALSE)
T_SetTimer(timer2,9)
ENDIF


// dont forget to update your timers!
T_UpdateTimer(timer)
T_UpdateTimer(timer2)

SHOWSCREEN
WEND
END



FUNCTION T_CreateTimer AS TTimer: delay%, start_value% = 0, count_down = FALSE
LOCAL T AS TTimer

T.delay = delay
T.time =  start_value
T.dir = count_down
DIMPUSH _TTimer[], T

RETURN T
ENDFUNCTION


FUNCTION T_UpdateTimer: T AS TTimer

IF T.time_ms < GETTIMERALL() AND T.stop = FALSE
IF T.dir = FALSE
INC T.time, 1
ELSE
DEC T.time,1
ENDIF

T.time_ms = GETTIMERALL()+T.delay
ENDIF

ENDFUNCTION 


FUNCTION T_GetTimer: T AS TTimer
RETURN T.time
ENDFUNCTION

FUNCTION T_StopTimer: T AS TTimer, stop = TRUE
T.stop = stop
ENDFUNCTION


FUNCTION T_SetTimer: T AS TTimer, time = 0
T.time = time
ENDFUNCTION



Hoffe du kannst damit was anfangen! :)
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

Metamorphose

super danke, das half. ich kapier den code nicht, aber es funktioniert.
werde mich bei gegebener zeit mal damit auseinandersetzen, da ich keinen code reingest?ckelt haben will, den ich nicht begreife.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Sind halt Types, sind nicht so anf?ngerfreundlich   :|
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