응애맘마조

슬라이드 퍼즐 본문

공부/2D과제

슬라이드 퍼즐

TH.Wert 2023. 1. 18. 23:36

이전 게시글에 이어서 코드 내용입니다.

https://keisukeaso.tistory.com/86

//main.cpp
#include "stdafx.h"
#include "Main.h"

void Main::Init()
{
	original = new ObImage(L"doramon2.jpg");
	original->scale = Vector2(500.0f, 500.0f);
	original->SetWorldPosX(250.0f);

	puzzleNum = 3;
	CreatePuzzle();
	Shuffle();
}

void Main::Release()
{
	SafeDelete(original);
	DeletePuzzle();
}

void Main::Update()
{
	int temp = puzzleNum;
	if (ImGui::SliderInt("PuzzleNum", &temp, 2, 10))
	{
		DeletePuzzle();
		puzzleNum = temp;
		CreatePuzzle();
		Shuffle();
	}

	if (ImGui::Button("Shuffle"))
	{
		Shuffle();
	}

	if (ImGui::Button("Cheat"))
	{
		for (int i = 0; i < puzzleNum; i++)
		{
			for (int j = 0; j < puzzleNum; j++)
			{
				puzzle[i][j]->uv = Vector4((i * 1.0f) / puzzleNum, (j * 1.0f) / puzzleNum,
					(i + 1.0f) / puzzleNum, (j + 1.0f) / puzzleNum);
			}
		}
	}

	if (INPUT->KeyDown('W'))
	{
		if (emptySpace.y > 0)
		{
			Utility::Swap(puzzle[emptySpace.x][emptySpace.y]->uv, 
				puzzle[emptySpace.x][emptySpace.y - 1]->uv);
			emptySpace.y--;
		}
	}
	else if (INPUT->KeyDown('S'))
	{
		if (emptySpace.y < puzzleNum - 1)
		{
			Utility::Swap(puzzle[emptySpace.x][emptySpace.y]->uv,
				puzzle[emptySpace.x][emptySpace.y + 1]->uv);
			emptySpace.y++;
		}
	}
	else if (INPUT->KeyDown('A'))
	{
		if (emptySpace.x > 0)
		{
			Utility::Swap(puzzle[emptySpace.x][emptySpace.y]->uv,
				puzzle[emptySpace.x - 1][emptySpace.y]->uv);
			emptySpace.x--;
		}
	}
	else if (INPUT->KeyDown('D'))
	{
		if (emptySpace.x < puzzleNum - 1)
		{
			Utility::Swap(puzzle[emptySpace.x][emptySpace.y]->uv,
				puzzle[emptySpace.x + 1][emptySpace.y]->uv);
			emptySpace.x++;
		}
	}

	original->Update();
	for (int i = 0; i < puzzleNum; i++)
	{
		for (int j = 0; j < puzzleNum; j++)
		{
			puzzle[i][j]->Update();
		}
	}
}

void Main::LateUpdate()
{

}

void Main::Render()
{
	original->Render();
	for (int i = 0; i < puzzleNum; i++)
	{
		for (int j = 0; j < puzzleNum; j++)
		{
			if (i == emptySpace.x && j == emptySpace.y)
				continue;
			puzzle[i][j]->Render();
		}
	}
}

void Main::ResizeScreen()
{
}

void Main::DeletePuzzle()
{
	for (int i = 0; i < puzzleNum; i++)
	{
		for (int j = 0; j < puzzleNum; j++)
		{
			SafeDelete(puzzle[i][j]);
		}
		SafeDelete(puzzle[i]);
	}
	SafeDelete(puzzle);
}

void Main::CreatePuzzle()
{
	puzzle = new ObImage * *[puzzleNum];
	for (int i = 0; i < puzzleNum; i++)
	{
		puzzle[i] = new ObImage * [puzzleNum];
		for (int j = 0; j < puzzleNum; j++)
		{
			puzzle[i][j] = new ObImage(L"doramon2.jpg");
			puzzle[i][j]->scale = Vector2(500.0f / puzzleNum, 500.0f / puzzleNum);
			puzzle[i][j]->pivot = OFFSET_LT;
			puzzle[i][j]->SetLocalPos(Vector2(500.0f / puzzleNum * i,
				500.0f / puzzleNum * -j));
			puzzle[i][j]->uv = Vector4((i * 1.0f) / puzzleNum, (j * 1.0f) / puzzleNum,
				(i + 1.0f) / puzzleNum, (j + 1.0f) / puzzleNum);

			if (!(i == 0 && j == 0))
			{
				puzzle[i][j]->SetParentRT(*puzzle[0][0]);
			}
		}
		puzzle[0][0]->SetWorldPos(Vector2(-500.0f, 250.0f));
	}

	emptySpace = Int2(0, 0);
}

void Main::Shuffle()
{
	for (int i = 0; i < 1000; i++)
	{
		int sour1 = RANDOM->Int(0, puzzleNum - 1);
		int sour2 = RANDOM->Int(0, puzzleNum - 1);
		int dest1 = RANDOM->Int(0, puzzleNum - 1);
		int dest2 = RANDOM->Int(0, puzzleNum - 1);

		Utility::Swap(puzzle[sour1][sour2]->uv, puzzle[dest1][dest2]->uv);
	}
}

int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prevInstance, LPWSTR param, int command)
{
	app.SetAppName(L"Game2");
	app.SetInstance(instance);
	app.InitWidthHeight(1000.0f, 500.0f);
	WIN->Create();
	Main* main = new Main();
	int wParam = (int)WIN->Run(main);
	SafeDelete(main);
	WIN->Destroy();
	WIN->DeleteSingleton();
	
	return wParam;
}

코드입니다.

 

읽어주셔서 감사합니다.

'공부 > 2D과제' 카테고리의 다른 글

쿠키런 2탄 : 착지, 젤리 먹기, 타격  (0) 2023.01.25
쿠키런 1탄 : 달리기, 점프, 2단 점프, 슬라이드  (0) 2023.01.20
이동 제한  (0) 2023.01.17
deque, map  (0) 2023.01.17
잔상 만들기  (0) 2023.01.16