# include // 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(); } }