Replace swap n pop for unordered_remove and check bullet/asteroid collisions even if dead
This commit is contained in:
parent
2f00e14632
commit
573891918b
69
game.odin
69
game.odin
@ -13,7 +13,6 @@ SCREEN_HEIGHT : i32 = 800
|
|||||||
BW := f32(SCREEN_WIDTH)
|
BW := f32(SCREEN_WIDTH)
|
||||||
BH := f32(SCREEN_HEIGHT)
|
BH := f32(SCREEN_HEIGHT)
|
||||||
|
|
||||||
|
|
||||||
SCALE: f32 = 0.37
|
SCALE: f32 = 0.37
|
||||||
SHIP_W: f32 = 70 * SCALE
|
SHIP_W: f32 = 70 * SCALE
|
||||||
SHIP_H: f32 = 100 * SCALE
|
SHIP_H: f32 = 100 * SCALE
|
||||||
@ -63,8 +62,6 @@ GameState :: struct {
|
|||||||
player_state: PlayerState,
|
player_state: PlayerState,
|
||||||
bullets: [dynamic]Bullet,
|
bullets: [dynamic]Bullet,
|
||||||
asteroids: [dynamic]Asteroid,
|
asteroids: [dynamic]Asteroid,
|
||||||
bullet_pop_idxs: [dynamic]int,
|
|
||||||
asteroid_pop_idxs: [dynamic]int,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update_ship_shape :: proc(p : ^Player) {
|
update_ship_shape :: proc(p : ^Player) {
|
||||||
@ -79,16 +76,6 @@ random_direction :: proc() -> Vec2 {
|
|||||||
return {math.cos(angle), math.sin(angle)}
|
return {math.cos(angle), math.sin(angle)}
|
||||||
}
|
}
|
||||||
|
|
||||||
swap_n_pop :: proc(bullets: ^[dynamic]$T, idx: int) {
|
|
||||||
last := len(bullets) - 1
|
|
||||||
if last == 0 {
|
|
||||||
clear(bullets)
|
|
||||||
} else {
|
|
||||||
bullets[last], bullets[idx] = bullets[idx], bullets[last]
|
|
||||||
pop(bullets)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init_state :: proc() -> ^GameState {
|
init_state :: proc() -> ^GameState {
|
||||||
start_pos := Vec2{BW / 2 - SHIP_W / 2, BH / 2 - SHIP_H / 2}
|
start_pos := Vec2{BW / 2 - SHIP_W / 2, BH / 2 - SHIP_H / 2}
|
||||||
player_state := Player {
|
player_state := Player {
|
||||||
@ -101,8 +88,6 @@ init_state :: proc() -> ^GameState {
|
|||||||
player_state = player_state,
|
player_state = player_state,
|
||||||
bullets = make([dynamic]Bullet, 0, 64),
|
bullets = make([dynamic]Bullet, 0, 64),
|
||||||
asteroids = make([dynamic]Asteroid, 0, 64),
|
asteroids = make([dynamic]Asteroid, 0, 64),
|
||||||
asteroid_pop_idxs = make([dynamic]int, 0, 64),
|
|
||||||
bullet_pop_idxs = make([dynamic]int, 0, 64),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get_rand_angle :: proc(min: i32, max: i32) -> f32 {
|
get_rand_angle :: proc(min: i32, max: i32) -> f32 {
|
||||||
@ -163,35 +148,6 @@ update :: proc(s: ^GameState) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for i := 0; i < len(s.bullets); i += 1 {
|
|
||||||
if ( s.bullets[i].pos.x < 0 || s.bullets[i].pos.x > BW
|
|
||||||
|| s.bullets[i].pos.y < 0 || s.bullets[i].pos.y > BH) {
|
|
||||||
append(&s.bullet_pop_idxs, i)
|
|
||||||
}
|
|
||||||
s.bullets[i].pos += s.bullets[i].vel
|
|
||||||
for j := 0; j < len(s.asteroids); j += 1 {
|
|
||||||
if rl.CheckCollisionCircleRec(s.bullets[i].pos, BULLET_RADIUS, s.asteroids[j].rect) {
|
|
||||||
append(&s.bullet_pop_idxs, i)
|
|
||||||
append(&s.asteroid_pop_idxs, j)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bpi_len := len(s.bullet_pop_idxs)
|
|
||||||
for i := 0; i < bpi_len; i += 1 {
|
|
||||||
swap_n_pop(&s.bullets, s.bullet_pop_idxs[i])
|
|
||||||
}
|
|
||||||
if bpi_len > 0 {
|
|
||||||
clear(&s.bullet_pop_idxs)
|
|
||||||
}
|
|
||||||
api_len := len(s.asteroid_pop_idxs)
|
|
||||||
for i := 0; i < api_len; i += 1 {
|
|
||||||
swap_n_pop(&s.asteroids, s.asteroid_pop_idxs[i])
|
|
||||||
}
|
|
||||||
if bpi_len > 0 {
|
|
||||||
clear(&s.asteroid_pop_idxs)
|
|
||||||
}
|
|
||||||
|
|
||||||
if ship_collision {
|
if ship_collision {
|
||||||
// Randomize everything
|
// Randomize everything
|
||||||
s.player_state = Death {
|
s.player_state = Death {
|
||||||
@ -214,18 +170,29 @@ update :: proc(s: ^GameState) {
|
|||||||
part.points[0] += part.vel
|
part.points[0] += part.vel
|
||||||
part.points[1] += part.vel
|
part.points[1] += part.vel
|
||||||
}
|
}
|
||||||
for i := 0; i < len(s.bullets); i += 1 {
|
|
||||||
if ( s.bullets[i].pos.x < 0 || s.bullets[i].pos.x > BW
|
|
||||||
|| s.bullets[i].pos.y < 0 || s.bullets[i].pos.y > BH) {
|
|
||||||
append(&s.bullet_pop_idxs, i)
|
|
||||||
}
|
|
||||||
s.bullets[i].pos += s.bullets[i].vel
|
|
||||||
}
|
|
||||||
for i := 0; i < len(s.asteroids); i += 1 {
|
for i := 0; i < len(s.asteroids); i += 1 {
|
||||||
s.asteroids[i].rect.x += s.asteroids[i].vel.x * s.dt
|
s.asteroids[i].rect.x += s.asteroids[i].vel.x * s.dt
|
||||||
s.asteroids[i].rect.y += s.asteroids[i].vel.y * s.dt
|
s.asteroids[i].rect.y += s.asteroids[i].vel.y * s.dt
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for i := len(s.bullets) - 1; i >= 0; i -= 1 {
|
||||||
|
if ( s.bullets[i].pos.x < 0 || s.bullets[i].pos.x > BW
|
||||||
|
|| s.bullets[i].pos.y < 0 || s.bullets[i].pos.y > BH) {
|
||||||
|
unordered_remove(&s.bullets, i)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
s.bullets[i].pos += s.bullets[i].vel
|
||||||
|
collided := false
|
||||||
|
for j := len(s.asteroids) - 1; j >= 0; j -= 1 {
|
||||||
|
if rl.CheckCollisionCircleRec(s.bullets[i].pos, BULLET_RADIUS, s.asteroids[j].rect) {
|
||||||
|
collided = true
|
||||||
|
unordered_remove(&s.asteroids, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if collided {
|
||||||
|
unordered_remove(&s.bullets, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
draw2d :: proc(s: ^GameState) {
|
draw2d :: proc(s: ^GameState) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user