かつどんの活動記録#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

この記事が気に入ったらサポートをしてみませんか?