League Of Legends - Link Select [winAPI 20] Tool
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 20] Tool

by GAMEMING 2024. 6. 11.
728x90

 

 

์ด์ œ Tool ์”ฌ์„ ์ž‘์—…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ํƒ€์ผ์„ ์ด์šฉํ•ด ๋งต์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์”ฌ์ด๋‹ค. ์ผ๋‹จ ๊ธฐ์กด ์”ฌ ๋งค๋‹ˆ์ €์—์„œ START ์”ฌ์ด ์•„๋‹Œ TOOL ์”ฌ์œผ๋กœ ์ง„์ž…ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

// SceneManager.cpp

void SceneManager::init()
{
	// ....
	currScene = arrScene[(UINT)SCENE_TYPE::TOOL];		// ์ˆ˜์ •
	currScene->Enter();
}

 

 

์ด์ œ Tile ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๋ฐ ์•„๋ž˜์˜ ํ…์Šค์ณ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต ํƒ€์ผ์€ ํ•œ ๋ณ€์˜ ํฌ๊ธฐ๊ฐ€ 64๋น„ํŠธ๋กœ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค.

 

tile texture (64 * 64)

 

// define.h
#define TILE_SIZE 64	// New!!

enum class GROUP_TYPE {
	DEFAULT,
	TILE,				// New!!
	PLAYER,
	PROJ_PALYER,	
	PROJ_MONSTER,		
	MONSTER,

	END = 32,
};

// Tile.h
#include "Object.h"

class Texture;

class Tile : public Object {
private:
	Texture*	tileTex;
	int		index;

	virtual void update();
	virtual void render(HDC _dc);
	CLONE(Tile);

public:
	Tile();
	~Tile();

	void SetTexture(Texture* _tex) { tileTex = _tex; }
};


// Tile.cpp
#include "pch.h"
#include "Tile.h"

#include "Texture.h"

Tile::Tile()
	: tileTex(nullptr)
	, index(0)
{
	setScale(Vec2(TILE_SIZE, TILE_SIZE));
}

Tile::~Tile()
{
}

void Tile::update()
{
}

void Tile::render(HDC _dc)
{
	if (nullptr == tileTex || -1 == index)
		return;

	UINT width = tileTex->Width();
	UINT height = tileTex->Height();

	UINT maxCol = width / TILE_SIZE;
	UINT maxRow = height / TILE_SIZE;

	UINT curRow = (UINT)index / maxCol;
	UINT curCol = (UINT)index % maxCol;

	if (maxRow <= curRow)	// ์ด๋ฏธ์ง€๋ฅผ ๋ฒ—์–ด๋‚œ ์ธ๋ฑ์Šค ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
		assert(nullptr);

	Vec2 renderPos = Camera::Instance()->GetRenderPos(getPos());
	Vec2 scale = getScale();

	BitBlt(_dc
		, (int)(renderPos.x)
		, (int)(renderPos.y)
		, (int)(scale.x)
		, (int)(scale.y)
		, tileTex->GetDC()
		, curCol * TILE_SIZE
		, curRow * TILE_SIZE
		, SRCCOPY);
}

 

 

์šฐ๋ฆฌ๊ฐ€ ์บ๋ฆญํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ ๊ฐ€์šด๋ฐ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์ถœ๋ ฅํ–ˆ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ํƒ€์ผ์˜ ์ขŒ์ƒ๋‹จ์„ ๊ธฐ์ค€์œผ๋กœ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ํ…์Šค์ณ์˜ ์ „์ฒด ๊ฐ€๋กœ, ์„ธ๋กœ ํฌ๊ธฐ์™€ ํ•œ ํƒ€์ผ์˜ ๋ณ€์ด ๋ช‡(TILE_SIZE)์ธ์ค„ ์•Œ๊ณ  ์žˆ๊ธฐ์— ์ธ๋ฑ์Šค๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ธ๋ฑ์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

 

// Scene_Tool.cpp

void Scene_Tool::update()
{
	Scene::update();

	/*if (KEY_TAP(KEY::ENTER)) {
		ChangeSceneEvent(SCENE_TYPE::START);
	}*/
}

void Scene_Tool::Enter()
{
	Texture* tlieTexure = ResManager::Instance()->LoadTexture(L"Tile", L"Texture\\Tile.bmp");

	// ํƒ€์ผ ์ƒ์„ฑ
	for (int i = 0; i < 5; ++i)
		for (int j = 0; j < 5; ++j) {
			Tile* tile = new Tile;
			tile->setPos(Vec2((float)(j * TILE_SIZE), (float)(i * TILE_SIZE)));
			tile->SetTexture(tlieTexure);
			AddObject(tile, GROUP_TYPE::TILE);
		}

	Vec2 resolution = Core::Instance()->GetResolution();
	Camera::Instance()->SetLookAt(resolution / 2.f);
}

 

 

