ページ 11

DXライブラリ キャラクターの移動について

Posted: 2011年10月30日(日) 11:56
by Haru*
はじめまして。
現在、DXライブラリで3Dゲームを作っている者です。

そこで、3Dゲーム内でプレーヤーが操作するキャラクターの移動ついて質問があります。
UPキーを押すとz軸正の方向に移動、DOWNキーを押すとz軸負の向きに移動、
RIGHTキーを押すとx軸正の方向に移動、LEFTキーを押すとx軸負の方向に移動、
というのは、下記のように記述することで実現できたのですが、

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
     ChangeWindowMode(TRUE); // ウィンドウモードに設定
     SetGraphMode( 1200 , 675 , 32 ) ;// 画面モードの変更
         DxLib_Init();   // DXライブラリ初期化処理;

      int ModelHandle;
	  float x=0, y=0 ,z=0,cx=400,cy=400,cz=-400;
      VECTOR CameraPos;

      ModelHandle = MV1LoadModel( "画像/Sample.x" ) ;// 3Dモデルの読み込み
      // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの更新):ゲーム本編
               while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
                      if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ // 右キーが押されていたら
                          x+=10;                       // 右へ移動
                      }
                      if( Key[ KEY_INPUT_LEFT  ] >= 1 ){ // 左キーが押されていたら
                          x-=10;                       //左へ移動
                      }
                      if( Key[ KEY_INPUT_UP ] >= 1 ){ // 上キーが押されていたら
                          z+=10;    // 前へ移動;
                      }
                      if( Key[ KEY_INPUT_DOWN ] >= 1 ){ // 上キーが押されていたら
                          z-=10;    // 後ろへ移動;
                      }
                            MV1DrawModel( ModelHandle ) ;// 3Dモデルの描画
							MV1SetPosition( ModelHandle, VGet( x, y, z) ) ;// 画面に映る位置に3Dモデルを移動
                            MV1SetScale( ModelHandle, VGet( 100.0f, 100.0f, 100.0f ) ) ;// 3Dモデルのスケールをx,y,z軸方向に100倍にする
                      }
                            
                      // カメラの座標を初期化
                      CameraPos.x = cx ;
                      CameraPos.y = cy ;
                      CameraPos.z = cz ;
                      SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0, 0, 0 ) ) ;// カメラの位置と注視点をセット
                                    
      WaitKey();// キー入力待ち
      DxLib_End();// DXライブラリ終了処理
      return 0;
      }

RIGHTキーを押すと、キャラクターの向きがy軸を軸としてに時計回りに
LEFTキーを押すと、キャラクターの向きがy軸を軸として反時計回りに
回転し、
UPキーを押すと、キャラクターが向いている方向に移動、
DOWNキーを押すと、キャラクターが向いている方向とは正反対の向きにキャラクターを向ける

ということがなかなか実現できません。

どのようなコードを書けば、上に書いたような動きを実現することが出来るのでしょうか?
出来れば、実際にコードを書いていただけるととても助かります。
回答、よろしくお願いします。

Re: DXライブラリ キャラクターの移動について

Posted: 2011年10月30日(日) 12:20
by softya(ソフト屋)
移動方向を角度で持って、sin/cosでx/yベクトルを取り出して移動します。
左、右、後ろは角度を変更すれば出来ます。

[補足]
コードを書いても良いのですが、仕組みを理解することが大事ですので。
そのまま使ってしまうと理解する機会を失うことにもなりかねません。
特に3Dはベクトルや三角関数を多用するので基本の基本は押さえたほうが良いと思います。

Re: DXライブラリ キャラクターの移動について

Posted: 2011年10月30日(日) 13:33
by Haru*
素早い回答、ありがとうございます。
三角関数、ベクトルについてもう少し勉強しようと思います。
またわからないところがあったら質問させていただくがもしれません。