ゲームプログラム・サンプルプログラム集 (トップページに戻る)
線に沿ってプレイヤーの移動
実装イメージ

・線に沿ってプレイヤーが移動します。
・ポイントまで着いたら次のポイントに切り替えています。
・左に移動するときは画像を左右反転しています。
サンプルプログラム

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

// ポイント座標数
#define MAX_POINT	3
// 移動スピード
#define MOVE_SPEED	3.0f
// この距離まで近づいたら次のポイントへ
#define CHECK_LENGTH	10.0f

// プレイヤー画像ハンドル
int PlayerGraph;
// プレイヤー座標
float PlayerX;
float PlayerY;
// 反転フラグ
bool ReverseFlag;
// 向かうポイント番号
int TargetNumber;
// ポイント座標
float PointX[MAX_POINT];
float PointY[MAX_POINT];

// ==============================
// *** 初期化処理 ***
// ==============================
void Game_Init()
{
	// プレイヤー画像の読み込み
	PlayerGraph = LoadGraph( "プレイヤー.png" );
	// ポイント座標を設定
	PointX[0] = 100.0f;
	PointY[0] = 100.0f;
	PointX[1] = 300.0f;
	PointY[1] =  50.0f;
	PointX[2] = 400.0f;
	PointY[2] = 150.0f;
	// プレイヤーの座標も最初のポイント座標にする
	PlayerX = PointX[0];
	PlayerY = PointY[0];
	// 次の場所に
	TargetNumber = 1;
}
// ==============================
// *** 更新処理 ***
// ==============================
void Game_Update()
{
	// ポイント座標
	float TargetX = PointX[TargetNumber];
	float TargetY = PointY[TargetNumber];
	// ターゲット座標までの距離を計算
	float X = TargetX - PlayerX;
	float Y = TargetY - PlayerY;
	float Length = sqrtf( X * X + Y * Y );
	// 移動ベクトルの大きさをスピード分にする
	float MoveX = X / Length * MOVE_SPEED;
	float MoveY = Y / Length * MOVE_SPEED;
	// 左に移動しているときは画像を左右反転
	ReverseFlag = false;
	if( MoveX < 0.0f ){
		ReverseFlag = true;
	}
	// 座標を進める
	PlayerX += MoveX;
	PlayerY += MoveY;
	// 移動後の座標から
	X = TargetX - PlayerX;
	Y = TargetY - PlayerY;
	// ポイント座標までの距離が近かったら
	if( sqrtf( X * X + Y * Y ) < CHECK_LENGTH ){
		// 次のポイントに進める
		TargetNumber++;
		if( TargetNumber >= MAX_POINT ){
			TargetNumber = 0;
		}
	}
}
// ==============================
// *** 描画処理 ***
// ==============================
void Game_Draw()
{
	// 各ポイントを線で結んで描画
	for( int i = 0; i < MAX_POINT; i++ ){
		int n1 = i;
		int n2 = ( i + 1 ) % MAX_POINT;
		DrawLineAA( PointX[n1], PointY[n1], PointX[n2], PointY[n2], GetColor( 255, 255, 0 ) );
	}
	// プレイヤーの描画
	DrawRotaGraphF( PlayerX, PlayerY, 1.0f, 0.0f, PlayerGraph, TRUE, ReverseFlag );
}