"ライバルカー登場"
# include <Siv3D.hpp> // OpenSiv3D v0.6.10
 
const double PI = 3.14159265359;
const double vLength = 60.0;
 
/// @brief 数学の座標をスクリーン座標に変換する関数
/// @param _point 変換前の数学座標
/// @return 変換されたスクリーン座標
Vec2 ConvertMath2Screen(Vec2 _point)
{
	Vec2 resultPoint;
	Vec2 halfScrSize = { Scene::Width() / 2.0, Scene::Height() / 2.0 };
	resultPoint.x = _point.x + halfScrSize.x;
	resultPoint.y = Scene::Height() - (_point.y + halfScrSize.y);
	return resultPoint;
}
 
/// @param _angle 角度を入力
/// @return  ラジアンに変換された値
double Degree2Radians(double _angle)
{
	return(_angle * (PI / 180.0));
}
 
/// @brief 座標軸を描く関数
void DrawAxis()
{
	Vec2 halfScrSize = { Scene::Width() / 2.0, Scene::Height() / 2.0 };
	Vec2 xAxisStart = { 0, halfScrSize.y };
	Vec2 xAxisEnd = { Scene::Width() , halfScrSize.y };
	Vec2 yAxisStart = { halfScrSize.x, Scene::Height() };
	Vec2 yAxisEnd = { halfScrSize.x, 0 };
	Line{ xAxisStart, xAxisEnd }.drawArrow(2, Vec2{ 5,5 }, Palette::Black);
	Line{ yAxisStart, yAxisEnd }.drawArrow(2, Vec2{ 5,5 }, Palette::Black);
}
 
/// @brief _angle度だけ_vecを原点中心に回転して返す
/// @param _vec 回転されるベクトル
/// @param _angle  回転角度(度)
/// @return  回転後のベクトル
Vec2 RotateVec(Vec2 _vec, double _angle)
{
	double theta = Degree2Radians(_angle); //ラジアン
	Vec2 res;
	res.x = _vec.x * cos(theta) - _vec.y * sin(theta);
	res.y = _vec.x * sin(theta) + _vec.y * cos(theta);
 
	return(res);
}
 
/* -----車のパラメータを表すグローバル変数たち----- */
struct Car {
	//車の基本方向を表すベクトル
	Vec2 sVec;
	//車の進行方向ベクトル
	Vec2 transVec;
	//車の位置 位置ベクトル Vec2
	Vec2 carPosition;
	//車の向き 回転角度 double
	double carRot;
	//車のスピード pixel/sec
	double speed;
};
/* ----------------------------------------------  */
 
//myCarの初期値設定
		 //sVec  transVec carPosition carRot speed
Car myCar{ {0,1}, {0,0},      {0,0},    0,    50.0 };
Car rivalCar{ {0,1}, {0,1.0},      {0,0},    -90,    80.0 };
 
//等速左右往復
void UpdateRivalCar() {
	//基本的に回転はcarRotのパラメータをベースに処理を行う
	//=>transVecは基本向きのベクトルをcarRot度回転させたものになる
	rivalCar.transVec = RotateVec(rivalCar.sVec, rivalCar.carRot);
	//ベクトル = ベクトル + スカラー*ベクトル*フレーム経過時間
	//フレーム経過時間をかけることによって、正確に1sあたりの移動量を計算する
	rivalCar.carPosition = rivalCar.carPosition
		+ rivalCar.speed * rivalCar.transVec * Scene::DeltaTime();
}
void DrawRivalCar() {
	Texture carImg = TextureAsset(U"RIVAL");
	//ラジアンで回すのよ
	carImg.resized(Vec2{ 64, 64 }).rotated(Degree2Radians(-rivalCar.carRot)).drawAt(ConvertMath2Screen(rivalCar.carPosition));
	//車の向きのベクトルをvLengthの長さで描画
	Line{ ConvertMath2Screen(rivalCar.carPosition), ConvertMath2Screen(rivalCar.carPosition + vLength * rivalCar.transVec) }
	.drawArrow(3, { 6,6 }, Palette::Red);
}
 
