[winAPI 20] Tool
μ΄μ 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();
}
}
μμ§ μμΈμ²λ¦¬κ° λ νμνκΈ° λλ¬Έμ λ€μ ν¬μ€ν μμ 보μνλλ‘ νκ² λ€.