/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* camera.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: mcolonna +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/11 16:34:56 by mcolonna #+# #+# */ /* Updated: 2024/04/21 19:37:20 by mcolonna ### ########.fr */ /* */ /* ************************************************************************** */ #include "includes.h" static t_point find_snas_position(void) { const t_room room = g_env.room; t_point pos; t_object *obj; t_character character; pos.y = -1; while (++pos.y < room.height) { pos.x = -1; while (++pos.x < room.width) { obj = room.objects[pos.y * room.width + pos.x]; if (obj && obj->type.init == snas_init) { character = ((t_snas_data *)obj->data)->character; return (point_subpoint(point_add(point_multiply(pos, 50), 25), point_multiply(point_fromdirection(character.direction), character.walk_remaining_steps * 50 / character.walk_steps_nb ))); } } } error_err("snas is nowhere"); return (point_init(0, 0)); } static void limit(int *n, int min, int max) { if (*n < min) *n = min; if (*n > max) *n = max; } static void camera_sync_ending(void) { g_env.camera.pos.y -= 5; if (g_env.camera.pos.y < 50) g_env.camera.pos.y = 50; } void camera_sync(void) { const t_point obj_pos = find_snas_position(); const t_point room_dims = point_multiply( point_init(g_env.room.width, g_env.room.height), 50); t_point *const camera_pos = &g_env.camera.pos; if (g_env.room.ending) return (camera_sync_ending()); if (room_dims.x <= WINDOW_WIDTH) camera_pos->x = -(WINDOW_WIDTH - room_dims.x) / 2; else { camera_pos->x = obj_pos.x - WINDOW_WIDTH / 2; limit(&camera_pos->x, 0, room_dims.x - WINDOW_WIDTH); } if (room_dims.y <= WINDOW_HEIGHT) camera_pos->y = -(WINDOW_HEIGHT - room_dims.y) / 2; else { camera_pos->y = obj_pos.y - WINDOW_HEIGHT / 2; limit(&camera_pos->y, 0, room_dims.y - WINDOW_HEIGHT); } }