みたいな話題があったので、前に自分が作ったデータ追い出しの実例をと。
といっても弾幕ではなく画面レイアウトの仕組みです。
まずこんなデータがある。
今になってみると結構面倒な仕組みになってるんだけど、これが何をやっているのかというと
画面の画像配置情報のデータである。
Layoutという要素は「これからレイアウトデータを読み込みますよ」的な意味がある。
LytObjectというのは実際に画面に表示されるオブジェクト。
・名前
・座標
・拡大率
・透過度
・オブジェクトサイズ
・回転角度
・画像ファイルパス
などを持つ。
頂点カラーやXYZスケールを持つ場合もあるがDXライブラリ用なのでそこまで対応していない。
これを解析する仕組みを用意して、専用のデータ形式に落とし込む。
あとはそのデータに合わせてオブジェクトを生成する
レイアウトの最上位にいるのはルートオブジェクト。
LytObject要素の中にLytObjectがある場合は親子階層を意味する。
この場合、NoNameはRootObjectの子にあたるが、NoName_0、NoName_1、NoName_2はNoNameの子オブジェクトとなる。
親子階層が成立している場合、子オブジェクトの座標は親オブジェクトの座標に依存する。
親が移動すると子も一緒になって移動するといった感じです。
PlayAnimDataという要素はアニメーションをさせる仕組み。
読み込んで関数一発呼ぶと定義された内容のアニメーションを再生する。
X,Y,Z,Rot,Scale,Alphaなどのパラメータを変動させることでFLASHみたいなアニメーションを実現します。
実際にこれを動かすコードはこんな感じ。
#include "DxLib\DxLib.h"
#include "layout\layout.h"
class Obj_1 : public ObjBinder{
public :
virtual void OnInit(){
bindObject( "NoName" );
playAnim(1);
}
virtual void OnUpdate(){
ObjBinder::OnUpdate();
static int hit = 0;
static int hit_next = 0;
hit_next = CheckHitKey( KEY_INPUT_Z );
if( hit != hit_next ){
hit = hit_next;
if( hit ){
playAnim(0);
}
}
}
};
class Obj_2 : public ObjBinder {
public :
virtual void OnInit(){
bindObject( "NoName_0" );
}
};
class Obj_3 : public ObjBinder{
public :
virtual void OnInit(){
bindObject( "NoName_1" );
}
};
class Obj_4 : public ObjBinder {
public :
virtual void OnInit(){
bindObject( "NoName_2" );
playAnim(2);
}
};
INT WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nShowCmd ){
ChangeWindowMode( TRUE );
DxLib_Init();
SetDrawScreen( DX_SCREEN_BACK );
DrawLayout lyt_1;
DrawLayout lyt_2;
lyt_1.loadFile( "LayoutSetting.xml" );
lyt_2.loadFile( "LayoutSetting_2.xml" );
lyt_1.entryObjFromRoot( new Obj_1() );
lyt_1.entryObjFromRoot( new Obj_2() );
lyt_1.entryObjFromRoot( new Obj_3() );
lyt_1.entryObjFromRoot( new Obj_4() );
while( ProcessMessage() == 0 ){
ClsDrawScreen();
lyt_1.process();
lyt_2.process();
if( CheckHitKey( KEY_INPUT_ESCAPE ) == 1 ){
break;
}
ScreenFlip();
}
DxLib_End();
lyt_1.finalize();
lyt_2.finalize();
return 0;
}
bindObjectというメソッドで指定のオブジェクトをコントロールできるようにする。
画面の素材配置と移動演出はこのようなデータに追い出すことで、処理が小ざっぱりとする。
最後にfinalizeメソッドを呼ぶことでレイアウトが管理するオブジェクトを全て解放する。
肝心の下の作りは汚すぎるのでここに書くのは止めておくとして。。。。
ゲームにおいての「データにする」の方法論の一つであります。
ではでは