package main import "core:fmt" import "core:image/png" import "util" import "vendor:sdl3" WIDTH :: 1600 HEIGHT :: 900 Game :: struct { render: ^sdl3.Renderer, units: [dynamic]Unit, player: Unit, time: u64, delta: f32, input_state: map[sdl3.Scancode]bool, } main :: proc() { assert(sdl3.Init(sdl3.INIT_VIDEO)) defer sdl3.Quit() window := sdl3.CreateWindow("Game", 1600, 900, nil) assert(window != nil) defer sdl3.DestroyWindow(window) render := sdl3.CreateRenderer(window, "opengl") assert(render != nil) units := make([dynamic]Unit) 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) time := sdl3.GetTicksNS() game := Game { render = render, units = units, player = new_unit(Faction.Player, util.Position{100, 100}, 200), time = time, delta = 0.0, input_state = input_state, } for { event: sdl3.Event for sdl3.PollEvent(&event) { #partial switch event.type { case .QUIT: return case .KEY_UP: handle_input(&game, event) case .KEY_DOWN: handle_input(&game, event) } } move_player(&game) render_game(&game) update_time(&game) } } update_time :: proc(game: ^Game) { new_time := sdl3.GetTicksNS() delta_ns := new_time - game.time game.time = new_time game.delta = f32(delta_ns) / f32(sdl3.NS_PER_SECOND) } render_game :: proc(game: ^Game) { sdl3.SetRenderDrawColor(game.render, 0, 0, 0, 0) sdl3.RenderClear(game.render) for unit in game.units { render_unit(unit, game) } render_unit(game.player, game) sdl3.RenderPresent(game.render) }