KeyDown() without Graphics()
BlitzMax Forums/BlitzMax Programming/KeyDown() without Graphics()
| ||
| I need to set up a Keydown() function to work either with a window, or without anything at all. I am not using the Blitz Graphics() command. |
| ||
| You need to use events instead. |
| ||
| Those would be fine as well, but they don't work without a canvas. |
| ||
| You can use a panel with PANEL_ACTIVE set, then you'll get events. |
| ||
| Sweet! |
| ||
| pah, still sux. 1: You need to click on the panel before it creates key-events 2: still no key-repeat (event id 515), so cursor-repeat, as well as other keys (F-keys etc.). So no real use for keyboard-based editing yet. In B+ you didn't need any panel or canvas.. keys were just there.. |
| ||
| Use ActivateGadget() to activate the panel. |
| ||
| It still doesnt' fix issue 2. I'd say it's a feature-lack for the moment.. I rather have no requiring panels or canvases for keypresses, just like B+.. |
| ||
| The key is pressed until you get an EVENT_KEYUP |
| ||
| IF you use WinXp and have MinGW properly installed you could do a hack to the Win32Gui Module. For details : Take a look at http://www.blitzbasic.com/Community/posts.php?topic=55069#614872 If change it to : setEventMask( BBEVENT_MOUSEMASK|BBEVENT_KEYMASK,this ) then you have to call EnablePolledInput before your main loop and the KeyDown and KeyHit also MouseX and Y and MouseHit commands will work. PS: Works for nearly every Gadget but not for the DesktopGadget |
| ||
Try this:Global KeyDown[256] Function UpdateKeyboard() Select EventID() Case EVENT_KEYDOWN KeyDown[EventData()]=True Case EVENT_KEYUP KeyDown[EventData()]=False EndSelect End Function |
| ||
If you want to use a panel , just make something like this before your mainloop:EnablePolledInput() While WaitEvent()<>EVENT_WINDOWCLOSE 'Here you could now use the KeyDown and KeyHit commands as usual Wend |
| ||
| btw, I'm not looking for keyrepeat as used in games (no delay). But more like: [press][delay][repeat][repeat][repeat][repeat][repeat][repeat][repeat][repeat][repeat][keyup] The delay is important. see this B+ code:
window=CreateWindow("._.",0,0,640,480)
canvas=CreateCanvas(0,0,640,480,window)
Repeat
WaitEvent()
If EventID()=$803 End
SetBuffer CanvasBuffer(canvas)
Cls
Text 2,2,EventID()+" "+EventData()
If EventID()=259 ; keyrepeat
If EventData()=63232 ; up
y=y-8
EndIf
If EventData()=63233 ; dn
y=y+8
EndIf
If EventData()=63276 ; pgup
y=y-32
EndIf
If EventData()=63277 ; pgdn
y=y+32
EndIf
If EventData()=63273 ; home
y=0
EndIf
If EventData()=63275 ; end
y=400
EndIf
If EventData()=63234 ; l
x=x-8
EndIf
If EventData()=63235 ; r
x=x+8
EndIf
If EventData()=63236 ; F1
x=Rnd(600)
y=Rnd(400)
EndIf
EndIf
Rect x,y,8,8,1
FlipCanvas canvas
Forever
Things should work/feel exactly like this.. I dunno about all that polled stuff, I basically want to do events-only orso.. all my keyboard routines ar meant for apps, not games. At the moment it isn't possible with bmax-events natively, unless someone proves me wrong. :P (oh, and I don't have xp/mingw) ps. note that I only used a canvas here to visualise the effect, a canvas or panel is not required. |
| ||
| If you want to handle it this way, you have to hack the Win32Gui Source as mentioned above and then catch the events like in B+. |
| ||
| hm.. too complex for me.. I ready-made solution (meaning: EVENT_KEYCHAR is created by a window) is appreciated tho. ^_^ |
| ||
| Dude, just use EnablePolledInput(). For Keydown() events, I usually just enter a loop and don't exit until the KeyUp() event is encountered. |
| ||
| Then convert that B+ source put there above to bmax please, as small as possible and with the natural delay. :P |
| ||
| lol@... liberal use of the word, nevermind ;) |
| ||
| !!!! Dude, just use EnablePolledInput(). For Keydown() events, I usually just enter a loop and don't exit until the KeyUp() event is encountered. Please give an example! I'm going crazy... I've tried something like this enablepolledinput() Repeat Print "..." If EventID()=EVENT_KEYUP Print "key pressed";go_exit=1 Until go_exit=1 End I used PollEvent() but nothing to do.. but nothing to do: and I dont' want a WaitEvent() call. |
| ||
| Why don't you want a WaitEvent?? What's more glorious and luxury than an event system?? |
| ||
| because WAITEVENT() halts program execution until an event is available: this mean that other processes are stopped... |
| ||
| What other processes? game-updates/AI? Stick them to an EVENT_TIMERTICK :P You *can* create games with events you know.. |
| ||
| enablepolledinput() Repeat Print "..." If KeyDown(KEY_UP) end forever |
| ||
Strict
Local win_main:tgadget=CreateWindow("Test",50,50,300,200,Null,WINDOW_TITLEBAR)
enablepolledinput()
While True
WaitEvent
Print CurrentEvent.ToString()
Select EventID()
Case EVENT_KEYDOWN
Print "key pressed"
Case EVENT_WINDOWCLOSE
End
End Select
Wend
This program emits or not a KeyDown Event? On my computer I CAN NOT catch a keyboard event... :( Please gimme an hint, I lost a week of life for this... @Halo: thanks for the example but I didn't work... |
| ||
| i think it only lets you use EVENT_KEYDOWN when a canvas is active. enabledpolledinput() just lets you use keydown() keyhit() and such like. Strict
Local win_main:tgadget=CreateWindow("Test",50,50,300,200,Null,WINDOW_TITLEBAR)
Local can_main:tgadget=CreateCanvas(0,0,ClientWidth(win_main),ClientHeight(win_main), win_main)
ActivateGadget can_main
enablepolledinput()
While True
WaitEvent
Print CurrentEvent.ToString()
Select EventID()
Case EVENT_WINDOWCLOSE
End
End Select
If KeyHit(KEY_ESCAPE) Then End
Wend
|
| ||
| So only with a canvas active I can intercept key event... Maybe I've misinterpreted the command 'enablepolledinput()' Thanks |