master
george 24 hours ago
commit 381153a6c9

3
.gitignore vendored

@ -0,0 +1,3 @@
libs/
.build/
droplets

@ -0,0 +1,20 @@
#run {
w := compiler_create_workspace();
bo := get_build_options(w);
bo.output_executable_name = "droplets";
import_paths: [..]string;
for bo.import_path array_add(*import_paths, it);
array_add(*import_paths, "libs");
bo.import_path = import_paths;
set_build_options(bo, w);
add_build_file("main.jai", w);
add_build_file("ring.jai", w);
set_build_options_dc(.{do_output=false});
}
#import "Basic";
#import "Compiler";

@ -0,0 +1,110 @@
GRAVITY :: Vector2.{0, 3000};
RECT_SIZE :: 10;
SPAWN_UPS :: 1.0 / 60;
particle :: struct {
pos : Vector2;
vel : Vector2;
}
main :: () {
InitWindow(800, 600, "Droplets");
defer CloseWindow();
SetTargetFPS(240);
high_fps := true;
particles: [..]particle;
mouse_drag := new_ring();
defer array_free(mouse_drag.data);
spawn_d := SPAWN_UPS;
while !WindowShouldClose() {
dt := GetFrameTime();
width := GetScreenWidth();
height := GetScreenHeight();
if IsMouseButtonPressed(.MOUSE_BUTTON_MIDDLE) {
if !high_fps SetTargetFPS(240);
if high_fps SetTargetFPS(60);
high_fps = !high_fps;
}
if IsMouseButtonDown(.MOUSE_BUTTON_RIGHT) {
spawn_d -= dt;
if spawn_d < 0 {
pos := GetMousePosition();
array_add(*particles, .{pos, .{0, 0}});
spawn_d = SPAWN_UPS;
}
}
if IsMouseButtonReleased(.MOUSE_BUTTON_RIGHT) {
spawn_d = SPAWN_UPS;
}
if IsMouseButtonDown(.MOUSE_BUTTON_LEFT) {
del := GetMouseDelta() / dt;
ring_add(*mouse_drag, del);
}
if IsMouseButtonReleased(.MOUSE_BUTTON_LEFT) {
pos := GetMousePosition();
{
max_x := cast(float) GetScreenWidth();
max_y := cast(float) GetScreenHeight();
using pos;
if x > max_x x = max_x;
if x < 0 x = 0;
if y > max_y y = max_y;
if y < 0 y = 0;
}
vel := ring_avg(*mouse_drag);
ring_reset(*mouse_drag);
array_add(*particles, .{pos, vel});
}
for *p : particles {
using p;
if pos.y + RECT_SIZE < xx height
vel += GRAVITY * dt;
pos += vel * dt;
if pos.x <= 0 {
vel.x = -(vel.x * 0.5);
pos.x = 0;
}
if pos.x + RECT_SIZE >= xx width {
vel.x = -(vel.x * 0.5);
pos.x = xx (width - RECT_SIZE);
}
if pos.y <= 0 {
vel.y = -(vel.y * 0.5);
vel.x *= 0.75;
pos.y = 0;
}
if pos.y + RECT_SIZE > xx height {
vel.y = -(vel.y * 0.5);
vel.x *= 0.75;
if abs(vel.y) < abs((GRAVITY * dt).y)
vel = .{0, 0};
pos.y = xx (height - RECT_SIZE);
}
}
BeginDrawing();
ClearBackground(RAYWHITE);
for p : particles {
DrawRectangleV(p.pos, .{RECT_SIZE, RECT_SIZE}, SKYBLUE);
}
EndDrawing();
}
}
#import "raylib";
#import "Basic";

@ -0,0 +1,31 @@
ring_add :: (using r : *ring, next: Vector2) {
data[start] = next;
start += 1;
start %= data.count;
}
ring_avg :: (using r : *ring) -> Vector2 {
sum : Vector2;
for data {
sum += it;
}
return sum / cast(float) data.count;
}
ring_reset :: (using r : *ring) {
memset(data.data, 0, data.count * size_of(Vector2));
}
new_ring :: (num_items: s64 = 5) -> ring {
r : ring;
r.data = NewArray(num_items, Vector2);
return r;
}
ring :: struct {
start : s64;
data : []Vector2;
}
#import "Math";
#import "Basic";
Loading…
Cancel
Save