図0112a
void ActivePsBox::OnCreate() {
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(m_Scale);
PtrTransform->SetQuaternion(m_Qt);
PtrTransform->SetPosition(m_Position);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(L"DEFAULT_CUBE");
auto PtrDraw = AddComponent<BcPNTStaticDraw>();
PtrDraw->SetFogEnabled(true);
PtrDraw->SetMeshResource(L"DEFAULT_CUBE");
PtrDraw->SetOwnShadowActive(true);
PtrDraw->SetTextureResource(L"SKY_TX");
//物理計算ボックス
PsBoxParam param;
//DEFAULT_CUBEのスケーリングは各辺基準なので、ハーフサイズにする
param.m_HalfSize = m_Scale * 0.5f;
param.m_Mass = 1.0f;
//慣性テンソルの計算
param.m_Inertia = BasePhysics::CalcInertiaBox(param.m_HalfSize, param.m_Mass);
param.m_MotionType = PsMotionType::MotionTypeActive;
param.m_Quat = m_Qt;
param.m_Pos = m_Position;
auto PsPtr = AddComponent<PsBoxBody>(param);
PsPtr->SetDrawActive(true);
}
param.m_MotionType = PsMotionType::MotionTypeActive;
param.m_MotionType = PsMotionType::MotionTypeFixed;
//慣性テンソルの計算
param.m_Inertia = BasePhysics::CalcInertiaBox(param.m_HalfSize, param.m_Mass);
PsPtr->SetDrawActive(true);
//初期化
void Player::OnCreate() {
//初期位置などの設定
auto Ptr = GetComponent<Transform>();
Ptr->SetScale(Vec3(m_Scale)); //直径25センチの球体
Ptr->SetRotation(0.0f, 0.0f, 0.0f);
auto bkCamera = App::GetApp()->GetScene<Scene>()->GetBackupCamera();
Vec3 FirstPos;
if (!bkCamera) {
FirstPos = Vec3(0, m_Scale * 0.5f, 0);
}
else {
FirstPos = App::GetApp()->GetScene<Scene>()->GetBackupPlayerPos();
}
Ptr->SetPosition(FirstPos);
PsSphereParam param;
//basecrossのスケーリングは直径基準なので、半径基準にする
param.m_Radius = m_Scale * 0.5f;
param.m_Mass = 1.0f;
//慣性テンソルの計算
param.m_Inertia = BasePhysics::CalcInertiaSphere(param.m_Radius, param.m_Mass);
//プレイヤーなのでスリープしない
param.m_UseSleep = false;
param.m_MotionType = PsMotionType::MotionTypeActive;
param.m_Quat.identity();
param.m_Pos = FirstPos;
param.m_LinearVelocity = Vec3(0);
auto PsPtr = AddComponent<PsSphereBody>(param);
PsPtr->SetAutoTransform(false);
PsPtr->SetDrawActive(true);
//中略
}
PsPtr->SetAutoTransform(false);
void Player::OnUpdate2() {
auto PtrPs = GetComponent<PsSphereBody>();
auto Ptr = GetComponent<Transform>();
Ptr->SetPosition(PtrPs->GetPosition());
//回転の計算
Vec3 Angle = GetMoveVector();
if (Angle.length() > 0.0f) {
auto UtilPtr = GetBehavior<UtilBehavior>();
//補間処理を行わない回転。補間処理するには以下1.0を0.1などにする
UtilPtr->RotToHead(Angle, 1.0f);
}
//中略
}
void Player::OnPushX() {
auto Ptr = GetComponent<Transform>();
Vec3 Pos = Ptr->GetPosition();
Pos.y += 0.25f;
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<FirePsSphere>(L"FirePsSphere", false);
if (ShPtr) {
ShPtr->Reset(Pos, velo);
}
else {
GetStage()->AddGameObject<FirePsSphere>(Pos, velo);
}
}
void FirePsSphere::Reset(const Vec3& Emitter, const Vec3& Velocity) {
auto PsPtr = GetComponent<PsSingleSphereBody>();
PsSphereParam param;
CreateDefParam(param);
param.m_Pos = Emitter;
param.m_LinearVelocity = Velocity;
PsPtr->Reset(param, PsPtr->GetIndex());
}