diff options
| author | lvntky <klevent1903@gmail.com> | 2024-11-28 12:30:22 +0300 |
|---|---|---|
| committer | lvntky <klevent1903@gmail.com> | 2024-11-28 12:30:22 +0300 |
| commit | fd7e67ca4d46b767482da9e3f26f39f4909bf9de (patch) | |
| tree | 7f92f71eb6944b615ce1b56b2ddaa15ef40f8f0f /examples | |
| parent | 82d24368330114f10b34f622da9fb6706ba06cc1 (diff) | |
[feature] keyboard and raw mode implementation
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/player.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/examples/player.c b/examples/player.c new file mode 100644 index 0000000..6eed8e7 --- /dev/null +++ b/examples/player.c @@ -0,0 +1,119 @@ +#define FBGL_IMPLEMENTATION +#include "fbgl.h" + +#include <stdio.h> +#include <unistd.h> + +#define PLAYER_SPEED 1 + +typedef struct { + int x; + int y; +} Player; + +int main(int argc, char *argv[]) +{ + // Check for font file argument + if (argc < 2) { + fprintf(stderr, "Usage: %s <psf1_font_file>\n", argv[0]); + return 1; + } + + // Load PSF1 font + fbgl_psf1_font_t *font = fbgl_load_psf1_font(argv[1]); + if (!font) { + fprintf(stderr, "Failed to load PSF1 font from %s\n", argv[1]); + return 1; + } + + // Initialize framebuffer + fbgl_t fb; + if (fbgl_init(NULL, &fb) != 0) { + fprintf(stderr, "Failed to initialize framebuffer\n"); + fbgl_destroy_psf1_font(font); + return 1; + } + + // Initialize keyboard + if (fbgl_keyboard_init() != 0) { + fprintf(stderr, "Failed to initialize keyboard\n"); + fbgl_destroy(&fb); + fbgl_destroy_psf1_font(font); + return 1; + } + + // Create a player + Player player = { .x = fb.width / 2, .y = fb.height / 2 }; + + // Game loop + while (1) { + // Clear the screen + fbgl_set_bg(&fb, 0x000000); + + // Get key input + fbgl_key_t key = fbgl_get_key(); + + // Handle player movement + switch (key) { + case FBGL_KEY_UP: + player.y = (player.y - PLAYER_SPEED < 0) ? + 0 : + player.y - PLAYER_SPEED; + break; + case FBGL_KEY_DOWN: + player.y = (player.y + PLAYER_SPEED >= fb.height) ? + fb.height - 1 : + player.y + PLAYER_SPEED; + break; + case FBGL_KEY_LEFT: + player.x = (player.x - PLAYER_SPEED < 0) ? + 0 : + player.x - PLAYER_SPEED; + break; + case FBGL_KEY_RIGHT: + player.x = (player.x + PLAYER_SPEED >= fb.width) ? + fb.width - 1 : + player.x + PLAYER_SPEED; + break; + case FBGL_KEY_ESCAPE: + // Exit the program + goto cleanup; + default: + break; + } + + // Draw the player (as a small white rectangle) + fbgl_point_t top_left = { .x = player.x - 5, + .y = player.y - 5 }; + fbgl_point_t bottom_right = { .x = player.x + 5, + .y = player.y + 5 }; + fbgl_draw_rectangle_filled(top_left, bottom_right, + FBGL_RGB(255, 255, 255), &fb); + + // Display debug info + char fps_text[32]; + char pos_text[32]; + float fps = fbgl_get_fps(); + + snprintf(fps_text, sizeof(fps_text), "FPS: %.2f", fps); + snprintf(pos_text, sizeof(pos_text), "POS: %d, %d", player.x, + player.y); + + // Render text using the loaded PSF1 font + fbgl_render_psf1_text(&fb, font, fps_text, 10, 10, + FBGL_RGB(0, 255, 0)); + fbgl_render_psf1_text(&fb, font, pos_text, 10, 30, + FBGL_RGB(255, 0, 0)); + + // Small delay to control frame rate + usleep(16666); // ~60 FPS + } + +cleanup: + // Cleanup + + fbgl_destroy(&fb); + fbgl_destroy_psf1_font(font); + + return 0; +} |
