図0702a
プレイヤーを動かすと、大きめの球体と凸型オブジェクトがごろごろ追いかけてきます。また、上からプリミティブが組み合わさった物体が落ちてきます。Bボタンで球を発射できます。追いかけるオブジェクトは、当たればひるみますが、逃げればまた追いかけてきます。
void SeekObject::OnCreate() {
//オブジェクトのグループを得る
auto Group = GetStage()->GetSharedObjectGroup(L"SeekObjectGroup");
//グループに自分自身を追加
Group->IntoGroup(GetThis<SeekObject>());
//ステートマシンの構築
m_StateMachine.reset(new StateMachine<SeekObject>(GetThis<SeekObject>()));
//最初のステートをSeekFarStateに設定
m_StateMachine->ChangeState(FarState::Instance());
}
void SeekObject::SeekBehavior() {
auto Pos = GetComponent<Transform>()->GetPosition();
auto TargetTrans = GetStage()->GetSharedObject(L"Player")->GetComponent<Transform>();
auto TargetPos = TargetTrans->GetPosition();
bsm::Vec3 WorkForce;
WorkForce = Steering::Seek(GetVelocity(), TargetPos, Pos, m_MaxSpeed);
Steering::AccumulateForce(m_Force, WorkForce, m_MaxForce);
}
void NearState::Execute(const shared_ptr<SeekObject>& Obj) {
Obj->SeparationBehavior();
Obj->ArriveBehavior();
if (Obj->GetTargetToLen() >= Obj->GetStateChangeSize()) {
Obj->GetStateMachine()->ChangeState(FarState::Instance());
}
}
class ActivePsConvex : public SeekObject {
Vec3 m_Position;
//メッシュ(描画用)
static shared_ptr<MeshResource> m_ConvexMesh;
//物理計算用
static shared_ptr<PsConvexMeshResource> m_PsConvexMesh;
public:
//構築と破棄
ActivePsConvex(const shared_ptr<Stage>& StagePtr,
const Vec3& Position
);
virtual ~ActivePsConvex();
//初期化
virtual void OnCreate() override;
//現在の速度を得る(仮想関数)
virtual Vec3 GetVelocity() const;
//更新
virtual void OnUpdate() override;
};
//static変数の初期化
shared_ptr<MeshResource> ActivePsConvex::m_ConvexMesh = nullptr;
shared_ptr<PsConvexMeshResource> ActivePsConvex::m_PsConvexMesh = nullptr;
void ActivePsConvex::OnCreate() {
if (!m_ConvexMesh || !m_PsConvexMesh) {
vector<VertexPositionNormalTexture> vertices;
vector<uint16_t> indices;
MeshUtill::CreateDodecahedron(0.5, vertices, indices);
m_ConvexMesh = MeshResource::CreateMeshResource(vertices, indices, false);
m_PsConvexMesh = PsConvexMeshResource::CreateMeshResource(vertices, indices, 0.5f);
}
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(Vec3(1.0f));
PtrTransform->SetQuaternion(Quat());
PtrTransform->SetPosition(m_Position);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(m_ConvexMesh);
auto PtrDraw = AddComponent<BcPNTStaticDraw>();
PtrDraw->SetFogEnabled(true);
PtrDraw->SetMeshResource(m_ConvexMesh);
PtrDraw->SetTextureResource(L"WALL_TX");
//物理計算凸面
PsConvexParam param;
param.m_ConvexMeshResource = m_PsConvexMesh;
param.m_Mass = 1.0f;
//慣性テンソルの計算(球と同じにする)
param.m_Inertia = BasePhysics::CalcInertiaSphere(0.5f, param.m_Mass);
param.m_MotionType = PsMotionType::MotionTypeActive;
param.m_Quat = Quat();
param.m_Pos = m_Position;
auto PsPtr = AddComponent<PsConvexBody>(param);
PsPtr->SetDrawActive(true);
//親クラスのOnCreateを呼ぶ
SeekObject::OnCreate();
}
void ActivePsConvex::OnUpdate() {
//親クラスのOnUpdateを呼ぶ
SeekObject::OnUpdate();
auto PtrPs = GetComponent<PsConvexBody>();
//現在のフォースを設定
PtrPs->ApplyForce(GetForce());
}
//現在のフォースを設定
PtrPs->ApplyForce(GetForce());
void ActivePsCombinedObject::OnCreate() {
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(Vec3(1.0f));
PtrTransform->SetQuaternion(m_Qt);
PtrTransform->SetPosition(m_Position);
//合成オブジェクトの準備
PsCombinedParam param;
//質量は重くする
param.m_Mass = 3.0f;
//Box用の慣性(慣性テンソル)を計算
param.m_Inertia = BasePhysics::CalcInertiaBox(Vec3(2.5f, 1.0f, 1.0f), param.m_Mass);
param.m_MotionType = PsMotionType::MotionTypeActive;
param.m_Quat = m_Qt;
param.m_Pos = m_Position;
//合成されるプリミティブ(0番目、ボックス)
PsCombinedPrimitive primitive;
primitive.reset();
primitive.m_CombinedType = PsCombinedType::TypeBox;
primitive.m_HalfSize = Vec3(0.5f, 0.5f, 1.5f);
primitive.m_OffsetPosition = Vec3(-2.0f, 0.0f, 0.0f);
//合成オブジェクトに追加
param.AddPrim(primitive);
//合成されるプリミティブ(1番目、ボックス)
primitive.reset();
primitive.m_CombinedType = PsCombinedType::TypeBox;
primitive.m_HalfSize = Vec3(0.5f, 1.5f, 0.5f);
primitive.m_OffsetPosition = Vec3(2.0f, 0.0f, 0.0f);
//合成オブジェクトに追加
param.AddPrim(primitive);
//合成されるプリミティブ(2番目、カプセル)
primitive.reset();
primitive.m_CombinedType = PsCombinedType::TypeCapsule;
primitive.m_HalfLen = 1.5f;
primitive.m_Radius = 0.5f;
primitive.m_OffsetPosition = Vec3(0.0f, 0.0f, 0.0f);
//合成オブジェクトに追加
param.AddPrim(primitive);
//物理コンポーネント(合成)
auto PsPtr = AddComponent<PsCombinedBody>(param);
PsPtr->SetDrawActive(true);
//物理コンポーネントに合わせて描画コンポーネント(影も)を作成
CreateDrawComp(param);
}