現状のコード

DSsec
記事: 0
登録日時: 14年前

現状のコード

投稿記事 by DSsec » 14年前

CODE:

#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 回目 ]

DSsec
記事: 0
登録日時: 14年前

Re: 現状のコード

投稿記事 by DSsec » 14年前

現在状況:
キャラはカメラ方向ベクトルを基準に移動
カメラはキャラを中心に回転
キャラの向きはカメラ方向ベクトルを基準。↑ならカメラ方向ベクトル通り、↓ならカメラ方向ベクトルの正反対、という風に。キャラを移動させない場合は最後の向きをそのまま反映。

キャラ移動とカメラはほぼ完成。次は当たり判定の導入か。カメラに関しては、床との当たり判定ぐらいはあった方がいいだろう。
最後に編集したユーザー DSsec on 2011年7月26日(火) 10:44 [ 編集 2 回目 ]

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前

Re: 現状のコード

投稿記事 by Dixq (管理人) » 14年前

是非 [ code ] [ /code ] タグを使うことお勧めしますw

DSsec
記事: 0
登録日時: 14年前

Re: 現状のコード

投稿記事 by DSsec » 14年前

ですね^q^