読者です 読者をやめる 読者になる 読者になる

凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

BMPファイルから弾幕を生成する(完成版)

愉繰郷 C++

前回(d:id:hecomi:20100728:1280296153),BMPファイルを読み込んで2値化し,弾を等間隔に配置していくプログラムを組みました.今回は,龍神録プログラミングの館(http://dixq.net/rp/)の第56章(http://dixq.net/rp/56.html)の内容を扱い,実際に弾幕にしてみた様子を紹介します.
愉繰郷?って方は,プロフィール(http://d.hatena.ne.jp/hecomi/about)を御覧ください.

データを読み込んで格納するクラス

ImgBullet.h

#pragma once

#include <fstream>
#include "Enemy.h"
#include "Bullet.h"
#include "Assist.h"
#include "Lazer.h"

#define BULLET_NUM_MAX 3000

/*! @brief 弾の座標 */
typedef struct {
	float X, Y;
} _BULLET_POS;

/*! @brief 読み出し用 */
typedef struct {
	int Num;
	_BULLET_POS Bullet[BULLET_NUM_MAX];
} _IMG_BULLET_INPUT_DATA;

class CImgBulletAssist : public CAssist
{
protected:
	int Num;
	_BULLET_POS* Bullet;
	float Size;

public:
	CImgBulletAssist(const char* fileName, CMover* parent)
		:	CAssist(SID_VOID, 0, parent->X, parent->Y), Num(0)
	{
		ifstream ifs(fileName, ios::in | ios::binary);
		if (ifs.fail()) {
			printfDx("Error@ImgBullet file open error:%s\n", fileName);
			return;
		}

		_IMG_BULLET_INPUT_DATA inputData;
		ifs.read(reinterpret_cast<char*>(&inputData), sizeof(inputData));
		Num = inputData.Num;
		Bullet = (_BULLET_POS*)malloc(sizeof(_BULLET_POS[BULLET_NUM_MAX]));
		memcpy(Bullet, inputData.Bullet, sizeof(_BULLET_POS[BULLET_NUM_MAX]));
	}

	~CImgBulletAssist()
	{
		free(Bullet);
	}
};

前回と同じメンバを持つ構造体を用意してバイナリでreadしてしまえば,構造体の中身に自動的に値がセットされるという寸法です.
あと,mallocしたりと周りくどいことをしていますが,弾の情報をそのままクラスのメンバとして格納してしまうと,クラスがバカでかいサイズとなってしまい,タスクリストの制約から望ましくありません.そこでmallocしてタスクリストとは別の場所に領域を確保し,memcpyすることにしています.C++で作ると言いながらスマートではありませんが….
あとは,このクラスを継承したアシストクラス(龍神録プログラミングの支館:http://sinkai.net/rp/24.phpを参考にしました)を作成し,構造体から情報を取り出して弾を配置すればOKです.

結果:内藤ホライゾン弾幕

要はブーン弾幕です. 「⊂二二二( ^ω^)二⊃ブーン」これです.研究室の友達のアイデアを借用しました.

1面Normalにしようと思ったのですが,普通に死にました.