アマゾンバナーリンク

この素晴らしい弾幕に祝福を

昨日最後の弾幕を作り終わりました。
そして、はっかりわかったことがあります。
私はゲームが作りたいというより弾幕を作りたいのだ!!!!
なのでこの回はすべてソースコードで語ります。

滅罪正直者の死

public class CShouzikimononosi : CBossBulletFactory
{
    public CShouzikimononosi(MOVE_BOSS_POS move_boss_pos) : base(move_boss_pos)
    {
        SGP.SpelName = "滅罪「正直者の死」";
    }
    int num = 0;
    public override bool Run(double x, double y)
    {
        const int TM012 = 300;
        int i, j, t = Cnt % TM012, t2 = Cnt;
        double angle, bx, by;
        int plmn;
        if (t2 == 0) num = 0;
        //60カウント以下で10カウントに1回
        if (t2 % 2 == 0)
        {
            int[] set_x = { -90, -40, 40, 90 }, set_y = { -30, 30, 30, -30 };
            double tmangle = PI / 6;
            for (j = 0; j < 4; j++)
            {
                bx = x + set_x[j];
                by = y + set_y[j];
                angle = SGP.GetPlayerAnglePI2(x, y);
                for (i = 0; i < 8; i++)
                {
                    SGP.CreateBullet(x: x + set_x[j], y: y + set_y[j], graph_type: 8,
                        angle: angle + tmangle / 2 - tmangle * 4 + tmangle * i + Math.Sin(PI2 / 25 * t) * PI / 
                        speed: 6.0, state: 0, pi2or1: 1.0, se_flag:false);                            
                }
            }
            SGP.PlaySound(0); ;
        }
        if (t2 % 9 == 0 && t2 > 60)
        {
            angle = SGP.GetPlayerAnglePI2(x,y);
            double tmangle = PI * 0.495 / 15;
            for (i = 0; i < 15; i++)
            {
                SGP.CreateBullet(x: x, y: y,
                    graph_type: 13, color: 0, angle: angle - tmangle * 7 + tmangle * i,
                    speed: 3.0, state: 0, pi2or1: 1.0);
            }
        }
        if (t == 120)
        {
            plmn = (num % 2 != 0 ? -1 : 1);
            SGP.Lazer.Add(new CLazer(
                col: 0, knd: 0, angle: SGP.GetPlayerAnglePI2(x, y) - PI / 7 * plmn,
                startpt_x: x, startpt_y: y, width: 1, state: 0, length: 500, hantei: 0));
            SGP.PlaySound(11);
        }
        plmn = (num % 2 != 0? -1 : 1);
        for (i = 0; i < SGP.Lazer.Count; i++)
        {
            int cnt = SGP.Lazer[i].Cnt;
            int state = SGP.Lazer[i].State;
            if (state == 0)
            {
                if (cnt < 180)
                {
                    SGP.Lazer[i].Angle += PI / 2 / 180 * plmn;
                }
                if (30 < cnt && cnt <= 45)
                {
                    SGP.Lazer[i].Width += 0.3;
                }
                if (cnt == 51)
                    SGP.Lazer[i].Hantei = 1;
                if (180 < cnt && cnt <= 200)
                {
                    SGP.Lazer[i].Width -= 0.3;
                    SGP.Lazer[i].Hantei = 0;
                }
                if (cnt == 200)
                    SGP.Lazer[i].Life = 0;
            }          
        }
        if (t == TM012 - 1)
            num = (++num);
        ++Cnt;
        return true;
    }
}

反魂蝶~八部咲き~

