From d5e67552d4f330d0227661ec75ee1b3052d3455e Mon Sep 17 00:00:00 2001 From: morrigan Date: Sun, 22 Jun 2025 21:35:03 +0200 Subject: [PATCH] sdl3 and uh some fun stuff! --- README.md | 3 +++ main.odin | 55 ++++++++++++++++++++++++++++++------------------------- math.odin | 5 +++++ unit.odin | 27 +++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 README.md create mode 100644 math.odin create mode 100644 unit.odin diff --git a/README.md b/README.md new file mode 100644 index 0000000..57a3651 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Fumarole + +This project has the goal of exploring the Odin programming language, and its game dev applications. diff --git a/main.odin b/main.odin index b3020d8..548c5dd 100644 --- a/main.odin +++ b/main.odin @@ -1,54 +1,59 @@ package main import "core:fmt" -import "vendor:sdl2" +import "core:image/png" +import "vendor:sdl3" WIDTH :: 1600 HEIGHT :: 900 Game :: struct { - render: ^sdl2.Renderer, - time: f64, - dt: f64, -} - -get_time :: proc() -> f64 { - return f64(sdl2.GetPerformanceCounter()) * 1000 / f64(sdl2.GetPerformanceFrequency()) + render: ^sdl3.Renderer, + units: [dynamic]Unit, } main :: proc() { - assert(sdl2.Init(sdl2.INIT_VIDEO) == 0, sdl2.GetErrorString()) - defer sdl2.Quit() + assert(sdl3.Init(sdl3.INIT_VIDEO)) + defer sdl3.Quit() - window := sdl2.CreateWindow("Game", 0, 0, 1600, 900, sdl2.WINDOW_SHOWN) - assert(window != nil, sdl2.GetErrorString()) - defer sdl2.DestroyWindow(window) + window := sdl3.CreateWindow("Game", 1600, 900, nil) + assert(window != nil) + defer sdl3.DestroyWindow(window) - render := sdl2.CreateRenderer(window, -1, sdl2.RENDERER_ACCELERATED) - assert(render != nil, sdl2.GetErrorString()) + render := sdl3.CreateRenderer(window, "vulkan") + assert(render != nil) - tickrate := 240.0 - ticktime := 1000.0 / tickrate + units := make([dynamic]Unit) + append(&units, Unit{faction = Faction.Player, position = Position{x = 500, y = 500}, hp = 100}) + append(&units, Unit{faction = Faction.Enemy, position = Position{x = 700, y = 700}, hp = 100}) game := Game { render = render, - time = get_time(), - dt = ticktime, + units = units, } for { - event: sdl2.Event - for sdl2.PollEvent(&event) { + event: sdl3.Event + for sdl3.PollEvent(&event) { #partial switch event.type { case .QUIT: return - + case .KEY_DOWN: + { + fmt.println(event.key) + } } } - sdl2.SetRenderDrawColor(render, 0, 0, 0, 0) - sdl2.RenderClear(render) - sdl2.RenderPresent(render) + sdl3.SetRenderDrawColor(render, 0, 0, 0, 0) + sdl3.RenderClear(render) + + for unit in game.units { + RenderUnit(unit, game) + } + + sdl3.RenderPresent(render) + } } diff --git a/math.odin b/math.odin new file mode 100644 index 0000000..811fee7 --- /dev/null +++ b/math.odin @@ -0,0 +1,5 @@ +package main + +Position :: struct { + x, y: f32, +} diff --git a/unit.odin b/unit.odin new file mode 100644 index 0000000..5cce543 --- /dev/null +++ b/unit.odin @@ -0,0 +1,27 @@ +package main + +import "vendor:sdl3" + +Faction :: enum { + Player, + Enemy, +} + +Unit :: struct { + faction: Faction, + position: Position, + hp: u32, +} + +RenderUnit :: proc(unit: Unit, game: Game) { + switch unit.faction { + case Faction.Player: + sdl3.SetRenderDrawColor(game.render, 0, 255, 0, 0) + case Faction.Enemy: + sdl3.SetRenderDrawColor(game.render, 255, 0, 0, 0) + } + sdl3.RenderRect( + game.render, + &sdl3.FRect{x = unit.position.x, y = unit.position.y, w = 10, h = 10}, + ) +}