collide & collect function

This commit is contained in:
KikooDX 2021-12-20 11:33:34 +01:00
parent 2bc9797ff8
commit 4f6ca567d4
3 changed files with 35 additions and 3 deletions

View File

@ -37,5 +37,6 @@ void level_draw_name(void);
int level_get(int x, int y);
int level_get_px(int x, int y);
void level_set(int x, int y, int v);
void level_set_px(int x, int y, int v);
struct Vec level_find(enum Tile);
struct Vec level_dim(void);

View File

@ -160,6 +160,12 @@ level_set(int x, int y, int v)
level.data[x + y * level.width] = v;
}
void
level_set_px(int x, int y, int v)
{
level_set(x / TILE_SIZE, y / TILE_SIZE, v);
}
struct Vec
level_find(enum Tile t)
{

View File

@ -9,10 +9,13 @@
static void reset_speed(struct Player *, int x, int y);
static struct Vec update_rem(struct Player *);
static int collide_opt(int x, int y, int tile, int margin, int collect);
static int collide_point(int x, int y, int tile, int collect);
static int collide_margin(int x, int y, int tile, int margin);
static int collide(int x, int y, int tile);
static int collide_solid(int x, int y);
static int collide_burn(int x, int y);
static int collide_collect(int x, int y, int tile, int margin);
void
player_spawn(struct Player *p)
@ -220,14 +223,30 @@ update_rem(struct Player *p)
}
static int
collide_margin(int x, int y, int tile, int margin)
collide_opt(int x, int y, int tile, int margin, int collect)
{
const int x1 = x + margin;
const int x2 = x + PLAYER_WIDTH - 1 - margin;
const int y1 = y + margin;
const int y2 = y + PLAYER_HEIGHT - 1 - margin;
return level_get_px(x1, y1) == tile || level_get_px(x2, y1) == tile ||
level_get_px(x1, y2) == tile || level_get_px(x2, y2) == tile;
return collide_point(x1, y1, tile, collect) +
collide_point(x2, y1, tile, collect) +
collide_point(x1, y2, tile, collect) +
collide_point(x2, y2, tile, collect);
}
static int
collide_point(int x, int y, int tile, int collect)
{
const int collide = level_get_px(x, y) == tile;
if (collide && collect) level_set_px(x, y, TILE_AIR);
return collide;
}
static int
collide_margin(int x, int y, int tile, int margin)
{
return collide_opt(x, y, tile, margin, 0);
}
static int
@ -251,3 +270,9 @@ collide_burn(int x, int y)
(!polarity() && collide(x, y, TILE_BURN_RED)) ||
(polarity() && collide(x, y, TILE_BURN_BLUE));
}
static int
collide_collect(int x, int y, int tile, int margin)
{
return collide_opt(x, y, tile, margin, 1);
}