Jump to content
Kronos

Example of using callbacks in Blitzmax

Recommended Posts

A while ago I was looking at callbacks for the first time and wrote this little demo to test some things. Anyway I figure it might be useful to others so here is the code.

 

'A short demo to show how to setup certain callbacks in Blitzmax
' and how to associate an instance of a type with an entity which can hold additional info
' use wasd,lshift and space to move camera
' keys r,g,b to send message to entity (to change colour)
'count1 updates for every entity update
'count2 updates when entity is in defined range of camera and name of entity matches simple.name

Framework leadwerks.engine
Import "C:\Program Files (x86)\Leadwerks Engine SDK\BMX\Framework\framework.bmx"

'*****************************************************************************************
Type SimpleType ' our user data holder class

Field health:Int
Field Name:String = "Fred"
Field Message:String
Field BODY:TBody
Field Count1:Long
Field Count2:Long


End Type
'*****************************************************************************************
Function CheckColour(ent:TEntity, message:String)' function used by MessageReceive callback

Select message

Case "Red"
EntityColor(ent, Vec3(255, 0, 0))

Case "Green"
EntityColor(ent, Vec3(0, 255, 0))

Case "Blue"
EntityColor(ent, Vec3(0, 0, 255))

End Select

Local Sim:SimpleType = simpletype(getentityuserdata(ent))' to access the userdata we have to cast to simpletype

Sim.message = message

End Function
'*******************************************************************************************
Function UpdateCounter(ent:TEntity) ' function used by EntityUpdate callback

Local Sim:SimpleType = simpletype(getentityuserdata(ent))
Sim.count1:+1

End Function
'*******************************************************************************************
Function UpdateCounter2(ent:TEntity) 'function used by ForEachEntityInAABBDo

If getentitykey(ent, "name") = "Fred" Then
Local Sim:SimpleType = simpletype(getentityuserdata(ent))
If Sim.Name = "Fred" Then Sim.count2:+1
EndIf

End Function
'*******************************************************************************************
'main routine

AppTitle:String = "Leadwerks Callback test"
RegisterAbstractPath ("C:\Program Files (x86)\Leadwerks Engine SDK\")
Graphics(1024, 768)


Global fw:TFramework = CreateFramework()
If Not fw RuntimeError "Failed to initialize engine."

Local markcam:mCamsetup = New mcamsetup
markcam.Camera = fw.Main.Camera

Local Simple:SimpleType = New SimpleType

Local MyMesh:TMesh = CreateCube()' create a mesh
Setentitykey(MyMesh, "name", "Fred")' give it a name of "Fred"
SetEntityCallback(MyMesh, Byte Ptr CheckColour, ENTITYCALLBACK_MESSAGERECEIVE)' associate a function to the message receive callback
SetEntityCallback(MyMesh, Byte Ptr UpdateCounter, ENTITYCALLBACK_UPDATE)' associate a function to the update callback

setentityuserdata(MyMesh, Simple) 'associates the instance of simpletype to MyMesh

PositionEntity(fw.Main.Camera, Vec3(.5, 2, -2), 1)

Global Light:TLight = CreateDirectionalLight()
RotateEntity(Light, Vec3(45, 45, 0))


Local PLANE:TMesh = createPlane()
ScaleEntity(PLANE, Vec3(5000, 1, 5000))
EntityColor(PLANE, Vec3(100, 100, 0))

Local Vec6:TAABB = New TAABB' needed for ForEachEntityInAABBDo
HideMouse()

While Not KeyHit(KEY_ESCAPE) And Not AppTerminate()
markcam.Update()

'setup the area to search for entities
Vec6.x0 = entityposition(markcam.Camera).X - 10
Vec6.x1 = entityposition(markcam.Camera).X + 10
Vec6.y0 = entityposition(markcam.Camera).Y - 10
Vec6.y1 = entityposition(markcam.Camera).Y + 10
Vec6.z0 = entityposition(markcam.Camera).Z - 10
Vec6.z1 = entityposition(markcam.Camera).Z + 10

ForEachEntityInAABBDo(Vec6, Byte Ptr UpdateCounter2)

If KeyHit(KEY_R) Then sendentitymessage(MyMesh, "Red", 1200)'send message with a short delay
If KeyHit(KEY_G) Then sendentitymessage(MyMesh, "Green", 1200)
If KeyHit(KEY_B) Then sendentitymessage(MyMesh, "Blue", 1200)


fw.Update()
fw.render()

DrawText(Int entityposition(markcam.Camera).X + " " + Int entityposition(markcam.Camera).Y + " " + Int entityposition(markcam.Camera).Z, 0, 16)
DrawText("Simple.Message=" + Simple.message, 0, 32)
DrawText("Simple.count1=" + Simple.count1, 0, 48)
DrawText("Simple.count2=" + Simple.count2, 0, 64)

Flip(0)
Wend

ShowMouse()
End
'*********************************************************************************************
'just a little camera control class

Type mCamSetup

Field mx:Float=0
Field my:Float=0
Field move:Float=1
Field wire:Int = -1
Field Camera:TCamera
Field Py:Float
Field toggle:Int = 1


Method New()

End Method

Method Update()

mx=mx+(MouseX()-GraphicsWidth()/2)/10
my=my+(MouseY()-GraphicsHeight()/2)/10

MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)

RotateEntity(Camera, Vec3(my, -mx, 0))

If toggle = 1 Then

If KeyDown(KEY_W) = True Then MoveEntity Camera, Vec3(0, 0, move * AppSpeed())
If KeyDown(KEY_S) = True Then MoveEntity Camera, Vec3(0, 0, -move * AppSpeed())

If KeyDown(KEY_A) = True Then MoveEntity Camera, Vec3(-move * AppSpeed(), 0, 0)
If KeyDown(KEY_D) = True Then MoveEntity Camera, Vec3(move * AppSpeed(), 0, 0)


If KeyDown(KEY_SPACE) = True Then TranslateEntity Camera, Vec3(0, move * AppSpeed(), 0)
If KeyDown(KEY_LSHIFT) = True Then TranslateEntity Camera, Vec3(0, -move * AppSpeed(), 0)

EndIf


End Method


End Type

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...