●「DXライブラリを使ってMMDモデルを表示するプログラム」を,キャラクターをクラスとして表すようにC++版として書き直した場合。

main.cpp

001#include <DxLib.h>
002 
003// ゲームのキャラクターを表すクラス
004class Character {
005    public :
006        int modelHandle1;  // 読み込んだ3Dモデルデータの番号を記録しておく変数
007        int attachIndex;   // アタッチされたアニメーションの番号を記録しておく変数
008        float animTime000; // アニメーションの総再生時間を記録しておく変数
009 
010        /*
011         * コンストラクタ
012         * 第1引数:MMD3Dモデルデータのファイルパス
013         * 第2引数:モーションデータと一緒に読み込んだモーションデータのうち、何番目のモーションを初期モーションとしてアタッチするか
014         * 第3引数:他のモデルデータに読み込み済みのモーションをアタッチする場合に、そのモデルデータ番号を渡す。-1の場合は第1引数と同じ値を指定したことになる。
015         * 第4引数:他のモデルからモーションデータを借りる場合(第3引数が-1)、この3Dモデルの階層構造の名称(フレーム名)とモーションデータが前提としているフレーム名
016         *      が一致していない場合、どうするか。(TRUE: アタッチしない, FALSE:アタッチする)
017         */
018        Character(const char * modelPath, int AnimIndex, int AnimSrcMHandle = -1, int NameCheck = FALSE ) {
019 
020            // キャラクタ用3Dモデルデータとアニメーションデータの読み込み
021            modelHandle1 = MV1LoadModel( modelPath );
022            // キャラクタ用アニメーションデータをアタッチ
023            attachIndex = MV1AttachAnim( modelHandle1, AnimIndex, AnimSrcMHandle, NameCheck );
024            // アタッチしたアニメーションの再生時間を得る
025            animTime000 = MV1GetAttachAnimTotalTime( modelHandle1, attachIndex );
026 
027        }
028};
029 
030// ゲームのステージを表すクラス
031class Stage {
032    public :
033        int modelHandle_BG; // 読み込んだステージ用3Dモデルデータの番号を記録しておく変数
034 
035        // コンストラクタ
036        Stage(const char * modelPath) {
037            modelHandle_BG = MV1LoadModel( modelPath ); // ステージの3Dデータを読み込む
038        }
039};
040 
041// カメラを表すクラス
042class Camera {
043public :
044 
045    int SetCameraNearFar(float Near, float Far) {
046        // 大域の同名関数(DXライブラリ所属)を呼び出す
047        return ::SetCameraNearFar(Near, Far);
048    }
049 
050    int SetCameraPositionAndTarget_UpVecY(VECTOR Position, VECTOR Target) {
051        // 大域の同名関数(DXライブラリ所属)を呼び出す
052        return ::SetCameraPositionAndTarget_UpVecY( Position, Target );
053    }
054};
055 
056int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ){
057 
058    DxLib_Init();                    // DXライブラリを初期化する
059    ChangeWindowMode( TRUE );        // ゲーム画面をウィンドウで表示するように指定する
060    SetDrawScreen( DX_SCREEN_BACK ); // 描写先を裏画面にする
061 
062    float theTime;     // アニメーションの再生時間を記録しておく変数
063 
064    Character  * naka       = new Character( "那珂ver1.01/那珂ver1.0.1.pmd", 0 );
065    Stage      * stage      = new Stage("かぼちゃステージ/カボチャステージ(空セット).pmx");
066    Camera     * mainCamera = new Camera();
067 
068    //カメラの描写範囲(奥行)を0.1~10000.0に設定する
069    mainCamera->SetCameraNearFar(0.1, 10000.0);
070 
071    //( 0.0, 9.0, -22.0 )の位置にカメラを設置し、視線を( 0.0, 10.0, 0.0 )にあるターゲットへ向ける。
072    mainCamera->SetCameraPositionAndTarget_UpVecY(VGet(0.0, 9.0, -22.0), VGet(0.0, 10.0, 0.0));
073 
074    // ゲーム内時間の初期化
075    theTime = 0.0;
076 
077    // ウインドウが開いている間はループする
078    while( ! ProcessMessage() ){
079         
080        // 描写先の画面(裏画面)を消去する
081        ClearDrawScreen();
082 
083        // 3Dモデル1の位置を得る。
084        VECTOR p = MV1GetPosition( naka->modelHandle1 );
085 
086        // 現在の再生時間をセットする
087        MV1SetAttachAnimTime( naka->modelHandle1, naka->attachIndex, theTime );
088 
089        // 3Dモデルの描画
090        MV1DrawModel( stage->modelHandle_BG ); // ステージのグラフィック(背景)を描写
091        MV1DrawModel( naka ->modelHandle1   ); // キャラクターを描写
092 
093        // 完成した裏画面の内容を表画面(ゲームのウィンドウ)に転写
094        ScreenFlip();
095 
096        // キー(ゲームコントローラー)の状態を得る
097        int keyInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 );
098        if( keyInput == PAD_INPUT_DOWN  ) {
099            p.z = p.z - 0.5;
100        }
101        if( keyInput == PAD_INPUT_UP  ) {
102            p.z = p.z + 0.5;
103        }
104        if( keyInput == PAD_INPUT_LEFT  ) {
105            p.x = p.x - 0.5;
106        }
107        if( keyInput == PAD_INPUT_RIGHT  ) {
108            p.x = p.x + 0.5;
109        }
110 
111        // モデルの位置を更新する
112        MV1SetPosition( naka->modelHandle1, p );
113 
114        // 次の描写のためにゲーム内時間を更新する
115        theTime = theTime + 0.4;
116 
117        // ゲーム内時間がアニメーションの再生時間を超えたら再生時間をリセットする
118        if( theTime >= naka->animTime000 ) theTime = 0.0;
119    }
120     
121    DxLib_End(); // DXライブラリの後処理を行う
122 
123    return 0 ;
124}