●「DXライブラリを使ってMMDモデルを表示するプログラム」を,キャラクターをクラスとして表すようにC++版として書き直した場合。
main.cpp
#include <DxLib.h>
// ゲームのキャラクターを表すクラス
class Character {
public :
int modelHandle1; // 読み込んだ3Dモデルデータの番号を記録しておく変数
int attachIndex; // アタッチされたアニメーションの番号を記録しておく変数
float animTime000; // アニメーションの総再生時間を記録しておく変数
/*
* コンストラクタ
* 第1引数:MMD3Dモデルデータのファイルパス
* 第2引数:モーションデータと一緒に読み込んだモーションデータのうち、何番目のモーションを初期モーションとしてアタッチするか
* 第3引数:他のモデルデータに読み込み済みのモーションをアタッチする場合に、そのモデルデータ番号を渡す。-1の場合は第1引数と同じ値を指定したことになる。
* 第4引数:他のモデルからモーションデータを借りる場合(第3引数が-1)、この3Dモデルの階層構造の名称(フレーム名)とモーションデータが前提としているフレーム名
* が一致していない場合、どうするか。(TRUE: アタッチしない, FALSE:アタッチする)
*/
Character(const char * modelPath, int AnimIndex, int AnimSrcMHandle = -1, int NameCheck = FALSE ) {
// キャラクタ用3Dモデルデータとアニメーションデータの読み込み
modelHandle1 = MV1LoadModel( modelPath );
// キャラクタ用アニメーションデータをアタッチ
attachIndex = MV1AttachAnim( modelHandle1, AnimIndex, AnimSrcMHandle, NameCheck );
// アタッチしたアニメーションの再生時間を得る
animTime000 = MV1GetAttachAnimTotalTime( modelHandle1, attachIndex );
}
};
// ゲームのステージを表すクラス
class Stage {
public :
int modelHandle_BG; // 読み込んだステージ用3Dモデルデータの番号を記録しておく変数
// コンストラクタ
Stage(const char * modelPath) {
modelHandle_BG = MV1LoadModel( modelPath ); // ステージの3Dデータを読み込む
}
};
// カメラを表すクラス
class Camera {
public :
int SetCameraNearFar(float Near, float Far) {
// 大域の同名関数(DXライブラリ所属)を呼び出す
return ::SetCameraNearFar(Near, Far);
}
int SetCameraPositionAndTarget_UpVecY(VECTOR Position, VECTOR Target) {
// 大域の同名関数(DXライブラリ所属)を呼び出す
return ::SetCameraPositionAndTarget_UpVecY( Position, Target );
}
};
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
DxLib_Init(); // DXライブラリを初期化する
ChangeWindowMode( TRUE ); // ゲーム画面をウィンドウで表示するように指定する
SetDrawScreen( DX_SCREEN_BACK ); // 描写先を裏画面にする
float theTime; // アニメーションの再生時間を記録しておく変数
Character * naka = new Character( "那珂ver1.01/那珂ver1.0.1.pmd", 0 );
Stage * stage = new Stage("かぼちゃステージ/カボチャステージ(空セット).pmx");
Camera * mainCamera = new Camera();
//カメラの描写範囲(奥行)を0.1〜10000.0に設定する
mainCamera->SetCameraNearFar(0.1, 10000.0);
//( 0.0, 9.0, -22.0 )の位置にカメラを設置し、視線を( 0.0, 10.0, 0.0 )にあるターゲットへ向ける。
mainCamera->SetCameraPositionAndTarget_UpVecY(VGet(0.0, 9.0, -22.0), VGet(0.0, 10.0, 0.0));
// ゲーム内時間の初期化
theTime = 0.0;
// ウインドウが開いている間はループする
while( ! ProcessMessage() ){
// 描写先の画面(裏画面)を消去する
ClearDrawScreen();
// 3Dモデル1の位置を得る。
VECTOR p = MV1GetPosition( naka->modelHandle1 );
// 現在の再生時間をセットする
MV1SetAttachAnimTime( naka->modelHandle1, naka->attachIndex, theTime );
// 3Dモデルの描画
MV1DrawModel( stage->modelHandle_BG ); // ステージのグラフィック(背景)を描写
MV1DrawModel( naka ->modelHandle1 ); // キャラクターを描写
// 完成した裏画面の内容を表画面(ゲームのウィンドウ)に転写
ScreenFlip();
// キー(ゲームコントローラー)の状態を得る
int keyInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
if( keyInput == PAD_INPUT_DOWN ) {
p.z = p.z - 0.5;
}
if( keyInput == PAD_INPUT_UP ) {
p.z = p.z + 0.5;
}
if( keyInput == PAD_INPUT_LEFT ) {
p.x = p.x - 0.5;
}
if( keyInput == PAD_INPUT_RIGHT ) {
p.x = p.x + 0.5;
}
// モデルの位置を更新する
MV1SetPosition( naka->modelHandle1, p );
// 次の描写のためにゲーム内時間を更新する
theTime = theTime + 0.4;
// ゲーム内時間がアニメーションの再生時間を超えたら再生時間をリセットする
if( theTime >= naka->animTime000 ) theTime = 0.0;
}
DxLib_End(); // DXライブラリの後処理を行う
return 0 ;
}