action fwdBase ()
{
static const var angForce = 600;
while (1)
{
// rotate base with A and D
var f = key_a - key_d;
if (f != 0)
{
// open constraint, if closed
if (!isFwdBaseOpen(my))
openFwdBase(my);
// rotate base
var vt = f * angForce * time_step;
pXent_setangvelocity(my, vector(0, 0, vt));
}
else // close constraint, when no force is applied
if (isFwdBaseOpen(my))
closeFwdBase(my);
wait(1);
}
}
void fwdBaseMakeContraint (ENTITY* eBase, var limit)
{
// use cage upward vector is hinge direction
VECTOR vAxis;
vec_set(&vAxis, vector(0,0,-1));
vec_rotate(&vAxis, eBase->parent->pan);
// create stiff hinge constraint for the base
pXcon_add(PH_HINGE, eBase, eBase->parent, 0);
pXcon_setparams1(eBase, eBase->x, &vAxis, NULL);
pXcon_setparams2(eBase, vector(-limit, limit, 100), NULL, NULL);
}
// returns if base constraint is open
BOOL isFwdBaseOpen (ENTITY* base)
{
static VECTOR vCon;
pXcon_getposition(base, &vCon);
BOOL isOpen = false;
if ((vCon.x == -180) && (vCon.y == 180))
isOpen = true;
return(isOpen);
}
// opens base constraint
void openFwdBase (ENTITY* base)
{
pXcon_remove(base);
fwdBaseMakeContraint(base, 180);
}
// closes base constraint
void closeFwdBase (ENTITY* base)
{
pXcon_remove(base);
fwdBaseMakeContraint(base, 5);
}