0461-Bomb-连环爆炸效果

环境

  • Time 2024-03-23
  • 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

目标

如果在爆炸的路径上碰到了其它的炸弹,则会直接引爆其它炸弹,实现连环爆炸。

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);
        }
    }

效果

bomb

总结

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

附录

posted @ 2026-08-18 14:31  jiangbo4444  阅读(2)  评论(0)    收藏  举报