0456-Bomb-实现爆炸效果

环境

  • Time 2024-03-21
  • Zig 0.12.0-dev.3152+90c1a2c41
  • WSL-Ubuntu 22.04.3 LTS
  • raylib 5.0

前言

说明

参考资料:

  1. 《游戏开发:世嘉新人培训教材》
  2. 图片素材: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));
        }
    }

效果

bomb

总结

实现了爆炸后的效果。

附录

posted @ 2026-08-16 08:53  jiangbo4444  阅读(5)  评论(0)    收藏  举报