diff --git a/assets/texture_atlas.png b/assets/texture_atlas.png index e554b3c..39f11d7 100644 Binary files a/assets/texture_atlas.png and b/assets/texture_atlas.png differ diff --git a/game.odin b/game.odin index 32fa3b0..84932cd 100644 --- a/game.odin +++ b/game.odin @@ -6,33 +6,12 @@ import glm "core:math/linalg/glsl" import rl "vendor:raylib" -GLOBAL_SPRITE_SCALE :: 2 -SPRITE_CELL :: 16 - -ALIEN_ROWS :: 5 -ALIENS_PER_ROW :: 11 -ALIENS :: ALIEN_ROWS * ALIENS_PER_ROW -ALIEN_SIDE_STEP :: 20 * GLOBAL_SPRITE_SCALE -ALIEN_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} - -MAX_BULLETS :: 100 -BULLET_SPEED :: 240 -BULLET_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} - -MAX_PLAYER_HEALTH :: 3 -PLAYER_SPEED :: 120 -PLAYER_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} - -// texture offset for ship -SHIP_TO :: glm.vec2{0, 112} -BULLET_TO := [2]glm.vec2{{0, 80}, {16, 80}} -BULLET_FRAME_ANIM := 0 - ShuffleDirection :: enum { RIGHT, LEFT, DOWN, } + STEP_MULTIPLIER_DEFAULT :: 10.0 step_multiplier := STEP_MULTIPLIER_DEFAULT @@ -43,18 +22,12 @@ AlienKind :: enum { RED, } -// texture atlas offset for aliens -ALIENS_TO := [AlienKind]glm.vec2 { - .ORANGE = {0, 128 - (SPRITE_CELL * 2)}, - .GREEN = {SPRITE_CELL * 1, 128 - (SPRITE_CELL * 2)}, - .YELLOW = {SPRITE_CELL * 2, 128 - (SPRITE_CELL * 2)}, - .RED = {SPRITE_CELL * 3, 128 - (SPRITE_CELL * 2)}, -} - Alien :: struct { - alive: bool, - position: glm.vec2, - id: AlienKind, + alive: bool, + playing_death_animation: bool, + death_animation_index: int, + position: glm.vec2, + id: AlienKind, } Bullet :: struct { @@ -93,9 +66,12 @@ setup_game :: proc(state: ^GameState) { f32((row + 1) * int(ALIEN_RECT.x + 10)), } alien_ptr.alive = true - alien_ptr.id = row % 2 == 0 ? .ORANGE : .GREEN + alien_ptr.id = transmute(AlienKind)(row % 4) } } + for &bullet in bullets { + bullet.alive = false + } if player_score > player_high_score { player_high_score = player_score @@ -126,12 +102,12 @@ update_game :: proc(state: ^GameState) { // Press space to change to fire if (rl.IsKeyPressed(rl.KeyboardKey.SPACE)) { - log.info("FIRE!") bullet := &bullets[bullet_index];bullet_index = (bullet_index + 1) % MAX_BULLETS bullet.alive = true bullet.player_bullet = true bullet.position = player_pos bullet.position.y = bullet.position.y - ((PLAYER_RECT.y / 2) + BULLET_RECT.y / 2.0) + log.info("Fired bullet: ", bullet) } if (rl.IsKeyDown(rl.KeyboardKey.RIGHT)) { @@ -243,9 +219,11 @@ damage_alien :: proc( bullet.alive = false alien.alive = false + alien.playing_death_animation = true + alien.death_animation_index = 0 // Count score or take player health depending whose bullet it is player_score += 10 - log.info("HIT 'EM HARD") + log.info("Hit alien: ", alien) return } @@ -271,22 +249,28 @@ draw_game :: proc(state: ^GameState) { rl.WHITE, ) - for alien in aliens { - if !alien.alive {continue} + for &alien in aliens { + if !alien.alive && !alien.playing_death_animation {continue} + alien_to := glm.vec2{ALIENS_TO[alien.id].x, ALIENS_TO[alien.id].y} + if alien.playing_death_animation { + if alien.death_animation_index < ALIEN_DEATH_FRAMES { + alien_to = ALIEN_DEATH_ANIMATION_TO[alien.death_animation_index] + if frame_counter % (int(target_fps) / 4) == 0 { + alien.death_animation_index += 1 + } + } else { + alien.playing_death_animation = false + continue + } + } rl.DrawTexturePro( texture_atlas, - {ALIENS_TO[alien.id].x, ALIENS_TO[alien.id].y, SPRITE_CELL, SPRITE_CELL}, + {alien_to.x, alien_to.y, SPRITE_CELL, SPRITE_CELL}, {alien.position.x, alien.position.y, ALIEN_RECT.x, ALIEN_RECT.y}, {SPRITE_CELL, SPRITE_CELL}, 0, rl.WHITE, ) - // rl.DrawCircle( - // c.int(alien.position.x), - // c.int(alien.position.y), - // f32(ALIEN_RECT.x / 2), - // rl.YELLOW, - // ) } for &bullet in bullets { @@ -318,7 +302,7 @@ draw_game :: proc(state: ^GameState) { ) } for &alien in aliens { - if !alien.alive {continue} + if !alien.alive && !alien.playing_death_animation {continue} rl.DrawRectangleLines( c.int(alien.position.x - (ALIEN_RECT.x / 2)), c.int(alien.position.y - (ALIEN_RECT.y / 2)), diff --git a/main.odin b/main.odin index 750c7fd..0d6e971 100644 --- a/main.odin +++ b/main.odin @@ -105,7 +105,6 @@ main :: proc() { rl.UnloadImage(texture_atlas_image) log.info("Loaded images") - for !rl.WindowShouldClose() { update(&state) draw(&state) diff --git a/sprites.odin b/sprites.odin new file mode 100644 index 0000000..ee684bc --- /dev/null +++ b/sprites.odin @@ -0,0 +1,41 @@ +package space_invaders + +import glm "core:math/linalg/glsl" + +GLOBAL_SPRITE_SCALE :: 2 +SPRITE_CELL :: 16 + +ALIEN_ROWS :: 5 +ALIENS_PER_ROW :: 11 +ALIENS :: ALIEN_ROWS * ALIENS_PER_ROW +ALIEN_SIDE_STEP :: 20 * GLOBAL_SPRITE_SCALE +ALIEN_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} + +MAX_BULLETS :: 100 +BULLET_SPEED :: 240 +BULLET_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} + +MAX_PLAYER_HEALTH :: 3 +PLAYER_SPEED :: 120 +PLAYER_RECT :: glm.vec2{SPRITE_CELL * GLOBAL_SPRITE_SCALE, SPRITE_CELL * GLOBAL_SPRITE_SCALE} + +// texture offset for ship +SHIP_TO :: glm.vec2{0, 112} +BULLET_TO := [2]glm.vec2{{0, 80}, {16, 80}} +BULLET_FRAME_ANIM := 0 + +// texture atlas offset for aliens +ALIENS_TO := [AlienKind]glm.vec2 { + .ORANGE = {0, 128 - (SPRITE_CELL * 2)}, + .GREEN = {SPRITE_CELL * 1, 128 - (SPRITE_CELL * 2)}, + .YELLOW = {SPRITE_CELL * 2, 128 - (SPRITE_CELL * 2)}, + .RED = {SPRITE_CELL * 3, 128 - (SPRITE_CELL * 2)}, +} +ALIEN_DEATH_FRAMES :: 4 +ALIEN_DEATH_ANIMATION_TO := [ALIEN_DEATH_FRAMES]glm.vec2 { + {0, 128 - (SPRITE_CELL * 4)}, + {SPRITE_CELL * 1, 128 - (SPRITE_CELL * 4)}, + {SPRITE_CELL * 2, 128 - (SPRITE_CELL * 4)}, + {SPRITE_CELL * 3, 128 - (SPRITE_CELL * 4)}, +} +