Entropie git · main
Entropie festival game; first steps
C 88.5% Markdown 9.1% GLSL 2.3%git clone https://git.christianimmanuel.de/games/Entropie.gitwget https://git.christianimmanuel.de/games/Entropie/archive/Entropie.tar.gzentropie/src/core/input.c raw
#include "core/input.h"
#include <SDL3/SDL.h>
#include <stdio.h>
#include <string.h>
#define MOUSE_SENSITIVITY 0.1f /* degrees per pixel */
void Input_poll(Input *input) {
*input = (Input){ 0 };
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_EVENT_QUIT) input->quit = true;
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN && event.button.button == SDL_BUTTON_LEFT) input->click = true;
if (event.type == SDL_EVENT_MOUSE_BUTTON_DOWN && event.button.button == SDL_BUTTON_RIGHT) input->right_click = true;
if (event.type == SDL_EVENT_TEXT_INPUT) {
size_t have = strlen(input->text);
snprintf(input->text + have, sizeof(input->text) - have, "%s", event.text.text);
}
if (event.type != SDL_EVENT_KEY_DOWN || event.key.repeat) continue;
switch (event.key.scancode) {
case SDL_SCANCODE_ESCAPE: input->escape = true; break;
case SDL_SCANCODE_RETURN:
case SDL_SCANCODE_KP_ENTER: input->enter = true; break;
case SDL_SCANCODE_Q: input->use_left = true; break;
case SDL_SCANCODE_E: input->use_right = true; break;
case SDL_SCANCODE_V: input->toggle_view = true; break;
case SDL_SCANCODE_G: input->call_help = true; break;
case SDL_SCANCODE_T: input->throw_item = true; break;
case SDL_SCANCODE_X: input->talk = true; break;
case SDL_SCANCODE_C: input->sit = true; break;
case SDL_SCANCODE_R: input->call = true; break;
case SDL_SCANCODE_H: input->dismiss_help = true; break;
case SDL_SCANCODE_BACKSPACE: input->cancel = input->erase = true; break;
case SDL_SCANCODE_I: input->show_keys = true; break;
case SDL_SCANCODE_TAB: input->show_stats = true; break;
case SDL_SCANCODE_P: input->pee = true; break;
case SDL_SCANCODE_K: input->smoke = true; break;
case SDL_SCANCODE_B: input->pockets = true; break;
case SDL_SCANCODE_J: input->notes = true; break;
case SDL_SCANCODE_Z: input->sleep = true; break;
case SDL_SCANCODE_LSHIFT: input->sprint_tap = true; break;
case SDL_SCANCODE_1: input->choice = 1; break;
case SDL_SCANCODE_2: input->choice = 2; break;
case SDL_SCANCODE_3: input->choice = 3; break;
case SDL_SCANCODE_4: input->choice = 4; break;
case SDL_SCANCODE_5: input->choice = 5; break;
case SDL_SCANCODE_RIGHT: input->page = 1; break;
case SDL_SCANCODE_LEFT: input->page = -1; break;
case SDL_SCANCODE_DOWN: input->menu_move = 1; break;
case SDL_SCANCODE_UP: input->menu_move = -1; break;
case SDL_SCANCODE_F1: input->dev_menu = true; break;
case SDL_SCANCODE_F2: input->crew_menu = true; break;
case SDL_SCANCODE_F5: input->quick_save = true; break;
case SDL_SCANCODE_F9: input->quick_load = true; break;
case SDL_SCANCODE_M: input->mute = true; break;
default: break;
}
}
const bool *keys = SDL_GetKeyboardState(NULL);
if (keys[SDL_SCANCODE_W]) input->move_forward += 1.0f;
if (keys[SDL_SCANCODE_S]) input->move_forward -= 1.0f;
if (keys[SDL_SCANCODE_D]) input->move_right += 1.0f;
if (keys[SDL_SCANCODE_A]) input->move_right -= 1.0f;
input->jump = keys[SDL_SCANCODE_SPACE];
input->sprint = keys[SDL_SCANCODE_LSHIFT];
input->grab = keys[SDL_SCANCODE_F];
input->free_look = keys[SDL_SCANCODE_LCTRL] || keys[SDL_SCANCODE_RCTRL];
input->throw_held = keys[SDL_SCANCODE_T];
float dx = 0.0f, dy = 0.0f;
SDL_GetRelativeMouseState(&dx, &dy);
input->click_held = (SDL_GetMouseState(&input->mouse_x, &input->mouse_y) & SDL_BUTTON_LMASK) != 0;
input->look_yaw = dx * MOUSE_SENSITIVITY;
input->look_pitch = -dy * MOUSE_SENSITIVITY;
}