From bbfdb058331381e6ce3aa2a85431aad468cf6157 Mon Sep 17 00:00:00 2001 From: SowinskiBraeden Date: Sun, 16 Nov 2025 12:37:39 -0800 Subject: [PATCH] initial commit --- .gitignore | 2 + Makefile | 21 +++++++ main.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 main.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4226bdd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +main.o +app diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0b1b16f --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +CC = gcc +CFLAGS = -Wall -Wextra -std=c17 `sdl2-config --cflags` +LDFLAGS = `sdl2-config --libs` + +SRC = $(wildcard *.c) +OBJ = $(SRC:.c=.o) +TARGET = app + +all: $(TARGET) + +$(TARGET): $(OBJ) + $(CC) $(OBJ) -o $(TARGET) $(LDFLAGS) + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +run: $(TARGET) + ./$(TARGET) + +clean: + rm -f $(OBJ) $(TARGET) diff --git a/main.c b/main.c new file mode 100644 index 0000000..66c8fb2 --- /dev/null +++ b/main.c @@ -0,0 +1,177 @@ +#include +#include +#include + +#define WINDOW_W 800 +#define WINDOW_H 600 + +#define NUM_RAINDROPS 300 +#define MAX_WIND 30 +#define GRAVITY 400 +#define GRAVITY_DIFF 50 // idk, maybe some downward or upward wind causing resistance +#define RAINDROP_WIDTH 2 +#define RAINDROP_MAX_HEIGHT 30 +#define RAINDROP_MIN_HEIGHT 10 + +#define BACKGROUND_R 20 +#define BACKGROUND_G 20 +#define BACKGROUND_B 20 +#define BACKGROUND_A 255 +#define RAINDROP_R 156 +#define RAINDROP_G 174 +#define RAINDROP_B 255 +#define RAINDROP_A 255 + +typedef struct { + float x; + float y; + float accelerationX; + float accelerationY; + int width; + int height; +} RAINDROP; + +float rand_float(float min, float max) +{ + float scale = (float)rand() / (float)RAND_MAX; + return min + scale * (max - min); +} + +void reset_raindrop(RAINDROP *d) +{ + d->x = rand_float(0, WINDOW_W); + d->y = rand_float(-1 * WINDOW_H, 0); + d->accelerationX = rand_float(-1 * MAX_WIND, MAX_WIND); + d->accelerationY = rand_float(GRAVITY - GRAVITY_DIFF, GRAVITY + GRAVITY_DIFF); + d->width = RAINDROP_WIDTH; + d->height = rand() % RAINDROP_MAX_HEIGHT + RAINDROP_MIN_HEIGHT; +} + +int main(void) +{ + if (SDL_Init(SDL_INIT_VIDEO) != 0) + { + SDL_Log("Error initializing: %s", SDL_GetError()); + return 1; + } + + SDL_Window *window; + SDL_Renderer *renderer; + + window = SDL_CreateWindow( + "SDL2 Window", + SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, + WINDOW_W, + WINDOW_H, + SDL_WINDOW_SHOWN + ); + + if (!window) + { + SDL_Log("Error creating window: %s", SDL_GetError()); + SDL_Quit(); + return 1; + } + + renderer = SDL_CreateRenderer( + window, + -1, + SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC + ); + + if (!renderer) + { + SDL_Log("Error creating renderer: %s", SDL_GetError()); + SDL_DestroyWindow(window); + SDL_Quit(); + return 1; + } + + int running; + SDL_Event event; + Uint32 last_time; + + last_time = SDL_GetTicks(); + running = 1; + + // Create drops + RAINDROP drops[NUM_RAINDROPS]; + for (int i = 0; i < NUM_RAINDROPS; i++) + { + reset_raindrop(&drops[i]); + } + + while (running) + { + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + running = 0; + } + } + + // delta time + Uint32 now; + float delta; + + now = SDL_GetTicks(); + delta = (now - last_time) / 1000.0f; // seconds + last_time = now; + + // clear scren + SDL_SetRenderDrawColor( + renderer, + BACKGROUND_R, + BACKGROUND_G, + BACKGROUND_B, + BACKGROUND_A + ); + SDL_RenderClear(renderer); + + + // render raindrops + for (int i = 0; i < NUM_RAINDROPS; i++) + { + RAINDROP *drop; + drop = &drops[i]; + + drop->x += delta * drop->accelerationX; + drop->y += delta * drop->accelerationY; + + if (drop->y > WINDOW_H || + drop->x < -1 * RAINDROP_WIDTH || + drop->x > WINDOW_W + RAINDROP_WIDTH) + { + reset_raindrop(drop); + } + + SDL_Rect raindrop; + + raindrop = (SDL_Rect){ + (int) drop->x, + (int) drop->y, + drop->width, + drop->height + }; + + // Set brush color and draw + SDL_SetRenderDrawColor( + renderer, + RAINDROP_R, + RAINDROP_G, + RAINDROP_B, + RAINDROP_A + ); + SDL_RenderFillRect(renderer, &raindrop); + } + + SDL_RenderPresent(renderer); + } + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + return 0; +}