0461-Bomb-连环爆炸效果
环境
- Time 2024-03-23
- Zig 0.12.0-dev.3152+90c1a2c41
- WSL-Ubuntu 22.04.3 LTS
- raylib 5.0
前言
说明
参考资料:
- 《游戏开发:世嘉新人培训教材》
- 图片素材:https://www.ituring.com.cn/book/1742
目标
如果在爆炸的路径上碰到了其它的炸弹,则会直接引爆其它炸弹,实现连环爆炸。
world.zig
主要修改的爆炸效果相关的方法,如果遇到炸弹,则把爆炸时间直接修改为立即爆炸。
fn explosionLeft(self: *World, time: usize, idx: usize) void {
for (1..self.player1().maxBombLength + 1) |i| {
const mapUnit = &self.data[idx -| i];
if (explosionMap(mapUnit) orelse return) continue;
mapUnit.insertTimedType(.fireX, time);
}
}
fn explosionMap(mapUnit: *core.MapUnit) ?bool {
if (mapUnit.contains(.wall)) return null;
if (mapUnit.contains(.brick)) {
mapUnit.remove(.brick);
return null;
}
if (mapUnit.contains(.bomb)) {
mapUnit.time -|= bombDelayTime;
return true;
}
return false;
}
fn explosionRight(self: *World, time: usize, idx: usize) void {
for (1..self.player1().maxBombLength + 1) |i| {
const mapUnit = &self.data[idx + i];
if (explosionMap(mapUnit) orelse return) continue;
mapUnit.insertTimedType(.fireX, time);
}
}
fn explosionUp(self: *World, time: usize, idx: usize) void {
for (1..self.player1().maxBombLength + 1) |i| {
const mapUnit = &self.data[idx -| (self.width * i)];
if (explosionMap(mapUnit) orelse return) continue;
mapUnit.insertTimedType(.fireY, time);
}
}
fn explosionDown(self: *World, time: usize, idx: usize) void {
for (1..self.player1().maxBombLength + 1) |i| {
const mapUnit = &self.data[idx + (self.width * i)];
if (explosionMap(mapUnit) orelse return) continue;
mapUnit.insertTimedType(.fireY, time);
}
}
效果

总结
实现了炸弹的连环爆炸效果。

浙公网安备 33010602011771号