์ด์ Tool ์ฌ์ ์์ ํด๋ณด๋๋ก ํ๊ฒ ๋ค. ํ์ผ์ ์ด์ฉํด ๋งต์ ์ฌ์ฉํ๋๋ฐ ํ์ํ ์ฌ์ด๋ค. ์ผ๋จ ๊ธฐ์กด ์ฌ ๋งค๋์ ์์ START ์ฌ์ด ์๋ TOOL ์ฌ์ผ๋ก ์ง์ ํ๋๋ก ํ๊ฒ ๋ค.
// SceneManager.cpp
void SceneManager::init()
{
// ....
currScene = arrScene[(UINT)SCENE_TYPE::TOOL]; // ์์
currScene->Enter();
}
์ด์ Tile ํด๋์ค๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๋ฐ ์๋์ ํ ์ค์ณ๋ฅผ ์ด์ฉํ ๊ฒ์ด๋ค. ๋ณดํต ํ์ผ์ ํ ๋ณ์ ํฌ๊ธฐ๊ฐ 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);
}
์ถ๋ ฅํ๋ฉด์ ์๋์ ๊ฐ๋ค.
์ ๋ฐฉ์์ ํ์ผ ํ๋ํ๋๋ฅผ ํ๋์ฝ๋ฉ ํ๋ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ผ ์, ํ์ ์ ๋ฐ์์ ๊ทธ๋ฆฌ๋ ๊ฒ๊ณผ ์ด๋ฅผ ์ ์ฅํ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๋๋ก ํ์. ์ฐ๋ฆฌ๊ฐ ํ๋ํ๋ ๊ตฌํํ๋ฉด ์ข๊ฒ ์ง๋ง, ๊ฐ๋ฐ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด ์๋์ฐ์์ ์ง์ํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ก ํ์. 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 |