●「DXライブラリを使ってMMDモデルを表示するプログラム」を,キャラクターをクラスとして表すようにC++版として書き直した場合。
main.cpp
001 | #include <DxLib.h> |
002 |
003 | // ゲームのキャラクターを表すクラス |
004 | class 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 | // ゲームのステージを表すクラス |
031 | class 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 | // カメラを表すクラス |
042 | class Camera { |
043 | public : |
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 |
056 | int 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 | } |