Example #1
0
    public static T NewCannon <T>(this PKG.CatchFish.Configs.Config cfg) where T : PKG.CatchFish.Configs.Cannon, new()
    {
        var t = new T();

        t.id = cfg.cannons.dataLen;
        cfg.cannons.Add(t);
        return(t);
    }
Example #2
0
    public static T NewFish <T>(this PKG.CatchFish.Configs.Config cfg) where T : PKG.CatchFish.Configs.Fish, new()
    {
        var f = new T();

        f.id = cfg.fishs.dataLen;
        cfg.fishs.Add(f);
        return(f);
    }
Example #3
0
    public static PKG.CatchFish.Stages.Stage NewStage(PKG.CatchFish.Configs.Config cfg, int cfg_endTicks)
    {
        var s = new PKG.CatchFish.Stages.Stage();

        s.cfg    = cfg;
        s.cfg_id = cfg.stages.dataLen;
        cfg.stages.Add(s);
        s.elements     = new xx.List <PKG.CatchFish.Stages.StageElement>();
        s.monitors     = new xx.List <PKG.CatchFish.Stages.StageElement>();
        s.cfg_endTicks = cfg_endTicks;
        s.ticks        = -1; // 方便前置 ++ 变成 0
        return(s);
    }
Example #4
0
    static void Main(string[] args)
    {
        // 注册序列化类型
        PKG.AllTypes.Register();

        // 填充 ways
        Ways.Fill();

        // 填充 frames, fishFrames
        SpriteFrames.Fill();

        // 创建配置实例
        var cfg = new PKG.CatchFish.Configs.Config();

        cfg.cannons     = new xx.List <PKG.CatchFish.Configs.Cannon>();
        cfg.fishs       = new xx.List <PKG.CatchFish.Configs.Fish>();
        cfg.sitPositons = new xx.List <xx.Pos>();
        cfg.stages      = new xx.List <PKG.CatchFish.Stages.Stage>();
        cfg.fixedWays   = new xx.List <PKG.CatchFish.Way>();
        cfg.weapons     = new xx.List <PKG.CatchFish.Configs.Weapon>();

        // 基于 1280 x 720 的设计尺寸
        cfg.sitPositons.Add(new xx.Pos {
            x = -250, y = -335
        });
        cfg.sitPositons.Add(new xx.Pos {
            x = 250, y = -335
        });
        cfg.sitPositons.Add(new xx.Pos {
            x = 250, y = 335
        });
        cfg.sitPositons.Add(new xx.Pos {
            x = -250, y = 335
        });
        cfg.aimTouchRadius          = 20;
        cfg.normalFishMaxRadius     = 150;
        cfg.enableBulletFastForward = false;

        // 有前后依赖
        Cannons.Fill(cfg);
        Weapons.Fill(cfg);
        Fishs.Fill(cfg);
        Stages.Fill(cfg);

        // cfg 序列化存盘
        var bb = new xx.BBuffer();

        bb.WriteRoot(cfg);
        File.WriteAllBytes(Path.Combine(outputPath, "cfg.bin"), bb.DumpData());
        bb.ReadRoot(ref cfg);   // test read
    }
Example #5
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        // 炸弹武器
        {
            var w = cfg.NewWeapon <PKG.CatchFish.Configs.Weapon>();
            w.txt           = "Bomb";
            w.cannon        = null; // 无 cannon 对应
            w.distance      = 0;    // 不移动
            w.showNumFrames = 120;  // 120 帧后爆炸. 同时也是预约时长
            w.explodeRadius = 300;  // 爆炸半径
            // 先忽略
            //w.frames
            //w.scale
            //w.zOrder
        }

        // todo
        // 闪电 狂暴 钻头
        //w1.cannon 指向 闪电 狂暴 钻头 cannon
    }
Example #6
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        var f1 = new PKG.CatchFish.Configs.Fish();

        f1.id = cfg.fishs.dataLen;
        cfg.fishs.Add(f1);
        f1.minCoin         = 1;
        f1.maxCoin         = 3;
        f1.minDetectRadius = 6;
        f1.maxDetectRadius = 32;
        f1.scale           = 1;
        f1.zOrder          = 3;
        f1.shadowOffset    = new xx.Pos {
            x = 5, y = 5
        };
        f1.shadowScale = 1;
        FillFishFrames(f1, "xiaochouyu_move", 30, "xiaochouyu_die", 10, 2.5f);


        var f2 = new PKG.CatchFish.Configs.BigFish();

        f2.id = cfg.fishs.dataLen;
        cfg.fishs.Add(f2);
        f2.minCoin         = 50;
        f2.maxCoin         = 50;
        f2.minDetectRadius = f1.minDetectRadius;
        f2.maxDetectRadius = f1.maxDetectRadius;
        f2.scale           = 6;
        f2.zOrder          = 4;
        f2.shadowOffset    = new xx.Pos {
            x = 10, y = 10
        };
        f2.shadowScale = f1.shadowScale;
        f2.frames      = f1.frames;
        f2.moveFrames  = f1.moveFrames;
        f2.dieFrames   = f1.dieFrames;

        f2.moveFrameDistance = 2.5f;
        f2.numChilds         = 16;
        f2.childsAngleInc    = (float)(Math.PI / 90.0);
    }
