deepseek generated frp platformer
@koldinium.bsky.plasmatrap.com · 14d ago · c · 135 loc · raw · 0 comments
1#include <SDL2/SDL.h>2#include <stdbool.h>3#include <math.h>45#define SCREEN_WIDTH 8006#define SCREEN_HEIGHT 6007#define GRAVITY 0.58#define JUMP_FORCE -129#define MOVE_SPEED 51011typedef struct {12 float x, y;13 float dx, dy;14 bool on_ground;15} Player;1617typedef struct {18 SDL_EventType type;19 SDL_Keycode key;20} EventSignal;2122typedef struct {23 Player player;24 bool running;25} GameState;2627typedef void (*StateTransformer)(GameState*, Uint32);28typedef void (*EventHander)(GameState*, EventSignal);2930// FRP-style event stream processing31void process_events(EventHander handler, GameState* state) {32 SDL_Event e;33 while (SDL_PollEvent(&e)) {34 EventSignal signal = {e.type, e.key.keysym.sym};35 handler(state, signal);36 }37}3839// FRP-style state transformation40void update_state(GameState* state, Uint32 delta_time) {41 Player* p = &state->player;42 43 // Apply gravity44 p->dy += GRAVITY;45 p->y += p->dy;46 47 // Ground collision48 if (p->y > SCREEN_HEIGHT - 40) {49 p->y = SCREEN_HEIGHT - 40;50 p->dy = 0;51 p->on_ground = true;52 }53}5455// Event handler with FRP-style signal processing56void handle_input(GameState* state, EventSignal signal) {57 Player* p = &state->player;58 59 switch (signal.type) {60 case SDL_QUIT:61 state->running = false;62 break;63 case SDL_KEYDOWN:64 switch (signal.key) {65 case SDLK_SPACE:66 if (p->on_ground) {67 p->dy = JUMP_FORCE;68 p->on_ground = false;69 }70 break;71 case SDLK_LEFT:72 p->dx = -MOVE_SPEED;73 break;74 case SDLK_RIGHT:75 p->dx = MOVE_SPEED;76 break;77 }78 break;79 case SDL_KEYUP:80 if (signal.key == SDLK_LEFT || signal.key == SDLK_RIGHT) {81 p->dx = 0;82 }83 break;84 }85}8687void render(SDL_Renderer* renderer, const GameState* state) {88 SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);89 SDL_RenderClear(renderer);90 91 // Draw ground92 SDL_SetRenderDrawColor(renderer, 100, 200, 100, 255);93 SDL_Rect ground = {0, SCREEN_HEIGHT - 40, SCREEN_WIDTH, 40};94 SDL_RenderFillRect(renderer, &ground);95 96 // Draw player97 SDL_SetRenderDrawColor(renderer, 200, 100, 100, 255);98 SDL_Rect player_rect = {state->player.x, state->player.y, 40, 40};99 SDL_RenderFillRect(renderer, &player_rect);100 101 SDL_RenderPresent(renderer);102}103104int main() {105 SDL_Init(SDL_INIT_VIDEO);106 SDL_Window* window = SDL_CreateWindow("Platformer FRP",107 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,108 SCREEN_WIDTH, SCREEN_HEIGHT, 0);109 SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);110111 GameState state = {112 .player = {.x = 100, .y = 100, .dx = 0, .dy = 0, .on_ground = true},113 .running = true114 };115116 Uint32 last_time = SDL_GetTicks();117 118 while (state.running) {119 Uint32 current_time = SDL_GetTicks();120 Uint32 delta_time = current_time - last_time;121 122 process_events(handle_input, &state);123 update_state(&state, delta_time);124 render(renderer, &state);125 126 // Simple frame rate limiting127 if (delta_time < 16) SDL_Delay(16 - delta_time);128 last_time = current_time;129 }130131 SDL_DestroyRenderer(renderer);132 SDL_DestroyWindow(window);133 SDL_Quit();134 return 0;135}
login to post a comment