nikki
18-11-2006 08:28:07
I had been using OgreODE in my game, but after PhySX became free for commercial use and all those new additions betajean has made to NxOgre, and since ode requires some extreme tweaking, I've been thinking about moving to PhySX. Is it worth the move?
I have another question:-
In my GameObject framework, each object has a collide event, making it easy to do something when two objects collide. The GameObjectManager (a collision listener) has a function called registerForCollision, which allows an object to receive this event. The GameObjectManaer registers itself as a collision listener when it is created. Since most of you might have used OgreODE before, the relevant functions are implemented like this:-
And a GameObject, for example, a Player, implements its collide event like this:-
Is it possible to do this in NxOgre? If so, is it this easy?
Thanks for the help.
I have another question:-
In my GameObject framework, each object has a collide event, making it easy to do something when two objects collide. The GameObjectManager (a collision listener) has a function called registerForCollision, which allows an object to receive this event. The GameObjectManaer registers itself as a collision listener when it is created. Since most of you might have used OgreODE before, the relevant functions are implemented like this:-
//Register the GameObject for collision events
void registerForCollision(GameObject *object, OgreOde::Geometry *geom)
{
geom->setUserObject(object);
geom->setUserData(1021993);
}
//This function is called by OgreODE, since GameObjectManager is a
//collision listener.
bool collision(OgreOde::Contact *contact)
{
OgreOde::Geometry *geom1 = contact->getFirstGeometry();
OgreOde::Geometry *geom2 = contact->getSecondGeometry();
if (geom1->getUserData() == 1021993 && geom2->getUserData() == 1021993)
{
GameObject *obj1 = (GameObject*)(geom1->getUserObject());
GameObject *obj2 = (GameObject*)(geom2->getUserObject());
if (obj1 && obj2)
{
obj1->collide(obj2, geom2, contact);
obj2->collide(obj1, geom1, contact);
}
}
else if (geom1->getUserData() == 1021993 && geom2->getUserData() != 1021993)
{
GameObject *obj1 = (GameObject*)(geom1->getUserObject());
if (obj1)
{
obj1->collide(0, geom2, contact);
}
}
else if (geom1->getUserData() != 1021993 && geom2->getUserData() == 1021993)
{
GameObject *obj2 = (GameObject*)(geom2->getUserObject());
if (obj2)
{
obj2->collide(0, geom1, contact);
}
}
return true;
}
And a GameObject, for example, a Player, implements its collide event like this:-
//Registration called on creation
GlbVar.goMgr->registerForCollision(this, mGeom);
//The collide event
void Player::collide(NGF::GameObject *other, OgreOde::Geometry *otherGeom, OgreOde::Contact *contact)
{
contact->setBouncyness(0);
contact->setFrictionMode(OgreOde::Contact::Flag_FrictionPyramid);
contact->setCoulombFriction(0);
Vector3 hitPos = contact->getPosition();
if (other)
{
//if (other->hasFlag("Crate") && (contact->getPosition().y > (mNode->getPosition().y - 3)))
if (other->hasFlag("LevelObj"))
{
contact->setSoftness(5, 0.0001);
}
if (other->hasFlag("Acid"))
{
die();
}
}
if (contact->getPosition().y < (mNode->getPosition().y - 3))
{
contact->setCoulombFriction(OgreOde::Utility::Infinity);
}
}
Is it possible to do this in NxOgre? If so, is it this easy?
Thanks for the help.