図0103a
//-------------------------------------------------------------------------------------- /// プレイヤー //-------------------------------------------------------------------------------------- class Player : public GameObject { //最高速度 float m_MaxSpeed; //減速率 float m_Decel; //質量 float m_Mass; //文字列の表示 void DrawStrings(); public: //構築と破棄 //-------------------------------------------------------------------------------------- /*! @brief コンストラクタ @param[in] StagePtr ステージ */ //-------------------------------------------------------------------------------------- Player(const shared_ptr<Stage>& StagePtr); //-------------------------------------------------------------------------------------- /*! @brief デストラクタ */ //-------------------------------------------------------------------------------------- virtual ~Player() {} //アクセサ //-------------------------------------------------------------------------------------- /*! @brief コントローラから方向ベクトルを得る @return 方向ベクトル */ //-------------------------------------------------------------------------------------- Vec3 GetMoveVector() const; //-------------------------------------------------------------------------------------- /*! @brief プレイヤーを移動させる @return なし */ //-------------------------------------------------------------------------------------- void MovePlayer(); //-------------------------------------------------------------------------------------- /*! @brief 最高速度を得る @return 最高速度 */ //-------------------------------------------------------------------------------------- float GetMaxSpeed() const { return m_MaxSpeed; } //-------------------------------------------------------------------------------------- /*! @brief 減速値を得る @return 減速値 */ //-------------------------------------------------------------------------------------- float GetDecel() const { return m_Decel; } //-------------------------------------------------------------------------------------- /*! @brief 質量を得る @return 質量 */ //-------------------------------------------------------------------------------------- float GetMass() const { return m_Mass; } //-------------------------------------------------------------------------------------- /*! @brief 初期化処理 @return なし */ //-------------------------------------------------------------------------------------- virtual void OnCreate() override; //-------------------------------------------------------------------------------------- /*! @brief 更新処理 @return なし */ //-------------------------------------------------------------------------------------- virtual void OnUpdate() override; //-------------------------------------------------------------------------------------- /*! @brief 後更新処理 @return なし */ //-------------------------------------------------------------------------------------- virtual void OnUpdate2() override; };
Player::Player(const shared_ptr<Stage>& StagePtr) : GameObject(StagePtr), m_MaxSpeed(10.0f), //最高速度 m_Decel(0.95f), //減速値 m_Mass(0.5f) //質量 {}
//初期化 void Player::OnCreate() { //初期位置などの設定 auto Ptr = GetComponent<Transform>(); Ptr->SetScale(0.25f, 0.25f, 0.25f); //直径25センチの球体 Ptr->SetRotation(0.0f, 0.0f, 0.0f); Ptr->SetPosition(0, 0.125f, 0); //Rigidbodyをつける auto PtrRedid = AddComponent<Rigidbody>(); //衝突判定をつける auto PtrCol = AddComponent<CollisionSphere>(); PtrCol->SetIsHitAction(IsHitAction::Auto); //デバッグ用文字列をつける auto PtrString = AddComponent<StringSprite>(); PtrString->SetText(L""); PtrString->SetTextRect(Rect2D<float>(16.0f, 16.0f, 640.0f, 480.0f)); //影をつける(シャドウマップを描画する) auto ShadowPtr = AddComponent<Shadowmap>(); //影の形(メッシュ)を設定 ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE"); //描画コンポーネントの設定 auto PtrDraw = AddComponent<BcPNTStaticDraw>(); //描画するメッシュを設定 PtrDraw->SetMeshResource(L"DEFAULT_SPHERE"); //描画するテクスチャを設定 PtrDraw->SetTextureResource(L"TRACE_TX"); //透明処理 SetAlphaActive(true); //カメラを得る auto PtrCamera = dynamic_pointer_cast<LookAtCamera>(OnGetDrawCamera()); if (PtrCamera) { //LookAtCameraである //LookAtCameraに注目するオブジェクト(プレイヤー)の設定 PtrCamera->SetTargetObject(GetThis<GameObject>()); //注目点をオブジェクト位置から少し上方にする PtrCamera->SetTargetToAt(Vec3(0, 0.25f, 0)); } }
//カメラを得る auto PtrCamera = dynamic_pointer_cast<LookAtCamera>(OnGetDrawCamera()); if (PtrCamera) { //LookAtCameraである //LookAtCameraに注目するオブジェクト(プレイヤー)の設定 PtrCamera->SetTargetObject(GetThis<GameObject>()); //注目点をオブジェクト位置から少し上方にする PtrCamera->SetTargetToAt(Vec3(0, 0.25f, 0)); }
void Player::OnUpdate() { //プレイヤーの移動 MovePlayer(); //重力を加える auto PtrGrav = GetBehavior<Gravity>(); PtrGrav->Execute(); }
auto PtrGrav = GetBehavior<Gravity>();
void Player::MovePlayer() { float ElapsedTime = App::GetApp()->GetElapsedTime(); Vec3 Angle = GetMoveVector(); //Rigidbodyを取り出す auto PtrRedit = GetComponent<Rigidbody>(); auto Velo = PtrRedit->GetVelocity(); if (Angle.length() <= 0.0f && Velo.y == 0.0f) { //コントローラを離したとき対策 Velo *= GetDecel(); PtrRedit->SetVelocity(Velo); return; } //Transform auto PtrTransform = GetComponent<Transform>(); //現在の速度を取り出す //目的地を最高速度を掛けて求める auto Target = Angle * GetMaxSpeed(); //目的地に向かうために力のかける方向を計算する //Forceはフォースである auto Force = Target - Velo; //yは0にする Force.y = 0; //加速度を求める auto Accel = Force / GetMass(); //ターン時間を掛けたものを速度に加算する Velo += (Accel * ElapsedTime); //速度を設定する PtrRedit->SetVelocity(Velo); //回転の計算 if (Angle.length() > 0.0f) { auto UtilPtr = GetBehavior<UtilBehavior>(); UtilPtr->RotToHead(Angle, 1.0f); } }
Vec3 Angle = GetMoveVector();
図0103b
そして取得した移動ベクトルをもとに、フォース(力)を作成します。フォースの計算は以下のように算出します。
図0103c
上図は現在の速度と目標地点から、どの方向にフォースをかければいいのかを図解したものです。単純に目標地点に向かってフォースをかけるのではなく、ベクトルの引き算で求めているのがわかります。
void Player::OnUpdate2() { //文字列の表示 DrawStrings(); }