#include "DxLib.h"
#include "math.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの初期化
if( DxLib_Init() = TotalTime )
{
PlayTime = 0.0f ;
}
// 再生時間をセットする
MV1SetAttachAnimTime( ModelHandle, AttachIndex, PlayTime ) ;
//キャラ移動処理(ワールド座標系のx,y,z軸を基準)+移動方向に合わせてキャラの方向も変化
if(CheckHitKey(KEY_INPUT_RIGHT)==1 && !(CheckHitKey(KEY_INPUT_UP)==1 || CheckHitKey(KEY_INPUT_DOWN)==1))
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(90.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam-90.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam-90.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_LEFT)==1 && !(CheckHitKey(KEY_INPUT_UP)==1 || CheckHitKey(KEY_INPUT_DOWN)==1))
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(-90.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam+90.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam+90.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_UP)==1 && !(CheckHitKey(KEY_INPUT_RIGHT)==1 || CheckHitKey(KEY_INPUT_LEFT)==1))
{
CharaPos = VAdd(CharaPos,CharaVel);
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam-180.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam-180.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_DOWN)==1 && !(CheckHitKey(KEY_INPUT_RIGHT)==1 || CheckHitKey(KEY_INPUT_LEFT)==1))
{
CharaPos = VSub(CharaPos,CharaVel);
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam+0.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam+0.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_RIGHT)==1 && CheckHitKey(KEY_INPUT_UP)==1)
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(45.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam-135.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam-135.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_RIGHT)==1 && CheckHitKey(KEY_INPUT_DOWN)==1)
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(135.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam-45.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam-45.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_LEFT)==1 && CheckHitKey(KEY_INPUT_UP)==1)
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(-45.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam+135.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam+135.0f*PHI_F/180.0f,0.0f));
}
if(CheckHitKey(KEY_INPUT_LEFT)==1 && CheckHitKey(KEY_INPUT_DOWN)==1)
{
CharaPos = VAdd(CharaPos,VTransform(CharaVel,MGetRotY(-135.0f*PHI_F/180.0f)));
AngCharaAndCam = acos(VDot(VNorm(CamDir),VNorm(CharaDir))/1.0f);
if(CamDir.x>=0)
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,AngCharaAndCam+45.0f*PHI_F/180.0f,0.0f));
else
MV1SetRotationXYZ(ModelHandle,VGet(0.0f,-AngCharaAndCam+45.0f*PHI_F/180.0f,0.0f));
}
//ズーム処理
if(CheckHitKey(KEY_INPUT_Z)==1)
{
if(Camera_Player_Distance=1600.f)
Camera_Player_Distance=1600.0f;
else
Camera_Player_Distance+=30.0f;
}
//カメラ横回転処理(x軸のマイナス方向が基準)
if(CheckHitKey(KEY_INPUT_D)==1)
{
AngH -= PHI_F/60.0f;
if(AngH=360.0f*PHI_F/180.0f)
AngH -= 360.0f*PHI_F/180.0f; //AngHが360°以上になったら360°を引く
}
//カメラ縦回転処理
if(CheckHitKey(KEY_INPUT_W)==1)
{
AngV -= PHI_F/60.0f;
if(AngV=60.0f*PHI_F/180.0f)
AngV = 60.0f*PHI_F/180.0f;
}
CamPos=VAdd( VTransform( VTransform( VGet( -Camera_Player_Distance, 0.0f, 0.0f ), MGetRotZ(AngV)), MGetRotY(AngH) ), CharaPos ); //カメラ位置を設定
CamDir=VNorm(VSub(VGet(CharaPos.x,0.0f,CharaPos.z),VGet(CamPos.x,0.0f,CamPos.z))); //カメラ方向ベクトルを正規化
CharaVel=VScale(VGet(CamDir.x,0.0f,CamDir.z),40.0f); //キャラ速度ベクトルの設定
SetCameraPositionAndTarget_UpVecY(VGet(CamPos.x,CamPos.y+600.0f,CamPos.z),VGet(CharaPos.x,CharaPos.y+600.0f,CharaPos.z)); //カメラをセット
MV1SetPosition(ModelHandle,CharaPos); //モデルの位置をセット
MV1DrawModel(ModelHandle); //モデル描画
MV1DrawModel(ModelComp);
ScreenFlip();
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
現状のコード
現状のコード
最後に編集したユーザー DSsec on 2011年7月26日(火) 10:55 [ 編集 6 回目 ]
Re: 現状のコード
現在状況:
キャラはカメラ方向ベクトルを基準に移動
カメラはキャラを中心に回転
キャラの向きはカメラ方向ベクトルを基準。↑ならカメラ方向ベクトル通り、↓ならカメラ方向ベクトルの正反対、という風に。キャラを移動させない場合は最後の向きをそのまま反映。
キャラ移動とカメラはほぼ完成。次は当たり判定の導入か。カメラに関しては、床との当たり判定ぐらいはあった方がいいだろう。
キャラはカメラ方向ベクトルを基準に移動
カメラはキャラを中心に回転
キャラの向きはカメラ方向ベクトルを基準。↑ならカメラ方向ベクトル通り、↓ならカメラ方向ベクトルの正反対、という風に。キャラを移動させない場合は最後の向きをそのまま反映。
キャラ移動とカメラはほぼ完成。次は当たり判定の導入か。カメラに関しては、床との当たり判定ぐらいはあった方がいいだろう。
最後に編集したユーザー DSsec on 2011年7月26日(火) 10:44 [ 編集 2 回目 ]