vg4->misc->move_and_check_collisions()
Move an object-instance checking for collisions.
SYNTAX
VG_BOOL
vg4->misc->move_and_check_collisions(void *vgame,
unsigned int instanceid,
struct VG_RectCent *rcnt_actual,
unsigned int ctag,
const struct VG_RectCent *rcnt_array,
int npos)
FUNCTION PARAMETERS
vgame | Private structure of the game, or NULL if not existing |
instanceid | Instance-ID |
rcnt_actual | Actual rectangle of the object-instance and returning the new rectangle |
ctag | Collision-tag |
rcnt_array | Array of rectangles to move |
npos | Number of rectangles in rcnt_array |
RETURN VALUE
Returns boolean:
- VG_TRUE: OK
- VG_FALSE: Object-instance is dead
DESCRIPTION
Move an object-instance checking for collisions.
The object-instance will be moved step by step beginning from rcnt_actual
according to the rectangles in rcnt_array,
whereat at any rectangle collisions are checked using vg4->object->collision_call()
as following:
- call of vg4->collision->setpos() to get the collisions at the actual rectangle
- call of vg4->object->collision_call() with the found collisions
to call their collision-functions
- acting according to the return-value of vg4->object->collision_call()
- VG_COLL_RETURN_DEAD: stop iterating the rectangles in the array and return VG_FALSE
- VG_COLL_RETURN_STOP: stop iterating the rectangles in the array and go one rectangle back,
call vg4->collision->setpos() for the corrected rectangle
and return VG_TRUE
- VG_COLL_RETURN_STOP_X or VG_COLL_RETURN_STOP_Y:
check again with the previous x- or y-position
- VG_COLL_RETURN_CONTINUE: update rcnt_actual with the actual rectangle
and continue iterating the rectangles in the array
rcnt_actual will be updated to the new rectangle.
EXAMPLE
/* example of an object's run()-function */ /* private struct for this object-instance */ struct s_obj { struct VG_RectCent rectc; /* rectangle of object-instance (position and width/size) */ struct VG_Image *imgp; /* image */ int angle; /* angle of rotation = moving direction */ }; /* run()-function */ static VG_BOOL f_run(void *vgame, struct VG_Object *objp) { const int factor = 10; struct s_obj *objpriv; int npos; struct VG_RectCent *rcentp; if (objp == NULL) { return VG_TRUE; } objpriv = (struct s_obj *)objp->opriv; /* get private struct */ /* get rectangles for moving the next step */ npos = vg4->misc->moving_one_step(&objpriv->rectc, objpriv->angle, factor, &rcentp); /* check for collisions for each rectangle (ctag is the collision-tag defined elsewhere) */ if (!vg4->misc->move_and_check_collisions(vgame, objp->instanceid, &objpriv->rectc, ctag, rcentp, npos)) { /* object-instance is dead */ if (rcentp != NULL) { free(rcentp); } return VG_TRUE; } if (rcentp != NULL) { free(rcentp); } return VG_TRUE; }