package space_invaders import "core:c" import "core:log" import glm "core:math/linalg/glsl" import rl "vendor:raylib" // orignal resolution of space invaders // 256 x 224 px TEXTURE_ATLAS_PATH :: "./assets/texture_atlas.png" DEBUG_MODE :: false GameEndType :: enum { AllAliensKilled, PlayerDied, AliensReachedPlayer, } GameState :: struct { // window target_fps: c.int, title: cstring, screen_width: c.int, screen_height: c.int, // frame stats frame_counter: int, current_frame_time: f64, last_frame_time: f64, delta_time: f64, // game vars screen: GameScreen, previous_screen: GameScreen, last_frame_screen: GameScreen, game_end: GameEndType, reset_game: bool, aliens: #soa[ALIENS]Alien, bullets: #soa[MAX_BULLETS]Bullet, bullet_index: int, player_last_time_fired: f64, player_pos: glm.vec2, player_health: c.int, player_score: c.int, player_high_score: c.int, shuffle_dir: ShuffleDirection, last_shuffle_dir: ShuffleDirection, } state: GameState texture_atlas_image: rl.Image texture_atlas: rl.Texture2D camera := rl.Camera2D { zoom = 2, } setup :: proc(state: ^GameState) { using state target_fps = 60 screen_width = 800 * 2 screen_height = 600 * 2 title = "Space Invaders (raylib+odin-lang edition)" current_frame_time = rl.GetTime() previous_screen = .TITLE screen = .TITLE rl.SetTargetFPS(target_fps) } update :: proc(state: ^GameState) { using state frame_counter += 1 last_frame_time = current_frame_time current_frame_time = rl.GetTime() delta_time = current_frame_time - last_frame_time update_screen(state) } draw :: proc(state: ^GameState) { rl.BeginDrawing() rl.ClearBackground(rl.RAYWHITE) rl.BeginMode2D(camera) draw_screen(state) rl.EndMode2D() rl.EndDrawing() } main :: proc() { context.logger = log.create_console_logger() log.info(state.screen) setup(&state) rl.InitWindow(state.screen_width, state.screen_height, state.title) defer rl.CloseWindow() if !ODIN_DEBUG { rl.SetExitKey(nil) } else { log.info("Built with Odin compiler version: ", ODIN_VERSION) } texture_atlas_image = rl.LoadImage(TEXTURE_ATLAS_PATH) texture_atlas = rl.LoadTextureFromImage(texture_atlas_image) rl.UnloadImage(texture_atlas_image) log.info("Loaded images") for !rl.WindowShouldClose() { update(&state) draw(&state) } }