見出し画像

線に沿ってプレイヤーの移動:3Dサンプルプログラム

実装イメージ

・線に沿ってプレイヤーが移動します。
・ポイントまで着いたら次のポイントに切り替えています。
・移動する方向に向きも変更しています。

#include "DxLib.h"
#include <math.h>

// 度をラジアンに変換する
#define D2R(deg) ((deg)*DX_PI_F/180.0f)
// ポイント座標数
#define MAX_POINT	5
// 移動スピード
#define MOVE_SPEED	0.2f
// この距離まで近づいたら次のポイントへ
#define CHECK_LENGTH	0.2f

// ステージモデルハンドル
int StageHandle;

// プレイヤーモデルハンドル
int PlayerHandle;
// プレイヤーの座標
VECTOR PlayerPos;
// プレイヤーの向き
VECTOR PlayerAngle;

// カメラ座標
VECTOR CameraPos;
// 注視点座標
VECTOR CameraTarget;

// 向かうポイント番号
int TargetNumber;
// ポイント座標
VECTOR PointPos[MAX_POINT];

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// 3Dモデルの読み込み
	StageHandle = MV1LoadModel( "stage.mqo" );
	PlayerHandle = MV1LoadModel( "player.mqo" );

	// プレイヤー座標は原点から
	PlayerPos = VGet( 0.0f, 0.0f, 0.0f );
	// 回転なしの状態から開始
	PlayerAngle = VGet( 0.0f, D2R( 0.0f ), 0.0f );
	// ポイント座標を設定
	PointPos[0] = VGet(   0.0f, 0.0f, -10.0f );
	PointPos[1] = VGet( -10.0f, 0.0f,  -5.0f );
	PointPos[2] = VGet(  -7.0f, 0.0f,  10.0f );
	PointPos[3] = VGet(   5.0f, 0.0f,   5.0f );
	PointPos[4] = VGet(  10.0f, 0.0f,  -5.0f );
	// プレイヤーの座標も最初のポイント座標にする
	PlayerPos = PointPos[0];
	// 次の場所に
	TargetNumber = 1;
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// ポイント座標
	VECTOR TargetPos = PointPos[TargetNumber];
	// ターゲット座標までの距離を計算
	VECTOR Vec = VSub( TargetPos, PlayerPos );
	float Length = VSize( Vec );
	// 移動ベクトルの大きさをスピード分にする
	VECTOR Move = VScale( VNorm( Vec ), MOVE_SPEED );
	// 移動ベクトルに合わせて向きの変更
	PlayerAngle.y = atan2f( Move.x, Move.z );
	// 座標を進める
	PlayerPos = VAdd( PlayerPos, Move );
	// 移動後の座標から
	Vec = VSub( TargetPos, PlayerPos );
	// ポイント座標までの距離が近かったら
	if( VSize( Vec ) < CHECK_LENGTH ){
		// 次のポイントに進める
		TargetNumber++;
		if( TargetNumber >= MAX_POINT ){
			TargetNumber = 0;
		}
	}
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// カメラの位置と注視点をセット
	SetCameraPositionAndTarget_UpVecY( VGet( 0.0f, 5.0f, -15.0f ), VGet( 0.0f, 0.0f, -5.0f ) );
	// ステージモデルの描画
	MV1DrawModel( StageHandle );
	// 各ポイントを線で結んで描画
	for( int i = 0; i < MAX_POINT; i++ ){
		int n1 = i;
		int n2 = ( i + 1 ) % MAX_POINT;
		DrawLine3D( PointPos[n1], PointPos[n2], GetColor( 255, 255, 0 ) );
	}
	// プレイヤーモデルの座標をセットする
	MV1SetPosition( PlayerHandle, PlayerPos );
	// プレイヤーモデルの回転値をセットする
	MV1SetRotationXYZ( PlayerHandle, PlayerAngle );
	// プレイヤーモデルを描画する
	MV1DrawModel( PlayerHandle );
}

サンプルプログラムで記述している描画や操作関係はDXライブラリを使っていますが、DXライブラリを使わない開発でも処理としては同じような実装で動作すると思います。

いいなと思ったら応援しよう!