I can answer one part to your question.
Its to do with reducing the amount of collision calls per loop or having none at all
Using a distance function you can calcualte the distance between two objects and only then do the collision detection. saving tonnes of checks per loop and reducing it to as many as you want within a given range of the players object. etc...
this really improves performance and if your not requiring an absolute collision detection for say a limbed model but just the distance of two objects then this puppy is the key. It works prior to detecting collision using other limb collision based methods i wont talk about here to keep this part simple and clear.
I dont know enough about limb based collisions yet but making mini limbs within an object and glueing real objects to these limbs provides a solution to check the collision ont he glued object and allows for more options since a limb doesnt have as many filters and features of a normal meshed object.
`a simple distance example with multiple targets
`indi feb 2001 v108
cls
sync rate 60
sync on
randomize timer()
set text font "verdana"
set text size 14
make matrix 1,500,500,10,10
position matrix 1,-250,0,-250
make object cube 1,10
position object 1,0,0,-100
make object cube 2,10
position object 2,0,0,50
make object cube 3,10
position object 3,0,0,200
make object cube 4,10
position object 4,0,0,300
position camera 0,200,-300
point camera 0,0,0
do
if upkey() = 1
position object 1,object position x(1),object position y(1),object position z(1)+1
endif
if downkey() = 1
position object 1,object position x(1),object position y(1),object position z(1)-1
endif
obj1x# = object position x(1)
obj1y# = object position y(1)
obj1z# = object position z(1)
for obj = 2 to 4
obj2x# = object position x(obj)
obj2y# = object position y(obj)
obj2z# = object position z(obj)
point camera object position x(1),object position y(1),object position z(1)
dist# = getdist(obj1x#,obj2x#,obj1y#,obj2y#,obj1z#,obj2z#)
if dist# < 30
text 10,50,"can check obj collision with obj " + STR$(obj)
text 10,70,"30 units or and less"
` turn on DB collision
` place the DB collision check here
`turn off DB collision
endif
next obj
text 10,10,"distance " + STR$(dist#)
text 10,30,"fps " + STR$(screen fps())
sync
loop
function getdist(obj1x#,obj2x#,obj1y#,obj2y#,obj1z#,obj2z#)
distance# = SQRT((obj1x#-obj2x#)^2+(obj1y#-obj2y#)^2+(obj1z#-obj2z#)^2)
endfunction distance#
theres a few distance functions around and this one might be faster than the last, dont forget if its a 2d based fighting area in a 3d world u can allevaite another call from the distance checks. assuming y for everyone inthe game is equal or very close so they can still come in a distance measured.
heres another distance function
function squaredistance(x2,y2,z2,x1,y1,z1)
dx = (x2-x1)
dy = (y2-y1)
dz = (z2-z1)
distance=dx*dx + dy*dy + dz*dz
endfunction distance