FontSize = FONT_SIZE1;//폰트 크기 조절 for (int32 i = 0; i < TEXT_NUM1; ++i) { data->RenderMode = SHADED; Text_CreateText(&data->GuideLine[i], "d2coding.ttf", data->FontSize, str[i], wcslen(str[i])); } Image_Lo"> FontSize = FONT_SIZE1;//폰트 크기 조절 for (int32 i = 0; i < TEXT_NUM1; ++i) { data->RenderMode = SHADED; Text_CreateText(&data->GuideLine[i], "d2coding.ttf", data->FontSize, str[i], wcslen(str[i])); } Image_Lo"> FontSize = FONT_SIZE1;//폰트 크기 조절 for (int32 i = 0; i < TEXT_NUM1; ++i) { data->RenderMode = SHADED; Text_CreateText(&data->GuideLine[i], "d2coding.ttf", data->FontSize, str[i], wcslen(str[i])); } Image_Lo">
scene.c
---

#include "stdafx.h"
#include "Scene.h"
#include "Timer.h"

#include "Framework.h"

#define SOLID 0
#define SHADED 1
#define BLENDED 2
Scene g_Scene;

static ESceneType s_nextScene = SCENE_NULL;

#pragma region TitleScene

#define SOLID 0
#define SHADED 1
#define BLENDED 2

//글자 수
const wchar_t* str[] = {
   L"게임 시작",
   L"게임 종료",
};
#define FONT_SIZE1 20//폰트 크기
#define TEXT_NUM1 2//글자 제한

typedef struct TitleSceneData
{
	Text   GuideLine[TEXT_NUM1];
	COORD   coord;
	int32   FontSize;
	int32   RenderMode;
	Image   TestImage;
	int32      X;
	int32      Y;
} TitleSceneData;

void init_title(void)
{
	g_Scene.Data = malloc(sizeof(TitleSceneData));
	memset(g_Scene.Data, 0, sizeof(TitleSceneData));

	TitleSceneData* data = (TitleSceneData*)g_Scene.Data;

	data->FontSize = FONT_SIZE1;//폰트 크기 조절

	for (int32 i = 0; i < TEXT_NUM1; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->GuideLine[i], "d2coding.ttf", data->FontSize, str[i], wcslen(str[i]));

	}

	Image_LoadImage(&data->TestImage, "Background.jfif");// 이미지 로드
}

int count = 0;//선택지 넘버

void update_title(void)
{
	TitleSceneData* data = (TitleSceneData*)g_Scene.Data;

	if (count > 0)
	{
		if (Input_GetKeyDown(VK_UP))
		{
			count--;//선택지 올리기
		}
	}
	if (count < TEXT_NUM1 - 1)
	{
		if (Input_GetKeyDown(VK_DOWN))
		{
			count++;//선택지 내리기
		}
	}
	if (Input_GetKeyDown('R'))//선택지 정하는 장소
	{
		switch (count)
		{
		case 0:Scene_SetNextScene(SCENE_SCENE2);
			break;
		case 1:Scene_SetNextScene(SCENE_SCENE3);
			break;
		default:
			break;
		}

	}
}

void render_title(void)
{
	TitleSceneData* data = (TitleSceneData*)g_Scene.Data;
	//data->X = rand() % 1020;
	//data->Y = rand() % 200;

	data->X = 510;//그림 위치 조절
	data->Y = 100;

	SDL_Color color = { .a = 255 };//선택 
	SDL_Color choice_color = { .g = 255 };

	Renderer_DrawImage(&data->TestImage, data->X, data->Y);// 이미지 띄우기

	for (int32 i = 0; i < TEXT_NUM1; ++i)
	{
		Renderer_DrawTextSolid(&data->GuideLine[i], 800, 300 + i * data->FontSize, color);

	}
	Renderer_DrawTextSolid(&data->GuideLine[count], 800, 300 + count * data->FontSize, choice_color);
}

void release_title(void)
{
	TitleSceneData* data = (TitleSceneData*)g_Scene.Data;

	for (int32 i = 0; i < TEXT_NUM1; ++i)
	{
		Text_FreeText(&data->GuideLine[i]);
	}

	SafeFree(g_Scene.Data);
}
#pragma endregion

#pragma region Scene2

#define SOLID 0
#define SHADED 1
#define BLENDED 2

//글자 수
const wchar_t* str_story2[] = {
   L"지훈은 소스라치게 놀라며 눈을 뜨게 되었다.",
   L"눈을 뜨고 나니 앞에는 여자 아이가 있었고 나를 향해 아빠라 불렀다.",
   L"이 모든 상황이 어리둥절하여 주변을 둘러본다.",
};

