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 |