Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ SRC = src/main.c \
src/change_map.c \
src/flags.c \
src/menu.c \
src/input.c \
$(addprefix src/utils/create/, \
$(addsuffix .c, \
raycasting \
Expand Down
1 change: 1 addition & 0 deletions include/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ typedef struct game_s {
end_t *loose;
bool is_finished;
int nb_mob_killed;
bool keystate[sfKeyCount];
} game_t;

bool is_error(const char **env);
Expand Down
16 changes: 16 additions & 0 deletions include/input.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/*
** EPITECH PROJECT, 2023
** rpg
** File description:
** input
*/

#ifndef INPUT_H_
#define INPUT_H_

#include "game.h"

void input_handle_event(game_t *game);
bool is_key_held(game_t *game, sfKeyCode key);

#endif /* !INPUT_H_ */
44 changes: 44 additions & 0 deletions src/input.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
** EPITECH PROJECT, 2023
** rpg
** File description:
** input
*/

/*
** Event-driven keyboard state. sfKeyboard_isKeyPressed polls the OS and, on
** macOS, returns false without the "Input Monitoring" permission. Tracking the
** key state from KeyPressed/KeyReleased events instead only needs window focus,
** so the game plays anywhere.
*/

#include "game.h"
#include "input.h"

static void clear_keystate(game_t *game)
{
int i = 0;

for (i = 0; i < sfKeyCount; i++)
game->keystate[i] = false;
}

void input_handle_event(game_t *game)
{
sfEvent *event = &game->window->event;

if (event->type == sfEvtFocusLost)
clear_keystate(game);
if (event->type != sfEvtKeyPressed && event->type != sfEvtKeyReleased)
return;
if (event->key.code < 0 || event->key.code >= sfKeyCount)
return;
game->keystate[event->key.code] = event->type == sfEvtKeyPressed;
}

bool is_key_held(game_t *game, sfKeyCode key)
{
if (key < 0 || key >= sfKeyCount)
return false;
return game->keystate[key];
}
2 changes: 2 additions & 0 deletions src/utils/display/dialog.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@
#include "game.h"
#include "display.h"
#include "menu.h"
#include "input.h"

static int poll_dialog(game_t *game)
{
int status = 0;

while (sfRenderWindow_pollEvent(game->window->window,
&game->window->event)) {
input_handle_event(game);
if (game->window->event.type == sfEvtClosed)
sfRenderWindow_close(game->window->window);
if (game->window->event.type == sfEvtKeyPressed)
Expand Down
3 changes: 2 additions & 1 deletion src/utils/display/npc.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <math.h>
#include "input.h"

#include "game.h"
#include "display.h"
Expand All @@ -31,7 +32,7 @@ static void get_distance(game_t *game, int i, const sfVector2f *second_pos)

game->npc[i]->distance_to_player = sqrt(pow(dx, 2) + pow(dy, 2));
if (game->npc[i]->distance_to_player < 100
&& sfKeyboard_isKeyPressed(game->keys->interact))
&& is_key_held(game, game->keys->interact))
try_interact(game, i);
}

Expand Down
17 changes: 9 additions & 8 deletions src/utils/display/perso.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <math.h>
#include "menu.h"
#include "input.h"

#include "game.h"
#include "collisions.h"
Expand All @@ -26,14 +27,14 @@ static void move_player_vertical(game_t *game)
sfVector2f pos = perso->pos;
sfVector2f dim = {45, 50};

if (sfKeyboard_isKeyPressed(game->keys->left)
|| sfKeyboard_isKeyPressed(game->keys->right))
if (is_key_held(game, game->keys->left)
|| is_key_held(game, game->keys->right))
speed = 2.8;
if (sfKeyboard_isKeyPressed(game->keys->up)
if (is_key_held(game, game->keys->up)
&& is_colliding(game, &(sfVector2f){pos.x, pos.y - 4}, &dim) == 0) {
perso->pos.y -= speed;
set_perso_move(perso, 18, 1);
} else if (sfKeyboard_isKeyPressed(game->keys->down)
} else if (is_key_held(game, game->keys->down)
&& is_colliding(game, &(sfVector2f){pos.x, pos.y + 4}, &dim) == 0) {
perso->pos.y += speed;
set_perso_move(perso, 0, 2);
Expand All @@ -47,14 +48,14 @@ static void move_player_horizontal(game_t *game)
sfVector2f pos = perso->pos;
sfVector2f dim = {45, 50};

if (sfKeyboard_isKeyPressed(game->keys->up)
|| sfKeyboard_isKeyPressed(game->keys->down))
if (is_key_held(game, game->keys->up)
|| is_key_held(game, game->keys->down))
speed = 2.8;
if (sfKeyboard_isKeyPressed(game->keys->left)
if (is_key_held(game, game->keys->left)
&& is_colliding(game, &(sfVector2f){pos.x - 4, pos.y}, &dim) == 0) {
perso->pos.x -= speed;
set_perso_move(perso, 36, 3);
} else if (sfKeyboard_isKeyPressed(game->keys->right)
} else if (is_key_held(game, game->keys->right)
&& is_colliding(game, &(sfVector2f){pos.x + 4, pos.y}, &dim) == 0) {
perso->pos.x += speed;
set_perso_move(perso, 54, 4);
Expand Down
4 changes: 3 additions & 1 deletion src/utils/events/index.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "game.h"
#include "events.h"
#include "input.h"

static void go_to_raycasting(game_t *game)
{
Expand All @@ -31,10 +32,11 @@ void events_window(game_t *game)
go_to_raycasting(game);
while (sfRenderWindow_pollEvent(game->window->window,
&game->window->event)) {
input_handle_event(game);
if (game->window->event.type == sfEvtClosed)
exit_start_all(game);
if (game->window->event.type == sfEvtKeyPressed
&& sfKeyboard_isKeyPressed(sfKeyEscape))
&& game->window->event.key.code == sfKeyEscape)
event_menu(game);
zoom(game);
change_item(game);
Expand Down
3 changes: 2 additions & 1 deletion src/utils/events/inventory.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include "game.h"
#include "input.h"

static void change_item_by_key(game_t *game)
{
Expand All @@ -25,7 +26,7 @@ static void change_item_by_key(game_t *game)
void change_item(game_t *game)
{
if (game->window->event.type == sfEvtMouseWheelScrolled &&
sfKeyboard_isKeyPressed(sfKeyLControl) == false) {
is_key_held(game, sfKeyLControl) == false) {
if (game->window->event.mouseWheelScroll.delta > 0) {
game->inventory->item_selected--;
}
Expand Down
3 changes: 2 additions & 1 deletion src/utils/events/zoom.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@

#include "game.h"
#include "events.h"
#include "input.h"

void zoom(game_t *game)
{
sfVector2f pos = {0};

if (!sfKeyboard_isKeyPressed(sfKeyLControl)
if (!is_key_held(game, sfKeyLControl)
|| game->window->event.type != sfEvtMouseWheelScrolled)
return;
pos = sfView_getSize(game->window->view);
Expand Down
3 changes: 2 additions & 1 deletion src/utils/mobs/manage_mobs.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <math.h>
#include "input.h"

#include "game.h"
#include "mobs_functions.h"
Expand Down Expand Up @@ -55,7 +56,7 @@ static void reward_kill(game_t *game, mobs_t *mob)

static void win_perso(game_t *game, mobs_t *mob)
{
if (sfKeyboard_isKeyPressed(game->keys->attack)
if (is_key_held(game, game->keys->attack)
&& mob->distance_to_player < 50) {
if (mob->combat->life > 0) {
mob->combat->life -= 10;
Expand Down
19 changes: 10 additions & 9 deletions src/utils/raycasting/move.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/

#include <math.h>
#include "input.h"

#include "game.h"
#include "raycasting_functions.h"
Expand Down Expand Up @@ -35,12 +36,12 @@ static void player_move_left_right(game_t *game)
raycasting_player_t *p = game->raycasting->player;
sfVector2f d = get_dir(game);

if (sfKeyboard_isKeyPressed(sfKeyQ)
if (is_key_held(game, sfKeyQ)
&& is_colliding(game, p->position.x - d.y, p->position.y - d.x) == 0) {
p->position.x -= d.y;
p->position.y -= d.x;
}
if (sfKeyboard_isKeyPressed(sfKeyD)
if (is_key_held(game, sfKeyD)
&& is_colliding(game, p->position.x + d.y, p->position.y + d.x) == 0) {
p->position.x += d.y;
p->position.y += d.x;
Expand All @@ -52,12 +53,12 @@ static void player_move_forward_backward(game_t *game)
raycasting_player_t *p = game->raycasting->player;
sfVector2f d = get_dir(game);

if (sfKeyboard_isKeyPressed(sfKeyZ)
if (is_key_held(game, sfKeyZ)
&& is_colliding(game, p->position.x + d.x, p->position.y - d.y) == 0) {
p->position.x += d.x;
p->position.y -= d.y;
}
if (sfKeyboard_isKeyPressed(sfKeyS)
if (is_key_held(game, sfKeyS)
&& is_colliding(game, p->position.x - d.x, p->position.y + d.y) == 0) {
p->position.x -= d.x;
p->position.y += d.y;
Expand All @@ -68,13 +69,13 @@ static void player_rotate(game_t *game)
{
raycasting_t *r = game->raycasting;

if (sfKeyboard_isKeyPressed(sfKeyLeft))
if (is_key_held(game, sfKeyLeft))
r->player->direction += r->sensitivity;
if (sfKeyboard_isKeyPressed(sfKeyRight))
if (is_key_held(game, sfKeyRight))
r->player->direction -= r->sensitivity;
if (sfKeyboard_isKeyPressed(sfKeyUp))
if (is_key_held(game, sfKeyUp))
r->player->pitch += r->sensitivity * 5;
if (sfKeyboard_isKeyPressed(sfKeyDown))
if (is_key_held(game, sfKeyDown))
r->player->pitch -= r->sensitivity * 5;
}

Expand All @@ -83,7 +84,7 @@ void move_raycasting_player(game_t *game)
player_rotate(game);
player_move_forward_backward(game);
player_move_left_right(game);
if (sfKeyboard_isKeyPressed(sfKeyE)) {
if (is_key_held(game, sfKeyE)) {
game->is_raycasting = false;
game->raycasting->player->position = (sfVector2f){500, 500};
}
Expand Down
6 changes: 5 additions & 1 deletion src/utils/raycasting/raycasting.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#include "game.h"
#include "raycasting_functions.h"
#include "input.h"

static void draw_entity(game_t *game, entity_t *entity)
{
Expand Down Expand Up @@ -73,9 +74,12 @@ int raycasting(game_t *game)
{
int i = 0;

while (sfRenderWindow_pollEvent(game->window->window, &game->window->event))
while (sfRenderWindow_pollEvent(game->window->window,
&game->window->event)) {
input_handle_event(game);
if (game->window->event.type == sfEvtClosed)
exit_start_all(game);
}
sfRenderWindow_clear(game->window->window, sfBlack);
move_raycasting_player(game);
for (i = 0; i < game->raycasting->nb_rays; i++)
Expand Down
Loading