かつどんの活動記録#4-3 シーンチェンジ作成
<scene.cpp>
static SCENE_INDEX g_SceneIndex = SCENE_INDEX_TITLE;
static SCENE_INDEX g_SceneNextIndex = g_SceneIndex;
/* -------- switchの代わり --------- */
typedef void(*Func)(void); // 関数ポインタの型
static const Func SCENE_INIT[] = {
Title_Initialize,
Game_Initialize,
};
static const Func SCENE_UPDATE[] = {
Title_Update,
Game_Update,
};
static const Func SCENE_DRAW[] = {
Title_Draw,
Game_Render,
};
static const Func SCENE_FINALIZE[] = {
Title_Finalize,
Game_Finalize,
};
void Scene_Initialize(SCENE_INDEX index)
{
g_SceneIndex = g_SceneNextIndex = index;
SCENE_INIT[g_SceneIndex]();
}
void Scene_Update(void)
{
SCENE_UPDATE[g_SceneIndex]();
}
void Scene_Draw(void)
{
SCENE_DRAW[g_SceneIndex]();
}
void Scene_Check(void)
{
// もし今のシーンと次のシーンが違ったらシーンチェンジ
if (g_SceneIndex != g_SceneNextIndex)
{
Scene_Finalize();
Scene_Initialize(g_SceneNextIndex);
}
}
void Scene_Finalize(void)
{
SCENE_FINALIZE[g_SceneIndex]();
}
void Scene_Change(SCENE_INDEX index)
{
g_SceneNextIndex = index;
}
<fade.cpp>
typedef struct FadeVertex_TAG
{
D3DXVECTOR4 position;
D3DCOLOR color;
}FadeVertex;
#define FVF_FADE_VERTEX (D3DFVF_XYZRHW| D3DFVF_DIFFUSE|D3DFVF_TEX1)
static bool g_bFade = false; // フェード中かどうか
static bool g_bOut = false; // フェードアウトなのかインなのか
static float g_Alpha = 0.0f;
static float g_addAlpha = 0.0f; // 1フレームでどのくらい+するのか
static D3DCOLOR g_color = D3DCOLOR_RGBA(0, 0, 0, 0); // フェードカラー
static int g_fadeFrame = 0; // 何フレームで終わるのか
static int g_fadeFrameCount = 0; // 何フレーム経ったのか
void Fade_Initialize(void)
{
g_bFade = false;
g_Alpha = 0.0f;
}
void Fade_Finalize(void)
{
}
void Fade_Update(void)
{
if (g_bFade)
{
g_Alpha = min(max(g_Alpha + g_addAlpha, 0.0f), 1.0f);
g_fadeFrameCount++;
if (g_fadeFrameCount > g_fadeFrame)
{
g_fadeFrameCount = g_fadeFrame;
g_bFade = false;
}
}
}
void Fade_Draw(void)
{
if (g_Alpha <= 0.0000001f)
{
return;
}
D3DXCOLOR color(g_color);
color.a = g_Alpha;
FadeVertex v[] = {
{ D3DXVECTOR4(0.0f,0.0f,1.0f,1.0f), color },
{ D3DXVECTOR4(SCREEN_WIDTH,0.0f,1.0f,1.0f), color },
{ D3DXVECTOR4(0.0f,SCREEN_HEIGHT,1.0f,1.0f), color },
{ D3DXVECTOR4(SCREEN_WIDTH,SCREEN_HEIGHT,1.0f,1.0f), color },
};
LPDIRECT3DDEVICE9 pDevice = MyDirect3D_GetDevice();
pDevice->SetFVF(FVF_FADE_VERTEX); // FVFをデバイスに設定
pDevice->SetTexture(0, NULL); //管理してるテクスチャを教えてあげる
pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(FadeVertex)); //描画命令,三角型の数は頂点-2
}
void Fade_Start(bool bOut, int frame, D3DCOLOR color)
{
g_bFade = true;
g_bOut = bOut;
g_color = color;
g_fadeFrame = frame;
g_fadeFrameCount = 0;
g_addAlpha = 1.0f / g_fadeFrame;
if (g_bOut)
{
g_Alpha = 0.0f;
}
else
{
g_Alpha = 1.0f;
g_addAlpha = -g_addAlpha;
}
}
bool Fade_IsFade(void)
{
return g_bFade;
}
この2つ使ってタイトル→ゲームみたいなシーンチェンジ実装しました。
疲れちゃったんで最後は適当になってしまいましたすいません…
もし聞きたいことがある場合はTwitterのDMなり、YouTubeのコメントなり、なんかしらの手段で連絡くれれば可能な限り全力でお答えします!w
この記事が気に入ったらサポートをしてみませんか?