🧐 Study/winAPI

[winAPI 20] Tool

GAMEMING 2024. 6. 11. 14:49

 

 

이제 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();
	}
}

 

 

 

 

아직 μ˜ˆμ™Έμ²˜λ¦¬κ°€ 더 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ λ³΄μ™„ν•˜λ„λ‘ ν•˜κ² λ‹€.

 

 

728x90