Modifiers are now "side dependent". Only implemented for floor.

This commit is contained in:
KikooDX 2021-01-15 18:37:43 +01:00
parent 7bce93d092
commit 0ec3cb12f8
3 changed files with 41 additions and 22 deletions

View File

@ -1,8 +1,15 @@
/* tile modifiers on player vars */
#ifndef _DEF_PLAYER_MODIFIERS
#define _DEF_PLAYER_MODIFIERS
#define D_LEFT 0b1
#define D_RIGHT 0b10
#define D_FLOOR 0b100
#define D_CEIL 0b1000
#define D_WALL (D_LEFT | D_RIGHT)
#define D_ANY (D_LEFT | D_RIGHT | D_FLOOR | D_CEIL)
#include "player.h"
void player_mod_ice(Player *player);
void player_mod_glue(Player *player);
void player_mod_ice(Player *player, uint8_t sides);
void player_mod_glue(Player *player, uint8_t sides);
#endif

View File

@ -45,35 +45,39 @@ void player_set_vars(Player *player, const Level *level) {
player->vars.acceleration = ACCELERATION;
player->vars.jump_spd = JUMP_SPD;
player->vars.gravity = GRAVITY;
/* apply modifiers */
Vec pos = { player->pos.x, player->pos.y + 1 };
Tile_flags flags = player_collide_or(player, pos, level);
pos.y -= 2;
flags |= player_collide_or(player, pos, level);
/* collide on all sides */
Vec pos = { player->pos.x - 1, player->pos.y };
Tile_flags flags_left;
Tile_flags flags_right;
Tile_flags flags_floor;
Tile_flags flags_ceil;
flags_left = player_collide_or(player, pos, level);
pos.x += 2;
flags_right = player_collide_or(player, pos, level);
pos.x -= 1;
pos.y += 1;
pos.x += 1;
flags |= player_collide_or(player, pos, level);
pos.x -= 2;
flags |= player_collide_or(player, pos, level);
flags_floor = player_collide_or(player, pos, level);
pos.y -= 2;
flags_ceil = player_collide_or(player, pos, level);
/* test for each flag */
for (uint i = 0; i < sizeof(Tile_flags) * 8; i++) {
if (flags & 1) {
if (flags_floor & 1) {
switch (1 << i) {
case F_ICE:
player_mod_ice(player);
player_mod_ice(player, D_FLOOR);
break;
case F_GLUE:
player_mod_glue(player);
player_mod_glue(player, D_FLOOR);
break;
default: break;
}
}
flags >>= 1;
flags_floor >>= 1;
}
}
void player_move(Player *player, const Level *level) {
/* TODO: Take into account player's hitbox */
/* TODO: Take into account player's hitbox */
const int sgn_spd_x = SGN(player->spd.x);
const int sgn_spd_y = SGN(player->spd.y);
Vec destination;

View File

@ -1,12 +1,20 @@
#include "player_modifiers.h"
#include "player.h"
void player_mod_ice(Player *player) {
player->vars.acceleration /= 4;
player->vars.friction /= 4;
void player_mod_ice(Player *player, uint8_t sides) {
if (sides & D_FLOOR) {
player->vars.acceleration /= 4;
player->vars.friction /= 4;
}
}
void player_mod_glue(Player *player) {
player->vars.acceleration = 1;
player->vars.friction = 1;
void player_mod_glue(Player *player, uint8_t sides) {
if (sides & D_FLOOR) {
player->vars.acceleration = 1;
player->vars.friction = 1;
}
if (sides & (D_LEFT | D_RIGHT | D_CEIL)) {
player->vars.gravity = 0;
player->vars.acceleration = 0;
}
}