図1103a
プレイヤーを動かすと敵に見立てた複数のオブジェクトが追いかけてきたり、あるいは様子をうかがったりしています。
//-------------------------------------------------------------------------------------- /// 敵の親 //-------------------------------------------------------------------------------------- class EnemyBase : public GameObject { Vec3 m_StartPos; //フォース Vec3 m_Force; //速度 Vec3 m_Velocity; protected: //構築と破棄 //-------------------------------------------------------------------------------------- /*! @brief プロテクトコンストラクタ @param[in] StagePtr ステージ */ //-------------------------------------------------------------------------------------- EnemyBase(const shared_ptr<Stage>& StagePtr, const Vec3& StartPos); //-------------------------------------------------------------------------------------- /*! @brief プロテクトデストラクタ */ //-------------------------------------------------------------------------------------- virtual ~EnemyBase() {} public: //アクセサ const Vec3& GetForce()const { return m_Force; } void SetForce(const Vec3& f) { m_Force = f; } void AddForce(const Vec3& f) { m_Force += f; } const Vec3& GetVelocity()const { return m_Velocity; } void SetVelocity(const Vec3& v) { m_Velocity = v; } void ApplyForce(); Vec3 GetTargetPos()const; //初期化 virtual void OnCreate() override; //更新 virtual void OnUpdate() override; };
//初期化 void EnemyBase::OnCreate() { auto ptrTrans = GetComponent<Transform>(); ptrTrans->SetPosition(m_StartPos); ptrTrans->SetScale(0.25f, 0.25f, 0.25f); ptrTrans->SetRotation(0.0f, 0.0f, 0.0f); //オブジェクトのグループを得る auto group = GetStage()->GetSharedObjectGroup(L"EnemyGroup"); //グループに自分自身を追加 group->IntoGroup(GetThis<GameObject>()); //分離行動をつける auto ptrSep = GetBehavior<SeparationSteering>(); ptrSep->SetGameObjectGroup(group); //重力をつける auto ptrGra = AddComponent<Gravity>(); }
//-------------------------------------------------------------------------------------- /// 敵1 //-------------------------------------------------------------------------------------- class Enemy1 : public EnemyBase { //ステートマシーン unique_ptr<StateMachine<Enemy1>> m_StateMachine; //NearとFarを切り替える値 float m_StateChangeSize; public: //構築と破棄 //-------------------------------------------------------------------------------------- /*! @brief コンストラクタ @param[in] StagePtr ステージ */ //-------------------------------------------------------------------------------------- Enemy1(const shared_ptr<Stage>& StagePtr, const Vec3& StartPos); //-------------------------------------------------------------------------------------- /*! @brief デストラクタ */ //-------------------------------------------------------------------------------------- virtual ~Enemy1() {} //アクセサ //-------------------------------------------------------------------------------------- /*! @brief ステートマシンを得る @return ステートマシン */ //-------------------------------------------------------------------------------------- unique_ptr< StateMachine<Enemy1>>& GetStateMachine() { return m_StateMachine; } float GetStateChangeSize() const { return m_StateChangeSize; } //初期化 virtual void OnCreate() override; //更新 virtual void OnUpdate() override; };
//初期化
void Enemy1::OnCreate() {
EnemyBase::OnCreate();
auto ptrTrans = GetComponent<Transform>();
ptrTrans->SetScale(0.125f, 0.25f, 0.25f);
//Obbの衝突判定をつける
AddComponent<CollisionObb>();
//影をつける
auto ptrShadow = AddComponent<Shadowmap>();
ptrShadow->SetMeshResource(L"DEFAULT_CUBE");
//描画コンポーネントの設定
auto ptrDraw = AddComponent<BcPNTStaticDraw>();
//描画するメッシュを設定
ptrDraw->SetMeshResource(L"DEFAULT_CUBE");
//描画するテクスチャを設定
ptrDraw->SetTextureResource(L"TRACE_TX");
//透明処理
SetAlphaActive(true);
//ステートマシンの構築
m_StateMachine.reset(new StateMachine<Enemy1>(GetThis<Enemy1>()));
//最初のステートをEnemy1FarStateに設定
m_StateMachine->ChangeState(Enemy1FarState::Instance());
}
EnemyBase::OnCreate();
void Enemy1::OnUpdate() {
EnemyBase::OnUpdate();
//ステートマシンのUpdateを行う
//この中でステートの切り替えが行われる
m_StateMachine->Update();
auto ptrUtil = GetBehavior<UtilBehavior>();
ptrUtil->RotToHead(1.0f);
}