const wchar_t* str_choice2[] = {
   L"1. 지나가는 직원을 붙잡고 물어본다.",
   L"2. 앞에 있는 아이에게 물어본다. ",
};

#define FONT_SIZE_ST2 30//폰트 크기
#define FONT_SIZE_CO2 20//폰트 크기
#define TEXT_NUM_ST2 3//글자 제한
#define TEXT_NUM_CO2 2//글자 제한

typedef struct Scene2Data
{
	Text    story[TEXT_NUM_ST2];
	Text    choice[TEXT_NUM_CO2];
	COORD   coord;
	int32   FontSize;
	int32   RenderMode;
	Image   TestImage;
	int32      X;
	int32      Y;
} Scene2Data;

void init_scene2(void)
{
	g_Scene.Data = malloc(sizeof(Scene2Data));
	memset(g_Scene.Data, 0, sizeof(Scene2Data));

	Scene2Data* data = (Scene2Data*)g_Scene.Data;

	data->FontSize = FONT_SIZE_ST2;//폰트 크기 조절
	data->FontSize = FONT_SIZE_CO2;//폰트 크기 조절

	for (int32 i = 0; i < TEXT_NUM_ST2; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->story[i], "d2coding.ttf", data->FontSize, str_story2[i], wcslen(str_story2[i]));
	}
	for (int32 i = 0; i < TEXT_NUM_CO2; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->choice[i], "d2coding.ttf", data->FontSize, str_choice2[i], wcslen(str_choice2[i]));
	}

	Image_LoadImage(&data->TestImage, "Background.jfif");// 이미지 로드
}

int count_ch2 = 0;//선택지 넘버

void update_scene2(void)
{
	Scene2Data* data = (Scene2Data*)g_Scene.Data;

	if (count_ch2 > 0)
	{
		if (Input_GetKeyDown(VK_UP))
		{
			count_ch2--;//선택지 올리기
		}
	}

	if (count_ch2 < TEXT_NUM_CO2 - 1)
	{
		if (Input_GetKeyDown(VK_DOWN))
		{
			count_ch2++;//선택지 내리기
		}
	}

	if (Input_GetKeyDown('R'))
	{
		Scene_SetNextScene(SCENE_SCENE3);
	}
}

void render_scene2(void)
{

	Scene2Data* data = (Scene2Data*)g_Scene.Data;
	//data->X = rand() % 1020;
	//data->Y = rand() % 200;

	data->X = 510;//그림 위치 조절
	data->Y = 100;

	SDL_Color color = { .a = 255 };//선택 
	SDL_Color choice_color = { .g = 255 };

	Renderer_DrawImage(&data->TestImage, data->X, data->Y);// 이미지 띄우기

	for (int32 i = 0; i < TEXT_NUM_ST2; ++i)//스토리
	{
		Renderer_DrawTextSolid(&data->story[i], 150, 450 + i * data->FontSize, color);
	}

	for (int32 i = 0; i < TEXT_NUM_CO2; ++i)//선택지
	{
		Renderer_DrawTextSolid(&data->choice[i], 150, 620 + i * data->FontSize, color);
	}

	Renderer_DrawTextSolid(&data->choice[count_ch2], 150, 620 + count_ch2 * data->FontSize, choice_color);
}

void release_scene2(void)
{
	Scene2Data* data = (Scene2Data*)g_Scene.Data;

	for (int32 i = 0; i < TEXT_NUM_ST2; ++i)
	{
		Text_FreeText(&data->story[i]);
	}

	for (int32 i = 0; i < TEXT_NUM_CO2; ++i)
	{
		Text_FreeText(&data->choice[i]);
	}

	SafeFree(g_Scene.Data);
}

#pragma endregion

#pragma region Scene3

#define SOLID 0
#define SHADED 1
#define BLENDED 2

//글자 수
const wchar_t* str_story3[] = {
   L"여기는 남산타워 전망대 입니다.",
   L"남산타워 전망대에 대한 설명을 열심히 한다.",
   L"\\"남산타워는 총 7층으로 구성되어있으며 1층에는 각종 기프트˜,",
   L"2층에는 테라스, 3층에는 …..\\"",
   L"지훈은 머리를 부여잡았다."
};

const wchar_t* str_choice3[] = {
   L"1. 설명은 됐습니다...",
   L" ",
};

#define FONT_SIZE_ST3 30//폰트 크기
#define FONT_SIZE_CO3 20//폰트 크기
#define TEXT_NUM_ST3 5//글자 제한
#define TEXT_NUM_CO3 2//글자 제한

