0456-Bomb-实现爆炸效果
环境
- Time 2024-03-21
- Zig 0.12.0-dev.3152+90c1a2c41
- WSL-Ubuntu 22.04.3 LTS
- raylib 5.0
前言
说明
参考资料:
- 《游戏开发:世嘉新人培训教材》
- 图片素材:https://www.ituring.com.cn/book/1742
目标
实现炸弹爆炸后的效果,目前只实现了炸毁砖块。
新增地图类型
新增了爆炸效果的的中间效果,X 效果和 Y 效果。
// 定义地图的类型
pub const MapType = enum(u8) {
space = 9,
wall = 7,
brick = 8,
bomb = 10,
item = 2,
power = 3,
fireX = 4,
fireY = 5,
explosion = 11,
};
update
地图的更新方法检测是否有炸弹需要爆炸,是否有效果需要消失。
pub fn update(self: *WorldMap) void {
const time = engine.time();
for (self.data, 0..) |*value, index| {
if (value.contains(.bomb)) {
if (time > value.time + 3000) {
self.explosion(value, index);
self.player1().bombNumber -|= 1;
}
}
if (value.contains(.explosion)) {
if (time > value.time + 700) {
value.remove(.explosion);
}
}
if (value.contains(.fireX)) {
if (time > value.time + 700) {
value.remove(.fireX);
}
}
if (value.contains(.fireY)) {
if (time > value.time + 700) {
value.remove(.fireY);
}
}
}
}
explosion
添加效果。
fn explosion(self: *WorldMap, mapUnit: *MapUnit, index: usize) void {
const time = engine.time();
mapUnit.remove(.bomb);
mapUnit.insertTime(.explosion, time);
// 左
doExplosion(&self.data[index -| 1], .fireX, time);
// 右
doExplosion(&self.data[index + 1], .fireX, time);
// 上
doExplosion(&self.data[index - width], .fireY, time);
// 下
doExplosion(&self.data[index + width], .fireY, time);
}
fn doExplosion(mapUnit: *MapUnit, mapType: MapType, time: usize) void {
if (mapUnit.contains(.wall)) return;
if (mapUnit.contains(.brick)) mapUnit.remove(.brick);
mapUnit.insertTime(mapType, time);
}
显示
pub fn draw(self: WorldMap) void {
for (0..self.height) |y| {
for (0..self.width) |x| {
const value = data[x + y * self.width];
if (value.contains(.wall)) drawEnum(.wall, x, y) //
else if (value.contains(.brick)) drawEnum(.brick, x, y) //
else {
drawEnum(.space, x, y);
if (value.contains(.explosion)) drawEnum(.explosion, x, y) //
else if (value.contains(.fireX)) drawEnum(.fireX, x, y) //
else if (value.contains(.fireY)) drawEnum(.fireY, x, y);
if (value.contains(.power)) drawEnum(.power, x, y) //
else if (value.contains(.bomb)) drawEnum(.bomb, x, y);
}
}
}
for (self.roles) |value| {
const x = value.x / speedUnit;
tileMap.drawXY(x, value.y / speedUnit, @intFromEnum(value.type));
}
}
效果

总结
实现了爆炸后的效果。

浙公网安备 33010602011771号