vg4->object->collision_add()
Add a collision-function for two object-IDs.
SYNTAX
void
vg4->object->collision_add(const char *objid1,
const char *objid2,
int (*collfn)(void *, unsigned int, struct VG_Coll *))
FUNCTION PARAMETERS
objid1 | Object-ID for moving object-instance |
objid2 | Object-ID for hit object-instance |
collfn | Collision-function: int (*collfn)(void *vgame, unsigned int instanceid, struct VG_Coll *collb) - parameters: - vgame: private structure of the game, or NULL if not existing - instanceid: instance-ID of the moving object-instance - collb: collision-struct (from the array got from vg4->collision->setpos()) - return value: should return one from VG_COLL_RETURNS or NULL = remove collision-function |
DESCRIPTION
Add a collision-function for two object-IDs.
To check for collisions of an object-instance with others, vg4->collision->setpos() is used.
It returns an array of collisions.
For each collision a collision-function for the appropriate two objects should be called.
vg4->object->collision_add() is used to register a collision-function for two objects,
which can be called with vg4->object->collision_call().
The collision-function is registered for moving object-instance objid1
and hitting object-instance objid2.
But it will also be added inverse,
that is for objid2 hitting objid1, if there is no other function already.
EXAMPLE
/* collision-function for OBJECT1 and OBJECT2 and inverse */ int collfn(void *vgame, unsigned int instanceid, struct VG_Coll *collb) { struct VG_Object *objp1, *objp2; int retw = VG_COLL_RETURN_CONTINUE; /* get object-instances */ objp1 = vg4->object->instance_getobj(instanceid); objp2 = vg4->object->instance_getobj(collb->instanceid); // or objp2 = collb->objid; /* return if it is not a new collision */ if (collb->type != VG_COLL_TYPE_ENTRY) { return VG_COLL_RETURN_CONTINUE; } if (strcmp(objp1->objid, "OBJECT1") == 0 && strcmp(objp2->objid, "OBJECT2") == 0) { /* OBJECT1 is moving, hitting OBJECT2 * OBJECT1 shall be destroyed, OBJECT2 shall remain alive */ [...] /* return DEAD */ retw = VG_COLL_RETURN_DEAD; } else if (strcmp(objp1->objid, "OBJECT2") == 0 && strcmp(objp2->objid, "OBJECT1") == 0) { /* OBJECT2 is moving, hitting OBJECT1 * OBJECT1 shall be destroyed, OBJECT2 shall remain alive */ [...] /* return CONTINUE */ retw = VG_COLL_RETURN_CONTINUE; } return retw; } void insert_collfn(void) { vg4->object->collision_add("OBJECT1", "OBJECT2", collfn); }
SEE ALSO