●「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 ; }