typedef struct Scene3Data
{
	Text    story[TEXT_NUM_ST3];
	Text    choice[TEXT_NUM_CO3];
	COORD   coord;
	int32   FontSize;
	int32   RenderMode;
	Image   TestImage;
	int32      X;
	int32      Y;
} Scene3Data;

void init_scene3(void)
{
	g_Scene.Data = malloc(sizeof(Scene3Data));
	memset(g_Scene.Data, 0, sizeof(Scene3Data));

	Scene3Data* data = (Scene3Data*)g_Scene.Data;

	data->FontSize = FONT_SIZE_ST3;//폰트 크기 조절
	data->FontSize = FONT_SIZE_CO3;//폰트 크기 조절

	for (int32 i = 0; i < TEXT_NUM_ST3; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->story[i], "d2coding.ttf", data->FontSize, str_story3[i], wcslen(str_story3[i]));
	}
	for (int32 i = 0; i < TEXT_NUM_CO3; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->choice[i], "d2coding.ttf", data->FontSize, str_choice3[i], wcslen(str_choice3[i]));
	}

	Image_LoadImage(&data->TestImage, "Background.jfif");// 이미지 로드
}

int count_ch3 = 0;//선택지 넘버

void update_scene3(void)
{
	Scene3Data* data = (Scene3Data*)g_Scene.Data;

	if (count_ch3 > 0)
	{
		if (Input_GetKeyDown(VK_UP))
		{
			count_ch3--;//선택지 올리기
		}
	}

	if (count_ch3 < TEXT_NUM_CO3 - 1)
	{
		if (Input_GetKeyDown(VK_DOWN))
		{
			count_ch3++;//선택지 내리기
		}
	}

	if (Input_GetKeyDown('R'))
	{
		Scene_SetNextScene(SCENE_SCENE4);
	}
}

void render_scene3(void)
{
	Scene3Data* data = (Scene3Data*)g_Scene.Data;
	//data->X = rand() % 1020;
	//data->Y = rand() % 200;

	data->X = 510;//그림 위치 조절
	data->Y = 100;

	SDL_Color color = { .a = 255 };//선택 
	SDL_Color choice_color = { .g = 255 };

	Renderer_DrawImage(&data->TestImage, data->X, data->Y);// 이미지 띄우기

	for (int32 i = 0; i < TEXT_NUM_ST3; ++i)//스토리
	{
		Renderer_DrawTextSolid(&data->story[i], 150, 450 + i * data->FontSize, color);
	}

	for (int32 i = 0; i < TEXT_NUM_CO3; ++i)//선택지
	{
		Renderer_DrawTextSolid(&data->choice[i], 150, 620 + i * data->FontSize, color);
	}

	Renderer_DrawTextSolid(&data->choice[count_ch3], 150, 620 + count_ch3 * data->FontSize, choice_color);
}

void release_scene3(void)
{
	Scene3Data* data = (Scene3Data*)g_Scene.Data;

	for (int32 i = 0; i < TEXT_NUM_ST3; ++i)
	{
		Text_FreeText(&data->story[i]);
	}

	for (int32 i = 0; i < TEXT_NUM_CO3; ++i)
	{
		Text_FreeText(&data->choice[i]);
	}

	SafeFree(g_Scene.Data);
}

#pragma endregion

#pragma region Scene4

#define SOLID 0
#define SHADED 1
#define BLENDED 2

//글자 수
const wchar_t* str_story4[] = {
   L"아빠가 놀러가자고 해서 온거잖아!",
   L" ",
};

const wchar_t* str_choice4[] = {
   L"1. 아이에게 물어본것이 잘못인거 같다. 직원에게 물어보자",
   L" ",
};

#define FONT_SIZE_ST4 30//폰트 크기
#define FONT_SIZE_CO4 20//폰트 크기
#define TEXT_NUM_ST4 2//글자 제한
#define TEXT_NUM_CO4 2//글자 제한

typedef struct Scene4Data
{
	Text    story[TEXT_NUM_ST4];
	Text    choice[TEXT_NUM_CO4];
	COORD   coord;
	int32   FontSize;
	int32   RenderMode;
	Image   TestImage;
	int32      X;
	int32      Y;
} Scene4Data;

