Events in BlitzMax

BlitzMax Forums/BlitzMax Programming/Events in BlitzMax

rogue(Posted 2005) [#1]
I am trying to migrate my BlitzPlus app to BlitzMax. I don't see any of the routines to handle system events in BlitzMax. In particular I have the following that works well in BlitzPlus, but cannot see how to do it in Max:

<codebox>
Repeat
event = WaitEvent()

Select event
Case EVENT_KeyDown
gKeyPressed = EventData()
Select gKeyPressed
Case KEY_Escape
GameShutDown()

Case KEY_F
If gFullScreen=MODE_FullScreen Then
gFullScreen = MODE_Windowed
Else
gFullScreen = MODE_FullScreen
EndIf
SetupDisplay()

End Select

Case EVENT_MouseDown
Select EventData()
Case 1
gLeftMouseDown = True

Case 2
gRightMouseDown = True
End Select

Case EVENT_MouseUp
Select EventData()
Case 1
gLeftMouseDown = False

Case 2
gRightMouseDown = False
End Select

Case EVENT_Close
GameShutDown()

End Select

Until event = EVENT_Timer
</codebox>

I guess I can do this by programming directly in Windows, but that won't help me when I try and get this running on the Mac.

Thanks,

- Ken


rogue(Posted 2005) [#2]
Hmmm, I guess I got the formatting tags wrong for the code box. Is there a post somewhere that lists all of the Forum formatting options?


N(Posted 2005) [#3]
Use [], not <>.


Dreamora(Posted 2005) [#4]
BlitzMax is not event based.

You have to use

IF keyhit(key_left)

endif
If mousehit(1)

endif

or keydown/mousedown


Robert(Posted 2005) [#5]
BlitzMax is not event based.


I think you mean that the input handling system (The BRL.System module) is not yet event based. When MaxGUI is released, there will no doubt be an event-based way of handling user input.


N(Posted 2005) [#6]
I vote for structures like thiiiis:

Type MyButton Extends Control

     Field Click:Int( sender:Control, e:EventArgs )

End Type


Anyone recognize what it's based on?


ziggy(Posted 2005) [#7]
It's as easy as to have a function pointer in each object that has to throw an event.

example:
Type MyBaseObject
   Field OnClick()
   Method Update() abstract
End Method

Type Button extends MyBaseObject
   field x,y,text
   Method New()
      ObjectManager.ObjectCollection.AddLast(self)
   end Method
   Method Update()
      If (whatver mouse control for example) and OnClick <> Null then
         OnClick()
      End if
   End Method
End Type

Type ObjectManager
    Global ObjectCollection
    Function DoEvents()
        For o:BaseObject = eachin ObjectCollection
           o.Update()
        Next
    end Function
End Type


With this, you can do a code as:

ObjectManager.ObjectCollection = New TList
Local MyBut:Button
MyBut.OnClick = Button_Click_Event

while not keyhit(key_escape)
    ObjectManager.Doevents()
Wend

Function Button_Click_Event()
    Notify("Pressed!!!")
End Function




Gabriel(Posted 2005) [#8]
It's as easy as to have a function pointer in each object that has to throw an event.


Absolutely. As someone who's completely new to function pointers, this is the only use for them that I can really see the use of. I've already found a lot of code which can benefit from it in this regard.


teamonkey(Posted 2005) [#9]
I suspect that the SendMessage() method in all objects is there to allow for some sort of event-based system. Probably.


StuC(Posted 2005) [#10]
@Noel -
Anyone recognize what it's based on?

both .Net and VCL (Delphi) support this methodology (as I'm sure do many others).

Cheers,

Stu