working death animation

This commit is contained in:
Stefan Stefanov 2024-02-10 15:33:39 +02:00
parent 19bff3176d
commit 31de4ca06c
4 changed files with 71 additions and 47 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 690 B

After

Width:  |  Height:  |  Size: 1 KiB

Before After
Before After

View file

@ -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)),

View file

@ -105,7 +105,6 @@ main :: proc() {
rl.UnloadImage(texture_atlas_image)
log.info("Loaded images")
for !rl.WindowShouldClose() {
update(&state)
draw(&state)

41
sprites.odin Normal file
View file

@ -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)},
}