void UpdateMyCar()
{
	if (MouseL.pressed())
	{
		myCar.carRot += Scene::DeltaTime() * 90;
	}
	if (MouseR.pressed())
	{
		myCar.carRot -= Scene::DeltaTime() * 90;
	}
	myCar.transVec = RotateVec(myCar.sVec, myCar.carRot);
	//ベクトル = ベクトル + スカラー*ベクトル*フレーム経過時間
	//フレーム経過時間をかけることによって、正確に1sあたりの移動量を計算する
	myCar.carPosition = myCar.carPosition
		+ myCar.speed * myCar.transVec * Scene::DeltaTime();
}
 
void Update()
{
	UpdateRivalCar();
	UpdateMyCar();
 
}
 
void DrawMyCar()
{
	Texture carImg = TextureAsset(U"CAR");
	//ラジアンで回すのよ
	carImg.resized(Vec2{ 64, 64 }).rotated(Degree2Radians(-myCar.carRot)).drawAt(ConvertMath2Screen(myCar.carPosition));
	//車の向きのベクトルをvLengthの長さで描画
	Line{ ConvertMath2Screen(myCar.carPosition), ConvertMath2Screen(myCar.carPosition + vLength * myCar.transVec) }
	.drawArrow(3, { 6,6 }, Palette::Yellow);
}
 
void Draw()
{
	DrawRivalCar();
	DrawMyCar();
}
void Main()
{
	// 背景の色を設定する | Set the background color
	Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
 
	TextureAsset::Register(U"CAR", U"car.png");
	TextureAsset::Register(U"RIVAL", U"rival.png");
 
	Vec2 origin{ 0,0 };
	Vec2 sOrigin = ConvertMath2Screen(origin);
	Print << sOrigin;
	//
	//double rotation = 0;
 
	while (System::Update())
	{
		DrawAxis();
 
		Update();
 
		Draw();
	}
}

ライバルカーうろうろ

"往復等速運動"
# include <Siv3D.hpp> // OpenSiv3D v0.6.10
 
const double PI = 3.14159265359;
const double vLength = 60.0;
const Vec2 SCRSIZE{ 800, 600};
const Vec2 CHRSIZE{ 64,64 };
 
 
/// @brief 数学の座標をスクリーン座標に変換する関数
/// @param _point 変換前の数学座標
/// @return 変換されたスクリーン座標
Vec2 ConvertMath2Screen(Vec2 _point)
{
	Vec2 resultPoint;
	Vec2 halfScrSize = { Scene::Width() / 2.0, Scene::Height() / 2.0 };
	resultPoint.x = _point.x + halfScrSize.x;
	resultPoint.y = Scene::Height() - (_point.y + halfScrSize.y);
	return resultPoint;
}
 
/// @param _angle 角度を入力
/// @return  ラジアンに変換された値
double Degree2Radians(double _angle)
{
	return(_angle * (PI / 180.0));
}
 
/// @brief 座標軸を描く関数
void DrawAxis()
{
	Vec2 halfScrSize = { Scene::Width() / 2.0, Scene::Height() / 2.0 };
	Vec2 xAxisStart = { 0, halfScrSize.y };
	Vec2 xAxisEnd = { Scene::Width() , halfScrSize.y };
	Vec2 yAxisStart = { halfScrSize.x, Scene::Height() };
	Vec2 yAxisEnd = { halfScrSize.x, 0 };
	Line{ xAxisStart, xAxisEnd }.drawArrow(2, Vec2{ 5,5 }, Palette::Black);
	Line{ yAxisStart, yAxisEnd }.drawArrow(2, Vec2{ 5,5 }, Palette::Black);
}
 
/// @brief _angle度だけ_vecを原点中心に回転して返す
/// @param _vec 回転されるベクトル
/// @param _angle  回転角度(度)
/// @return  回転後のベクトル
Vec2 RotateVec(Vec2 _vec, double _angle)
{
	double theta = Degree2Radians(_angle); //ラジアン
	Vec2 res;
	res.x = _vec.x * cos(theta) - _vec.y * sin(theta);
	res.y = _vec.x * sin(theta) + _vec.y * cos(theta);
 
	return(res);
}
 
/* -----車のパラメータを表すグローバル変数たち----- */
struct Car {
	//車の基本方向を表すベクトル
	Vec2 sVec;
	//車の進行方向ベクトル
	Vec2 transVec;
	//車の位置 位置ベクトル Vec2
	Vec2 carPosition;
	//車の向き 回転角度 double
	double carRot;
	//車のスピード pixel/sec
	double speed;
};
/* ----------------------------------------------  */
 