Example #7
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        {
            var c = cfg.NewCannon <PKG.CatchFish.Configs.Cannon>();
            c.frames = new xx.List <PKG.CatchFish.Configs.SpriteFrame>();
            c.frames.Add(GetSpriteFrame("pao_01"));
            c.frames.Add(GetSpriteFrame("zidan_01"));
            c.frames.Add(GetSpriteFrame("yuwang_1"));
            c.angle              = (float)(90.0 * Math.PI / 180.0);
            c.quantity           = -1;
            c.muzzleLen          = 200;
            c.numLimit           = 30;
            c.scale              = 1f;
            c.fireCD             = 6;
            c.zOrder             = 100;
            c.radius             = 6;
            c.maxRadius          = 60;
            c.distance           = 720 / 30; //720 / 60;  // 1秒钟上下穿越屏幕?
            c.enableBulletBounce = true;
        }

        // todo: fury, drill
    }
Example #8
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        {
            var c = new PKG.CatchFish.Configs.Cannon();
            c.id = cfg.cannons.dataLen;
            cfg.cannons.Add(c);

            c.frames = new xx.List <PKG.CatchFish.Configs.SpriteFrame>();
            c.frames.Add(GetSpriteFrame("pao_01"));
            c.frames.Add(GetSpriteFrame("zidan_01"));
            c.frames.Add(GetSpriteFrame("yuwang_1"));
            c.angle              = (float)(90.0 * Math.PI / 180.0);
            c.quantity           = -1;
            c.muzzleLen          = 200;
            c.numLimit           = 120;
            c.scale              = 0.6f;
            c.fireCD             = 1;
            c.zOrder             = 100;
            c.radius             = 6;
            c.maxRadius          = 200;
            c.distance           = 720 / 60; // 1秒钟上下穿越屏幕?
            c.enableBulletBounce = true;
        }
    }
Example #9
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        // 随机小鱼 + 炸弹
        {
            var s = NewStage(cfg, 60 * 60);                             // 关卡持续时长帧数
            {
                var e = NewElement <PKG.CatchFish.Stages.Emitter_RandomFishs>(s);
                e.cfg_bornTicksInterval = 20;                           // 每隔多少帧刷 1 只
                e.cfg_coin      = 3;
                e.cfg_scaleFrom = 2;                                    // 体积范围
                e.cfg_scaleTo   = 3;
            }
            {
                // 自动补炸弹
                var m = NewMonitor <PKG.CatchFish.Stages.Monitor_KeepBombFish>(s);
                m.cfg_bornTicksInterval    = 0;
                m.cfg_numFishsLimit        = 1;                          // 总只数限制
                m.cfg_bornDelayFrameNumber = 120;                        // 预约 xx 帧 后再生( 预约时间太短客户端容易掉线 )
                m.cfg_endTicks            -= m.cfg_bornDelayFrameNumber; // 监视器结束时间 应早于 关卡结束时间 - 预约延迟
            }
        }

        // BOSS: 大鱼周围环绕小鱼
        {
            var s = NewStage(cfg, 60 * 60);                             // 关卡持续时长帧数
            {
                // 自动补 BOSS
                var m = NewMonitor <PKG.CatchFish.Stages.Monitor_KeepBigFish>(s);
                m.cfg_bornTicksInterval    = 30;
                m.cfg_numFishsLimit        = 2;                          // 总只数限制
                m.cfg_bornDelayFrameNumber = 120;                        // 预约 xx 帧 后再生( 预约时间太短客户端容易掉线 )
                m.cfg_endTicks            -= m.cfg_bornDelayFrameNumber; // 监视器结束时间 应早于 关卡结束时间 - 预约延迟
            }
        }
        // 大量随机小鱼
        {
            var s = NewStage(cfg, 60 * 10);                             // 关卡持续时长帧数
            {
                var e = NewElement <PKG.CatchFish.Stages.Emitter_RandomFishs>(s);
                e.cfg_bornTicksInterval = 2;                            // 每隔多少帧刷 1 只
                e.cfg_coin      = 2;
                e.cfg_scaleFrom = 2;                                    // 体积范围
                e.cfg_scaleTo   = 3;
            }
        }
        // 组合
        {
            var s = NewStage(cfg, 60 * 60);
            {
                // 旋转出鱼--0
                var e1 = NewElement <PKG.CatchFish.Stages.Emitter_CircleFishs>(s);
                e1.cfg_endTicks         /= 2;                            // 停止运作时间为关卡时长的一半
                e1.cfg_angleBegin        = 0;                            // 起始角度
                e1.cfg_angleIncrease     = (float)(System.Math.PI / 30); // 每生成一只鱼的累加角度
                e1.cfg_bornTicksInterval = 3;                            // 两只鱼生成帧间隔
                e1.cfg_speed             = 3;                            // 每帧移动像素跨度
                e1.cfg_scale             = 1;                            // 体积
                e1.cfg_coin = 1;
                e1.angle    = e1.cfg_angleBegin;
                {
                    // 旋转出鱼--180
                    var e1a = CloneElement(e1);
                    e1a.angle = e1a.cfg_angleBegin = (float)System.Math.PI;
                }

                // 圆环鱼阵--小鱼
                var e2 = NewElement <PKG.CatchFish.Stages.Emitter_RingFishs>(s);
                e2.cfg_beginTicks        = e1.cfg_endTicks;             // 生效时间:位于 旋转出鱼 结束之后
                e2.cfg_numFishsPerBatch  = 36;                          // 每波产生多少只
                e2.cfg_bornTicksInterval = 60;                          // 波与波之间生成帧间隔
                e2.cfg_speed             = 3;
                e2.cfg_scale             = 1;
                e2.cfg_coin = 1;
                {
                    // 圆环鱼阵--中鱼( 与 圆环鱼阵--小鱼 交叠起作用 )
                    var e2a = CloneElement(e2);
                    e2a.cfg_beginTicks      += e2.cfg_bornTicksInterval / 2; // 生效时间:比 圆环鱼阵--小鱼 晚 波与波之间生成帧间隔 / 2
                    e2a.cfg_numFishsPerBatch = 18;
                    e2a.cfg_scale            = 2;
                    e2a.cfg_coin             = 2;
                }
            }
            {
                // 自动补肥鱼
                var m = NewMonitor <PKG.CatchFish.Stages.Monitor_KeepFatFish>(s);
                m.cfg_bornTicksInterval = 30;
                m.cfg_coin                 = 10;
                m.cfg_scaleFrom            = 4;
                m.cfg_scaleTo              = 5;
                m.cfg_numFishsLimit        = 2;                          // 总只数限制
                m.cfg_bornDelayFrameNumber = 120;                        // 预约 xx 帧 后再生( 预约时间太短客户端容易掉线 )
                m.cfg_endTicks            -= m.cfg_bornDelayFrameNumber; // 监视器结束时间 应早于 关卡结束时间 - 预约延迟
            }
        }
    }
