前回(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にしようと思ったのですが,普通に死にました.