図1304a
少し経つと、以下の画面になります。
図1304b
ここでBボタンを押すと、ゲーム画面になります。
図1304c
ゲーム画面でBボタンを押すと前の画面に戻ります。
class WaitStage : public Stage {
//ビューの作成
void CreateViewLight();
//スプライトの作成
void CreateTitleSprite();
//リソースロード用のスレッド(スタティック関数)
static void LoadResourceFunc();
//リソースを読み込んだことを知らせるフラグ(スタティック変数)
static bool m_Loaded;
//ミューテックス
static std::mutex mtx;
public:
//構築と破棄
WaitStage() :Stage() {}
virtual ~WaitStage() {}
//初期化
virtual void OnCreate()override;
//更新
virtual void OnUpdate()override;
};
リソースロード用のスレッド関数 リソースが読み込み終わったことを知らせるフラグ ミューテックス
void WaitStage::OnCreate() {
wstring DataDir;
//サンプルのためアセットディレクトリを取得
App::GetApp()->GetAssetsDirectory(DataDir);
//お待ちくださいのテクスチャのみここで登録
wstring strTexture = DataDir + L"wait.png";
App::GetApp()->RegisterTexture(L"WAIT_TX", strTexture);
strTexture = DataDir + L"movetest.png";
App::GetApp()->RegisterTexture(L"MOVETEST_TX", strTexture);
//他のリソースを読み込むスレッドのスタート
std::thread LoadThread(LoadResourceFunc);
//終了までは待たない
LoadThread.detach();
CreateViewLight();
//スプライトの作成
CreateTitleSprite();
}
//他のリソースを読み込むスレッドのスタート
std::thread LoadThread(LoadResourceFunc);
//終了までは待たない
LoadThread.detach();
bool WaitStage::m_Loaded = false; std::mutex WaitStage::mtx;
void WaitStage::LoadResourceFunc() { mtx.lock(); m_Loaded = false; mtx.unlock(); wstring DataDir; //サンプルのためアセットディレクトリを取得 App::GetApp()->GetAssetsDirectory(DataDir); //各ゲームは以下のようにデータディレクトリを取得すべき //App::GetApp()->GetDataDirectory(DataDir); wstring strTexture = DataDir + L"sky.jpg"; App::GetApp()->RegisterTexture(L"SKY_TX", strTexture); strTexture = DataDir + L"trace.png"; App::GetApp()->RegisterTexture(L"TRACE_TX", strTexture); strTexture = DataDir + L"number.png"; App::GetApp()->RegisterTexture(L"NUMBER_TX", strTexture); strTexture = DataDir + L"spark.png"; App::GetApp()->RegisterTexture(L"SPARK_TX", strTexture); strTexture = DataDir + L"fire.png"; App::GetApp()->RegisterTexture(L"FIRE_TX", strTexture); strTexture = DataDir + L"StageMessage.png"; App::GetApp()->RegisterTexture(L"MESSAGE_TX", strTexture); //サウンド wstring CursorWav = DataDir + L"cursor.wav"; App::GetApp()->RegisterWav(L"cursor", CursorWav); //BGM wstring strMusic = DataDir + L"nanika .wav"; App::GetApp()->RegisterWav(L"Nanika", strMusic); mtx.lock(); m_Loaded = true; mtx.unlock(); }
void WaitStage::OnUpdate() { if (m_Loaded) { //リソースのロードが終了したらタイトルステージに移行 PostEvent(0.0f, GetThis<ObjectInterface>(), App::GetApp()->GetScene<Scene>(), L"ToTitleStage"); } }
App::GetApp()->UnRegisterResource(L"リソース名")
void AnimeSprite::OnCreate() { float HelfSize = 0.5f; //頂点配列 vector<VertexPositionColorTexture> vertex = { { VertexPositionColorTexture(Vec3(-HelfSize, HelfSize, 0),Col4(1.0f,1.0f,1.0f,1.0f), Vec2(0.0f, 0.0f)) }, { VertexPositionColorTexture(Vec3(HelfSize, HelfSize, 0), Col4(1.0f, 1.0f, 1.0f, 1.0f), Vec2(1.0f, 0.0f)) }, { VertexPositionColorTexture(Vec3(-HelfSize, -HelfSize, 0), Col4(1.0f, 1.0f, 1.0f, 1.0f), Vec2(0.0f, 1.0f)) }, { VertexPositionColorTexture(Vec3(HelfSize, -HelfSize, 0), Col4(1.0f, 1.0f, 1.0f, 1.0f), Vec2(1.0f, 1.0f)) }, }; //インデックス配列 vector<uint16_t> indices = { 0, 1, 2, 1, 3, 2 }; SetAlphaActive(m_Trace); auto PtrTransform = GetComponent<Transform>(); PtrTransform->SetScale(m_StartScale.x, m_StartScale.y, 1.0f); PtrTransform->SetRotation(0, 0, 0); PtrTransform->SetPosition(m_StartPos.x, m_StartPos.y, 0.0f); //頂点とインデックスを指定してスプライト作成 auto PtrDraw = AddComponent<PCTSpriteDraw>(vertex, indices); PtrDraw->SetSamplerState(SamplerState::LinearWrap); PtrDraw->SetTextureResource(m_TextureKey); }
void AnimeSprite::OnUpdate() { float ElapsedTime = App::GetApp()->GetElapsedTime(); m_TotalTime += ElapsedTime * 5.0f; if (m_TotalTime >= XM_2PI) { m_TotalTime = 0; } auto PtrDraw = GetComponent<PCTSpriteDraw>(); Col4 col(1.0, 1.0, 1.0, 1.0); col.w = sin(m_TotalTime) * 0.5f + 0.5f; PtrDraw->SetDiffuse(col); }
図1304d
このテクスチャを3×2に分割し、それを順番に表示すると連番アニメーションが出来上がります。
void SerialAnimeSprite::OnUpdate() {
float ElapsedTime = App::GetApp()->GetElapsedTime();
m_TotalTime += ElapsedTime;
if (m_TotalTime >= m_AnimeTime) {
m_PieceIndex++;
if (m_PieceIndex >= m_PieceXCount * m_PieceYCount) {
m_PieceIndex = 0;
}
m_TotalTime = 0;
}
vector<VertexPositionColorTexture> newVertices;
uint32_t pieceX = m_PieceIndex % m_PieceXCount;
uint32_t pieceY = m_PieceIndex / m_PieceXCount;
float pieceWidth = 1.0f / (float)m_PieceXCount;
float pieceHeight = 1.0f / (float)m_PieceYCount;
float pieceStartX = (float)pieceX * pieceWidth;
float pieceEndX = pieceStartX + pieceWidth;
float pieceStartY = (float)pieceY * pieceHeight;
float pieceEndY = pieceStartY + pieceHeight;
for (size_t i = 0; i < m_BackupVertices.size(); i++) {
Vec2 uv = m_BackupVertices[i].textureCoordinate;
switch (i) {
case 0:
uv.x = pieceStartX;
uv.y = pieceStartY;
break;
case 1:
uv.x = pieceEndX;
uv.y = pieceStartY;
break;
case 2:
uv.x = pieceStartX;
uv.y = pieceEndY;
break;
case 3:
uv.x = pieceEndX;
uv.y = pieceEndY;
break;
}
auto v = VertexPositionColorTexture(
m_BackupVertices[i].position,
m_BackupVertices[i].color,
uv
);
newVertices.push_back(v);
}
auto ptrDraw = GetComponent<PCTSpriteDraw>();
ptrDraw->UpdateVertices(newVertices);
}
uint32_t pieceX = m_PieceIndex % m_PieceXCount; //Xの位置
uint32_t pieceY = m_PieceIndex / m_PieceXCount; //Yの位置
//初期化 void MultiFire::OnCreate() { //加算描画処理をする SetAddType(true); }
void MultiFire::InsertFire(const Vec3& Pos) { auto ptrParticle = InsertParticle(4); ptrParticle->SetEmitterPos(Pos); ptrParticle->SetTextureResource(L"FIRE_TX"); ptrParticle->SetMaxTime(0.5f); for (auto& rParticleSprite : ptrParticle->GetParticleSpriteVec()) { rParticleSprite.m_LocalPos.x = Util::RandZeroToOne() * 0.1f - 0.05f; rParticleSprite.m_LocalPos.y = Util::RandZeroToOne() * 0.1f; rParticleSprite.m_LocalPos.z = Util::RandZeroToOne() * 0.1f - 0.05f; //各パーティクルの移動速度を指定 rParticleSprite.m_Velocity = Vec3( rParticleSprite.m_LocalPos.x * 5.0f, rParticleSprite.m_LocalPos.y * 5.0f, rParticleSprite.m_LocalPos.z * 5.0f ); //色の指定 rParticleSprite.m_Color = Col4(1.0f, 1.0f, 1.0f, 1.0f); } }
auto ptrParticle = InsertParticle(4);
ptrParticle->SetEmitterPos(Pos); ptrParticle->SetTextureResource(L"FIRE_TX"); ptrParticle->SetMaxTime(0.5f);
for (auto& rParticleSprite : ptrParticle->GetParticleSpriteVec()) { rParticleSprite.m_LocalPos.x = Util::RandZeroToOne() * 0.1f - 0.05f; rParticleSprite.m_LocalPos.y = Util::RandZeroToOne() * 0.1f; rParticleSprite.m_LocalPos.z = Util::RandZeroToOne() * 0.1f - 0.05f; //各パーティクルの移動速度を指定 rParticleSprite.m_Velocity = Vec3( rParticleSprite.m_LocalPos.x * 5.0f, rParticleSprite.m_LocalPos.y * 5.0f, rParticleSprite.m_LocalPos.z * 5.0f ); //色の指定 rParticleSprite.m_Color = Col4(1.0f, 1.0f, 1.0f, 1.0f); }
//炎の作成 void GameStage::CreateFire() { auto MultiFirePtr = AddGameObject<MultiFire>(); //共有オブジェクトに炎を登録 SetSharedGameObject(L"MultiFire", MultiFirePtr); }
void SeekObject::OnCollisionEnter(shared_ptr<GameObject>& Other) { //ファイアの放出 auto ptriFire = GetStage()->GetSharedGameObject<MultiFire>(L"MultiFire", false); if (ptriFire) { ptriFire->InsertFire(GetComponent<Transform>()->GetPosition()); } }
void MultiSpark::OnUpdate() {
for (auto ptrParticle : GetParticleVec()) {
for (auto& rParticleSprite : ptrParticle->GetParticleSpriteVec()) {
if (rParticleSprite.m_Active) {
rParticleSprite.m_Color.z += 0.05f;
if (rParticleSprite.m_Color.z >= 1.0f) {
rParticleSprite.m_Color.z = 1.0f;
}
}
}
}
//親クラスのOnUpdate()を呼ぶ
MultiParticle::OnUpdate();
}
//親クラスのOnUpdate()を呼ぶ
MultiParticle::OnUpdate();
void WaitStage::LoadResourceFunc() { wstring dataDir; //サンプルのためアセットディレクトリを取得 App::GetApp()->GetAssetsDirectory(dataDir); //中略 //以下オーディオ //サウンド wstring CursorWav = dataDir + L"cursor.wav"; App::GetApp()->RegisterWav(L"cursor", CursorWav); //ミュージック wstring strMusic = dataDir + L"nanika .wav"; App::GetApp()->RegisterWav(L"Nanika", strMusic); }
void GameStage::PlayBGM() { auto XAPtr = App::GetApp()->GetXAudio2Manager(); m_BGM = XAPtr->Start(L"Nanika", XAUDIO2_LOOP_INFINITE, 0.1f); }
void GameStage::OnDestroy() { //BGMのストップ auto XAPtr = App::GetApp()->GetXAudio2Manager(); XAPtr->Stop(m_BGM); }
//Aボタン
void Player::OnPushA() {
auto grav = GetComponent<Gravity>();
grav->StartJump(Vec3(0,4.0f,0));
//スパークの放出
auto PtrSpark = GetStage()->GetSharedGameObject<MultiSpark>(L"MultiSpark", false);
if (PtrSpark) {
PtrSpark->InsertSpark(GetComponent<Transform>()->GetPosition());
}
//サウンドの再生
auto ptrXA = App::GetApp()->GetXAudio2Manager();
ptrXA->Start(L"cursor", 0, 0.5f);
}