Keyboard trouble... :(

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

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

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

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