working death animation
This commit is contained in:
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 |
76
game.odin
76
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)),
|
||||
|
|
|
|||
|
|
@ -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
41
sprites.odin
Normal 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)},
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue