waitevent

BlitzMax Forums/BlitzMax Programming/waitevent

gellyware(Posted 2006) [#1]
Waitevent seems to make my while statement crawl ( I guess because events arent being generated)....However if I move my mouse, the graphics that are supposed to be doing something move quickly.....

How can I get around this?


tonyg(Posted 2006) [#2]
Can you post some code?


Dreamora(Posted 2006) [#3]
You need to create a timer for screen updating and simply call flip if a EVENT_TIMERTICK was raised by your update timer.

When doing event based you can't use regular coding styles anymore (ok you can but you will have to face many problems)


gellyware(Posted 2006) [#4]
thanks Dreamora, I'll have a look at it tonight, that makes sense. :)


AramusM(Posted 2006) [#5]
Been starting to learn bmax and maxgui recently and came across waitevent and thought eewww. Did a forum search and came across this post about using timers for a game loop etc and thought i would post this bit of code here as it might help a few people.
If you dont want your game loop to process every timer tick but process as fast as possible when its got nothing else to do try this


Global GAME_WIDTH=320
Global GAME_HEIGHT=240

' create a centered window with client size GAME_WIDTH,GAME_HEIGHT

Local wx=(GadgetWidth(Desktop())-GAME_WIDTH)/2
Local wy=(GadgetHeight(Desktop())-GAME_HEIGHT)/2

Local window:TGadget=CreateWindow("My Canvas",wx,wy,GAME_WIDTH,GAME_HEIGHT,0,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)

' create a canvas for our game

Local canvas:TGadget=CreateCanvas(0,0,320,240,window)

' create an update timer

CreateTimer 60

While True
	If PeekEvent()
		PollEvent()
		Select EventID()
			Case EVENT_TIMERTICK
				RedrawGadget canvas
			Case EVENT_GADGETPAINT
				Local g=CanvasGraphics(canvas)
				SetGraphics g
				SetOrigin 160,120
				SetLineWidth 5
				Cls
				Local t=MilliSecs()
				DrawLine 0,0,120*Cos(t),120*Sin(t)
				DrawLine 0,0,80*Cos(t/60),80*Sin(t/60)
				Flip
			Case EVENT_WINDOWCLOSE
				FreeGadget canvas
				End
			Case EVENT_APPTERMINATE
				End
		End Select
	EndIf
	
	'Do other stuff in your loop here when no events in queue
	
Wend



This way you can keep redrawing at 60fps but dont have to wait around for that timer tick to process your game code(eg scripts/ai etc)

If im wrong, please shoot me down as im just starting to learn this stuff :)


CS_TBL(Posted 2006) [#6]
I'd drop any polling..

You don't need to rely on just one timer. You can do:

AItimer=CreateTimer(30)
Drawtimer=CreateTimer(60)

And then:

WaitEvent()
If EventID()=EVENT_TIMERTICK
If EventSource()=AItimer
doAI()
Endif
If EventSource()=Drawtimer
update()
Endif
Endif

Advantage of events with games is that you could create a map-editor (events/GUI) in the future with integrated testplaying (e.g walking around on the map-editor form). In this case you'd have to have the game running in an event-interface anyway.


AramusM(Posted 2006) [#7]
The problem with WaitEvent I think is the waiting, waiting is unused processing time you could be using elsewhere.


CS_TBL(Posted 2006) [#8]
Use for what? I'd prefer constant gametiming without cpu drops.. with timers you have a guaranteerd framerate.


Chris C(Posted 2006) [#9]
you might want to consider dropping a pollsystem in there somewhere too, under certain circumstances the windows gui can become unresponsive (usually when you've borked somthing!) so it can be useful for testing