アマゾンバナーリンク

画像弾幕を実際に打ってみる

デシリアライズ してバイナリデータを読み込む

前回のツールで作ったバイナリファイルをデシリアライズして弾幕データを読み込んで使用します。
デシリアライズするの注意も前回同様にクラス名の前に[Serializable](属性)を付ける事です。LoadFromBinaryFileで読み込んだデータをCBl_t型にして、BLに入れます。
この時にusing System.Runtime.Serialization.Formatters.Binary;を一番上に書くのを忘れないようにしましょう。そして前回も言った注意点のおさらい↓構造体でなくクラスを使いましょう。

弾幕の制御

BLには画像の弾幕の情報がすべて入っています。

あとはRun関数で400周期に1回のペースで弾幕を繰り返し打ちます。
カウントが50の時にボスの座標を中心にBl.Pt[i].xとBl.Pt[i].yの座標を足した値が弾幕の初期位置です。
角度はsx,syとなす角度をMath.Atan2で取得します。
Speedに関してはMath.Sqrt(sx * sx + sy * sy)←平方根を使うことによって直角三角形の斜辺の長さが求められます。1フレームでその値だけ進むという事です。

計算部では、Speedに1.001をかけて少しずつ弾速を上げてます。
さらにカウントが180を超えると1.01をかけることによってさらに弾速を上げます。

 public class CImageBullet : CBossBulletFactory
 {
     /* AAデータを作成する合計枚数 */
     const int BULLET_MAX = 4000;

     [Serializable]
     //弾の座標(55)
     public class Pt_t
     {
         public float x, y;
     };
     [Serializable]
     //置いた弾の構造体
     public class CBl_t
     {
         public int num;//現在置いた弾数
         public Pt_t[] Pt = new Pt_t[BULLET_MAX];
     };

     CBl_t Bl = new CBl_t();

     public CImageBullet(MOVE_BOSS_POS move_boss_pos) : base(move_boss_pos)
     {
         Bl = (CBl_t)LoadFromBinaryFile("miina.dat");
         SpelName = "絵文字弾幕";
         
     }
     public object LoadFromBinaryFile(string path)
     {
         FileStream fs = new FileStream(path,
             FileMode.Open,
             FileAccess.Read);
         BinaryFormatter f = new BinaryFormatter();
         //読み込んで逆シリアル化する
         object obj = f.Deserialize(fs);
         fs.Close();
         return obj;
     }

     public override bool Run(double x, double y)
     {
         int i, t = Cnt % 400, t2 = Cnt;
         if (t == 50)
         {
             for (i = 0; i < Bl.num; i++)
             {
                 float sx = Bl.Pt[i].x, sy = Bl.Pt[i].y;
                 if (sx == 0 && sy == 0)
                 {
                     continue;
                 }
                 SGP.CreateBullet(x: x + sx, y: y + sy,
                 angle: Math.Atan2(sy, sx), graph_type: 14, color: 1,
                 speed: Math.Sqrt(sx * sx + sy * sy),pi2or1:1.0);

             }
             SGP.PlaySound(0);
         }
         for (i = 0; i < SGP.Bullet.Count; i++)
         {
             int cnt = SGP.Bullet[i].Cnt;
             SGP.Bullet[i].Speed *= 1.001;
             if (cnt > 180)
             {
                 SGP.Bullet[i].Speed *= 1.01;
             }              
         }
         ++Cnt;
         return true;
     }
 }

実行結果

未分類

Posted by ジェイ