home · login to get plonkin'

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