diff --git a/game.odin b/game.odin index 44a5b49..878ce94 100644 --- a/game.odin +++ b/game.odin @@ -82,6 +82,39 @@ swap_n_pop :: proc(bullets: ^[dynamic]$T, idx: int) { } } +init_game :: proc() -> ^GameState { + start_pos := Vec2{BW / 2 - SHIP_W / 2, BH / 2 - SHIP_H / 2} + state := GameState { + dt = rl.GetFrameTime(), + player_state = Player { + pos = start_pos, + angle = -math.PI / 2, + }, + bullets = make([dynamic]Bullet, 0, 64), + asteroids = make([dynamic]Asteroid, 0, 64), + asteroid_pop_idxs = make([dynamic]int, 0, 64), + bullet_pop_idxs = make([dynamic]int, 0, 64), + } + + get_rand_angle :: proc(min: i32, max: i32) -> f32 { + return f32(rl.GetRandomValue(min, max)) * rl.DEG2RAD + } + + for i := 0; i < 5; i += 1 { + rand_angle := get_rand_angle(-50, 50) + rand_pos := Vec2{ f32(rl.GetRandomValue(0, i32(BW))), -50 } + rand_size := f32(rl.GetRandomValue(25, 60)) + rand_vy := f32(rl.GetRandomValue(1, 2)) * 0.5 + asteroid := Asteroid { + rect = {rand_pos.x,rand_pos.y,rand_size,rand_size}, + vel = Vec2{rand_angle, rand_vy} * 50, + rot = 0, + } + append(&state.asteroids, asteroid) + } + return new_clone(state) +} + player_input :: proc(s: ^GameState) { switch &player in s.player_state { case Player: @@ -189,47 +222,19 @@ main :: proc() { rl.InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Asteroids") rl.SetTargetFPS(60) - start_pos := Vec2{BW / 2 - SHIP_W / 2, BH / 2 - SHIP_H / 2} - s := GameState{ - dt = rl.GetFrameTime(), - player_state = Player { - pos = start_pos, - angle = -math.PI / 2, - }, - bullets = make([dynamic]Bullet, 0, 64), - asteroids = make([dynamic]Asteroid, 0, 64), - asteroid_pop_idxs = make([dynamic]int, 0, 64), - bullet_pop_idxs = make([dynamic]int, 0, 64), - } - - get_rand_angle :: proc(min: i32, max: i32) -> f32 { - return f32(rl.GetRandomValue(min, max)) * rl.DEG2RAD - } - - for i := 0; i < 5; i += 1 { - rand_angle := get_rand_angle(-50, 50) - rand_pos := Vec2{ f32(rl.GetRandomValue(0, i32(BW))), -50 } - rand_size := f32(rl.GetRandomValue(25, 60)) - rand_vy := f32(rl.GetRandomValue(1, 2)) * 0.5 - asteroid := Asteroid { - rect = {rand_pos.x,rand_pos.y,rand_size,rand_size}, - vel = Vec2{rand_angle, rand_vy} * 50, - rot = 0, - } - append(&s.asteroids, asteroid) - } + state := init_game() for !rl.WindowShouldClose() { - s.dt = rl.GetFrameTime() + state.dt = rl.GetFrameTime() - player_input(&s) + player_input(state) - update(&s) + update(state) rl.BeginDrawing() rl.ClearBackground(rl.BLACK) - draw2d(&s) + draw2d(state) rl.EndDrawing() }