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