Hi,
ich wollte einfach mal eine Keyhit function schreiben, hier soll nur überprüft werden ob eine Taste getrückt
wurde.
Nur funktioniert das ganze nur für eine Taste da hier globale Variablen genutzt werden, möchte ich mehre Tasten überprüfen
müsste
ich für jede Taste eine Function mit Variablen erstellen.
Hier mal den Code:
WHILE TRUE
links = KEY(203)
// rechts = KEY(205)
PRINT keyhit(links),10,300
// PRINT keyhit(rechts),10,320
SHOWSCREEN
WEND
///////////////////////////////////////////////////
FUNCTION keyhit:keyhit_a
//LOCAL keyhit_a
//LOCAL keyhit_out
//LOCAL keyhit_controll
IF keyhit_a = 1 AND keyhit_controll = 1 THEN keyhit_out = 0
IF keyhit_a = 1 AND keyhit_controll = 0
keyhit_out = 1
keyhit_controll = 1
ENDIF
IF keyhit_a = 0 AND keyhit_controll = 1 THEN keyhit_controll = 0
RETURN keyhit_out
ENDFUNCTIONWie kann ich es anstellen eine Function zu schreiben um sie für mehrer Tasten zu nützen?
Type?
Hier wäre das nicht schlecht wenn gehen würde.
Type Tkeyhit
keyhit_a
keyhit_out
keyhit_controll
method keyhit:keyhit_a
IF keyhit_a = 1 AND keyhit_controll = 1 THEN keyhit_out = 0
IF keyhit_a = 1 AND keyhit_controll = 0
keyhit_out = 1
keyhit_controll = 1
ENDIF
IF keyhit_a = 0 AND keyhit_controll = 1 THEN keyhit_controll = 0
RETURN keyhit_out
Endmethod
Endtype
Edit:
So, hab das ganze nochmals versucht mit Type und Arras in diesem Type,
// --------------------------------- //
// Project:
// Start: Saturday, January 20, 2007
// IDE Version: 4.051
WHILE TRUE
links = KEY(203)
rechts = KEY(205)
PRINT keyhit(links,1),10,300
PRINT keyhit(rechts,2),30,300
SHOWSCREEN
WEND
FUNCTION keyhit :keyhit_in,keyhit_counter
LOCAL keyhit_in
LOCAL keyhit_counter
LOCAL mykey AS Tkeyhit
mykey.in[keyhit_counter] = keyhit_in
IF mykey.in[keyhit_counter] = 1 AND mykey.controll[keyhit_counter] = 1 THEN mykey.out[keyhit_counter] = 0
IF mykey.in[keyhit_counter] = 1 AND mykey.controll[keyhit_counter] = 0
mykey.out[keyhit_counter] = 1
mykey.controll[keyhit_counter] = 1
ENDIF
IF mykey.in[keyhit_counter] = 0 AND mykey.controll[keyhit_counter] = 1 THEN mykey.controll = 0
RETURN mykey.out[keyhit_counter]
ENDFUNCTION
TYPE Tkeyhit
in[25]
out[25]
controll[25]
ENDTYPEbekomme aber nun folgende Fehlermeldung.
Quote_______________________________________
*** Configuration: WIN32 ***
precompiling...
GPC - GLBasic Precompiler V.2006.354 - 3D, NET
compiling...
keyhit.gbas (954 B )
Wordcount:19 commands
compiling:
D:\temp\glbasic\gpc_temp0.cpp: In function `DGInt __GLBASIC__::keyhit(DGInt, DGInt)':
D:\temp\glbasic\gpc_temp0.cpp:33: error: no match for 'operator=' in 'mykey.__GLBASIC__::Tkeyhit::controll = 0'
C:/Basic/GLBasic/Compiler/platform/Include/glb.h:272: note: candidates are: __GLBASIC__::DGIntArray& __GLBASIC__::DGIntArray::operator=(const __GLBASIC__::DGIntArray&)
linking:
g++.exe: gpc_temp0.o: No such file or directory
*** FATAL ERROR - Bitte die Compiler-Ausgabe ins Forum kopieren
_______________________________________
*** Fertig ***
Zeit: 0.8 sek
Erstellen: 0 erfolgreich, 1 fehlgeschlagen
Hi
Zu der Fehlermeldung. Du hast hier was vergessen.
IF mykey.in[keyhit_counter] = 0 AND mykey.controll[keyhit_counter] = 1 THEN mykey.controll[keyhit_counter] = 0
Der Compiler versteht da keinen Spass.:) Schau mal ob's geht
Cheers
Danke, Dummer leichtsinnsfehler.
:good:
Aber löst im Grund ja nicht das Problem.
Dadurch das Der Type(Instance vom Type? ) in der funktion als Local läuft,
werden die Daten/Werte bei erneuten aufruf hier eh wieder gelöscht.
Hier habe ich dann denn Effekt wie KEY().
So wie ich das sehe komme ich um Globale Variablen/Array's nicht rum.
Hab hier schon mal irgendwo ein Beispiel gemacht, wo man eine Taste immer wieder drücken muß. Gernot hat da auch mal was gemacht
Also hier mal mein KeyHit.;)
DIM Push[21]
x=200;y=200
WHILE TRUE
//Tasten 2 bis 20 (= Zahl 2 (nicht Ziffernblock) bis Buchstabe T) durchlaufen
FOR i=2 TO 20
IF KEY(i)=TRUE AND Push[i]=FALSE
x=x+10
Push[i]=TRUE
ENDIF
IF KEY(i)=FALSE THEN Push[i]=FALSE
NEXT
FILLRECT x,y,x+20,y+20,RGB(255,25,25)
SHOWSCREEN
WENDUnd wenn du jetzt die Zeile oben so erweiterst
IF KEY(i)=TRUE AND Push=FALSE AND KEY(57)
funktionieren die oben Tasten (2 - 20) nur wenn du auch die Leertaste drückst.
Weiß aber jetzt nicht, ob ich das richtig verstanden, und du das so überhaupt gebrauchen kannst. Bin heute etwas zerstreut.:D
Cheers
Schöne lösung.
Aber ich habe hier versucht eben das hier zu vermeiden und das ganze etwas abzukapseln.
So das ich nur noch z.B. Keyhit(57) so wie das Key(57) benutze.
Mit, wenn möglich ohne Globales drumrum ;)
Das hier funktioniert ja auch,
// --------------------------------- //
// Project:
// Start: Saturday, January 20, 2007
// IDE Version: 4.051
DIM Push[20][3]
x=200;y=200
WHILE TRUE
IF keyhit(205,0) THEN x = x + 10
IF keyhit(203,1) THEN x = x - 10
FILLRECT x,y,x+20,y+20,RGB(255,25,25)
SHOWSCREEN
WEND
FUNCTION keyhit :keyhit_in,keyhit_counter
LOCAL keyhit_counter
LOCAL keyhit_in
Push[keyhit_counter][0] = KEY(keyhit_in)
IF Push[keyhit_counter][0] = 1 AND Push[keyhit_counter][1] = 1 THEN Push[keyhit_counter][2] = 0
IF Push[keyhit_counter][0] = 1 AND Push[keyhit_counter][1] = 0
Push[keyhit_counter][2]= 1
Push[keyhit_counter][1] = 1
ENDIF
IF Push[keyhit_counter][0] = 0 AND Push[keyhit_counter][1] = 1 THEN Push[keyhit_counter][1] = 0
RETURN Push[keyhit_counter][2]
ENDFUNCTIONNicht schlecht wäre wenn man das Globale Array vermeiden hätte können.
Um eine Globale kommt man derzeit nicht herum. Ich wollte mal "STATIC" sinführen, also eine Variable, die LOCAL ist, aber ihren Wert nicht verliert. Muss ich mal überdenken, ob das nicht zu kompliziert wird.
Schaut mal hier:
http://www.glbasic.com/beta/menu_internet.rar Damit kann man ganz einfach eine Tastaturbelegung vom User machen lassen usw...