Kollisionsabfrage funktioniert bei erstem Spiel in GlBasic nicht.

Previous topic - Next topic

Metamorphose

Moin.
Ich bin an meinem ersten Spiel in GlBasic, ich hoff erst mal ich bin im richtigen Forum. Irgendwie bombardier ich euch in letzter Zeit des ?fteren mit meinen Anf?ngerfragen, hoffe mal das geht in Ordnung, hab keine Anf?ngerecke gefunden.

Also ich w?rde gerne ein Labyrinth-Game machen f?r den GP2X-WIZ und habe da mal was aufgesetzt. Da ich am Anfang steh von GLBasic ist der Code nicht Optimal, ich hab einfach Sachen verwendet die ich nun kenne und 2-3 dinge nachgeschlagen (hibernate zB).
Das Problem ist, das ich immer wenn sich die Figur bewegt, die richtung der taste mitgegeben wird (pxy) und es angehalten wird, dass man nicht durchs spiel durchrennt. nun da es zu einer kollision kommt von einem Block und der Figur, dachte ich - da man den block von verschiedenen seiten anrempeln kann, des w?re eine gute l?sung. es funktioniert aber nicht, da er die pxy-variable nimmt die vor dem tastendruck war. kann mir da jemand helfen? und anregungen zur codeoptimierung f?nd ich auch klasse, da ich mir das mit meinem derzeitigen wissen zusammengeschustert habe.

das ganze auf 320x240, hier der code:

Code (glbasic) Select

//Initialisierung der Variablen
GLOBAL px=64 //player x
GLOBAL py=64 //player y
GLOBAL pxy=0 //player richtung

//Mediaecke - Laden der Fonts, PNG's usw
LOADFONT "Media/font.png", 1
SETFONT 1
LOADSPRITE "Media/p1.png", 1 //Held
LOADSPRITE "Media/wand.png", 2 //wand
LOADSPRITE "Media/fliese.png", 3 //fliese


WHILE TRUE
PRINT px+":"+py+":"+pxy, 111, 111

//Levelrahmen
fort=0; FOR i=0 TO 8; DRAWSPRITE 2, fort, 0; fort = fort + 32; NEXT;
fort=0; FOR i=0 TO 5; DRAWSPRITE 2, 0, fort; fort = fort + 32; NEXT
fort=0; FOR i=0 TO 6; DRAWSPRITE 2, 288, fort; fort = fort + 32; NEXT
fort=0; FOR i=0 TO 8; DRAWSPRITE 2, fort, 192; fort = fort + 32; NEXT

//fliesen
DRAWSPRITE 3, 32, 32; DRAWSPRITE 3, 32, 64; DRAWSPRITE 3, 32, 96; DRAWSPRITE 3, 64, 64; DRAWSPRITE 3, 64, 96

//bl?cke
DRAWSPRITE 2, 64, 32


DRAWSPRITE 1, px, py //held zeichnen

//Kontrollen
IF KEY(208) THEN py=py+32 //rauf
IF KEY(200) THEN py=py-32 //runter
IF KEY(203) THEN px=px-32 //links
IF KEY(205) THEN px=px+32 //rechts

//LEVELBEGRENZUNGEN
IF py > 160 THEN py=160 ; IF px > 256 THEN px=256; IF py < 32 THEN py=32 ; IF px < 32 THEN px=32 //levelbegrenzung
IF px=64 AND py=32 AND pxy=1 THEN py=py+32; IF px=64 AND py=32 AND pxy=4 THEN px=px-32

//richtungsangabe und kein durchrennen dank hibernate
WHILE KEY(200)=1; pxy=1; HIBERNATE; WEND //rauf
WHILE KEY(208)=1; pxy=2; HIBERNATE; WEND //runter
WHILE KEY(203)=1; pxy=3; HIBERNATE; WEND //links
WHILE KEY(205)=1; pxy=4; HIBERNATE; WEND //rechts

PRINT "Level 1 : Punkte=20 : Leben=3", 0, 230 //Statusinfo sp?ter
SHOWSCREEN

WEND


Die Grafikdateien zur ?bersicht sind angeh?ngt.

[attachment deleted by admin]
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

D2O

Hi,

