-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhandle_player.c
123 lines (112 loc) · 4.31 KB
/
handle_player.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* handle_player.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jaemjeon <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/11/02 16:00:23 by jaemjeon #+# #+# */
/* Updated: 2022/11/13 09:58:54 by jaemjeon ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
#include "mlx.h"
#include <math.h>
double cut_point(double num, int limiter)
{
const int handler = pow(10, limiter);
int sign;
if (num < 0)
{
num *= -1.0;
sign = -1;
}
else
sign = 1;
return ((double)((int)(num * handler)) / handler * sign);
}
void check_wall_collisions(t_vector2 *player_pos, \
t_vector2 *tmp_pos, char **map)
{
t_vector2 check_coordin;
if (tmp_pos->x - player_pos->x > 0)
check_coordin.x = tmp_pos->x + BODY_SIDE_2;
else
check_coordin.x = tmp_pos->x - BODY_SIDE_2;
if (tmp_pos->y - player_pos->y > 0)
check_coordin.y = tmp_pos->y + BODY_SIDE_2;
else
check_coordin.y = tmp_pos->y - BODY_SIDE_2;
if (map[(int)check_coordin.y][(int)player_pos->x] != WALL)
player_pos->y = tmp_pos->y;
if (map[(int)player_pos->y][(int)check_coordin.x] != WALL)
player_pos->x = tmp_pos->x;
}
void move_player(t_player *player, char **map, \
unsigned int const pressed_keyset)
{
double const angle = player->camera_angle_h;
double const move_speed = player->move_speed;
t_vector2 tmp_pos;
double sign;
tmp_pos = player->vec_pos;
if (!!(pressed_keyset & KEYSET_W) ^ !!(pressed_keyset & KEYSET_S))
{
sign = 1.0;
if (pressed_keyset & KEYSET_S)
sign = -1.0;
tmp_pos.x += move_speed * cut_point(cos(deg2rad(angle)), 6) * sign;
tmp_pos.y += move_speed * cut_point(sin(deg2rad(angle)), 6) * sign;
}
if (!!(pressed_keyset & KEYSET_A) ^ !!(pressed_keyset & KEYSET_D))
{
sign = 1.0;
if (pressed_keyset & KEYSET_A)
sign = -1.0;
tmp_pos.x += move_speed \
* cut_point(cos(deg2rad(adjust_degree(angle, 90.0 * sign))), 6);
tmp_pos.y += move_speed \
* cut_point(sin(deg2rad(adjust_degree(angle, 90.0 * sign))), 6);
}
check_wall_collisions(&player->vec_pos, &tmp_pos, map);
}
void rotate_player_key(t_game *game, unsigned int const pressed_keyset)
{
t_player *const player = &game->player;
double const rotate_speed_h = game->player.rotate_speed_h;
double const rotate_speed_v = game->player.rotate_speed_v;
double *angle;
angle = &player->camera_angle_h;
if (pressed_keyset & KEYSET_LA && !(pressed_keyset & KEYSET_RA))
*angle = adjust_degree(*angle, -rotate_speed_h);
if (pressed_keyset & KEYSET_RA && !(pressed_keyset & KEYSET_LA))
*angle = adjust_degree(*angle, rotate_speed_h);
if (pressed_keyset & KEYSET_DA && !(pressed_keyset & KEYSET_UA))
{
player->vertical_dist_pixel += rotate_speed_v;
if (player->vertical_dist_pixel > game->info.screen_y / 2)
player->vertical_dist_pixel = game->info.screen_y / 2;
}
if (pressed_keyset & KEYSET_UA && !(pressed_keyset & KEYSET_DA))
{
player->vertical_dist_pixel += -rotate_speed_v;
if (player->vertical_dist_pixel < -game->info.screen_y / 2)
player->vertical_dist_pixel = -game->info.screen_y / 2;
}
}
void rotate_player_mouse(t_game *game)
{
t_vector2_d delta_mousepos;
double *const angle_h = &game->player.camera_angle_h;
double new_vertical_dis_pixel;
mlx_mouse_get_pos(game->info.win_ptr, &delta_mousepos.x, &delta_mousepos.y);
*angle_h = adjust_degree(*angle_h, \
(delta_mousepos.x - game->info.screen_x / 2) * SPEED_MOUSE_H);
new_vertical_dis_pixel = game->player.vertical_dist_pixel + \
(delta_mousepos.y - game->info.screen_y / 2) * SPEED_MOUSE_V;
set_range_double(&new_vertical_dis_pixel, \
-game->info.screen_y / 2, game->info.screen_y / 2);
game->player.vertical_dist_pixel = new_vertical_dis_pixel;
mlx_mouse_move(game->info.win_ptr, \
game->info.screen_x / 2, game->info.screen_y / 2);
}