From 480501a6b6fdc21e65d7ef372c3272d47420d542 Mon Sep 17 00:00:00 2001 From: harper Date: Tue, 22 Sep 2026 15:40:36 -0700 Subject: [PATCH] initial commit --- general/components.odin | 7 ++ general/ecs/ecs.odin | 35 ++++++++ general/entities.odin | 19 +++++ general/main.odin | 100 +++++++++++++++++++++++ general/systems.odin | 33 ++++++++ sprite-stacking/assets/Chair_strip12.png | Bin 0 -> 2466 bytes sprite-stacking/main.odin | 60 ++++++++++++++ 7 files changed, 254 insertions(+) create mode 100644 general/components.odin create mode 100644 general/ecs/ecs.odin create mode 100644 general/entities.odin create mode 100644 general/main.odin create mode 100644 general/systems.odin create mode 100644 sprite-stacking/assets/Chair_strip12.png create mode 100644 sprite-stacking/main.odin diff --git a/general/components.odin b/general/components.odin new file mode 100644 index 0000000..cd43803 --- /dev/null +++ b/general/components.odin @@ -0,0 +1,7 @@ +package main + +import rl "vendor:raylib" + +Transform :: struct { + position: rl.Vector2, +} diff --git a/general/ecs/ecs.odin b/general/ecs/ecs.odin new file mode 100644 index 0000000..6c2f39b --- /dev/null +++ b/general/ecs/ecs.odin @@ -0,0 +1,35 @@ +package ecs + +import "core:fmt" + +startup_systems: [dynamic]proc() +update_systems: [dynamic]proc() +fixed_update_systems: [dynamic]proc() + + +App :: struct {} + +Component :: union { + Transform, +} + +Transform :: struct {} + +STARTUP :: 0 +UPDATE :: 1 +FIXED_UPDATE :: 2 + +add_system :: proc(schedule: int, system: proc()) { + switch schedule { + case 0: + append(&startup_systems, system) + case 1: + append(&update_systems, system) + case 2: + append(&fixed_update_systems, system) + } +} + +ping :: proc() { + +} diff --git a/general/entities.odin b/general/entities.odin new file mode 100644 index 0000000..5a6425a --- /dev/null +++ b/general/entities.odin @@ -0,0 +1,19 @@ +package main + +import rl "vendor:raylib" + +Entity :: union { + Player, + Enemy, +} + +Player :: struct { + transform: Transform, + sprite: rl.Texture2D, + camera: rl.Camera2D, +} + +Enemy :: struct { + transform: Transform, + sprite: rl.Texture2D, +} diff --git a/general/main.odin b/general/main.odin new file mode 100644 index 0000000..1fa4912 --- /dev/null +++ b/general/main.odin @@ -0,0 +1,100 @@ +package main + +import "core:fmt" +import "ecs" +import rl "vendor:raylib" + +World :: struct { + entities: map[rl.Vector2]Entity, +} + +world: World +player: Player +enemy: Enemy +camera: rl.Camera2D +CELL_SIZE :: 20 + +main :: proc() { + ecs.ping() + fmt.println("hello world") + rl.InitWindow(800, 600, "grimm gameplay prototype") + defer rl.CloseWindow() + + player = Player { + transform = Transform{position = {4, 8}}, + camera = rl.Camera2D{target = {0, 0}, zoom = 1.5}, + } + world.entities[player.transform.position] = player + enemy = Enemy { + transform = Transform{position = {8, 8}}, + } + world.entities[enemy.transform.position] = enemy + + for !rl.WindowShouldClose() { + update() + rl.BeginDrawing() + rl.ClearBackground(rl.PURPLE) + rl.BeginMode2D(player.camera) + draw() + rl.EndMode2D() + rl.EndDrawing() + } +} + +update :: proc() { + if rl.IsKeyPressed(rl.KeyboardKey.W) { + move(&player.transform, 0, -1) + } + if rl.IsKeyPressed(rl.KeyboardKey.A) { + move(&player.transform, -1, 0) + } + if rl.IsKeyPressed(rl.KeyboardKey.S) { + move(&player.transform, 0, 1) + } + if rl.IsKeyPressed(rl.KeyboardKey.D) { + move(&player.transform, 1, 0) + } + + if rl.IsKeyPressed(rl.KeyboardKey.SPACE) { + move(&enemy.transform, 1, 0) + } + +} + +draw :: proc() { + rl.DrawRectangle( + i32(player.transform.position.x * CELL_SIZE), + i32(player.transform.position.y * CELL_SIZE), + CELL_SIZE, + CELL_SIZE, + rl.WHITE, + ) + rl.DrawRectangle( + i32(enemy.transform.position.x * CELL_SIZE), + i32(enemy.transform.position.y * CELL_SIZE), + CELL_SIZE, + CELL_SIZE, + rl.BLUE, + ) + + + for x in 0 ..< 26 { + for y in 0 ..< 26 { + rl.DrawRectangleLines( + i32(x) * CELL_SIZE, + i32(y) * CELL_SIZE, + CELL_SIZE, + CELL_SIZE, + rl.BLANK, + ) + } + } + + if rl.IsMouseButtonDown(rl.MouseButton.LEFT) { + pos := rl.GetScreenToWorld2D(rl.GetMousePosition(), player.camera) + pos_x := int(pos.x / CELL_SIZE) * CELL_SIZE + pos_y := int(pos.y / CELL_SIZE) * CELL_SIZE + shoot({f32(pos_x), f32(pos_y)}, player.transform) + } + +} diff --git a/general/systems.odin b/general/systems.odin new file mode 100644 index 0000000..8d72dca --- /dev/null +++ b/general/systems.odin @@ -0,0 +1,33 @@ +package main + +import rl "vendor:raylib" + +move :: proc(t: ^Transform, x, y: f32) { + next_position := Transform { + position = {t.position.x + x, t.position.y + y}, + } + if e, occupied := world.entities[next_position.position]; !occupied { + delete_key(&world.entities, t.position) + defer world.entities[t.position] = e + t.position = next_position.position + } +} + +shoot :: proc(pos: rl.Vector2, t: Transform) { + pos_centered := center_to_grid(pos) + t_centered := center_to_grid(t.position) + rl.DrawLine( + i32(t.position.x) * CELL_SIZE + (CELL_SIZE / 2), + i32(t.position.y) * CELL_SIZE + (CELL_SIZE / 2), + i32(pos_centered.x), + i32(pos_centered.y), + rl.WHITE, + ) +} + +center_to_grid :: proc(pos: rl.Vector2) -> rl.Vector2 { + pos_x, pos_y: f32 + pos_x = pos.x + CELL_SIZE / 2 + pos_y = pos.y + CELL_SIZE / 2 + return rl.Vector2{pos_x, pos_y} +} diff --git a/sprite-stacking/assets/Chair_strip12.png b/sprite-stacking/assets/Chair_strip12.png new file mode 100644 index 0000000000000000000000000000000000000000..9a33537484ff06dba137f8a3ca6e98fc2144d551 GIT binary patch literal 2466 zcmd5;ZHN?Q93RgY?)0=kk;~AAQDcK<=Y4i(a=mU}&f9WrxjXX|%A1{eW_NOSW}2D1 z-7`O^SCoX|mms1Kmq$t%VGu&}p^G4-z|y`1Mjxz8BPcLb0>S>z?8}{bTKK7fdHX-V z|NG1H94YSDwsQHpj%nxJ-;e8D5?#^ZKJbFny2(K=0V0SPF6)$<$1DsQJ~E?Om#5Z-_!+vDXJ2N zp2{$_S}k4^;;vt2I7LwymS=dL1_T{UIH6XjonT{2LKX$OZ+W5RIwY2;mE5r~MS-Oa z7ph*N&=%|j%|JoOn7ZaMT%2X9RqR)U4#M0xFgMLu5FHFpc!(K9fjj2wC^wFraAS+z z(A&J;m~Tf87&?P&R0UW7+PJnVui}PoP;tFB%Wdk~%aMsK1(2SF;VoZUz|b=1!g-ru zymFgNRJZN|#Vc(ngi+19`WW^kpG{HeTw3gt(^7v%N{cx`?w4|Xe5OBz-e7PPBx>3JtazUPC*xIe(!CIpfKX>1a~ zuSndGR`qNY6p>%F>d1~F6D^G3YPZK4A`(2)V%U8b`W$(uV?hQ$D=sB92ajiwA4I0G zyZ~|{dX$VI7+4TbS&{^)Nsr7J$y!iy4Ib=y#1XCRp1%U#;{g_x+<+B?u0PQnF+=FZ z=9g`eQG=_R-tZ;R#*slaiPi$eCMS`i=)6gDEaX_%MTsuSyg^HX#<7YbNHSMy@z*K{ zM|fU6@Tw%Jf()5%s0~~*tZ6>#D?{*G6Ey8xMj64Zn)8Rn`k8Ks2DnX+UiT8bBRCZS5w|HYaAHU=7T zztfqy?z%^2qCUbCn#^SIUZ&hDKT%#7ya6@pjrnIOMxB(lLfl`CPFtWpw@W?Cr&0Dv6 zzlilL{kh}IL*sSqa#ONU-9|uqt&f5Z(aWF;PDO5*%y9UJbCV$ z$*yC2re-$kv+qA$U%d9j@7JgIcH`^v^FPd-`f(sV`N8qR&Nq&3x^}kf%Iw#**a5pV z-PPGkN{hJjXV*`UzD%r5Z+@Wr!BeZ2jc#7^$>#I1o^_)iFIl&A&7t#4#O1M$>8{F} z;*$Q=-^QjoPj{bjZpM1{97I#=pLB_bhY$R9b^W>RtDO@!9=TY*Fj~BIb@mDSDX$}Z v=`~{0wKK045*yZ@{=TE