์ถœ๋ ฅํ™”๋ฉด์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

index๊ฐ€ 6์ผ ๋–„ ์ถœ๋ ฅํ™”๋ฉด

 

 


 

 

์œ„ ๋ฐฉ์‹์€ ํƒ€์ผ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ผ ์ˆ˜, ํƒ€์ž…์„ ๋ฐ›์•„์„œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ์ด๋ฅผ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜์ž. ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ํ•˜๋‚˜ ๊ตฌํ˜„ํ•˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์œˆ๋„์šฐ์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž. Dialog๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๋ฐ ์ด์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‚˜์ค‘์— ํฌ์ŠคํŒ…์„ ์ถ”๊ฐ€ํ•ด๋†“๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

ํŒŒ์ผ ๋‚ด๋ถ€์— '(์†”๋ฃจ์…˜ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„) .rc ' ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œจ๋Š”๋ฐ ๋ฆฌ์†Œ์Šค ์ถ”๊ฐ€๋ฅผ ํ•ด์ฃผ์ž.

 

 

 

 

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ž‘์—… ์ฐฝ์ด ๋œฐ ๊ฒƒ์ด๋‹ค.

 

 

 

 

์ด ์ƒํƒœ์—์„œ F4๋ฅผ ๋œจ๋ฉด ์†์„ฑ ํ™”๋ฉด์ด ๋œจ๋Š”๋ฐ ID๋ฅผ 'IDD_TILE_COUNT'๋กœ ๋ฐ”๊ฟ”์ฃผ๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ํฐ ์ฐฝ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ํฌ๊ธฐ๋ฅผ ์ค„์ธ ๋‹ค์Œ ๋„๊ตฌ ์ƒ์ž(๋ณด๊ธฐ(V)-๋„๊ตฌ์ƒ์ž(X))๋ฅผ ๊บผ๋‚ด๋ณด์ž.

 

 

 

์—ฌ๊ธฐ์„œ 'Edit Contiol'์ด ์ž…๋ ฅ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ด๋‹ค. 'Static Text'๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ํ…์ŠคํŠธ๋ผ ํ•ด์„œ ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ์ด์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

 

 

 

๋‹ค์Œ์œผ๋กœ Menu๋ฅผ ๋“ค์–ด๊ฐ€์„œ ๋ฉ”๋‰ด์— 'ํƒ€์ผ'์„ ์ถ”๊ฐ€ํ•ด์ค€ ํ›„์— 'ํƒ€์ผ ๊ฐœ์ˆ˜'๋ฅผ ์ถ”๊ฐ€ํ›„ F4๋ฅผ ๋ˆŒ๋Ÿฌ ์•„์ด๋””๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

 

 

 

์ด๋ฅผ WndProc์—์„œ ๋ฐ˜์˜ํ•ด์ฃผ์ž.

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_COMMAND:
    {
        int wmId = LOWORD(wParam);
        switch (wmId)
        {
        case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            break;

	// New
        case ID_MENU_TILE:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_TILE_COUNT), hWnd, About);
            break;

        case IDM_EXIT:
            DestroyWindow(hWnd);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
    }
    break;
    // ....
    
}

 

 

ํ˜„์žฌ ์ถœ๋ ฅํ™”๋ฉด์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

ํ•ด๋‹น ๊ฐ’์„ ๋„ฃ๊ณ  ํ™•์ธ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ์™€ ์ทจ์†Œ๋ฅผ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ž‘์—…์„ ๊ฐ๊ฐ ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ธฐ์— About() ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ทผ๋ฐ ํ˜„์žฌ Tool ์”ฌ์—์„œ ์ž‘์—…ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญํ•จ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค. 

// Main.cpp

INT_PTR _stdcall TileCountProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);	// ์ถ”๊ฐ€

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	// ...
}

// Scene_Tool.cpp


void Scene_Tool::Enter()
{
	Texture* tlieTexure = ResManager::Instance()->LoadTexture(L"Tile", L"Texture\\Tile.bmp");

	// ํƒ€์ผ ์ƒ์„ฑ
	CreateTile(5, 5);

	Vec2 resolution = Core::Instance()->GetResolution();
	Camera::Instance()->SetLookAt(resolution / 2.f);
}

// ======================
// Tile Count Window Proc
// ======================

