diff --git a/src/engine/math.zig b/src/engine/math.zig index 95d0178..f9861e5 100644 --- a/src/engine/math.zig +++ b/src/engine/math.zig @@ -426,6 +426,11 @@ pub const Rect = struct { const y_overlap = self.pos.y <= pos.y and pos.y < self.pos.y + self.size.y; return x_overlap and y_overlap; } + + pub fn hasOverlap(lhs: Rect, rhs: Rect) bool { + return (lhs.left() < rhs.right() and lhs.right() > rhs.left()) and + (lhs.top() < rhs.bottom() and lhs.bottom() > rhs.top()); + } }; pub const Line = struct { diff --git a/src/game.zig b/src/game.zig index 6e22a96..e8669d6 100644 --- a/src/game.zig +++ b/src/game.zig @@ -61,13 +61,17 @@ const Bullet = struct { kinetic: Kinetic, size: f32 = 5, dir: Vec2, - speed: f32 + speed: f32, + + dead: bool = false }; const Enemy = struct { kinetic: Kinetic, speed: f32, size: f32, + + dead: bool = false }; arena: std.heap.ArenaAllocator, @@ -102,6 +106,13 @@ pub fn deinit(self: *Game) void { self.enemies.deinit(self.gpa); } +fn getCenteredRect(pos: Vec2, size: f32) Rect { + return .{ + .pos = pos.sub(Vec2.init(size, size).multiplyScalar(0.5)), + .size = .init(size, size), + }; +} + pub fn tick(self: *Game, frame: *Engine.Frame) !void { const dt = frame.deltaTime(); @@ -184,12 +195,8 @@ pub fn tick(self: *Game, frame: *Engine.Frame) !void { } } - var size = self.assets.players_tilemap.tile_size; frame.drawRectangle(.{ - .rect = .{ - .pos = self.player.kinetic.pos.sub(size.divideScalar(2)), - .size = size, - }, + .rect = getCenteredRect(self.player.kinetic.pos, 16), .color = rgb(255, 255, 255) }); @@ -197,11 +204,18 @@ pub fn tick(self: *Game, frame: *Engine.Frame) !void { bullet.kinetic.vel = bullet.dir.multiplyScalar(bullet.speed); bullet.kinetic.update(dt, .{}); + const bullet_rect = getCenteredRect(bullet.kinetic.pos, bullet.size); + + for (self.enemies.items) |*enemy| { + const enemy_rect = getCenteredRect(enemy.kinetic.pos, enemy.size); + if (enemy_rect.hasOverlap(bullet_rect)) { + enemy.dead = true; + bullet.dead = true; + } + } + frame.drawRectangle(.{ - .rect = .{ - .pos = bullet.kinetic.pos.sub(Vec2.init(bullet.size, bullet.size).multiplyScalar(0.5)), - .size = .init(bullet.size, bullet.size), - }, + .rect = bullet_rect, .color = rgb(200, 20, 255) }); } @@ -211,14 +225,34 @@ pub fn tick(self: *Game, frame: *Engine.Frame) !void { enemy.kinetic.vel = dir_to_player.multiplyScalar(50); enemy.kinetic.update(dt, .{}); + const enemy_rect = getCenteredRect(enemy.kinetic.pos, enemy.size); frame.drawRectangle(.{ - .rect = .{ - .pos = enemy.kinetic.pos.sub(Vec2.init(enemy.size, enemy.size).multiplyScalar(0.5)), - .size = .init(enemy.size, enemy.size), - }, + .rect = enemy_rect, .color = rgb(20, 200, 20) }); } + + { + var i: usize = 0; + while (i < self.bullets.items.len) { + if (self.bullets.items[i].dead) { + _ = self.bullets.swapRemove(i); + } else { + i += 1; + } + } + } + + { + var i: usize = 0; + while (i < self.enemies.items.len) { + if (self.enemies.items[i].dead) { + _ = self.enemies.swapRemove(i); + } else { + i += 1; + } + } + } } pub fn debug(self: *Game) !void {