fumarole/main.odin

86 lines
1.7 KiB
Odin
Raw Normal View History

2025-06-20 14:53:56 +02:00
package main
import "core:fmt"
2025-06-22 21:35:03 +02:00
import "core:image/png"
2025-06-28 15:08:49 +02:00
import "util"
2025-06-22 21:35:03 +02:00
import "vendor:sdl3"
2025-06-20 14:53:56 +02:00
WIDTH :: 1600
HEIGHT :: 900
2025-06-20 15:13:11 +02:00
Game :: struct {
render: ^sdl3.Renderer,
units: [dynamic]Unit,
player: Unit,
2025-06-26 22:32:55 +02:00
time: u64,
delta: f32,
input_state: map[sdl3.Scancode]bool,
2025-06-20 15:13:11 +02:00
}
2025-06-20 14:53:56 +02:00
main :: proc() {
2025-06-22 21:35:03 +02:00
assert(sdl3.Init(sdl3.INIT_VIDEO))
defer sdl3.Quit()
2025-06-20 14:53:56 +02:00
2025-06-22 21:35:03 +02:00
window := sdl3.CreateWindow("Game", 1600, 900, nil)
assert(window != nil)
defer sdl3.DestroyWindow(window)
2025-06-20 14:53:56 +02:00
render := sdl3.CreateRenderer(window, "opengl")
2025-06-20 14:53:56 +02:00
2025-06-22 21:38:29 +02:00
assert(render != nil)
2025-06-22 21:47:58 +02:00
2025-06-22 21:35:03 +02:00
units := make([dynamic]Unit)
2025-06-28 15:33:39 +02:00
append(&units, new_unit(Faction.Allied, util.Position{500, 500}))
append(&units, new_unit(Faction.Enemy, util.Position{700, 700}))
input_state := make(map[sdl3.Scancode]bool)
2025-06-26 22:32:55 +02:00
time := sdl3.GetTicksNS()
2025-06-20 15:13:11 +02:00
game := Game {
2025-06-28 15:21:52 +02:00
render = render,
units = units,
2025-06-28 15:33:39 +02:00
player = new_unit(Faction.Player, util.Position{100, 100}, 200),
2025-06-28 15:21:52 +02:00
time = time,
delta = 0.0,
input_state = input_state,
2025-06-20 14:53:56 +02:00
}
2025-06-20 15:13:11 +02:00
for {
2025-06-22 21:35:03 +02:00
event: sdl3.Event
for sdl3.PollEvent(&event) {
2025-06-20 15:13:11 +02:00
#partial switch event.type {
case .QUIT:
return
case .KEY_UP:
2025-06-28 15:33:39 +02:00
handle_input(&game, event)
2025-06-22 21:35:03 +02:00
case .KEY_DOWN:
2025-06-28 15:33:39 +02:00
handle_input(&game, event)
2025-06-20 15:13:11 +02:00
}
}
2025-06-28 15:33:39 +02:00
move_player(&game)
render_game(&game)
update_time(&game)
2025-06-22 21:38:29 +02:00
}
}
2025-06-22 21:35:03 +02:00
2025-06-28 15:33:39 +02:00
update_time :: proc(game: ^Game) {
2025-06-27 10:11:07 +02:00
new_time := sdl3.GetTicksNS()
delta_ns := new_time - game.time
game.time = new_time
game.delta = f32(delta_ns) / f32(sdl3.NS_PER_SECOND)
}
2025-06-28 15:33:39 +02:00
render_game :: proc(game: ^Game) {
2025-06-22 21:38:29 +02:00
sdl3.SetRenderDrawColor(game.render, 0, 0, 0, 0)
sdl3.RenderClear(game.render)
2025-06-22 21:35:03 +02:00
2025-06-22 21:38:29 +02:00
for unit in game.units {
2025-06-28 15:33:39 +02:00
render_unit(unit, game)
2025-06-20 14:53:56 +02:00
}
2025-06-28 15:33:39 +02:00
render_unit(game.player, game)
2025-06-22 21:47:58 +02:00
2025-06-22 21:38:29 +02:00
sdl3.RenderPresent(game.render)
2025-06-20 14:53:56 +02:00
}