線に沿ってプレイヤーの移動
実装イメージ
・線に沿ってプレイヤーが移動します。
・ポイントまで着いたら次のポイントに切り替えています。
・左に移動するときは画像を左右反転しています。
サンプルプログラム
#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 );
}