Keyboard trouble... :(

BlitzPlus Forums/BlitzPlus Programming/Keyboard trouble... :(

3DBuzzFan(Posted 2003) [#1]
I have written a very nice piece of software down here, using Blitz3D.
Now, I have just purchased BlitzPlus and have recompiled it (I did not use any 3D - just plain 2D stuff).
The recompiled (with BlitzPlus) version rubs much smoother.
It is ALMOST perfect.
But the keyboard logic has gone to space...
I had to write some chunk of code to deal with auto-repeat, del, tab, backspace, arrow keys, and the like.
And now none of it works.
Well, some of it works, but with side effects.

Let me just check if I am right...
B3D did not catch CONTROL+Key combinations (or ALT+Key for that matter) with the GetKey() function.
So, one would have to work around it by using KeyDown() and KeyHit() functions.
Thatīs fine with me. It was not very difficult and worked perfectly well.

Please, understand that I am not trying to explain it here, I am just trying to make sure that I understand what is going on, myself...

Now that I have recompiled it, I have to throw away the specialized code I have written, because getKey() now is capable of (and does) handling any key combination, by using 64 bits for the "virtual key" code (or something like that).

So, I can simply use GetKey() and check if it is the ALT+Z "virtual key", instead of having to check if the ALT key is being held down when GetKey() returns the ASCII code for "Z".

Is that it?
If so, where can I find more info about it --- if there is anything else I should be aware of, concerning keyboard input, that is...

I would appreciate any help on this.
Thank you,

/R


3DBuzzFan(Posted 2003) [#2]
Yeah, right...
I got it :^).
B+ deals with keyboard beautifuly, even when you are not using messages.
Converting my code was piece of cake.
And now it is much more readable, too...

/R


CS_TBL(Posted 2003) [#3]
the first thing that a new b+ update should have imo, is a proper keysystem, including all kinda luxery to configure, such as keyrepeat and more.. (such as: when you hit [alt]+[q], and you release the [alt] first, you shouldn't get a [q] trigger for a while, only after the usual key-delay.

Since last week I am busy with a key-controlled app (a music-tracker!) and luckily blitzcoder.com was in the air when this site was down.

This is what Cyberseth proposed to my initial app:

app=CreateWindow("..",0,0,640,480) 

Global quit=False 
Global c=CreateCanvas(32,32,512,512,app) 
Global x,y 
Global delaykey, delaytime

timer = CreateTimer(30) ; 30 FPS

; Make an array of all the keys you want to check for
; so we can store their numbers, for delay purposes
Dim Key(20,1)
Dim KeyDn(20)

Key(0,0)=200
Key(1,0)=208
Key(2,0)=203
Key(3,0)=205
Key(4,0)=15  key(4,1)=-42   ; Let's say "-" means "DONT PRESS IT"
Key(5,0)=15  key(5,1)=42

delaykey=-1  ; none of the above

Repeat
	WaitEvent()
	If EventID()=$803 
		If EventSource()=app 
			quit=True 
		EndIf 
	EndIf 
	
	If EventID()=$4001
		; Every timer tick, we can update the game
		; If you want to you could use EventData() to find the number of ticks
		; elapsed and then a For..Next loop to accurately update the game
		; but for now it's unnecessary.
		
		; To do all this key stuff, let's go through our Key(i,j) array
		; and check if the keys have been pressed. I made it a two-dimensional
		; array so we can have more than one scancode for each key...
		
		For i=0 To 20
			ok=1  ; a variable to check whether this is OK
			If Key(i,0)=0 Then ok=0
			For j=0 To 1
				If Key(i,j)<0 Then  ; if <0 then check it is NOT pressed
					If KeyDown(-key(i,j))=True Then ok=0  ; not ok, we want it to be False
				End If
				If Key(i,j)>0 Then  ; if >0 then check it is pressed
					If KeyDown(key(i,j))=False Then ok=0  ; not ok, we want it to be True
				End If
			Next
			
			If ok
				If KeyDn(i)=0 Then  ; If KeyHit
					delaykey=i If delaytime>0 delaytime=1
				End If
				KeyDn(i)=1  ; Set KeyDown
				
				If delaytime=0 Or delaytime>7   ; if keyhit or delay>10 frames
					Select i
					Case 0		; 200
						y=y-1
					Case 1		; 208
						y=y+1
					Case 2		; 203
						x=x-1
					Case 3		; 205
						x=x+1
					Case 4		; 15,  NOT 42
						x=x+1
					Case 5		; 15, 42
						x=x-1
					End Select
				End If
				
				delaytime=delaytime+1
			Else
				If KeyDn(i) Then  ; key off
					KeyDn(i)=0
				End If
			End If
		Next
		For i=0 To 20
			If KeyDn(i)=0 And delaykey=i
				delaykey=-1
				delaytime=0
			End If
		Next
		
		draw() 
	End If
Until quit
End

Function draw() 
		SetBuffer CanvasBuffer(c) 
			Cls 
			Rect x*4,y*4,8,8,True 
			Text 20,100,x+" "+y 
			Text 20,115,"Delay Time: "+delaytime
			Text 20,130,"Delay Key : "+delaykey
			If delaykey<>-1 Text 20,145,"Delay Scancode : "+Key(delaykey,0)
		FlipCanvas c
End Function