diff options
Diffstat (limited to 'player.c')
-rw-r--r-- | player.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/player.c b/player.c new file mode 100644 index 0000000..68f77ff --- /dev/null +++ b/player.c @@ -0,0 +1,92 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* player.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: kdx <kdx @student.42angouleme.fr +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2022/10/09 08:29:41 by kdx #+# #+# */ +/* Updated: 2022/10/14 14:36:25 by kdx ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "player.h" +#include "sprite.h" +#include "game.h" +#include "map.h" +#include <math.h> +#include <stdbool.h> + +static void player_move(t_player *player, t_map *map) +{ + int i; + int sign; + + if (player_collide(map, player->pos[0], player->pos[1], TILE_WALL)) + return ; + i = -1; + while (++i < 2) + { + sign = (player->vel[i] > 0) - (player->vel[i] < 0); + player->pos[i] += player->vel[i]; + while (player_collide(map, player->pos[0], player->pos[1], TILE_WALL)) + { + player->vel[i] = 0.0; + player->pos[i] = round(player->pos[i]) - sign; + } + } +} + +void player_init(t_player *player, double x, double y) +{ + player->pos[0] = x; + player->pos[1] = y; + player->vel[0] = 0.0; + player->vel[1] = 0.0; +} + +static void player_update_end(t_sily *sily, t_player *player) +{ + player_move(player, &sily->game->map); + player_collect(sily->game, player, &sily->game->map); + player_collide_exit(sily, player, &sily->game->map); + if (player_collide_badeline(player, &sily->game->badeline)) + { + ft_putendl_fd("oof", 1); + sily->quit = true; + } +} + +void player_update(t_sily *sily, t_player *player) +{ + double dir[2]; + int i; + + dir[0] = sily->input[K_RIGHT] - sily->input[K_LEFT]; + dir[1] = sily->input[K_DOWN] - sily->input[K_UP]; + player->invincible -= (player->invincible > 0); + if ((dir[0] || dir[1]) && !sily->game->badeline.active) + { + sily->game->badeline.active = true; + player->invincible = PLAYER_INVINCIBLE; + } + i = 0; + while (i < 2) + { + player->old_pos[i] = player->pos[i]; + if (dir[0] && dir[1]) + dir[i] /= 1.4142135623730951; + i++; + } + player->vel[0] *= 1.0 - PLAYER_FRICTION; + player->vel[0] += PLAYER_ACCELERATION * dir[0]; + player->vel[1] += PLAYER_THRUSTER * dir[1]; + player->vel[1] += PLAYER_GRAVITY; + player_update_end(sily, player); +} + +void player_draw(t_sily *sily, t_player *player) +{ + sprite_draw(sily, sily->game->s_player, round(player->pos[0]), + round(player->pos[1])); +} |