//myCarの初期値設定
		 //sVec  transVec carPosition carRot speed
Car myCar{ {0,1}, {0,0},      {0,0},    0,    50.0 };
Car rivalCar{ {0,1}, {0,1.0},      {0,0},    -90,    50.0 };
 
//等速左右往復
void UpdateRivalCar() {
	//基本的に回転はcarRotのパラメータをベースに処理を行う
	//=>transVecは基本向きのベクトルをcarRot度回転させたものになる
	rivalCar.transVec = RotateVec(rivalCar.sVec, rivalCar.carRot);
	//ベクトル = ベクトル + スカラー*ベクトル*フレーム経過時間
	//フレーム経過時間をかけることによって、正確に1sあたりの移動量を計算する
	rivalCar.carPosition = rivalCar.carPosition
		+ rivalCar.speed * rivalCar.transVec * Scene::DeltaTime();
	const Vec2 HSCRSIZE{ SCRSIZE.x / 2, SCRSIZE.y / 2 };
    
        //ライバルカーが画面からはみ出ないように調整する
	if (rivalCar.carPosition.x  > HSCRSIZE.x - CHRSIZE.x / 2 || rivalCar.carPosition.x  < -HSCRSIZE.x + CHRSIZE.x / 2) {
		if (rivalCar.carPosition.x < 0)
		{
			rivalCar.carPosition.x = -HSCRSIZE.x + CHRSIZE.x/2;
 
		}else
			rivalCar.carPosition.x = HSCRSIZE.x - CHRSIZE.x/2;
 
		rivalCar.carRot += 180;
		if (rivalCar.carRot > 360)
			rivalCar.carRot -= 360;
	}
	else
	{
		rivalCar.carPosition = rivalCar.carPosition
			+ rivalCar.speed * rivalCar.transVec * Scene::DeltaTime();
	}
}
void DrawRivalCar() {
	Texture carImg = TextureAsset(U"RIVAL");
	//ラジアンで回すのよ
	carImg.resized(CHRSIZE).rotated(Degree2Radians(-rivalCar.carRot)).drawAt(ConvertMath2Screen(rivalCar.carPosition));
	//車の向きのベクトルをvLengthの長さで描画
	Line{ ConvertMath2Screen(rivalCar.carPosition), ConvertMath2Screen(rivalCar.carPosition + vLength * rivalCar.transVec) }
	.drawArrow(3, { 6,6 }, Palette::Red);
}
 
void UpdateMyCar()
{
	if (MouseL.pressed())
	{
		myCar.carRot += Scene::DeltaTime() * 90;
	}
	if (MouseR.pressed())
	{
		myCar.carRot -= Scene::DeltaTime() * 90;
	}
	myCar.transVec = RotateVec(myCar.sVec, myCar.carRot);
	//ベクトル = ベクトル + スカラー*ベクトル*フレーム経過時間
	//フレーム経過時間をかけることによって、正確に1sあたりの移動量を計算する
	myCar.carPosition = myCar.carPosition
		+ myCar.speed * myCar.transVec * Scene::DeltaTime();
}
 
void Update()
{
	UpdateRivalCar();
	UpdateMyCar();
 
}
 
void DrawMyCar()
{
	Texture carImg = TextureAsset(U"CAR");
	//ラジアンで回すのよ
	carImg.resized(CHRSIZE).rotated(Degree2Radians(-myCar.carRot)).drawAt(ConvertMath2Screen(myCar.carPosition));
	//車の向きのベクトルをvLengthの長さで描画
	Line{ ConvertMath2Screen(myCar.carPosition), ConvertMath2Screen(myCar.carPosition + vLength * myCar.transVec) }
	.drawArrow(3, { 6,6 }, Palette::Yellow);
}
 
void Draw()
{
	DrawRivalCar();
	DrawMyCar();
}
void Main()
{
	// 背景の色を設定する | Set the background color
	Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
 
	TextureAsset::Register(U"CAR", U"car.png");
	TextureAsset::Register(U"RIVAL", U"rival.png");
 
	Vec2 origin{ 0,0 };
	Vec2 sOrigin = ConvertMath2Screen(origin);
	Print << sOrigin;
	//
	//double rotation = 0;
 
	while (System::Update())
	{
		DrawAxis();
 
		Update();
 
		Draw();
	}
}