add killing enemies

This commit is contained in:
Rokas Puzonas 2026-01-31 00:12:06 +02:00
parent 82fa2a03e0
commit 8552ce3300
2 changed files with 53 additions and 14 deletions

View File

@ -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 {

View File

@ -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 {