add killing enemies
This commit is contained in:
parent
82fa2a03e0
commit
8552ce3300
@ -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 {
|
||||
|
||||
62
src/game.zig
62
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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user