summaryrefslogtreecommitdiff
path: root/player.c
diff options
context:
space:
mode:
Diffstat (limited to 'player.c')
-rw-r--r--player.c92
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]));
+}