#include "stdafx.h"
#include "refCMAct単位付き数値・ジャンプ.h"

namespace FDK
{
// public:

	CMAct単位付き数値・ジャンプ::CMAct単位付き数値・ジャンプ()
	{
		this->_n数値 = 0;
		this->_b表示 = true;
			
		this->n現在の数値 = -1;
		this->nジャンプインデックス値 = 9999;
		this->nジャンプ差分値 = gcnew array<int>( 180 );
		this->mジャンプインデックス進行 = nullptr;
		this->dgジャンプ更新 = gcnew C一定間隔処理::dg処理( this, &CMAct単位付き数値・ジャンプ::tジャンプ更新 );

		// 180度分のジャンプY座標差分を算出。(i:{0 → 90 → 179} で、[i]:{0 → -15 → 0})
			
		for( int i = 0; i < 180; i++ )
			this->nジャンプ差分値[ i ] = (int) ( -15.0 * Math::Sin( ( Math::PI * i ) / 180.0 ) );
	}

	void CMAct単位付き数値・ジャンプ::On活性化()
	{
		this->_n数値 = 0;
		this->n現在の数値 = 0;
		this->nジャンプインデックス値 = 99999;
		this->mジャンプインデックス進行 = gcnew C一定間隔処理();
	}
	void CMAct単位付き数値・ジャンプ::On非活性化()
	{
		SAFE_REF_DELETE( this->mジャンプインデックス進行 );
	}
	int CMAct単位付き数値・ジャンプ::On進行()
	{
		#pragma region [ nジャンプインデックス値 の進行。]
		//-----------------
		if( this->nジャンプインデックス値 < 360 )
			this->mジャンプインデックス進行->t進行( 2, this->dgジャンプ更新 );
		//-----------------
		#pragma endregion

		#pragma region [ 数値が増加していればジャンプを開始する。]
		//-----------------
		if( this->n現在の数値 < this->_n数値 )
		{
			this->nジャンプインデックス値 = 0;

			SAFE_REF_DELETE( this->mジャンプインデックス進行 );
			this->mジャンプインデックス進行 = gcnew C一定間隔処理();
		}
		//-----------------
		#pragma endregion

		this->n現在の数値 = this->_n数値;

		return 0;
	}
	void CMAct単位付き数値・ジャンプ::On描画( IntPtr hDevice, CTexture^ tx数値と単位, int n中央X, int n下辺Y, int n文字間隔px )
	{
		if( nullptr == tx数値と単位 )
			return;

		// 正常系チェック。

		if( !this->_b表示 )
			return;


		// 数値と単位を表示。

		int n位の数[ 10 ];	// 表示は10桁もあれば足りるだろう
		int n桁数 = 0;

		#pragma region [ n現在の数値 を桁数ごとに n位の数[] に格納する。（例：n現在の数値=125 のとき n位の数 = { 5,2,1,0,0,0,0,0,0,0 } ） ]
		//-----------------
		int n = this->n現在の数値;
		while( ( n > 0 ) && ( n桁数 < 10 ) )
		{
			n位の数[ n桁数 ] = n % 10;		// 1の位を格納
			n = ( n - ( n % 10 ) ) / 10;	// 右へシフト（例: 12345 → 1234 ）
			n桁数++;
		}
		//-----------------
		#pragma endregion

		#pragma region [ rc単位, n数字と単位を合わせた画像の全幅px を算出。 ]
		//-----------------
		System::Drawing::Rectangle rc単位 = tx数値と単位->list描画範囲[ 10 ];

		int n数字と単位を合わせた画像の全幅px = rc単位.Width;
		for( int i = 0; i < n桁数; i++ )
			n数字と単位を合わせた画像の全幅px += tx数値と単位->list描画範囲[ n位の数[ i ] ].Width;
		//-----------------
		#pragma endregion
	
		const int n1桁ごとのジャンプの遅れ = 50;	// 1桁につき 50 インデックス遅れる

		#pragma region [ n位の数[] を、"COMBO" → 1の位 → 10の位 … の順に、右から左へ向かって順番に表示する。]
		//-----------------
		int x = n中央X + ( n数字と単位を合わせた画像の全幅px / 2 );		// 右端X
		int y = n下辺Y;
		int nJump = this->nジャンプインデックス値 - ( n桁数 * n1桁ごとのジャンプの遅れ );


		// 単位 を表示。

		x -= rc単位.Width;
		tx数値と単位->t2D描画( hDevice, x, n下辺Y - rc単位.Height, rc単位 );


		// 数値を1の位から順に表示。

		for( int i = 0; i < n桁数; i++ )
		{
			System::Drawing::Rectangle rc = tx数値と単位->list描画範囲[ n位の数[ i ] ];

			x -= rc.Width + n文字間隔px;
			y = n下辺Y - rc.Height;

			nJump = this->nジャンプインデックス値 - ( ( ( n桁数 - i ) - 1 ) * n1桁ごとのジャンプの遅れ );
			if( ( 0 <= nJump ) && ( 180 > nJump ) )
				y += this->nジャンプ差分値[ nJump ];

			tx数値と単位->t2D描画( hDevice, x, y, rc );
		}
		//-----------------
		#pragma endregion
	}

// private:

	void CMAct単位付き数値・ジャンプ::tジャンプ更新()
	{
		if( this->nジャンプインデックス値 < 2000 )
			this->nジャンプインデックス値 += 3;
	}
}