1、テンプレートGameObject 2、行動の使いまわしによるできるだけ少ないコード 3、セルマップによるAStar検索 4、細かなステートの変化 5、剣での戦い
図0110a
「Aボタン」で、プレイヤーはジャンプします「Xボタン」で剣にのようなオブジェクトを振り、敵を攻撃します。
1、プレイヤーと敵の2つのクラス(マネージャ含めると2セットというべきか)を作成する 2、クラスは1セットだが、プレイヤーや敵が、その「HPバーセット」を管理しHP変更の場合は、そのメンバ関数を呼び出す。 3、クラスは1セットで、「HPバーマネージャ」がプレイヤー及び敵の「GetHP()関数」呼び出しを行って、HPを取得する。
//-------------------------------------------------------------------------------------- // HPのマネージャ(テンプレートクラス) //-------------------------------------------------------------------------------------- template<typename T> class HPManeger : public GameObject { weak_ptr<T> m_TargetObj; weak_ptr<HPSquareBase> m_HPSquareBase; weak_ptr<HPSquare> m_HPSquare; Col4 m_Color; Quat Billboard(const Vec3& Line) { Vec3 Temp = Line; Mat4x4 RotMatrix; Vec3 DefUp(0, 1.0f, 0); Vec2 TempVec2(Temp.x, Temp.z); if (TempVec2.length() < 0.1f) { DefUp = Vec3(0, 0, 1.0f); } Temp.normalize(); RotMatrix = XMMatrixLookAtLH(Vec3(0, 0, 0), Temp, DefUp); RotMatrix.inverse(); Quat Qt; Qt = RotMatrix.quatInMatrix(); Qt.normalize(); return Qt; } void UpdateHPTrans() { auto ShTarget = m_TargetObj.lock(); auto ShHPSquareBase = m_HPSquareBase.lock(); auto ShHPSquare = m_HPSquare.lock(); if (ShTarget && ShHPSquareBase && ShHPSquare) { auto HPBaseTrans = ShHPSquareBase->GetComponent<Transform>(); auto HPTrans = ShHPSquare->GetComponent<Transform>(); //スケーリング float MaxHP = ShTarget->GetMaxHP(); float HP = ShTarget->GetHP(); float Width = HP / MaxHP; HPBaseTrans->SetScale(0.5f, 0.125f, 0.5); HPTrans->SetScale(0.46f * Width, 0.1f, 0.46f); auto TargetTrans = ShTarget->GetComponent<Transform>(); auto Pos = TargetTrans->GetPosition(); Pos.y += 0.75f; HPBaseTrans->SetPosition(Pos); Pos = Vec3(0, 0, -0.001f); Pos.x -= 0.46f * 0.5f; Pos.x += (0.46f * Width * 0.5f); HPTrans->SetPosition(Pos); auto PtrCamera = GetStage()->GetView()->GetTargetCamera(); Quat Qt; //向きをビルボードにする Qt = Billboard(PtrCamera->GetAt() - PtrCamera->GetEye()); HPBaseTrans->SetQuaternion(Qt); } } public: //構築と破棄 HPManeger(const shared_ptr<Stage>& StagePtr, const shared_ptr<T>& TargetObj, const Col4& Col): GameObject(StagePtr), m_TargetObj(TargetObj), m_Color(Col) {} virtual ~HPManeger() {} //初期化 virtual void OnCreate() override { auto HPBase = GetStage()->AddGameObject<HPSquareBase>(); auto HP = GetStage()->AddGameObject<HPSquare>(m_Color); auto PtrTrans = HP->GetComponent<Transform>(); PtrTrans->SetParent(HPBase); m_HPSquareBase = HPBase; m_HPSquare = HP; UpdateHPTrans(); } virtual void OnUpdate2() override { UpdateHPTrans(); } };
AddGameObject<HPManeger<Player>>(PlayerPtr,Col4(0,1,0,1));
AddGameObject<HPManeger<Enemy>>(EnemyPtr, Col4(1, 0, 0, 1));
float MaxHP = ShTarget->GetMaxHP();
float HP = ShTarget->GetHP();
auto HPBase = GetStage()->AddGameObject<HPSquareBase>(); auto HP = GetStage()->AddGameObject<HPSquare>(m_Color);
template <typename T> class FightBehavior : public ObjBehavior<T> { //回転切りの回転角度 float m_RotationShakeRad; //剣のweak_ptr weak_ptr<Sword> m_SwordWeak; //相手の剣に当たったときの変数 //相手の場所 Vec3 m_HitBase; //ひるむ時間 float m_HitSwordTime; //倒れた処理用 enum class DieFlag { Down, Die, Up, }; float m_DieRot; float m_DieInterval; DieFlag m_DieFlag; Vec3 m_PokeStart; public: //-------------------------------------------------------------------------------------- /*! @brief コンストラクタ */ //-------------------------------------------------------------------------------------- FightBehavior(const shared_ptr<T>& GameObjectPtr): ObjBehavior(GameObjectPtr) {} //-------------------------------------------------------------------------------------- /*! @brief デストラクタ */ //-------------------------------------------------------------------------------------- virtual ~FightBehavior() {} //-------------------------------------------------------------------------------------- /*! @brief 剣を持つ処理 @param[in] SwordKey 剣を特定するキー @return なし */ //-------------------------------------------------------------------------------------- void HaveSword(const wstring& SwordKey) { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 剣を振る処理の開始 @return なし */ //-------------------------------------------------------------------------------------- void StartShakeSword() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 剣を振る(回転) @return 半周回転したらtrue */ //-------------------------------------------------------------------------------------- bool RotationShakeSword() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 剣を突く処理の開始 @return なし */ //-------------------------------------------------------------------------------------- void StartPokeSword() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 剣を突く @return 一定距離突いたらtrue */ //-------------------------------------------------------------------------------------- bool PokeSword() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 相手の剣に当たったときの相手の位置の設定 @param[in] pos 位置 @return なし */ //-------------------------------------------------------------------------------------- void SetHitBase(const Vec3& pos) { m_HitBase = pos; } //-------------------------------------------------------------------------------------- /*! @brief 相手の剣に当たった行動 @return なし */ //-------------------------------------------------------------------------------------- void HitSwordBehavior() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 剣に当たってひるむ行動 @return ひるむ時間が終わったらtrue */ //-------------------------------------------------------------------------------------- bool HitAfterdBehavior() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 倒れる開始 @return なし */ //-------------------------------------------------------------------------------------- void DieStartBehavior() { //中略 } //-------------------------------------------------------------------------------------- /*! @brief 倒れる行動 @return 一連の動作が終わればtrue */ //-------------------------------------------------------------------------------------- bool DieBehavior() { //中略 } };