public class CHangontyou : CBossBulletFactory
{
    public CHangontyou(MOVE_BOSS_POS move_boss_pos) : base(move_boss_pos)
    {
        SGP.SpelName = "反魂蝶~八部咲き~";
    }
    int num = 0;
    public override bool Run(double x, double y)
    {
        const int TM009 = 420;
        const int DIST = 60;
        int i, j, s, t = Cnt % TM009, t2 = Cnt;
        double angle;
        
        if (t2 == 0) num = 4;
        if (t == 0)
        {
            for (j = 0; j < 2; j++)
            {
                for (i = 0; i < num; i++)
                {
                    angle = PI2 / num * i + PI2 / (num * 2) * j + PI2 / (num * 4) * ((num + 1) % 2);
                    int plmn = (j != 0? -1 : 1);
                    SGP.Lazer.Add(new CLazer(col: j, knd: 0,
                        angle: angle,
                        startpt_x: x + Math.Cos(angle) * DIST, startpt_y: y + Math.Sin(angle) * DIST,
                        width: 2, state: j, length: 310, hantei: 0, conv_flag: 1,
                        lphy_conv_base_x: x, lphy_conv_base_y: y, lphy_angle: PI / num * plmn, 80));
                }
            }
            SGP.PlaySound(11);
        }
        //60カウント以下で10カウントに1回
        if (t == 50)
        {
            angle = CUtility.Rang(PI);//自機とボスとの成す角
            for (s = 0; s < 2; s++)
            {
                for (t = 0; t < 3; t++)
                {
                    for (j = 0; j < 3; j++)
                    {
                        for (i = 0; i < 30; i++)
                        {
                            SGP.CreateBullet(color: s, x: x, y: y, graph_type: 11,
                                angle: angle + PI2 / 30 * i + PI2 / 60 * s,
                                speed: 1.8 - 0.2 * j + 0.1 * s, state: t, pi2or1:1.0);                           
                        }
                    }
                }
            }
        }
        if (t >= 170 && t < 310 && (t - 170) % 35 == 0)
        {
            int div = ((t - 170) % 70 == 0) ? -1 : 1;
            angle = CUtility.Rang(PI);//自機とボスとの成す角
            for (s = 0; s < 2; s++)
            {//速度の違う2つの弾がある
                for (t = 0; t < 3; t++)
                {//1箇所から3つにわかれる
                    for (i = 0; i < 30; i++)
                    {//1周30個
                        SGP.CreateBullet(color: 2, x: x, y: y, graph_type: 11,
                            angle: angle + PI2 / 30 * i, speed: 2 - 0.3 * s,
                            state: 10 + t, base_angle: PI / 300 * div, se_flag:false, pi2or1:1.0);
                    }
                }
                SGP.PlaySound(0);
            }
        }
        if (t == 360)
        {
            angle = CUtility.Rang(PI);//自機とボスとの成す角
            for (t = 0; t < 3; t++)
            {//1箇所から3つに分かれる
                for (i = 0; i < 30; i++)
                {
                    SGP.CreateBullet(color: 1, x: x, y: y, graph_type: 0,
                        angle: angle + PI2 / 30 * i, speed: 1.8,
                        state: 20 + t, se_flag: false, pi2or1:1.0);
                }
            }
            SGP.PlaySound(0);
        }
        for (i = 0; i < SGP.Bullet.Count; i++)
        {
            int cnt = SGP.Bullet[i].Cnt;
            int state = SGP.Bullet[i].State;
            if (state % 10 == 0)
            {
                if (cnt > 90 && cnt <= 100)
                    SGP.Bullet[i].Speed -= SGP.Bullet[i].Speed / 220;
            }
            if (state % 10 == 1)
            {
                if (cnt > 50)
                    SGP.Bullet[i].Speed += SGP.Bullet[i].Speed / 45;
            }
            if (state % 10 == 2)
            {
                if (cnt > 65)
                    SGP.Bullet[i].Speed += SGP.Bullet[i].Speed / 90;
            }
            if (10 <= state && state <= 12)
            {
                if (cnt > 15 && cnt <= 80)
                    SGP.Bullet[i].Angle += SGP.Bullet[i].BaseAngle;
            }
        }
        for (i = 0; i < SGP.Lazer.Count; i++)
        {
            int cnt = SGP.Lazer[i].Cnt;
            int state = SGP.Lazer[i].State;
            if (state == 0 || state == 1)
            {
                if (cnt == 80)
                {
                    SGP.Lazer[i].Width = 10;
                    SGP.Lazer[i].Hantei = 0.5;
                }
                if (cnt >= 260 && cnt <= 320)
                {
                    if (cnt == 280)
                        SGP.Lazer[i].Hantei = 0;
                    SGP.Lazer[i].Width = 10 * (60 - (cnt - 260)) / 60.0;
                    if (cnt == 320)
                        SGP.Lazer[i].Life = 0;
                }
            }             
        }
        if (t == TM009 - 1)
            num = (++num);
        ++Cnt;
        return true;
    }
}

ありがとう弾幕よ2か月間楽しかった!純粋にプログラミングを楽しんでた懐かしいあの頃を思い出したよ。