dorianocacasorus/winfun.c

142 lines
5.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define NOB_REALLOC realloc
#define NOB_ASSERT assert
// Initial capacity of a dynamic array
#define NOB_DA_INIT_CAP 256
// Append an item to a dynamic array
#define nob_da_append(da, item) \
do { \
if ((da)->count >= (da)->capacity) { \
(da)->capacity = (da)->capacity == 0 ? NOB_DA_INIT_CAP : (da)->capacity*2; \
(da)->items = NOB_REALLOC((da)->items, (da)->capacity*sizeof(*(da)->items)); \
NOB_ASSERT((da)->items != NULL && "Buy more RAM lol"); \
} \
\
(da)->items[(da)->count++] = (item); \
} while (0)
#include "raylib.h"
#include "raymath.h"
#define PLAYER_SPEED 1000
#define REAL_FPS 30
#define TARGET_FPS 480
#define TARGET_DT (1.0/TARGET_FPS)
#define GRAVITY 1000.0f
#define COLLISION_DAMPING 0.8
typedef struct {
Vector2 *items;
size_t count;
size_t capacity;
} Vector2s;
typedef struct {
Color *items;
size_t count;
size_t capacity;
} Colors;
Texture tex_rac;
int win_fun()
{
SetWindowState(FLAG_WINDOW_RESIZABLE);
#ifdef RELEASE
ShowCursor();
EnableCursor();
#endif
#ifdef RELEASE
SetWindowSize(690, 690);
#else
SetWindowSize(1600, 900);
#endif
SetTargetFPS(REAL_FPS);
Vector2s positions = {0};
Vector2s velocities = {0};
Colors colors = {0};
#ifdef RELEASE
#include "assets/raccon-delicieu.h"
Image img_rac = LoadImageFromMemory(".png", raccoon_data, raccoon_size);
tex_rac = LoadTextureFromImage(img_rac);
#else
tex_rac = LoadTexture("assets/raccon-delicieu.png");
#endif
Vector2 prev_winpos = GetWindowPosition();
while (!WindowShouldClose()) {
Vector2 winpos = GetWindowPosition();
Vector2 dwinpos = Vector2Subtract(winpos, prev_winpos);
float w = GetScreenWidth();
float h = GetScreenHeight();
float real_dt = GetFrameTime();
float radius = 40.0f;
BeginDrawing();
ClearBackground(GetColor(0x181818FF));
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
nob_da_append(&positions, GetMousePosition());
float angle = DEG2RAD*GetRandomValue(0, 360);
Vector2 dir = {500*cosf(angle), 500*sinf(angle)};
nob_da_append(&velocities, dir);
nob_da_append(&colors, ColorFromHSV(GetRandomValue(0, 360), 1, 1));
}
for (float t = 0.0; t < real_dt; t += TARGET_DT) {
for (size_t i = 0; i < positions.count; ++i) {
float f = t/real_dt;
positions.items[i] = Vector2Subtract(positions.items[i], Vector2Scale(dwinpos, TARGET_DT/real_dt));
velocities.items[i].y += GRAVITY*TARGET_DT;
float nx = positions.items[i].x + velocities.items[i].x*TARGET_DT;
if (nx - radius <= 0) {
positions.items[i].x = radius;
velocities.items[i].x *= -COLLISION_DAMPING;
velocities.items[i].x += dwinpos.x*TARGET_DT/real_dt*300;
} else if (nx + radius >= w) {
positions.items[i].x = w - radius;
velocities.items[i].x *= -COLLISION_DAMPING;
velocities.items[i].x += dwinpos.x*TARGET_DT/real_dt*300;
} else {
positions.items[i].x = nx;
}
float ny = positions.items[i].y + velocities.items[i].y*TARGET_DT;
if (ny - radius <= 0) {
positions.items[i].y = radius;
velocities.items[i].y *= -COLLISION_DAMPING;
velocities.items[i].y += dwinpos.y*TARGET_DT/real_dt*300;
} else if (ny + radius >= h) {
positions.items[i].y = h - radius;
velocities.items[i].y *= -COLLISION_DAMPING;
velocities.items[i].y += dwinpos.y*TARGET_DT/real_dt*300;
} else {
positions.items[i].y = ny;
}
// DrawRing(positions.items[i], radius*0.8, radius, 0, 360, 100, ColorAlpha(colors.items[i], f));
DrawTexturePro(
tex_rac,
(Rectangle) {0, 0, tex_rac.width, tex_rac.height},
(Rectangle) {positions.items[i].x-radius, positions.items[i].y-radius, radius*2, radius*2},
(Vector2) {0, 0},
0.0f,
ColorAlpha(colors.items[i], f)
);
}
}
EndDrawing();
prev_winpos = winpos;
}
CloseWindow();
return 0;
}