図0406a
実行すると、ステージ上には大量のボックスが回転しています。プレイヤーを動かすとそれぞれと衝突判定をして、上に乗ることができます。上に乗ると親子関係になり、ボックスの回転に合わせてプレイヤーが台の上で回転します。
//初期化
void RollingBoxGroup::OnCreate() {
auto PtrTrans = GetComponent<Transform>();
PtrTrans->SetScale(Vec3(1.0f, 1.0f, 1.0f));
Quat Qt;
Qt.identity();
PtrTrans->SetQuaternion(Qt);
PtrTrans->SetPosition(Vec3(0, 0, 0));
//影をつける(自己影用のシェーダを使うための理由)
auto ShadowPtr = AddComponent<Shadowmap>();
//描画コンポーネント
auto PtrDraw = AddComponent<PNTStaticInstanceDraw>();
PtrDraw->SetOwnShadowActive(true);
PtrDraw->SetMeshResource(L"DEFAULT_CUBE");
PtrDraw->SetTextureResource(L"SKY_TX");
//毎ターン毎に行列をクリアする
PtrDraw->SetAutoClearMatrixVec(true);
}
void RollingBox::OnCreate() {
auto PtrTransform = GetComponent<Transform>();
PtrTransform->SetScale(m_Scale);
PtrTransform->SetRotation(m_Rotation);
PtrTransform->SetPosition(m_Position);
//衝突判定
auto PtrObb = AddComponent<CollisionObb>();
PtrObb->SetFixed(true);
//影をつける
auto ShadowPtr = AddComponent<Shadowmap>();
ShadowPtr->SetMeshResource(L"DEFAULT_CUBE");
auto GroupPtr = GetStage()->GetSharedGameObject<RollingBoxGroup>(L"RollingBoxGroup");
auto DrawPtr = GroupPtr->GetComponent<PNTStaticInstanceDraw>();
DrawPtr->AddMatrix(PtrTransform->GetWorldMatrix());
AddTag(L"MoveBox");
}
void RollingBox::OnUpdate() { float ElapsedTime = App::GetApp()->GetElapsedTime(); auto PtrTransform = GetComponent<Transform>(); auto Qt = PtrTransform->GetQuaternion(); Quat QtSpan(Vec3(0, 1, 0), ElapsedTime * m_RotParam); Qt *= QtSpan; PtrTransform->SetQuaternion(Qt); auto GroupPtr = GetStage()->GetSharedGameObject<RollingBoxGroup>(L"RollingBoxGroup"); auto DrawPtr = GroupPtr->GetComponent<PNTStaticInstanceDraw>(); DrawPtr->AddMatrix(PtrTransform->GetWorldMatrix()); }
void GameStage::CreateRollingBox() { auto GroupPtr = AddGameObject<RollingBoxGroup>(); //シェアオブジェクトに設定 SetSharedGameObject(L"RollingBoxGroup", GroupPtr); Vec3 Scale(1.25f, 0.5f, 1.25f); Vec3 Rot(0.0f, 0.0f, 0.0f); Vec3 Pos; //配列の初期化 vector< vector<Vec3> > Vec; //奥側のオブジェクト for (int x = -20; x < 20; x+= 2) { for (int z = 5; z < 20; z+= 2) { Pos = Vec3((float)x, 0.25f, (float)z); vector<Vec3> temp = { Scale, Rot, Pos }; Vec.push_back(temp); } } //手前側のオブジェクト for (int x = -20; x < 20; x += 2) { for (int z = -5; z > -20; z -= 2) { Pos = Vec3((float)x, 0.25f, (float)z); vector<Vec3> temp = { Scale, Rot, Pos }; Vec.push_back(temp); } } //オブジェクトの作成 float RotParam = 1.0f; for (auto v : Vec) { //乱数で回転係数を0.5から1.5の間に設定 RotParam = Util::RandZeroToOne(true) + 0.5f; AddGameObject<RollingBox>(v[0], v[1], v[2], RotParam); } }