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"
|
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 {
|
ShuffleDirection :: enum {
|
||||||
RIGHT,
|
RIGHT,
|
||||||
LEFT,
|
LEFT,
|
||||||
DOWN,
|
DOWN,
|
||||||
}
|
}
|
||||||
|
|
||||||
STEP_MULTIPLIER_DEFAULT :: 10.0
|
STEP_MULTIPLIER_DEFAULT :: 10.0
|
||||||
step_multiplier := STEP_MULTIPLIER_DEFAULT
|
step_multiplier := STEP_MULTIPLIER_DEFAULT
|
||||||
|
|
||||||
|
|
@ -43,18 +22,12 @@ AlienKind :: enum {
|
||||||
RED,
|
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 {
|
Alien :: struct {
|
||||||
alive: bool,
|
alive: bool,
|
||||||
position: glm.vec2,
|
playing_death_animation: bool,
|
||||||
id: AlienKind,
|
death_animation_index: int,
|
||||||
|
position: glm.vec2,
|
||||||
|
id: AlienKind,
|
||||||
}
|
}
|
||||||
|
|
||||||
Bullet :: struct {
|
Bullet :: struct {
|
||||||
|
|
@ -93,9 +66,12 @@ setup_game :: proc(state: ^GameState) {
|
||||||
f32((row + 1) * int(ALIEN_RECT.x + 10)),
|
f32((row + 1) * int(ALIEN_RECT.x + 10)),
|
||||||
}
|
}
|
||||||
alien_ptr.alive = true
|
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 {
|
if player_score > player_high_score {
|
||||||
player_high_score = player_score
|
player_high_score = player_score
|
||||||
|
|
@ -126,12 +102,12 @@ update_game :: proc(state: ^GameState) {
|
||||||
|
|
||||||
// Press space to change to fire
|
// Press space to change to fire
|
||||||
if (rl.IsKeyPressed(rl.KeyboardKey.SPACE)) {
|
if (rl.IsKeyPressed(rl.KeyboardKey.SPACE)) {
|
||||||
log.info("FIRE!")
|
|
||||||
bullet := &bullets[bullet_index];bullet_index = (bullet_index + 1) % MAX_BULLETS
|
bullet := &bullets[bullet_index];bullet_index = (bullet_index + 1) % MAX_BULLETS
|
||||||
bullet.alive = true
|
bullet.alive = true
|
||||||
bullet.player_bullet = true
|
bullet.player_bullet = true
|
||||||
bullet.position = player_pos
|
bullet.position = player_pos
|
||||||
bullet.position.y = bullet.position.y - ((PLAYER_RECT.y / 2) + BULLET_RECT.y / 2.0)
|
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)) {
|
if (rl.IsKeyDown(rl.KeyboardKey.RIGHT)) {
|
||||||
|
|
@ -243,9 +219,11 @@ damage_alien :: proc(
|
||||||
|
|
||||||
bullet.alive = false
|
bullet.alive = false
|
||||||
alien.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
|
// Count score or take player health depending whose bullet it is
|
||||||
player_score += 10
|
player_score += 10
|
||||||
log.info("HIT 'EM HARD")
|
log.info("Hit alien: ", alien)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -271,22 +249,28 @@ draw_game :: proc(state: ^GameState) {
|
||||||
rl.WHITE,
|
rl.WHITE,
|
||||||
)
|
)
|
||||||
|
|
||||||
for alien in aliens {
|
for &alien in aliens {
|
||||||
if !alien.alive {continue}
|
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(
|
rl.DrawTexturePro(
|
||||||
texture_atlas,
|
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},
|
{alien.position.x, alien.position.y, ALIEN_RECT.x, ALIEN_RECT.y},
|
||||||
{SPRITE_CELL, SPRITE_CELL},
|
{SPRITE_CELL, SPRITE_CELL},
|
||||||
0,
|
0,
|
||||||
rl.WHITE,
|
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 {
|
for &bullet in bullets {
|
||||||
|
|
@ -318,7 +302,7 @@ draw_game :: proc(state: ^GameState) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
for &alien in aliens {
|
for &alien in aliens {
|
||||||
if !alien.alive {continue}
|
if !alien.alive && !alien.playing_death_animation {continue}
|
||||||
rl.DrawRectangleLines(
|
rl.DrawRectangleLines(
|
||||||
c.int(alien.position.x - (ALIEN_RECT.x / 2)),
|
c.int(alien.position.x - (ALIEN_RECT.x / 2)),
|
||||||
c.int(alien.position.y - (ALIEN_RECT.y / 2)),
|
c.int(alien.position.y - (ALIEN_RECT.y / 2)),
|
||||||
|
|
|
||||||
|
|
@ -105,7 +105,6 @@ main :: proc() {
|
||||||
rl.UnloadImage(texture_atlas_image)
|
rl.UnloadImage(texture_atlas_image)
|
||||||
log.info("Loaded images")
|
log.info("Loaded images")
|
||||||
|
|
||||||
|
|
||||||
for !rl.WindowShouldClose() {
|
for !rl.WindowShouldClose() {
|
||||||
update(&state)
|
update(&state)
|
||||||
draw(&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