Eigene Keyhit Function erstellen

Previous topic - Next topic

D2O

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:
Code (glbasic) Select
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

ENDFUNCTION
Wie 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.

Code (glbasic) Select
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,
Code (glbasic) Select
// --------------------------------- //
// 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]
ENDTYPE
bekomme 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
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

BumbleBee

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
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

D2O

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.
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

BumbleBee

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.;)

Code (glbasic) Select
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
WEND
Und 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
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

D2O

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,
Code (glbasic) Select
// --------------------------------- //
// 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]
ENDFUNCTION
Nicht schlecht wäre wenn man das Globale Array vermeiden hätte können.
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

Kitty Hello

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...