void init_scene4(void)
{
	g_Scene.Data = malloc(sizeof(Scene4Data));
	memset(g_Scene.Data, 0, sizeof(Scene4Data));

	Scene4Data* data = (Scene4Data*)g_Scene.Data;

	data->FontSize = FONT_SIZE_ST4;//폰트 크기 조절
	data->FontSize = FONT_SIZE_CO4;//폰트 크기 조절

	for (int32 i = 0; i < TEXT_NUM_ST4; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->story[i], "d2coding.ttf", data->FontSize, str_story4[i], wcslen(str_story4[i]));
	}
	for (int32 i = 0; i < TEXT_NUM_CO3; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->choice[i], "d2coding.ttf", data->FontSize, str_choice4[i], wcslen(str_choice4[i]));
	}

	Image_LoadImage(&data->TestImage, "Background.jfif");// 이미지 로드
}

int count_ch4 = 0;//선택지 넘버

void update_scene4(void)
{
	Scene4Data* data = (Scene4Data*)g_Scene.Data;

	if (count_ch4 > 0)
	{
		if (Input_GetKeyDown(VK_UP))
		{
			count_ch4--;//선택지 올리기
		}
	}

	if (count_ch4 < TEXT_NUM_CO4 - 1)
	{
		if (Input_GetKeyDown(VK_DOWN))
		{
			count_ch4++;//선택지 내리기
		}
	}

	if (Input_GetKeyDown('R'))
	{
		Scene_SetNextScene(SCENE_SCENE5);
	}
}

void render_scene4(void)
{
	Scene4Data* data = (Scene4Data*)g_Scene.Data;
	//data->X = rand() % 1020;
	//data->Y = rand() % 200;

	data->X = 510;//그림 위치 조절
	data->Y = 100;

	SDL_Color color = { .a = 255 };//선택 
	SDL_Color choice_color = { .g = 255 };

	Renderer_DrawImage(&data->TestImage, data->X, data->Y);// 이미지 띄우기

	for (int32 i = 0; i < TEXT_NUM_ST4; ++i)//스토리
	{
		Renderer_DrawTextSolid(&data->story[i], 150, 450 + i * data->FontSize, color);
	}

	for (int32 i = 0; i < TEXT_NUM_CO4; ++i)//선택지
	{
		Renderer_DrawTextSolid(&data->choice[i], 150, 620 + i * data->FontSize, color);
	}

	Renderer_DrawTextSolid(&data->choice[count_ch4], 150, 620 + count_ch4 * data->FontSize, choice_color);
}

void release_scene4(void)
{
	Scene4Data* data = (Scene4Data*)g_Scene.Data;

	for (int32 i = 0; i < TEXT_NUM_ST4; ++i)
	{
		Text_FreeText(&data->story[i]);
	}

	for (int32 i = 0; i < TEXT_NUM_CO4; ++i)
	{
		Text_FreeText(&data->choice[i]);
	}

	SafeFree(g_Scene.Data);
}
#pragma endregion

#pragma region Scene5

#define SOLID 0
#define SHADED 1
#define BLENDED 2

//글자 수
const wchar_t* str_story5[] = {
   L"나는 OO사단 특수부대 대위 김지훈이라는 사실만 머릿속에서 맴돌뿐 이 상황이 이해가 되지 않는다.",
   L"내 앞에 있는 아이는 누구인지 내가 왜 갑자기 남산타워에 있는 것인지",
   L"내 앞에 있는 아이는 누구인지 내가 왜 갑자기 남산타워에 있는 것인지",
   L"모든것들이 알 수 없는 의문 투성이였다.",
   L"직원에게 들은 것만으로는 정보가 부족하다 주변을 조사하여 좀 더 정보를 모아보자.",
   L"",
};

const wchar_t* str_choice5[] = {
   L"1. 정신부터 차리도록하자 화장실에 가서 세수를 하자",
   L"2. 의자에 놓인 신문을 확인한다.",
};

#define FONT_SIZE_ST5 30//폰트 크기
#define FONT_SIZE_CO5 20//폰트 크기
#define TEXT_NUM_ST5 6//글자 제한
#define TEXT_NUM_CO5 2//글자 제한

typedef struct Scene5Data
{
	Text    story[TEXT_NUM_ST5];
	Text    choice[TEXT_NUM_CO5];
	COORD   coord;
	int32   FontSize;
	int32   RenderMode;
	Image   TestImage;
	int32      X;
	int32      Y;
} Scene5Data;

