Kronos Posted August 13, 2012 Share Posted August 13, 2012 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 Quote intel i5 2500k, ram 16gb, nvidia Geforce GTX570, asus xonar sound card. Windows 7 64 bit Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.