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