#include "DxLib.h"
#include <math.h>

//変数の宣言
enum {STATUS_Menue, STATUS_Move, STATUS_End_Menu, DEFAULT} ;
enum Mo{Move_FALSE, Move_TRUE};
int StringCr, Green ;
int FUNCTION_STATUS = STATUS_Menue;
int Move_STATUS = Move_FALSE;
int MouseX, MouseY ;
double Sx, Sy ;
int Key[256] ;
double BoxX = 320;
double BoxY = 240;
char GetHitKeyStateAll_Key[256];

//GetHitKeyStateAll_2関数
int GetHitKeyStateAll_2(int KeyStateBuf[])
{
	GetHitKeyStateAll( GetHitKeyStateAll_Key );
    for(int i=0;i<256;i++)
	{
		if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
		else                            KeyStateBuf[i]=0;
	}
	return 0;
}

//Menue関数 (FUNCTION_STATUS == 0 == STATUS_Menue)
void Menue()
{
	DrawString( 0 , 0 , "自機（青い点）がクリックした場所（白い○）に向かって移動します" , StringCr ) ;
	DrawString( 0 , 60 , "何かキーを押して開始してください" , StringCr ) ;
	DrawString( 0 , 80 , "Ｅｓｃキーで終了します" , StringCr ) ;
}

//Move関数 (FUNCTION_STATUS == 1 == STATUS_Move)
void Move()
{
	double Ax, Ay, Rr ;

	DrawCircle( (int)BoxX , (int)BoxY , 2, Green, TRUE ) ;

	if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 )
	{
		GetMousePoint( &MouseX , &MouseY ) ;

		if(MouseX < 0)
			MouseX = 0;
		if( MouseX > 640)
			MouseX = 640;

		if(MouseY < 0)
			MouseY = 0;
		if(MouseY > 480)
			MouseY = 480;

		Ax = (double)MouseX-BoxX ;
		Ay = (double)MouseY-BoxY ;
		Rr = sqrt( Ax * Ax + Ay * Ay ) ;
		Sx = Ax/Rr ;
		Sy = Ay/Rr ;

		Move_STATUS = Move_TRUE;
	}

	if(Move_STATUS == Move_TRUE)
	{
		if((int)BoxX != MouseX)
			BoxX += Sx ;

		if((int)BoxY != MouseY)
			BoxY += Sy ;

		DrawCircle( MouseX , MouseY , 6, StringCr, FALSE ) ;	
	}

	if((int)BoxX == MouseX && (int)BoxY == MouseY)
	{
		Move_STATUS = Move_FALSE;
	}
}

//End_Menu関数 (FUNCTION_STATUS == 2 == STATUS_End_Menu)
void End_Menu()
{
	DrawString( 230 , 120 , "プログラムを終了しますか？" , StringCr ) ;
	DrawString( 200 , 220 , "プログラムを終了する（ESCAPEキー）" , StringCr ) ;
	DrawString( 200 , 260 , "終了しない（ESCAPE以外の他のキー）" , StringCr ) ;	
}

//End_NotEnd関数 (FUNCTION_STATUS == 2 == STATUS_End_Menu)
void End_NotEnd()
{
	if( CheckHitKeyAll())
	{
		GetHitKeyStateAll_2(Key);

		if(Key[KEY_INPUT_ESCAPE] == 1)
			FUNCTION_STATUS = DEFAULT;
		else
			FUNCTION_STATUS = STATUS_Move;
	}
}

//EscapeKey関数 ESCAPEキーが押されたら終了するかどうかの確認画面へ
void EscapeKey()
{
	if( CheckHitKeyAll())
	{
		if(Key[KEY_INPUT_ESCAPE] == 1)
			FUNCTION_STATUS = STATUS_End_Menu;
		else
			FUNCTION_STATUS = STATUS_Move;
	}
}

//Check関数 いろいろ変数の値を見られるようにしておきます
//この関数は確認用なので必要なくなったら消してよし
void Check()
{
	if(FUNCTION_STATUS == STATUS_Move)
	{
		DrawFormatString( 0, 380, StringCr, "(int)BoxX %d (int)BoxY %d", (int)BoxX ,(int)BoxY ) ;
		DrawFormatString( 0, 400, StringCr, "MouseX %d MouseY %d", MouseX ,MouseY ) ;
		DrawFormatString( 0, 420, StringCr, "Move_STATUS %d", Move_STATUS ) ;
	}

	DrawFormatString( 0, 440, StringCr, "FUNCTION_STATUS %d", FUNCTION_STATUS ) ;
	DrawFormatString( 0, 460, StringCr, "Key[KEY_INPUT_ESCAPE] %d", Key[KEY_INPUT_ESCAPE] ) ;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
	// 画面モードの変更
	SetGraphMode( 640 , 480 , 32 ) ;

    // ウインドウモードに変更
	ChangeWindowMode( TRUE ) ;

	if( DxLib_Init() == -1 )	// ＤＸライブラリ初期化処理
	{
		 return -1;	// エラーが起きたら直ちに終了
	}

	// 描画先画面を裏画面にセット
	SetDrawScreen( DX_SCREEN_BACK ) ;

	// マウスを表示状態にする
	SetMouseDispFlag( TRUE ) ;

	// 色の値を取得
	StringCr = GetColor( 255 , 255 , 255 ) ;
	Green = GetColor( 0 , 255 , 255 ) ;

    while(ProcessMessage() != -1)
	{
		ClearDrawScreen() ;

		switch(FUNCTION_STATUS)
		{
		case STATUS_Menue:
			Menue();
			break;
		case STATUS_Move:
			Move();
			break;
		case STATUS_End_Menu:
			End_Menu();
			if(Key[KEY_INPUT_ESCAPE] == 0)
				End_NotEnd();
			break;
		default:
			DxLib_End() ;
			return 0;
			break;
		}

		//キーの押下状態を取得
		GetHitKeyStateAll_2(Key);

		//FUNCTION_STATUSの値が３より小さければEscapeKey関数を呼び出す
		if(FUNCTION_STATUS < STATUS_End_Menu)
			EscapeKey();

		//いろいろ変数の値を見られるようにしておきます
		Check();

		ScreenFlip() ;

		WaitTimer(0);

	}

	DxLib_End() ;		// ＤＸライブラリ使用の終了処理

	return 0 ;		// ソフトの終了
}

