jtmm2/src/collide.c

99 lines
2.0 KiB
C

#include <gint/defs/types.h>
#include <stdbool.h>
#include "collide.h"
#include "conf.h"
#include "level.h"
uint8_t collide_point(Vec point, const Level *level, uint layer_id)
{
Vec cursor; /* the final position to test */
vec_cpy(&cursor, point);
vec_div(&cursor, TILE_SIZE); /* get the expected tile ID */
if (point.x < 0 || point.y < 0 ||
cursor.x >= level->width || cursor.y >= level->height)
{
return 0; /* the point is out of bounds */
}
else
{
return level->layers[layer_id][cursor.x + cursor.y * level->width];
}
}
_Bool collide_right(Player *player, Vec position, const Level *level, uint layer_id)
{
Vec pos;
vec_cpy(&pos, position);
vec_sub(&pos, player->origin);
pos.x += player->hbox.x;
if (collide_point(pos, level, layer_id))
{
return true;
}
pos.y += player->hbox.y;
if (collide_point(pos, level, layer_id))
{
return true;
}
return false;
}
_Bool collide_left(Player *player, Vec position, const Level *level, uint layer_id)
{
Vec pos;
vec_cpy(&pos, position);
vec_sub(&pos, player->origin);
if (collide_point(pos, level, layer_id))
{
return true;
}
pos.y += player->hbox.y;
if (collide_point(pos, level, layer_id))
{
return true;
}
return false;
}
_Bool collide_down(Player *player, Vec position, const Level *level, uint layer_id)
{
Vec pos;
vec_cpy(&pos, position);
vec_sub(&pos, player->origin);
pos.y += player->hbox.y;
if (collide_point(pos, level, layer_id))
{
return true;
}
pos.x += player->hbox.x;
if (collide_point(pos, level, layer_id))
{
return true;
}
return false;
}
_Bool collide_up(Player *player, Vec position, const Level *level, uint layer_id)
{
Vec pos;
vec_cpy(&pos, position);
vec_sub(&pos, player->origin);
if (collide_point(pos, level, layer_id))
{
return true;
}
pos.x += player->hbox.x;
if (collide_point(pos, level, layer_id))
{
return true;
}
return false;
}
_Bool collide_full(Player *player, Vec position, const Level *level, uint layer_id)
{
return collide_up(player, position, level, layer_id) ||
collide_down(player, position, level, layer_id);
}