ich glaube Du hast "Hibernate" Falsch verstanden ;)

Ich habe Deine Code mal schnell mit einem KeyHit() erg?nzt.
Schau Dir die Funktion mal an, und speicher sie Dir in einem extra *.gbas.


Code (glbasic) Select

//Initialisierung der Variablen
GLOBAL px=64 //player x
GLOBAL py=64 //player y
GLOBAL pxy=0 //player richtung

//Mediaecke - Laden der Fonts, PNG's usw
LOADFONT "font.png", 1
SETFONT 1
LOADSPRITE "p1.png", 1 //Held
LOADSPRITE "wand.png", 2 //wand
LOADSPRITE "fliese.png", 3 //fliese


WHILE TRUE
KeyHitUpdate()
PRINT px+":"+py+":"+pxy, 111, 111

//Levelrahmen
fort=0; FOR i=0 TO 8; DRAWSPRITE 2, fort, 0; fort = fort + 32; NEXT;
fort=0; FOR i=0 TO 5; DRAWSPRITE 2, 0, fort; fort = fort + 32; NEXT
fort=0; FOR i=0 TO 6; DRAWSPRITE 2, 288, fort; fort = fort + 32; NEXT
fort=0; FOR i=0 TO 8; DRAWSPRITE 2, fort, 192; fort = fort + 32; NEXT

//fliesen
DRAWSPRITE 3, 32, 32; DRAWSPRITE 3, 32, 64; DRAWSPRITE 3, 32, 96; DRAWSPRITE 3, 64, 64; DRAWSPRITE 3, 64, 96

//bl?cke
DRAWSPRITE 2, 64, 32


DRAWSPRITE 1, px, py //held zeichnen

//Kontrollen
//IF KEY(208) THEN py=py+32 //rauf
//IF KEY(200) THEN py=py-32 //runter
//IF KEY(203) THEN px=px-32 //links
//IF KEY(205) THEN px=px+32 //rechts


/// Neu

IF KeyHit(200) = 2
py=py-32
pxy=1
ENDIF

IF KeyHit(208) = 2
py=py+32
pxy=2
ENDIF

IF KeyHit(203) = 2
px=px-32
pxy=3
ENDIF

IF KeyHit(205) = 2
px=px+32
pxy=4
ENDIF



//LEVELBEGRENZUNGEN
IF py > 160 THEN py=160 ; IF px > 256 THEN px=256; IF py < 32 THEN py=32 ; IF px < 32 THEN px=32 //levelbegrenzung
IF px=64 AND py=32 AND pxy=1 THEN py=py+32; IF px=64 AND py=32 AND pxy=4 THEN px=px-32

//richtungsangabe und kein durchrennen dank hibernate
//WHILE KEY(200)=1; pxy=1; HIBERNATE; WEND //rauf
//WHILE KEY(208)=1; pxy=2; HIBERNATE; WEND //runter
//WHILE KEY(203)=1; pxy=3; HIBERNATE; WEND //links
//WHILE KEY(205)=1; pxy=4; HIBERNATE; WEND //rechts






PRINT "Level 1 : Punkte=20 : Leben=3", 0, 230 //Statusinfo sp?ter
SHOWSCREEN

WEND














//----------------------------------


FUNCTION KeyHitUpdate:
GLOBAL   gKeyDown[], gKeyState[]
LOCAL  k
LOCAL i
STATIC a
    // First Time call/ zum ersten Mal hier
    //IF BOUNDS(gKeyDown[],0)=0
    IF a = 0
        DIM gKeyDown[256]
        DIM gKeyState[256]
        a =1
    ENDIF

    // For each key / f?r jede Taste
    FOR i=0 TO 255
        k = KEY(i)
        // Key is pressed / Taste ist gedr?ckt
        IF k
            IF gKeyDown[i]
                gKeyState[i]=1
            ELSE
                gKeyDown[i]=1
                gKeyState[i]=2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedr?ckt

            // Has key been pressed before?
            // War die Taste gedr?ckt?
            IF gKeyDown[i]
                gKeyDown[i] = 0
                gKeyState[i] = -1
            ELSE
                gKeyState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION





