//速度オブジェクトを使う
bool SampleSpeed()
{
	using namespace SDX;
	System::Initialise("sample", 600, 400);

	//位置と形を持った型
	std::vector<std::shared_ptr<Shape>> shapes;
	shapes.emplace_back(new Circle(0, 50, 10));
	shapes.emplace_back(new Rect(0, 150, 20,20));
	shapes.emplace_back(new Line(0, 250, PAI/2 , 20, 5));

	//変化する数値を表す型
	std::vector<std::shared_ptr<ISpeed>> speeds;
	speeds.emplace_back(new Speed::Liner(1));//等速
	speeds.emplace_back(new Speed::Accel(0,0.01));//加速する
	speeds.emplace_back(new Speed::Wave(2, 0.1, 0));//平均√2で進む

	while (System::Update())
	{
		for (int i = 0; i < 3; ++i)
		{
			//速度を更新する
			speeds[i]->Update();

			//図形を移動させる
			shapes[i]->MoveA(speeds[i]->Get() ,0);

			//描画する
			shapes[i]->Draw(Color::White, 255);
		}

		if (Input::key.Return.on) break;//Enterで終了	
	}

	System::End();
	return true;
}
bool SampleSpeed2()
{
	using namespace SDX;
	System::Initialise("sample", 600, 400);

	//図形を宣言
	Circle	circle(0, 50, 10);
	Rect	rect(0, 150, 20, 20);
	Line	line(0, 250, PAI / 2, 20, 5);

	//速度オブジェクトを宣言
	Speed::Liner liner(1);//等速
	Speed::Accel accel(0, 0.01);//加速する
	Speed::Wave  wave(2, 0.1, 0);//平均√2で進む

	while (System::Update())
	{
		//速度オブジェクトを更新する
		liner.Update();
		accel.Update();
		wave.Update();

		//図形を移動する
		circle.Move(liner.Get(), 0);
		rect.Move(accel.Get(), 0);
		line.Move(wave.Get(), 0);

		//図形を描画する
		circle.Draw(Color::White, 255);
		rect.Draw(Color::White, 255);
		line.Draw(Color::White, 255);

		if (Input::key.Return.on) break;//Enterで終了	
	}

	System::End();
	return true;
}

//Easeing関数的な実装
double GetLiner(double 経過時間, double 初速, double 使わない引数A, double 使わない引数B)
{
	return 初速;
}

double GetAccel(double 経過時間, double 初速, double 加速度, double 使わない引数)
{
	return 初速 + 経過時間 * 加速度;
}

double GetWave(double 経過時間, double 速度, double 角速度, double 初角)
{
	return std::abs(std::sin(経過時間*角速度 + 初角) * 速度);
}

//引数が多いので使えない
double GetWave2(double 経過時間, double 速度, double 加速度, double 角速度, double 初角)
{
	return std::abs(std::sin(経過時間*角速度 + 初角) * 速度 + 経過時間 * 加速度);
}

bool SampleSpeed3()
{
	using namespace SDX;
	System::Initialise("sample", 600, 400);

	//図形を宣言
	Circle	circle(0, 50, 10);
	Rect	rect(0, 150, 20, 20);
	Line	line(0, 250, PAI / 2, 20, 5);

	double(*pfunc[3])(double,double,double,double);

	pfunc[0] = GetLiner;
	pfunc[1] = GetAccel;
	pfunc[2] = GetWave;

	int time = 0;
	while (System::Update())
	{
		++time;
		//図形を移動する
		circle.Move(pfunc[0](time,1,0,0), 0);
		rect.Move(pfunc[1](time, 0, 0.01, 0), 0);
		line.Move(pfunc[2](time, 2, 0.1, 0), 0);

		//図形を描画する
		circle.Draw(Color::White, 255);
		rect.Draw(Color::White, 255);
		line.Draw(Color::White, 255);

		if (Input::key.Return.on) break;//Enterで終了	
	}

	System::End();
	return true;
}
