#pragma once
#include<DxLib.h>
#include<Color.h>
#include<vector>
#include<string>
#include<Image.h>

namespace DXFW
{
///	<summary>リソースを読み込まずに描画</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 Drawing
{
private:
	Drawing();
	~Drawing();		
public:
			
	///<summary>直線を描画</summary>
	///始点と終点を結ぶ直線を描画
	static bool Line( int 始点X , int 始点Y , int 終点X , int 終点Y , int 色 , int 太さ)
	{
		return !DxLib::DrawLine( 始点X , 始点Y , 終点X , 終点Y , 色 , 太さ );
	}

	///<summary>矩形を描画</summary>
	///座標aと座標bを対角の頂点とする矩形を描画
	static bool Rect( int 座標aX , int 座標aY , int 座標bX , int 座標bY , int 色 , bool 塗りつぶしフラグ )
	{
		return !DxLib::DrawBox( 座標aX , 座標aY , 座標bX , 座標bY , 色 , 塗りつぶしフラグ );
	}
	static bool RectMask( int x1 , int y1 , int x2 , int y2 , ZMaskType type, bool isFill )
	{
		return !DxLib::DrawBoxToZBuffer( x1 , y1 , x2 , y2 , isFill , (int)type );
	}

	///<summary>円を描画</summary>
	///中心と半径を指定して円を描画
	static bool Circle( int 中心X , int 中心Y , int 半径 , int 色 , bool 塗りつぶしフラグ )
	{
		return !DxLib::DrawCircle( 中心X , 中心Y , 半径 , 色 , 塗りつぶしフラグ );
	}
	static bool CircleZMask( int 中心X , int 中心Y , int 半径 , int 色 , bool 塗りつぶしフラグ )
	{
		return !DxLib::DrawCircleToZBuffer( 中心X , 中心Y , 半径 , 塗りつぶしフラグ , DX_ZWRITE_MASK );			
	}

	///<summary>楕円を描画</summary>
	///中心と外接する四角形の大きさを指定して楕円を描画
	static bool Oval( int 中心X , int 中心Y , int 幅 , int 高さ , int 色 , bool 塗りつぶしフラグ )
	{
		return !DxLib::DrawOval( 中心X , 中心Y , 幅 , 高さ , 色 , 塗りつぶしフラグ );
	}

	///<summary>三角形を描画</summary>
	///頂点を３つ指定して、三角形を描画
	static bool Triangle( int 頂点aX , int 頂点aY , int 頂点bX , int 頂点bY , int 頂点cX , int 頂点cY , int 色 , bool 塗りつぶしフラグ )
	{
		return !DxLib::DrawTriangle( 頂点aX , 頂点aY , 頂点bX , 頂点bY , 頂点cX , 頂点cY , 色 , 塗りつぶしフラグ);
	}

	///<summary>点を描画</summary>
	///座標を指定して1ピクセルの点を描画
	static bool Pixel( int 座標X , int 座標Y , int 色 )
	{
		return !DxLib::DrawPixel( 座標X , 座標Y , 色 );
	}

	///<summary>指定座標の色を取得</summary>
	///座標を指定して、スクリーン上の色を取得
	static int GetPixel( int 座標X , int 座標Y )
	{
		return DxLib::GetPixel( 座標X , 座標Y );
	}

	///<summary>画像ファイルを描画</summary>
	///画像を一時的にメモリに読み込んで描画
	///この処理は重いので、通常はImageクラスを利用する
	static bool ImageFile( int 座標X , int 座標Y , const char *ファイル名 , bool 透過フラグ = true )
	{
		return !DxLib::LoadGraphScreen( 座標X , 座標Y , ファイル名 , 透過フラグ);
	}

	///<summary>書式付きで文字を描画</summary>
	///書式付き文字列を描画、フォントはデフォルトでゴシック体
	static void String( int X座標 , int Y座標 , int 色 , const char *文字列 , ... )
	{
		char bufstr[1024];
		va_list args;
		va_start(args,文字列);
		vsprintf_s( bufstr , 1024 , 文字列 , args );
		va_end(args);

		char *pstr,*stro;
		stro = strtok_s( bufstr , "\n" , &pstr );

		while(stro != NULL)
		{
			DxLib::DrawString( X座標 , Y座標 , stro , 色 );
			stro = strtok_s( NULL , "\n" , &pstr );
			Y座標 += 20;
		}
	}

	static void StringZMask( int X座標 , int Y座標  , ZMaskType Zマスク , const char *文字列 , ... )
	{
		char bufstr[1024];
		va_list args;
		va_start(args,文字列);
		vsprintf_s( bufstr , 1024 , 文字列 , args );
		va_end(args);

		char *pstr,*stro;
		stro = strtok_s( bufstr , "\n" , &pstr );

		while(stro != NULL)
		{
			DxLib::DrawStringToZBuffer( X座標 , Y座標 , stro , (int)Zマスク);
			stro = strtok_s( NULL , "\n" , &pstr );
			Y座標 += 20;
		}
	}
};
}