#pragma once
namespace DXFW
{
/// <summary>カメラの追跡方式</summary>
enum class ChaseType
{
	NormalChase,
	Smooth,
	XToY,
	YToX,
	Warp
};
	
///	<summary>2D用のカメラクラス</summary>
///	<example>
///	[サンプルコード:未完成]<BR>
/// サンプル説明<BR>
///	<code>
///	int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
///	{<BR>
///		if( !Dx::Initialise() ) return -1;<BR>
///		Dx::End();<BR>
///		return 0;<BR>
/// }<BR>
/// </code>	
/// </example>
class Camera
{
private:
	double x;//現在の位置
	double y;
	double zoom;

	double forcusX;//移動目標
	double forcusY;
	double forcusZ;

	double speed;//移動速度
	double speedZ;

	double centerX;//焦点位置
	double centerY;

	static Camera* cameraNow;

	ChaseType chaseType;
public:
	///<summary>カメラの作成</summary>
	///初期座標と拡大率を指定してカメラを初期化
	Camera(double 座標X , double 座標Y , double 拡大率):
		x(座標X),
		y(座標Y),
		zoom(拡大率),
		forcusX(座標X),
		forcusY(座標Y),
		forcusZ(拡大率),
		speed(1),
		speedZ(1),
		centerX(座標X),
		centerY(座標Y),
		chaseType(ChaseType::Warp)
	{};
			
	///<summary>登録中のカメラを取得</summary>
	///現在有効なカメラを取得する
	static Camera* Now()
	{
		return cameraNow;
	}
			
	///<summary>カメラを登録</summary>
	///現在有効なカメラを登録する
	static void SetNow(Camera* アクティブカメラ)
	{
		cameraNow = アクティブカメラ;
	}
			
	///<summary>カメラの焦点を設定</summary>
	void SetCenter(double X座標 , double Y座標)
	{
		this->centerX = X座標;
		this->centerY = Y座標;
	}
			
	///<summary>焦点のX座標を取得</summary>
	double GetCenterX()
	{
		return this->centerX;
	}
		
	/// <summary>移動目標のY座標を取得</summary>
	double GetCenterY()
	{
		return this->centerY;
	}

	///<summary>位置と倍率を設定</summary>
	void Set(double X座標 , double Y座標 ,double 拡大率)
	{
		this->x = X座標;
		this->y = Y座標;
		this->zoom = 拡大率;
	}
			
	///<summary>移動目標座標を相対移動</summary>
	void MoveForcus(double X座標 ,double Y座標)
	{
		this->forcusX += X座標;
		this->forcusY += Y座標;
	}
			
	///<summary>移動目標座標を設定</summary>
	void SetForcus(double X座標 , double Y座標)
	{
		this->forcusX = X座標;
		this->forcusY = Y座標;
	}
			
	///<summary>拡大目標をセット</summary>
	void SetZoomForcus(double 拡大率)
	{
		this->forcusZ = 拡大率;
	}
			
	///<summary>追跡速度を設定</summary>
	void SetSpeed(double 追跡速度)
	{
		this->speed = 追跡速度;
	}
		
	///<summary>拡大応答速度を設定</summary>
	void SetZoomSpeed(double 拡大速度)
	{
		this->speedZ = 拡大速度;
	}
			
	///<summary>拡大率を取得</summary>
	double GetZoom()
	{
		return this->zoom;
	}
			
	///<summary>追跡方法を設定</summary>
	void SetChaseType(ChaseType 追跡タイプ)
	{
		chaseType = 追跡タイプ;
	}

	///<summary>カメラ位置の更新</summary>
	///追跡方法や追跡速度に応じて、カメラ位置を更新する
	void Update()
	{
		x = x/2 + forcusX/2;
		y = y/2 + forcusY/2;
		zoom = zoom/2 + forcusZ/2;
	}
			
	///<summary>X座標を変換</summary>
	///カメラの位置と拡大率に応じて、座標を変換して返す
	double TranX(double X座標変換前)
	{
		return centerX + ( X座標変換前 - this->x ) * zoom;
	}
			
	/// <summary>Y座標を変換</summary>
	///カメラの位置と拡大率に応じて、座標を変換して返す
	double TranY(double Y座標変換前)
	{
		return centerY + ( Y座標変換前 - this->y ) * zoom;
	}
};
}
