commit 480501a6b6fdc21e65d7ef372c3272d47420d542 Author: harper Date: Tue Sep 22 15:40:36 2026 -0700 initial commit 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 0000000..9a33537 Binary files /dev/null and b/sprite-stacking/assets/Chair_strip12.png differ diff --git a/sprite-stacking/main.odin b/sprite-stacking/main.odin new file mode 100644 index 0000000..99f1ab0 --- /dev/null +++ b/sprite-stacking/main.odin @@ -0,0 +1,60 @@ +package main + +import rl "vendor:raylib" + +main :: proc() { + rl.InitWindow(800, 600, "grimm sprite stacking") + rl.SetTargetFPS(60) + defer rl.CloseWindow() + + sprite := rl.LoadTexture("assets/Chair_strip12.png") + defer rl.UnloadTexture(sprite) + + sprite_size :: 12 + stack_count :: 11 + + camera := rl.Camera2D{} + camera.zoom = 3 + camera.offset = {400, 300} + + spacing: f32 = 1 + rotation: f32 = 0 + + for !rl.WindowShouldClose() { + if rl.IsKeyPressed(rl.KeyboardKey.SPACE) { + spacing += 0.5 + } + + rl.BeginDrawing() + rl.ClearBackground(rl.BLUE) + + rl.BeginMode2D(camera) + + for i in 0 ..< stack_count { + source := rl.Rectangle { + x = f32(i * sprite_size), + y = 0, + width = sprite_size, + height = sprite_size, + } + + destination := rl.Rectangle { + x = 0, + y = -spacing * f32(i), + width = sprite_size, + height = sprite_size, + } + + origin := rl.Vector2{} + origin.x = sprite_size / 2 + origin.y = sprite_size / 2 + + rl.DrawTexturePro(sprite, source, destination, origin, rotation, rl.WHITE) + } + + rl.EndMode2D() + rl.EndDrawing() + + rotation += 1 + } +}