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;
|
const y_overlap = self.pos.y <= pos.y and pos.y < self.pos.y + self.size.y;
|
||||||
return x_overlap and y_overlap;
|
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 {
|
pub const Line = struct {
|
||||||
|
|||||||
62
src/game.zig
62
src/game.zig
@ -61,13 +61,17 @@ const Bullet = struct {
|
|||||||
kinetic: Kinetic,
|
kinetic: Kinetic,
|
||||||
size: f32 = 5,
|
size: f32 = 5,
|
||||||
dir: Vec2,
|
dir: Vec2,
|
||||||
speed: f32
|
speed: f32,
|
||||||
|
|
||||||
|
dead: bool = false
|
||||||
};
|
};
|
||||||
|
|
||||||
const Enemy = struct {
|
const Enemy = struct {
|
||||||
kinetic: Kinetic,
|
kinetic: Kinetic,
|
||||||
speed: f32,
|
speed: f32,
|
||||||
size: f32,
|
size: f32,
|
||||||
|
|
||||||
|
dead: bool = false
|
||||||
};
|
};
|
||||||
|
|
||||||
arena: std.heap.ArenaAllocator,
|
arena: std.heap.ArenaAllocator,
|
||||||
@ -102,6 +106,13 @@ pub fn deinit(self: *Game) void {
|
|||||||
self.enemies.deinit(self.gpa);
|
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 {
|
pub fn tick(self: *Game, frame: *Engine.Frame) !void {
|
||||||
const dt = frame.deltaTime();
|
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(.{
|
frame.drawRectangle(.{
|
||||||
.rect = .{
|
.rect = getCenteredRect(self.player.kinetic.pos, 16),
|
||||||
.pos = self.player.kinetic.pos.sub(size.divideScalar(2)),
|
|
||||||
.size = size,
|
|
||||||
},
|
|
||||||
.color = rgb(255, 255, 255)
|
.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.vel = bullet.dir.multiplyScalar(bullet.speed);
|
||||||
bullet.kinetic.update(dt, .{});
|
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(.{
|
frame.drawRectangle(.{
|
||||||
.rect = .{
|
.rect = bullet_rect,
|
||||||
.pos = bullet.kinetic.pos.sub(Vec2.init(bullet.size, bullet.size).multiplyScalar(0.5)),
|
|
||||||
.size = .init(bullet.size, bullet.size),
|
|
||||||
},
|
|
||||||
.color = rgb(200, 20, 255)
|
.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.vel = dir_to_player.multiplyScalar(50);
|
||||||
enemy.kinetic.update(dt, .{});
|
enemy.kinetic.update(dt, .{});
|
||||||
|
|
||||||
|
const enemy_rect = getCenteredRect(enemy.kinetic.pos, enemy.size);
|
||||||
frame.drawRectangle(.{
|
frame.drawRectangle(.{
|
||||||
.rect = .{
|
.rect = enemy_rect,
|
||||||
.pos = enemy.kinetic.pos.sub(Vec2.init(enemy.size, enemy.size).multiplyScalar(0.5)),
|
|
||||||
.size = .init(enemy.size, enemy.size),
|
|
||||||
},
|
|
||||||
.color = rgb(20, 200, 20)
|
.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 {
|
pub fn debug(self: *Game) !void {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user