アマゾンバナーリンク

初心者弾幕講座その5 図柄弾幕

みなさんこんにちは!ジェイです。前回は特殊な弾幕を紹介しましたので、今回は図柄弾幕の実装の仕方を説明します。よくパロディウスとかで文字に当たり判定がある弾幕がありますよね?それを作ってみます。

上から下に図柄弾幕を発射

最初にC言語のコンソールでのコードを載せてます。

Timeがカウンター、Patternが発射する弾幕の図柄、Intervalが弾を発射する間隔、Widthが横幅、Heightが高さです。

C言語コンソール版

#include <stdio.h>

void Move();

char Pattern[]=
	"                                   "
	"                                   "
	"                                   "
	"####  #   # #     #     ##### #####"
	"#   # #   # #     #     #       #  "
	"####  #   # #     #     ####    #  "
	"#   # #   # #     #     #       #  "
	"####  ##### ##### ##### #####   #  ";
int Time, Interval=5, Width=35, Height=8,temp;

int main()
{
	for(int i = 0; i < Height*Interval; i++)
		Move();
	return 0;
}

void Move() {

	// 指定されたフレームおきに弾を撃つ
	if (Time%Interval == 0) {

		// 上から下バージョン
		temp = Time/Interval;

		// タイマーに応じて図柄を読む位置を決める
		char* p = Pattern+temp*Width;

		// 図柄を右から左へ読む
		for (int i = Width-1; i>=0; i--, p++) {

			// 図柄の空白以外の部分に対応する位置に弾を撃つ
			if (*p != ' ') {
				printf("#");
			} else {
				printf(" ");
			}
		}
		printf("\n");
	}

	// タイマー更新
	Time = (Time+1)%(Interval*Height);
}

C言語コンソール版 実行結果

C#版 ソースコード

public class CPatternShooter : CEnemy
{
    string[] Pattern =
    {
         "                                   ",
         "                                   ",
         "                                   ",
         "####  #   # #     #     ##### #####",
         "#   # #   # #     #     #       #  ",
         "####  #   # #     #     ####    #  ",
         "#   # #   # #     #     #       #  ",
         "####  ##### ##### ##### #####   #  "
    };

    int Interval = 5;
    public CPatternShooter(double x, double y)
    : base(x, y)
    {
        Cnt2 = Pattern.Length-1;
    }
    int Cnt2 = 0;
    public override bool Move()
    {
        // Intervalフレームおきに弾を撃つ;
        if (Cnt % Interval == 0)
        {
            int len = Cnt2 % Pattern.Length;
            int width = Pattern[Pattern.Length - len - 1].Length - 1;
            for (int i = width; i >= 0; i--)
            {
                if (Pattern[len][i] == '#')
                {
                    BC.Bullet.Add(new CBullet(x: X, y: Y, angle: 0.25 - 0.3 * ((double)i / (width - 1) - 0.5)
                        , speed: 2,graph_type:4,color:0));
                }
            }
            Cnt2 += Pattern.Length-1;
        }
        return base.Move();
    }
}

C#版 実行結果

dq

下から上に図柄弾幕を発射

内容は同じですが若干違うコードになるので下から上に図柄弾幕を発射するコードも紹介します。変わってる部分にハイライトを付けてます。

public class CPatternShooter2 : CEnemy
{
    string[] Pattern =
    {
         "                                   ",
         "                                   ",
         "                                   ",
         "####  #   # #     #     ##### #####",
         "#   # #   # #     #     #       #  ",
         "####  #   # #     #     ####    #  ",
         "#   # #   # #     #     #       #  ",
         "####  ##### ##### ##### #####   #  "
    };

    int Interval = 5;
    public CPatternShooter2(double x, double y)
    : base(x, y)
    {
        Cnt2 = Pattern.Length - 1;
    }
    int Cnt2 = 0;
    public override bool Move()
    {
        // Intervalフレームおきに弾を撃つ;
        if (Cnt % Interval == 0)
        {
            int len = Cnt2 % Pattern.Length;
            int width = Pattern[len].Length - 1;
            for (int i = 0; i < width; ++i)
            {
                if (Pattern[len][i] == '#')
                {
                    BC.Bullet.Add(new CBullet(x: X, y: Y, angle: 0.75 + 0.3 * ((double)i / (width - 1) - 0.5)
                        , speed: 2, graph_type: 4, color: 0));
                }
            }
            Cnt2 += 1;
        }
        return base.Move();
    }
}

下から上に図柄弾幕を発射 実行結果

今回の弾幕講座で使用したプロジェクトはこちらからダウンロードできます。