//  0 = not pressed / nicht gedr?ckt
//  2 = just pressed / gerade runtergedr?ckt
//  1 = pressed / gedr?ckt (gehalten)
// -1 = release event / wieder losgelassen
FUNCTION KeyHit: nkey
    RETURN gKeyState[nkey]
ENDFUNCTION
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

Metamorphose

Wau, danke.
Doch ich steig bei der Funktion nicht durch, ist die selbstgeschrieben oder wo entnommen?
kannst du die beiden funktionen kurz erläutern?
ich vermute es werden alle tasten abgefragt und der wert 0, 1 oder 2 wiedergegeben, doch wie es GENAU funktioniert, steig ich da nicht durch.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Keyhit schaut ob deine Taste gedr?ckt ist return = 2 , wenn sie beim n?chsten durchlauf immer noch dr?ckt ist gehts weiter zu gedr?ckt gehalten return = 1, wenn nicht mehr gedr?ckt kommt event Release return = -1. Standart ist 0 = ungedr?ckt.


Die Funktion ist von Gernot (Kitty Hello)!
Ich schrei schon ne Ewigkeit nach einer festen einbinding...  :'(
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

ich find die funktion auch super, schade das es nicht gleich eingebaut ist.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Kitty Hello

OK, Auf meiner ToDo: "KEYACTION", das dann -1, 0, 1 liefert.

Schranz0r

Nnnnnnnnnnnnnnnnnnnnnice baby!

Mach aber bitte:

returns: 1 = wurde gedr?ckt, 2 = gedr?ckt gehalten, -1 = losgelassen, 0 = NIX :)

Finde das schon gut so!
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

Moin. Hab wieder eine frage ;)
Ich hab versucht das Script f?r die Tastenabfrage, dass es sich nicht immer wiederholt, auf die maus zu setzen.

Code (glbasic) Select
IF MOUSEAXIS(3)=1
moudown=1
moustate=1
ELSE
moustate=2
ENDIF

IF moustate=1
moudown = 0
moustate = -1
ELSE
moustate=0
ENDIF


unten steht noch was von wegen if mousdown=1 then auswahl=auswahl+1

geht nicht. und sonst mit mousestate und mouseaxis inkrementiert die variable fortlaufend.
jemand ne idee?

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

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

Metamorphose

ich versteh es nicht, wieso das nicht in glbasic standart drinne ist.
ist jetzt echt nicht b?se gemeint, doch das ist doch sinnvoll?
kann ich grad nicht nachvollziehen, auch das mit den tasten.

und danke schranz0r :)
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Hat so keine Basicsprache drin ( zumindest die die ich kenne :) ).
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

man muss sich ja nich an basicsprachen orientieren.
es w?r doch sinnvoll und einfacher, oder? und genau deshalb benutzt man doch unter anderem auch glbasic und nich c mit sdl oder so.
ich mein das jetzt aber nich als b?seb?se usw, sondern s w?r son feedback... vll steh ich ja auch alleine da.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Hab bis jetzt 1x MouseHit gebraucht und da hab ich mir es selber geschrieben xD

Wirst noch ?fter so f?lle haben, wo du dir denkst, da w?r jetzt ein Befehl sinnvoll, ob das jetzt aber generell sinnvoll ist muss Gernot entscheiden  :whistle:
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

hm. wäre es möglich den bereich der codeschnippsel zu ordnen? dann könnte man die mousehit und keyhit und sonstige erleichternde sachen in nen basis-ordner oder sowas packen, spielereien in nen ordner, datazeugs in nen ordner usw, n bissl struktur reinbringen, dass man nachher nich suchen muss? weil sonst schau ich immerwieder hier rein und sich ne weile ;)
fände das einfach sinnvoll, will nicht mich durch leveleditoren, highscorelisten usw durchschauen bis ich auf sowas für mich fast fundamentales stosse. was die leveleditoren und highscorelisten usw nicht abwertet, ich find einfach, die codeschnippsel helfen extrem und eine gewisse übersicht wäre doch einfach produktiver für alle, nicht? ich meine eine erweiterung der codesnippets ;) oder halt einfach ne neue kategorie mit basics... nicht? :S
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

Kannst du bei dir im Common-Ordner gerne machen GLBasic\Samples\Common
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