void init_scene5(void)
{
	g_Scene.Data = malloc(sizeof(Scene5Data));
	memset(g_Scene.Data, 0, sizeof(Scene5Data));

	Scene5Data* data = (Scene5Data*)g_Scene.Data;

	data->FontSize = FONT_SIZE_ST5;//폰트 크기 조절
	data->FontSize = FONT_SIZE_CO5;//폰트 크기 조절

	for (int32 i = 0; i < TEXT_NUM_ST5; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->story[i], "d2coding.ttf", data->FontSize, str_story5[i], wcslen(str_story5[i]));
	}
	for (int32 i = 0; i < TEXT_NUM_CO3; ++i)
	{
		data->RenderMode = SHADED;
		Text_CreateText(&data->choice[i], "d2coding.ttf", data->FontSize, str_choice5[i], wcslen(str_choice5[i]));
	}

	Image_LoadImage(&data->TestImage, "Background.jfif");// 이미지 로드
}

int count_ch5 = 0;//선택지 넘버

void update_scene5(void)
{
	Scene5Data* data = (Scene5Data*)g_Scene.Data;

	if (count_ch5 > 0)
	{
		if (Input_GetKeyDown(VK_UP))
		{
			count_ch5--;//선택지 올리기
		}
	}

	if (count_ch5 < TEXT_NUM_CO5 - 1)
	{
		if (Input_GetKeyDown(VK_DOWN))
		{
			count_ch5++;//선택지 내리기
		}
	}
	//if (Input_GetKeyDown('R'))//선택지 정하는 장소
	//{
	//	switch (count_s2)
	//	{
	//	case 0:Scene_SetNextScene(SCENE_MAIN);
	//		break;
	//	case 1:Scene_SetNextScene(SCENE_MAIN);
	//		break;
	//	default:
	//		break;
	//	}
	//	
	//}
}

void render_scene5(void)
{
	Scene5Data* data = (Scene5Data*)g_Scene.Data;
	//data->X = rand() % 1020;
	//data->Y = rand() % 200;

	data->X = 510;//그림 위치 조절
	data->Y = 100;

	SDL_Color color = { .a = 255 };//선택 
	SDL_Color choice_color = { .g = 255 };

	Renderer_DrawImage(&data->TestImage, data->X, data->Y);// 이미지 띄우기

	for (int32 i = 0; i < TEXT_NUM_ST5; ++i)//스토리
	{
		Renderer_DrawTextSolid(&data->story[i], 150, 450 + i * data->FontSize, color);
	}

	for (int32 i = 0; i < TEXT_NUM_CO5; ++i)//선택지
	{
		Renderer_DrawTextSolid(&data->choice[i], 150, 620 + i * data->FontSize, color);
	}

	Renderer_DrawTextSolid(&data->choice[count_ch5], 150, 620 + count_ch5 * data->FontSize, choice_color);
}

void release_scene5(void)
{
	Scene5Data* data = (Scene5Data*)g_Scene.Data;

	for (int32 i = 0; i < TEXT_NUM_ST5; ++i)
	{
		Text_FreeText(&data->story[i]);
	}

	for (int32 i = 0; i < TEXT_NUM_CO5; ++i)
	{
		Text_FreeText(&data->choice[i]);
	}

	SafeFree(g_Scene.Data);
}
#pragma endregion

bool Scene_IsSetNextScene(void)
{
	if (SCENE_NULL == s_nextScene)
	{
		return false;
	}
	else
	{
		return true;
	}
}

void Scene_SetNextScene(ESceneType scene)
{
	assert(s_nextScene == SCENE_NULL);
	assert(SCENE_NULL < scene&& scene < SCENE_MAX);

	s_nextScene = scene;
}

void Scene_Change(void)
{
	assert(s_nextScene != SCENE_NULL);

	if (g_Scene.Release)
	{
		g_Scene.Release();
	}

	switch (s_nextScene)
	{
	case SCENE_TITLE:
		g_Scene.Init = init_title;
		g_Scene.Update = update_title;
		g_Scene.Render = render_title;
		g_Scene.Release = release_title;
		break;
	case SCENE_SCENE2:
		g_Scene.Init = init_scene2;
		g_Scene.Update = update_scene2;
		g_Scene.Render = render_scene2;
		g_Scene.Release = release_scene2;
		break;
	case SCENE_SCENE3:
		g_Scene.Init = init_scene3;
		g_Scene.Update = update_scene3;
		g_Scene.Render = render_scene3;
		g_Scene.Release = release_scene3;
		break;
	case SCENE_SCENE4:
		g_Scene.Init = init_scene4;
		g_Scene.Update = update_scene4;
		g_Scene.Render = render_scene4;
		g_Scene.Release = release_scene4;
		break;
	case SCENE_SCENE5:
		g_Scene.Init = init_scene5;
		g_Scene.Update = update_scene5;
		g_Scene.Render = render_scene5;
		g_Scene.Release = release_scene5;
		break;
	}

	g_Scene.Init();

	s_nextScene = SCENE_NULL;
}