From 31de4ca06cfce92f567ce732b8234978ccd0e953 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Sat, 10 Feb 2024 15:33:39 +0200 Subject: [PATCH] working death animation --- assets/texture_atlas.png | Bin 690 -> 1067 bytes game.odin | 76 ++++++++++++++++----------------------- main.odin | 1 - sprites.odin | 41 +++++++++++++++++++++ 4 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 sprites.odin diff --git a/assets/texture_atlas.png b/assets/texture_atlas.png index e554b3c43967b8ad4f344d7465b3be65a5edbd67..39f11d7c41162208ef1ffe9e547adc27f23586d6 100644 GIT binary patch literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>V1DZ9;uumf z=j|NBs@n<@Z43LS%cy>xqRRfFv8wURUI+du%oQ2SWK?1|P35cW5PatDp)_sL`&xC@ z#(-LtxWX3JW~%Fm5&KBr&2!SBq@le%w@ z$CbbPdE;Pa(2}|H%Iu6{3|MEJx-lhT>eXAzWpCZG^X-gjlDmB3-U~C*Mz2}B% zb-(p`d%5rY(xB&F4Hc84PJ4e{^C_xYd)4J_Td!-l?lXPl*}y&fCfl@UPj7kTXXam> zT|f2rV z?~Rg^Wqf(eoS^6p7EQ=(`FwWvTW4@oZ{QYaXAxj$Jd!A`zz0;&?NI2!Q269|`q%f$ zC7unt9~_D;IBQ;%^;dIFpW>Xp=b6W?+PJ6RXRnYd>-cZ#)4uU@@z0ONH#E=hKcC&V z@~J_8-hbIWtbWG@@<-+w&dcWuM+Zyj~tpPTI9);p5Sy}Hlzkn+ZwHF7@9 zu?-fn%Nj}?uW#DXU3zct=bs&UvCIbFzb9^Fs9e&|IpMnOY@=fy&%YcGf4_EWosR$W z|CbF}zQ2DzY5V_AIeCH>+t?cR#c&F2FTb`;Uw^w>$vl>&t&c8Ud>>PLWxB^}yM0yb z|0!e?a~ia3M%!#_bml8`iB`5ry88O71IM*Qan69K2a!vH**pU(L~KfVCwzK0*MED( zwZhY_PjB0ZHO^<|Z#puu-{EWQfh5K&`47U|H67-xV&Fg6+V21B5nB$kkb_KcL;Hh6 z-R1v|TKjXo5f^fpvs%6JT1Nj2 literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>V9N1yaSW-L z^Y)fw&>;r_hl`oryzUoepBJC~`b1|<%rq{a@1GK+q-1ni z@PEH0RBWYk%`34*$BUT`NHWavXDskzuwZWZtjTbWli|6q!W>}+zWw%>|H~ibWH9$; zxUIAEY|&S*U0e)asINs#~c6c?HjLuopp!lf!SK|U)psi%K!K^=T3Xm7rkz$ z+xf>V4cUGT(O1k%uHU&+dfkF^nz?1eKM#5C1@&tMbx!Ltywhp8F@49Ej_X$SnXd6s zSMUC;a@z50`g4|s?stXjqwgm7*Z+O}YGuItmw&4pqvb^BpFGdhQuZyZAX_NLSn-u@ z-HVEM@lM}??)Q!B{bKv&D$rwW%r{a`&YgdI{VZXIb&?14yyX@hQS`E4y>^gTe~DWM4fc47bU 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)}, +} +