図0701a
図0701b
その状態で、Yボタンを押し続けると、選択されたオブジェクトが、プレイヤーの上部に引き寄せられます。Yボタンを離すと、そのオブジェクトは落ちてきます。場合によってはプレイヤーの頭から落ちてくる場合もあるので注意しましょう。(だからといってプレイヤーに何か損害が出るわけではないですが・・・)
図0701c
void FireSphere::OnCreate() {
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(Vec3(m_Scale));
PtrTransform->SetQuaternion(Quat());
PtrTransform->SetPosition(m_Emitter);
//コリジョンを付ける(ボリューム取得のため)
auto PtrColl = AddComponent<CollisionSphere>();
PtrColl->SetIsHitAction(IsHitAction::None);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(L"DEFAULT_SPHERE");
auto PtrDraw = AddComponent<BcPNTStaticDraw>();
PtrDraw->SetFogEnabled(true);
PtrDraw->SetMeshResource(L"DEFAULT_SPHERE");
PtrDraw->SetTextureResource(L"SKY_TX");
GetStage()->SetSharedGameObject(L"FireSphere", GetThis<GameObject>());
}
//Xボタンハンドラ
void Player::OnPushX() {
auto Ptr = GetComponent<Transform>();
Vec3 Pos = Ptr->GetPosition();
Pos.y += 0.5f;
Quat Qt = Ptr->GetQuaternion();
Vec3 Rot = Qt.toRotVec();
float RotY = Rot.y;
Vec3 velo(sin(RotY), 0.05f, cos(RotY));
velo.normalize();
velo *= 20.0f;
auto ShPtr = GetStage()->GetSharedGameObject<FireSphere>(L"FireSphere",false);
if (ShPtr) {
ShPtr->Reset(Pos, velo);
}
else {
GetStage()->AddGameObject<FireSphere>(Pos, velo);
}
}
//-------------------------------------------------------------------------------------- /*! @brief コリジョンとの衝突判定(呼び出しテンプレート) @tparam T コリジョン型 @param[in] src コリジョンOBB @return なし */ //-------------------------------------------------------------------------------------- template<typename T> bool CollisionTest(const T& src) { return CollisionTestBase(src); }
bool PsSphereBody::CollisionTestBase(const SPHERE& src) { SPHERE dest; auto& param = m_PhysicsSphere->GetParam(); dest.m_Radius = param.m_Radius; dest.m_Center = GetPosition(); return HitTest::SPHERE_SPHERE(src, dest); }
void FireSphere::OnUpdate() {
auto PtrTransform = GetComponent<Transform>();
if (PtrTransform->GetPosition().y > -20.0f) {
float ElapsedTime = App::GetApp()->GetElapsedTime();
Vec3 Ac = Vec3(0, -9.8f, 0) * 1.0f;
m_Velocity += Ac * ElapsedTime;
auto Pos = PtrTransform->GetPosition();
Pos += m_Velocity* ElapsedTime;
PtrTransform->SetPosition(Pos);
}
else {
//じっとしている
PtrTransform->SetPosition(Vec3(0,-20.0f,0));
}
auto Coll = GetComponent<CollisionSphere>();
//物理オブジェクトを持つ配列の取得
vector<shared_ptr<PsBodyComponent>> PsComptVec;
GetStage()->GetUsedDynamicCompoentVec<PsBodyComponent>(PsComptVec);
for (auto& v : PsComptVec) {
auto g_ptr = dynamic_pointer_cast<ActivePsObject>(v->GetGameObject());
if (g_ptr) {
if (v->CollisionTest(Coll->GetSphere())) {
auto h_ptr = m_HoldObject.lock();
if (h_ptr) {
h_ptr->SetHold(false);
}
m_HoldObject = g_ptr;
g_ptr->SetHold(true);
PtrTransform->SetPosition(Vec3(0, -20, 0));
break;
}
}
}
}
if (PtrTransform->GetPosition().y > -20.0f) { float ElapsedTime = App::GetApp()->GetElapsedTime(); Vec3 Ac = Vec3(0, -9.8f, 0) * 1.0f; m_Velocity += Ac * ElapsedTime; auto Pos = PtrTransform->GetPosition(); Pos += m_Velocity* ElapsedTime; PtrTransform->SetPosition(Pos); } else { //じっとしている PtrTransform->SetPosition(Vec3(0,-20.0f,0)); }
//物理オブジェクトを持つ配列の取得
vector<shared_ptr<PsBodyComponent>> PsComptVec;
GetStage()->GetUsedDynamicCompoentVec<PsBodyComponent>(PsComptVec);
for (auto& v : PsComptVec) {
auto g_ptr = dynamic_pointer_cast<ActivePsObject>(v->GetGameObject());
if (g_ptr) {
if (v->CollisionTest(Coll->GetSphere())) {
auto h_ptr = m_HoldObject.lock();
if (h_ptr) {
h_ptr->SetHold(false);
}
m_HoldObject = g_ptr;
g_ptr->SetHold(true);
PtrTransform->SetPosition(Vec3(0, -20, 0));
break;
}
}
}
if (v->CollisionTest<SPHERE>(Coll->GetSphere())) {
h_ptr->SetHold(false);
g_ptr->SetHold(true);
PtrTransform->SetPosition(Vec3(0, -20, 0));
void ActivePsObject::SetHold(bool b) {
if (b) {
if (m_StateMachine->GetCurrentState() == ActivePsDefaultState::Instance()) {
m_StateMachine->ChangeState(ActivePsHoldState::Instance());
//プレイヤーに自分がホールドされていることを伝える
auto PlayerPtr = GetStage()->GetSharedGameObject<Player>(L"Player", false);
if (PlayerPtr) {
PlayerPtr->SetHoldObject(GetThis<ActivePsObject>());
}
}
}
else {
if (m_StateMachine->GetCurrentState() == ActivePsHoldState::Instance()) {
m_StateMachine->ChangeState(ActivePsDefaultState::Instance());
}
}
}
//Yボタンハンドラ(押した瞬間) void Player::OnPushY() { //ホールドしたオブジェクトがなければ何もしない auto HoldPtr = m_HoldObject.lock(); if (!HoldPtr) { return; } auto ActionLinePtr = m_ActionLine.lock(); if (ActionLinePtr) { auto Check = ActionLinePtr->GetEndObj(); auto CheckHold = dynamic_pointer_cast<GameObject>(HoldPtr); if (Check != CheckHold) { ActionLinePtr->SetEndObj(HoldPtr); } ActionLinePtr->SetDrawActive(true); } else { //ラインの作成 auto LinePtr = GetStage()->AddGameObject<ActionLine>(GetThis<GameObject>(), HoldPtr); LinePtr->SetDrawActive(true); m_ActionLine = LinePtr; } }
//ラインの作成 auto LinePtr = GetStage()->AddGameObject<ActionLine>(GetThis<GameObject>(), HoldPtr);
//Yボタンハンドラ(離した瞬間) void Player::OnReleaseY() { auto ActionLinePtr = m_ActionLine.lock(); if (ActionLinePtr) { ActionLinePtr->SetDrawActive(false); } }
//Yボタンハンドラ(押し続け)
void Player::OnPressY() {
auto Ptr = GetComponent<Transform>();
auto PlayerPos = Ptr->GetPosition();
auto HoldPtr = m_HoldObject.lock();
if (HoldPtr) {
auto PsPtr = HoldPtr->GetDynamicComponent<PsBodyComponent>(false);
if (PsPtr) {
auto PsPos = PsPtr->GetPosition();
float ToY = 2.0f;
if (PsPos.y > 5.0f) {
ToY = 0.0f;
}
PsPos.y = 0;
PlayerPos.y = 0;
Vec3 ToPlayerVec = PlayerPos - PsPos;
PsPtr->WakeUp();
PsPtr->SetLinearVelocity(Vec3(ToPlayerVec.x , ToY, ToPlayerVec.z ));
}
}
}
PsPtr->WakeUp();