図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();