diff --git a/CMakeLists.txt b/CMakeLists.txt index 32b98dc..2154a44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,14 +12,12 @@ find_package(Gint 2.1 REQUIRED) set(SOURCES src/main.c - src/input.c + src/draw.c src/player.c - # ... + src/input.c ) set(ASSETS_cg - assets-cg/tileset.png - # ... ) fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) diff --git a/assets-cg/icon-sel.png b/assets-cg/icon-sel.png new file mode 100644 index 0000000..7137b50 Binary files /dev/null and b/assets-cg/icon-sel.png differ diff --git a/assets-cg/icon-uns.png b/assets-cg/icon-uns.png new file mode 100644 index 0000000..3c99f62 Binary files /dev/null and b/assets-cg/icon-uns.png differ diff --git a/include/conf.h b/include/conf.h new file mode 100644 index 0000000..b5a2f10 --- /dev/null +++ b/include/conf.h @@ -0,0 +1,3 @@ +#pragma once + +#define PLAYER_S 12 diff --git a/include/draw.h b/include/draw.h new file mode 100644 index 0000000..6bb8187 --- /dev/null +++ b/include/draw.h @@ -0,0 +1,4 @@ +#pragma once +#include + +void draw_rectangle(int c, int x, int y, int w, int h); diff --git a/include/input.h b/include/input.h new file mode 100644 index 0000000..f4beb9d --- /dev/null +++ b/include/input.h @@ -0,0 +1,31 @@ +#pragma once + +/* CODE FROM FISFOR */ + +typedef enum Key { + K_A, + K_B, + K_UP, + K_DOWN, + K_LEFT, + K_RIGHT, + K_EXIT, + K_COUNT +} Key; +typedef enum KeyState { KS_UP, KS_RELEASE, KS_DOWN, KS_PRESS } KeyState; + +typedef struct Input { + int keys[K_COUNT]; + KeyState states[K_COUNT]; +} Input; + +/* called by main.c once */ +void input_init(void); + +/* call this to update key states once per frame */ +void input_step(void); + +int input_down(Key); +int input_pressed(Key); +int input_up(Key); +int input_released(Key); diff --git a/include/main.h b/include/main.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/include/main.h @@ -0,0 +1 @@ +#pragma once diff --git a/include/player.h b/include/player.h new file mode 100644 index 0000000..c84d80d --- /dev/null +++ b/include/player.h @@ -0,0 +1,11 @@ +#pragma once +#include "type.h" + +struct Player { + struct Vec2 pos; + struct FVec2 spd; + struct Vec2 spawn; +}; + +void player_update(void); +void player_draw(void); diff --git a/include/type.h b/include/type.h new file mode 100644 index 0000000..b6d2f35 --- /dev/null +++ b/include/type.h @@ -0,0 +1,9 @@ +#pragma once + +struct Vec2 { + int x, y; +}; + +struct FVec2 { + float x, y; +}; diff --git a/src/draw.c b/src/draw.c new file mode 100644 index 0000000..c83e95b --- /dev/null +++ b/src/draw.c @@ -0,0 +1,9 @@ +#include + +void +draw_rectangle(int x, int y, int w, int h, int c) +{ + /* draw a rectangle at a given position (x, y) with a given size (w, h) + */ + drect(x, y, x + w - 1, y + h - 1, c); +} diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..f0d5e20 --- /dev/null +++ b/src/input.c @@ -0,0 +1,70 @@ +/* CODE FROM FISFOR */ + +#include "input.h" +#include + +static Input input; + +void +input_init(void) +{ + int i = K_COUNT; + while (i-- > 0) { + input.states[i] = KS_UP; + } + input.keys[K_A] = KEY_SHIFT; + input.keys[K_B] = KEY_ALPHA; + input.keys[K_LEFT] = KEY_LEFT; + input.keys[K_RIGHT] = KEY_RIGHT; + input.keys[K_UP] = KEY_UP; + input.keys[K_DOWN] = KEY_DOWN; + input.keys[K_EXIT] = KEY_MENU; +} + +void +input_step(void) +{ + int i = K_COUNT; + clearevents(); + while (i-- > 0) { + const int kdown = keydown(input.keys[i]); + KeyState *const state = &input.states[i]; + const KeyState prev_state = input.states[i]; + switch (prev_state) { + case KS_UP: + case KS_RELEASE: + *state = (kdown) ? (KS_PRESS) : (KS_UP); + break; + case KS_DOWN: + case KS_PRESS: + *state = (kdown) ? (KS_DOWN) : (KS_RELEASE); + break; + default: + break; + } + } +} + +int +input_down(Key k) +{ + return input.states[k] == KS_DOWN || input.states[k] == KS_PRESS; +} + +int +input_pressed(Key k) +{ + return input.states[k] == KS_PRESS; +} + +int +input_up(Key k) +{ + return !input_down(k); +} + +int +input_released(Key k) +{ + return input.states[k] == KS_RELEASE; +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..15e2dc6 --- /dev/null +++ b/src/main.c @@ -0,0 +1,46 @@ +#include "main.h" +#include "draw.h" +#include "input.h" +#include "player.h" + +static int running = 1; +static void init(void); +static void update(void); +static void draw(void); + +int +main(void) +{ + init(); + + while (running) { + update(); + draw(); + + if (input_pressed(K_EXIT)) { + running = 0; + } + } + return 1; +} + +static void +init(void) +{ + input_init(); +} + +static void +update(void) +{ + input_step(); + player_update(); +} + +static void +draw(void) +{ + dclear(C_WHITE); + player_draw(); + dupdate(); +} diff --git a/src/player.c b/src/player.c new file mode 100644 index 0000000..a41f356 --- /dev/null +++ b/src/player.c @@ -0,0 +1,51 @@ +#include "player.h" +#include "conf.h" +#include "draw.h" +#include "input.h" + +static int k_up, k_down, k_left, k_right, k_jump; +static struct Player player; +static void player_get_input(void); +static void player_move(void); + +void +player_init(void) +{ + player.pos = (struct Vec2){0, 0}; + player.spd = (struct FVec2){0.0f, 0.0f}; +} + +void +player_update(void) +{ + player_get_input(); + + const struct Vec2 mov = (struct Vec2){k_right - k_left, k_down - k_up}; + player.spd.x = mov.x; + player.spd.y = mov.y; + + player_move(); +} + +void +player_draw(void) +{ + draw_rectangle(player.pos.x, player.pos.y, PLAYER_S, PLAYER_S, C_BLACK); +} + +static void +player_get_input(void) +{ + k_up = input_down(K_UP); + k_down = input_down(K_DOWN); + k_left = input_down(K_LEFT); + k_right = input_down(K_RIGHT); + k_jump = input_pressed(K_A); +} + +static void +player_move(void) +{ + player.pos.x += player.spd.x; + player.pos.y += player.spd.y; +} diff --git a/src/type.h b/src/type.h new file mode 100644 index 0000000..2d242c4 --- /dev/null +++ b/src/type.h @@ -0,0 +1,11 @@ +#pragma once + +typedef int tile_t; + +typedef struct Vec2 { + int x, y; +} Vec2; + +typedef struct FVec2 { + float x, y; +} FVec2;