I can't make any sense of the collision system. It seems entirely horrible. I could say something nice like 'I'm sure it made more sense back in Blitz3D', but I _owned_ B3D and I could never make sense of it back then either. :)
So I made a simpler one. There are only four commands:
collide (Checks for collision between two entities using sphere-to-mesh check)
collide_sphere (Checks for collision between two entities using sphere-to-sphere check)
latestcollision (gets data object from an entity's most recent collision)
resetentities (must be called before moving anything every frame)
It uses as much of the default behaviour as possible to avoid weird side effects, so it's not as efficient as it could be. But it should still be faster than the default (fingers crossed).
If you give it a go, or especially if you give a go and find a bug, please let me know!
So I made a simpler one. There are only four commands:
collide (Checks for collision between two entities using sphere-to-mesh check)
collide_sphere (Checks for collision between two entities using sphere-to-sphere check)
latestcollision (gets data object from an entity's most recent collision)
resetentities (must be called before moving anything every frame)
It uses as much of the default behaviour as possible to avoid weird side effects, so it's not as efficient as it could be. But it should still be faster than the default (fingers crossed).
Strict Import sidesign.minib3d 'Rem Graphics3D 640, 480 Local cube:TMesh=CreateCube() cube.PositionEntity -5,0,0 cube.EntityRadius 1 Local sphere:TMesh=CreateSphere() sphere.PositionEntity 0,0,0 sphere.EntityRadius 1 Local sphere2:TMesh=CreateSphere() sphere2.PositionEntity 0,1,0 sphere2.EntityRadius 1 Local cam:TCamera=CreateCamera() cam.PositionEntity 0,0,-5 'hardwareinfo.displayinfo While Not AppTerminate() And Not KeyHit(KEY_ESCAPE) ResetEntities If KeyDown(KEY_LEFT) cube.MoveEntity -0.1,0,0 If KeyDown(KEY_RIGHT) cube.MoveEntity 0.1,0,0 If KeyDown(KEY_UP) cube.MoveEntity 0,0.1,0 If KeyDown(KEY_DOWN) cube.MoveEntity 0,-0.1,0 If collide (cube, sphere) Print "THUMP!" Print "You hit the lower sphere at: " + latestcollision (cube).x + ", ".. + latestcollision (cube).y + ", " + latestcollision (cube).z End If If collide (cube, sphere2) Print "BUMP!" RenderWorld Flip Wend 'EndRem Function collide (ent:TEntity, ent2:TMesh) Local old = ent.no_collisions If TCollision.QuickCheck(ent,ent2) ent2.TreeCheck() TCollision.SphereToMesh(ent,ent2) EndIf If old < ent.no_collisions Return 1 End Function Function collide_sphere (ent:TEntity, ent2:TEntity) If TCollision.SphereToSphere(ent,ent2) ent.no_collisions=ent.no_collisions+1 Local i=ent.no_collisions-1 ent.collision=ent.collision[..i+1] ent.collision[i]=New TCollisionImpact ent.collision[i].ent=ent2 Return 1 EndIf End Function Function latestcollision:TCollisionImpact (ent:TEntity) If ent.no_collisions = 0 Return Null Return ent.collision[ent.no_collisions-1] End Function Function resetentities(list:TList=Null) If Not list list = TEntity.entity_list For Local loop:TEntity = EachIn list loop.ResetEntity Next EndFunction
If you give it a go, or especially if you give a go and find a bug, please let me know!