Collision functions
Accelerated checking for collisions of objects. Collisions are realized via a quadtree. There may be more than one collision-quadtree for different species of collision. So each collision-quadtree is referenced by a collision-tag. Object-instances must be inserted as a start into one (or more) collision-tag(s). When they move the new position must be updated by vg4->collision->setpos() which also returns the collisions with other object-instances at this new position. A state of collisions for each object-instance is kept, so also information about leaving collisions is returned.
- Enumerations and Structures
- VG_COLL_RETURNS
- VG_COLL_SIDES
- VG_COLL_TYPES
- struct VG_Coll
- Collision tags
- vg4->collision->create()
Create a collision-tag. - vg4->collision->destroy()
Destroy collision-tag. - vg4->collision->destroyall()
Destroy all collision-tags. - Inserting and removing object-instances
- vg4->collision->insert()
Insert object-instance into a collision-tag. - vg4->collision->remove()
Remove object-instance from a collision-tag. - vg4->collision->clear()
Clear a collision-tag. - Updating and checking for collisions
- vg4->collision->setpos()
Set position of an object-instance and get collisions. - Miscellaneous functions
- vg4->collision->mark()
Mark object-instance-IDs in the collision-tag by drawing a rectangle around them.
Example 
Object-instance coming
Object-instance colliding
Object-instance going
/* move an object-instance to another, change colors of both while they collide */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <vgagames4.h>
int main(int argc, char **argv) {
unsigned int coll_tag;
const int coll_percent = 100;
int winw, winh, canz, i1;
struct VG_Coll *collp;
struct VG_Rect rect1, rect2;
unsigned int instanceid1, instanceid2;
int color1, color2;
(void)argc; (void)argv;
/* initialize and open window */
if (!VG_init("test")) { exit(1); }
if (!vg4->window->open(VG_WINDOW_SIZE_LOW, VG_WINDOW_SCALE_BEST)) { VG_dest(); exit(1); }
vg4->window->getsize(&winw, &winh);
/* create two object-instances */
instanceid1 = 1;
rect1.x = 0; rect1.w = 20;
rect1.y = winh / 2 - 5; rect1.h = 20;
color1 = VG_COLOR_RED;
instanceid2 = 2;
rect2.x = winw / 2; rect2.w = 20;
rect2.y = winh / 2; rect2.h = 20;
color2 = VG_COLOR_GREEN;
/* create collision-tag */
coll_tag = vg4->collision->create(NULL, 0, 0);
/* insert object-instances into collision-tag */
vg4->collision->insert(coll_tag, instanceid1, &rect1, coll_percent);
vg4->collision->insert(coll_tag, instanceid2, &rect2, coll_percent);
/* game loop */
for (;;) {
if (!vg4->input->update(VG_TRUE)) { break; }
vg4->window->clear();
/* move first object-instance */
if (++rect1.x == winw) { break; }
/* update position and get collisions of first object-instance */
canz = vg4->collision->setpos(coll_tag, instanceid1, &rect1, &collp);
for (i1 = 0; i1 < canz; i1++) {
if (collp[i1].type == VG_COLL_TYPE_ENTRY) { /* entering into collision */
/* change colors to yellow and white */
color1 = VG_COLOR_YELLOW;
color2 = VG_COLOR_WHITE;
} else if (collp[i1].type == VG_COLL_TYPE_LEAVE) { /* leaving collision */
/* reset colors to default */
color1 = VG_COLOR_RED;
color2 = VG_COLOR_GREEN;
}
}
if (collp != NULL) { free(collp); }
/* draw object-instances */
vg4->window->draw_rect(&rect1, color1, VG_TRUE);
vg4->window->draw_rect(&rect2, color2, VG_TRUE);
vg4->window->flush();
vg4->misc->wait_time(30);
}
/* destroy and exit */
VG_dest();
exit(0);
}