Example #10
0
    public static void Fill(PKG.CatchFish.Configs.Config cfg)
    {
        // 一般 / 通用鱼
        var f1 = cfg.NewFish <PKG.CatchFish.Configs.Fish>();

        f1.minCoin         = 1;
        f1.maxCoin         = 3;
        f1.minDetectRadius = 6;
        f1.maxDetectRadius = 32;
        f1.scale           = 1;
        f1.zOrder          = 3;
        f1.shadowOffset    = new xx.Pos {
            x = 5, y = 5
        };
        f1.shadowScale = 1;
        FillFishFrames(f1, "xiaochouyu_move", 30, "xiaochouyu_die", 10, 2.5f);

        // 小鱼环绕鱼
        {
            var f2 = cfg.NewFish <PKG.CatchFish.Configs.BigFish>();
            f2.minCoin         = 50;
            f2.maxCoin         = 50;
            f2.minDetectRadius = f1.minDetectRadius;
            f2.maxDetectRadius = f1.maxDetectRadius;
            f2.scale           = 6;
            f2.zOrder          = 4;
            f2.shadowOffset    = new xx.Pos {
                x = 10, y = 10
            };
            f2.shadowScale = f1.shadowScale;
            f2.frames      = f1.frames;
            f2.moveFrames  = f1.moveFrames;
            f2.dieFrames   = f1.dieFrames;

            f2.moveFrameDistance = 2.5f;
            f2.numChilds         = 16;
            f2.childsAngleInc    = (float)(Math.PI / 90.0);
        }

        // 炸弹鱼
        {
            var f3 = cfg.NewFish <PKG.CatchFish.Configs.ColorFish>();
            f3.minCoin         = 100;
            f3.maxCoin         = 100;
            f3.minDetectRadius = f1.minDetectRadius;
            f3.maxDetectRadius = f1.maxDetectRadius;
            f3.scale           = 7;
            f3.zOrder          = 5;
            f3.shadowOffset    = new xx.Pos {
                x = 12, y = 12
            };
            f3.shadowScale = f1.shadowScale;
            f3.frames      = f1.frames;
            f3.moveFrames  = f1.moveFrames;
            f3.dieFrames   = f1.dieFrames;

            f3.moveFrameDistance = 0.8f;
            f3.r      = 255;
            f3.g      = 0;
            f3.b      = 0;
            f3.weapon = cfg.weapons.FirstOrDefault(w => w.id == 0);
        }

        // todo
        //// 闪电鱼
        //// 狂暴鱼
        //// 钻头鱼
    }