INT_PTR _stdcall TileCountProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK){
			// GetDlgItemInt - ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜์˜ ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ•จ์ˆ˜
			UINT xCount = GetDlgItemInt(hDlg, IDC_EDIT1, nullptr, false);
			UINT yCount = GetDlgItemInt(hDlg, IDC_EDIT2, nullptr, false);

			Scene* curScene = SceneManager::Instance()->GetCurScene();
			
			// tool ์”ฌ์ธ์ง€ ํ™•์ธ
			// ๋‹ค์šด ์บ์ŠคํŒ…ํ•ด์„œ ํ˜„์žฌ์”ฌ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ํ•œ๋‹ค.
			Scene_Tool* scene = dynamic_cast<Scene_Tool*>(curScene);
			assert(scene);

			scene->DeleteGroup(GROUP_TYPE::TILE);
			scene->CreateTile(xCount, yCount);

			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
			
		else if(LOWORD(wParam) == IDCANCEL)	{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}


// Scene.h
class Scene {
private:
	vector<Object*> arrObj[(UINT)GROUP_TYPE::END];
	wstring			strName;

	UINT			tileX;	// ํƒ€์ผ ๊ฐ€๋กœ ๊ฐœ์ˆ˜
	UINT			tileY;	// ํƒ€์ผ ์ƒˆ๋กœ ๊ฐœ์ˆ˜

public:
	void CreateTile(UINT _xCount, UINT _yCount);
}


// Scene.cpp
// ๋ชจ๋“  ์”ฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์—ฌ๊ธฐ์„œ ๋งŒ๋“ค์–ด ๋†“์ž
void Scene::CreateTile(UINT _xCount, UINT _yCount)
{
	tileX = _xCount;
	tileY = _yCount;
    
	Texture* tlieTexure = ResManager::Instance()->LoadTexture(L"Tile", L"Texture\\Tile.bmp");
	for (UINT i = 0; i < _yCount; ++i)
		for (UINT j = 0; j < _xCount; ++j) {
			Tile* tile = new Tile;
			tile->setPos(Vec2((float)(j * TILE_SIZE), (float)(i * TILE_SIZE)));
			tile->SetTexture(tlieTexure);
			AddObject(tile, GROUP_TYPE::TILE);
		}
}

 

 

 

์ž…๋ ฅ ๋ฐ›์„ ๊ฐ’์€ ์˜ค๋กœ์ง€ ์ˆซ์ž์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์„ฑ์—์„œ Number(์ˆซ์ž)์„ True๋กœ ๋ฐ”๊ฟ”์ฃผ์ž. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ ์†์— ์žˆ๋Š” ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

 

 

์ง€์ •ํ•˜๋Š” ์ˆ˜๋งŒํผ ์ž˜ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์ถ”๊ฐ€์ ์œผ๋กœ ์ด์™ธ์˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด์ž. ๋งˆ์šฐ์Šค๋กœ ํƒ€์ผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์Œ ํƒ€์ผ์„ ๊บผ๋‚ด์™€์„œ ๋งˆ์Œ์— ๋“œ๋Š” ํƒ€์ผ๋กœ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

 

// Scene_Tool.h

class Scene_Tool : public Scene {
private:

public:
	Scene_Tool();
	~Scene_Tool();

	virtual void update();
	virtual void Enter();
	virtual void Exit();

	void SetTileIdx();		//  ์ถ”๊ฐ€
};


// Scene_Tool.cpp

void Scene_Tool::update()
{
	Scene::update();

	/*if (KEY_TAP(KEY::ENTER)) {
		ChangeSceneEvent(SCENE_TYPE::START);
	}*/

	SetTileIdx();		// ์ถ”๊ฐ€
}

void Scene_Tool::SetTileIdx()
{
	if (KEY_TAP(KEY::LBTN)) {
		Vec2 mousePos = MOUSE_POS;

		// ๋งˆ์šฐ์Šค ์ขŒํ‘œ์˜ ์‹ค์ œ ์ขŒํ‘œ๋ฅผ ์•Œ์•„์•ผ ํ•จ
		mousePos = Camera::Instance()->GetRenderPos(mousePos);

		UINT tileX = GetTileX();
		UINT tileY = GetTileY();

		UINT col = (UINT)mousePos.x / TILE_SIZE;
		UINT row = (UINT)mousePos.y / TILE_SIZE;

		UINT idx = row * tileX + col;

		const vector<Object*>& vecTile = GetGroupObject(GROUP_TYPE::TILE);
		((Tile*)vecTile[idx])->AddImgIdx();
	}
}

 

 

 

 

์•„์ง ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋” ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋ณด์™„ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

'๐Ÿค“ Study > winAPI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[winAPI 19] Unity Build  (0) 2024.06.11
[winAPI 16] Scene & Object  (1) 2024.06.10
[winAPI 15] Event Manager  (1) 2024.06.10
[winAPI 14] Collider(3)  (1) 2024.06.09
[winAPI 13] Collider(2)  (1) 2024.06.08