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:
//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]
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.
//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
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.
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... :'(
ich find die funktion auch super, schade das es nicht gleich eingebaut ist.
OK, Auf meiner ToDo: "KEYACTION", das dann -1, 0, 1 liefert.
Nnnnnnnnnnnnnnnnnnnnnice baby!
Mach aber bitte:
returns: 1 = wurde gedr?ckt, 2 = gedr?ckt gehalten, -1 = losgelassen, 0 = NIX :)
Finde das schon gut so!
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.
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?
schau mal da:
http://www.glbasic.com/forum/index.php?topic=2034.0
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 :)
Hat so keine Basicsprache drin ( zumindest die die ich kenne :) ).
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.
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:
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
Kannst du bei dir im Common-Ordner gerne machen GLBasic\Samples\Common
der link zu mousehit geht nicht mehr, hat jemand noch die funktion? hab sie selbst leider nicht abgespeichert
Moin moin,
die alte Funktion habe ich nicht mehr, aber ich hatte sie mal geändert ;)
Hier die Funktion, der Type und ein kleines beispiel dazu.
Linke mousetate zählt nach oben, recht zurück.
count% = 33
WHILE TRUE
MOUSESTATE mx%,my%,a%,b%
//Mousevariable, mousbutton
IF MouseHit(a,1) = 1 THEN INC count%,1
IF MouseHit(b,2) = 1 THEN DEC count%,1
IF count% < 33 THEN count% = 86
IF count > 86 THEN count% = 33
PRINT CHR$(count%) , 100,100
SHOWSCREEN
WEND
END
// bt% = Mousebutton,
// l_mbutton = standart linke mousetaste
// es können gesammt 7 Tasten abgefragt werden
// l_mbutton = 0 sollte aber reserviert bleiben
FUNCTION MouseHit% : bt%, l_mbutton% = 1
STATIC s_k AS T_mousehit
IF bt = TRUE AND s_k.s_check[l_mbutton] = TRUE AND s_k.s_done[l_mbutton] = 1
s_k.s_done[l_mbutton] = 2
ENDIF
IF bt = TRUE AND s_k.s_check[l_mbutton] = FALSE AND s_k.s_done[l_mbutton] = 0
s_k.s_done[l_mbutton] = 1
s_k.s_check[l_mbutton] = TRUE
// ELSE
// s_k.s_done[l_mbutton] = 0
ENDIF
// IF bt = FALSE AND s_k.s_check[l_mbutton] = TRUE AND s_k.s_done[l_mbutton] = 2
// s_k.s_done[l_mbutton] = 3
// s_k.s_check[l_mbutton] = FALSE
//
// ENDIF
IF bt = FALSE AND s_k.s_check[l_mbutton] = TRUE //AND s_k.s_done[l_mbutton] = 3
s_k.s_done[l_mbutton] = 0
s_k.s_check[l_mbutton] = FALSE
ENDIF
RETURN s_k.s_done[l_mbutton]
ENDFUNCTION
TYPE T_mousehit
s_done%[6]
s_check%[6]
ENDTYPE
Danke!
Ich habe nun angefangen ein fake os zu schreiben (dies soll nur sekunden leicht überzeugen), dabei ist ein ordner offen. klickt man auf dem desktop auf den ordner, soll der offene ordner sich schliessen. klickt man wiederrum auf den ordner, soll er sich wieder öffnen. er öffnet sich aber nicht wieder. ich benutze genau diese funktion. sitze seit 2 h dran und kapier es nicht, obwohl es doch so einfach sein müsste.
hier der code
stpc=1 //am fakepc
GETSPRITESIZE 51, bb1, bh1; GETSPRITESIZE 52, bb2, bh2 //nimmt höhe und breite versch. bilder, die ersten paar sind die ordner
GETSPRITESIZE 53, bb3, bh3; GETSPRITESIZE 54, bb4, bh4
GETSPRITESIZE 55, bb5, bh5; GETSPRITESIZE 56, bb6, bh6
GETSPRITESIZE 57, bb7, bh7
bx1=180; by1=350; bx2=180; by2=350 //koordinaten ordner und offener ordner
LOCAL mx%,my%,a%,b%, fen1 //fen1 steht für offener ordner (fenster)
fen1=1
SYSTEMPOINTER TRUE
WHILE stpc=1 //stpc ist der fakepc
MOUSESTATE mx%,my%,a%,b%
IF fen1=1 //ist fen1 an ergo hintergrundbild, fenster und paar icons
DRAWSPRITE 3, 0, 0
DRAWSPRITE 52, bx2, by2 //eig2
DRAWSPRITE 53, 160, 80 //fen
DRAWSPRITE 54, 180, 105 //romanico
DRAWSPRITE 56, 260, 105 //wowico
ELSEIF fen1=0 //ist fen1 nicht aktiv ergo nur hintergrund und ordnericon
DRAWSPRITE 3, 0, 0
DRAWSPRITE 51, bx1, by1 //eig1
ENDIF
IF mx% > bx2 AND mx% < bx2+bb2 AND my% > by2 AND my% < by2+bh2 AND MouseHit(a,1) = 1 AND fen1=1
// ist maus gedrückt dann sag was
fen1=0
ENDIF
IF mx% > bx1 AND mx% < bx1+bb1 AND my% > by1 AND my% < by1+bh1 AND MouseHit(a,1) = 1 AND fen1=0
// ist maus gedrückt dann sag was
fen1=1
ENDIF
PRINT fen1+":"+MouseHit(a,1), 100, 100 //für mich zur überprüfung
SHOWSCREEN
WEND
Moin moin,
ein Gutes neues noch Nachträglich :)
Ohne die ganzen Grafiken und den Code ist es schwer etwas nach zu vollziehen, aber in Deinem Codeschnipsel konnte ich mal soweit nichts falschen feststellen.
Die Function MouseHit ist aber schon im gesammten Code mit dabei und nur in diesem Schnipsel nicht, oder?
Ich habe jetzt mal in Deinem Code ein Rechteck eingebaut das von links nach rechts läuft.
Klickt man auf dieses Rechteck ändert sich dir X-Achsen richtung.
Das Funktioniert bei mir Tadellos.
Schau Die mal auch die Funktion Bnot() an, die ist auch ganz nützlich wenn man "nur" 2 zustände braucht.
Ich hoffe das hilft Dir weiter.
stpc=1 //am fakepc
//GETSPRITESIZE 51, bb1, bh1; GETSPRITESIZE 52, bb2, bh2 //nimmt höhe und breite versch. bilder, die ersten paar sind die ordner
//GETSPRITESIZE 53, bb3, bh3; GETSPRITESIZE 54, bb4, bh4
//GETSPRITESIZE 55, bb5, bh5; GETSPRITESIZE 56, bb6, bh6
//GETSPRITESIZE 57, bb7, bh7
//bx1=180; by1=350; bx2=180; by2=350 //koordinaten ordner und offener ordner
LOCAL mx%,my%,a%,b%, fen1 //fen1 steht für offener ordner (fenster)
fen1=1
SYSTEMPOINTER TRUE
WHILE stpc=1 //stpc ist der fakepc
MOUSESTATE mx%,my%,a%,b%
// IF fen1=1 //ist fen1 an ergo hintergrundbild, fenster und paar icons
// DRAWSPRITE 3, 0, 0
// DRAWSPRITE 52, bx2, by2 //eig2
// DRAWSPRITE 53, 160, 80 //fen
// DRAWSPRITE 54, 180, 105 //romanico
// DRAWSPRITE 56, 260, 105 //wowico
// ELSEIF fen1=0 //ist fen1 nicht aktiv ergo nur hintergrund und ordnericon
// DRAWSPRITE 3, 0, 0
// DRAWSPRITE 51, bx1, by1 //eig1
// ENDIF
//// Start Mein Test
DRAWRECT rectx%,recty%,32,32,RGB(0xff, 0x4a, 0x4a)
IF mx% > rectx% AND mx% < rectx%+32 AND my% > recty% AND my% < recty%+32 AND MouseHit(a,1) = 1
fen1 = bNOT(fen1)
ENDIF
IF fen1 = 1
INC rectx%,1
ELSE
DEC rectx%,1
ENDIF
/// Bildschirmauflösung ist 800 x 600 Pixel
IF rectx% > 800 THEN rectx% = -32
IF rectx% < -32 THEN rectx% = 800
/// Ende Mein Test
// IF mx% > bx2 AND mx% < bx2+bb2 AND my% > by2 AND my% < by2+bh2 AND MouseHit(a,1) = 1 AND fen1=1
// // ist maus gedrückt dann sag was
// fen1=0
// ENDIF
// IF mx% > bx1 AND mx% < bx1+bb1 AND my% > by1 AND my% < by1+bh1 AND MouseHit(a,1) = 1 AND fen1=0
// // ist maus gedrückt dann sag was
// fen1=1
// ENDIF
PRINT fen1+":"+MouseHit(a,1), 100, 100 //für mich zur überprüfung
SHOWSCREEN
WEND
// bt% = Mousebutton,
// l_mbutton = standart linke mousetaste
// es können gesammt 7 Tasten abgefragt werden
// l_mbutton = 0 sollte aber reserviert bleiben
FUNCTION MouseHit% : bt%, l_mbutton% = 1
STATIC s_k AS T_mousehit
IF bt = TRUE AND s_k.s_check[l_mbutton] = TRUE AND s_k.s_done[l_mbutton] = 1
s_k.s_done[l_mbutton] = 2
ENDIF
IF bt = TRUE AND s_k.s_check[l_mbutton] = FALSE AND s_k.s_done[l_mbutton] = 0
s_k.s_done[l_mbutton] = 1
s_k.s_check[l_mbutton] = TRUE
// ELSE
// s_k.s_done[l_mbutton] = 0
ENDIF
// IF bt = FALSE AND s_k.s_check[l_mbutton] = TRUE AND s_k.s_done[l_mbutton] = 2
// s_k.s_done[l_mbutton] = 3
// s_k.s_check[l_mbutton] = FALSE
//
// ENDIF
IF bt = FALSE AND s_k.s_check[l_mbutton] = TRUE //AND s_k.s_done[l_mbutton] = 3
s_k.s_done[l_mbutton] = 0
s_k.s_check[l_mbutton] = FALSE
ENDIF
RETURN s_k.s_done[l_mbutton]
ENDFUNCTION
TYPE T_mousehit
s_done%[6]
s_check%[6]
ENDTYPE
hab noch n bild vom fake-pc gemacht. klickt man auf deskacc ist das fenster weg, klickt man wieder auf deskacc kommt nix und die variable schaltet auch nicht. ja, mousehit ist drin, das war nur der schnippsel mit dem fakepc.
[attachment deleted by admin]
Hmmm,
kannst Du ein kleines Lauffähiges beispiel schreiben, mit denn jetzt benutzten Variablen und den Projektordner zum Download anbieten?
Ich schaus mir dann am WE an was da nicht läuft.
Also wo nur 2 Grafiken enthalten sind,
einmal die deskacc grafik und eine Fenstergrafik.