collide & collect function
This commit is contained in:
parent
2bc9797ff8
commit
4f6ca567d4
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
31
src/player.c
31
src/player.c
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue