์ง๊ธ๊น์ง๋ ๋จ์ํ ๋ํ๋ง์ ๋ค๋ฃจ์ด๋ดค๋ค๋ฉด ์ด์ ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํ์ฉํด๋ณด์. ์ค์ ๊ฒ์์์๋ ์ด๋ฏธ์ง, ์ฌ์ด๋ ๋ฑ ์ฌ๋ฌ ๋ฆฌ์์ค๊ฐ ์๊ณ ์ด๋ฅผ ์ด์ฉํด ํ๋ฉด์ ์ฌ๋ฌ ์ฅ๋ฉด์ ๊ทธ๋ ค ์ ์ ์๊ฒ ๋ณด์ฌ์ค๋ค.
์ฐ์ ์ด ๋ฆฌ์์ค๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ผ ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ Resํด๋์ค๋ฅผ ๋ง๋ค์ด์ค๋ค (๋ถ๋ชจ๊ฒฉ ํด๋์ค)
๋ฆฌ์์ค๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ๊ณ ์ ์ ID์ ์ด ๋ฆฌ์์ค๊ฐ ์ด๋ ํ์ผ์ ์์นํด ์๋ ์ง๋ฅผ ์๋ ค์ฃผ์ด์ผ ํจ์ผ๋ก ๊ฒฝ๋ก๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํ๋ค.
// Res.h
#pragma once
class Res {
private:
wstring key; // ๊ณ ์ ID
wstring strRelativePath; // ๋ฆฌ์์ค ์๋ ๊ฒฝ๋ก(ํด๋ ๋ด์ ๋ณํ์ง ์๋ ๊ฒฝ๋ก)
public:
Res();
~Res();
void SetKey(const wstring& _key) { key = _key; }
void SetRelativePath(const wstring& _str) { strRelativePath = _str; }
const wstring& GetKey() { return key; }
const wstring& GetRelativePath() { return strRelativePath; }
};
// Res.cpp
#include "pch.h"
#include "Res.h"
Res::Res()
{
}
Res::~Res()
{
}
์ด๋์ ๊ฒฝ๋ก๋ ์๋ ๊ฒฝ๋ก๋ก ์คํ ํ์ผ์ ๊ธฐ์ค์ผ๋ก ๋ฐ๋์ง ์๋๋ก ํ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์ด ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ด๋ฆฌ์๊ฐ ํ์ํ๋ค.
์ด๋ฅผ Path Manager๋ผ๊ณ ํ๊ฒ ๋ค.
ํด๋์ค๋ฅผ ๊ตฌํํ๊ธฐ ์ ์ ์ฐ๋ฆฌ๊ฐ VS๋ก ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋๋ฆฌ๋ฉด ํด๋น exe ํ์ผ์ด ๋์ค๊ฒ ๋๋๋ฐ, ์๊ฐ ์คํ ํ์ผ์ด๋ค. Debug๋ชจ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฒ์์ ๋ฐฐํฌํ๊ธฐ ์ ์ ๊ฐ๋ฐ ๋จ๊ณ์์ ๋๋ฒ๊น ์ด ์ฉ์ดํ๋๋ก ํ๋ ๋ฒ์ , Release๋ชจ๋๋ ๋ฐฐํฌ ๋ฒ์ ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค. ๋ณดํต ์ ์ ์๊ฒ ๋ฐฐํฌํ๊ฑฐ๋ ๊ณผ์ ๋ฅผ ์ ์ถํ ๋ ์ด Release ๋ชจ๋๋ก ํ๋ฉด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฒ์์ ๋ฐฐํฌํ ๋ exeํ์ผ์ ํ๋๋ฐ ๊ทธ ๋ด๋ถ์ ๋ฆฌ์์ค์ ๊ด๋ จ ๊ฒฝ๋ก๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
Release ํ์ผ ๋ด๋ถ์ ๋ฆฌ์์ค ํ์ผ์ ๋ง๋ค์ด ๋์ผ๋ฉด ๋๋ค.
์ผ๋จ ์ด๋ฅผ ์ํด์ ๊ธฐ์กด์ ์์ฑ๋ ํ์ผ์ ์ญ์ ํ๊ณ ์ฐ๋ฆฌ๊ฐ ์คํํด์ ๋ง๋ exeํ์ผ๋ค์ Output์ด๋ผ๋ ํ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ์ค์ ํ์.
ํ๋ก์ ํธ → ์์ฑ → ๊ตฌ์ฑ : Debug / Release (๋ ๋ค ๊ฐ๊ฐ ์ค์ ํด์ฃผ๋๋ก ํ๋ค) → ์ผ๋ฐ → ์ถ๋ ฅ ๋๋ ํฐ๋ฆฌ ์ค์
Debug ์ค์ : $(SolutionDir)Output\bin_debug\
Release ์ค์ : $(SolutionDir)Output\bin\
์ด๋ ๊ฒ ์ค์ ํ๊ณ ๊ฐ ๋ฒ์ ์์ ์คํ์ํจ ํ ํ์ผ์ ๋ค์ฌ๋ค ๋ณด๋ฉด ์๋์ ์ฌ์ง์ฒ๋ผ ํ์ผ์ด ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
bin ํ์ผ์ด Release๋ชจ๋, bin_debug๊ฐ Debug๋ชจ๋๋ก ์ปดํ์ผ ํ์ ๋ ์๊ธฐ๋ exeํ์ผ๋ก, ๊ฐ ํ์ผ์ ๋ค์ด๊ฐ exe๋ฅผ ๋๋ฌ๋ณด๋ฉด ์ ์์ ์ผ๋ก ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
bin ํ์ผ ๋ด๋ถ์ ๋ฆฌ์์ค๋ฅผ ๋ฃ์ Content๋ผ๋ ํ์ผ์ ๋ฃ๊ณ Texture, Sound ๋ฑ ํ์ผ์ ๋ง๋ค์ด๋ณด์.
๊ทผ๋ฐ ์ด๋ฌ๋ฉด Debug ๋ฒ์ ์ผ๋ก ๋๋ฆด ๋ ๋ฆฌ์์ค ํ์ผ์ ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ๊น? ๊ฐ์ ๋ฆฌ์์ค ํ์ผ์ ๋ ๋ง๋๋ ๊ฒ์ ๋ญ๋น์์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ค์ ํ์ฌ Release ๋ชจ๋ ์์ ๋ฆฌ์์ค ํ์ผ์ ์ ๊ทผํด ์ฌ์ฉํ๋๋ก ํ๋ค.
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Path Manager์ ๋ง๋ค๊ณ ์ค์ ํด๋ณด๋๋ก ํ์.
// PathManager.h
#pragma once
class PathManager{
SINGLE(PathManager);
private:
wchar_t contentPath[255];
public:
void init();
const wchar_t* GetContentPath() { return contentPath; }
};
// PathManager.cpp
#include "pch.h"
#include "PathManager.h"
#include "Core.h"
PathManager::PathManager()
: contentPath{}
{
}
PathManager::~PathManager()
{
}
void PathManager::init()
{
GetCurrentDirectory(255, contentPath);
int len = wcslen(contentPath);
for (int i = len - 1; 0 <= i; --i) {
if ('\\' == contentPath[i]) {
contentPath[i] = '\0';
break;
}
}
wcscat_s(contentPath, 255, L"\\bin\\Content\\");
SetWindowText(Core::Instance()->getMainHandle(), contentPath);
}
ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ํํ๊ณ ์๋ ํ๋ก๊ทธ๋จ ์คํ ํ์ผ์ ๊ธฐ์ค์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์์์ค๋ ํจ์ GetCurrentDirectory()๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด contentPath์ ํ์ฌ ๊ฒฝ๋ก๊ฐ ์ฑ์์ง๋ค. ํ์ง๋ง ๋ฆฌ์์ค ํ์ผ์ binํ์ผ์ ์์์ผ๋ก ๋ด๊ฐ ๊ฐ์ ธ์จ ๊ฒฝ๋ก์์ ์ ํ์ผ๋ก ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผ ํ๋ ์์ ์ด ํ์ํ๋ค.
์ด๋ ๋ฌธ์์ด ๊ด๋ จ ํค๋ ํ์ผ์ ์ด์ฉํ๋ ๋ฒ์ด ์์ง๋ง, ๊ฐ๋จํ๊ฒ ๋ฌธ์์ด๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๊ฐ์ ธ์จ ๊ฒฝ๋ก๋ฅผ ๊ฑฐ๊พธ๋ก ํ์ํ์ฌ '\\' ๋ฅผ ๋ง๋๋ฉด ๊ฑฐ๊ธฐ์ ๋ฉ์ถ๋ฉด ๋๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋๋ฐ
F5์ Ctrl + F5์ ์คํ ๊ฒฐ๊ณผ๋ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ์งํ๋๋ค๋ ์ ์ด๋ค. ๊ทธ๋์ F5๋ฅผ ๋๋ ์ ๋๋ ๊ธฐ์กด ์์ฑ๋ ๋ฆฌ์์ค ํ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ํด์ผ ํ๋ค.
์๋์ ์ค์ ์ ํ๋ฉด ๋๋ค.
ํ๋ก์ ํธ → ์์ฑ → ๊ตฌ์ฑ : ๋ชจ๋ ๊ตฌ์ฑ → ๋๋ฒ๊น → ์์ ๋๋ ํฐ๋ฆฌ ๋ณ๊ฒฝ
$(SolutionDir)Output\bin\
๊ฒฝ๋ก๋ฅผ ๋์๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ค์์ binํ์ผ์ ๋ฆฌ์์ค ํ์ผ๋ก ์ ๊ทผํ๋ ๊ฒฝ๋ก๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
PathManager์ init()์ Core ํด๋์ค ๋ด๋ถ์์ ๋ถ๋ฌ์ฃผ๋ ์์ ๋ ์์ง ๋ง๊ณ ํด์ผ ํ๋ค.
์ด๋ ๊ฒ ํ๋ฉด exe๊ฐ ํฌํจ๋ ํ์ผ์ ์์น๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ์ ์์ ์ผ๋ก ๋ฆฌ์์ค๊ฐ ๋ฐ์๋ ์ ์๋ค.
๊ฒ์ ๋ด์ ์ฌ๋ฌ ์ด๋ฏธ์ง ํ์ผ์ Texture๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ ์ฌ๋ฌ ๋ชจ๋ธ๋ง์ ๊ด๋ จ ํ ์ค์ณ๋ฅผ ์ ํ ๋ฌผ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ฐฉ์์ด ๋ง๋ค.
// Texture.h
class Texture : public Res {
private:
HDC dc;
HBITMAP bit;
BITMAP info;
public:
Texture();
~Texture();
void Load(const wstring& _str);
UINT Width() { return info.bmWidth; }
UINT Height() { return info.bmHeight; }
HDC GetDC() { return dc; }
};
// Texture.cpp
#include "pch.h"
#include "Texture.h"
#include "Core.h"
Texture::Texture()
: bit(0)
, dc(0)
, info{}
{
}
Texture::~Texture()
{
DeleteDC(dc);
DeleteObject(bit);
}
void Texture::Load(const wstring& _str)
{
bit = (HBITMAP)LoadImage(nullptr, _str.c_str(), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
assert(bit); // ๋นํธ๋งต์ด ์์ ๊ฒฝ์ฐ์ ์๋ฌ ์ฒ๋ฆฌ
// ๋นํธ๋งต๊ณผ ์ฐ๊ฒฐํ DC
dc = CreateCompatibleDC(Core::Instance()->GetMainDC());
// ๋นํธ๋งต๊ณผ DC ์ฐ๊ฒฐ
HBITMAP preBit = (HBITMAP)SelectObject(dc, bit);
DeleteObject(preBit);
// ๊ฐ๋ก ์ธ๋ก ๊ธธ์ด
GetObject(bit, sizeof(BITMAP), &info);
}
์ฐ๋ฆฌ๊ฐ ์กฐ์ํ๋ ํ๋ ์ด์ด๋ฅผ ๋ฆฌ์์ค๋ฅผ ํ์ฉํด ํํํด๋ณด์.
// Player.h
#pragma once
#include "Object.h"
class Texture; // ์ถ๊ฐ
class Player : public Object {
private:
Texture* tex;
void CreateMissile();
public:
Player();
~Player();
virtual void update();
virtual void render(HDC _dc); // ์ถ๊ฐ
};
// Player.cpp
#include "PathManager.h"
#include "Texture.h"
Player::Player()
: tex(nullptr)
{
// Texture Loading
tex = new Texture;
wstring strPath = PathManager::Instance()->GetContentPath();
strPath += L"Texture\\Player.bmp";
tex->Load(strPath);
}
Player::~Player()
{
if(nullptr != tex)
delete tex;
}
void Player::render(HDC _dc)
{
int width = (int)tex->Width();
int height = (int)tex->Height();
Vec2 vPos = getPos();
vPos.x - (float)(width / 2);
vPos.y - (float)(height / 2);
TransparentBlt(_dc
, int(vPos.x - (float)(width / 2))
, int(vPos.y - (float)(height / 2))
, width, height
, tex->GetDC()
, 0, 0, width, height
, RGB(255, 0, 255));
}
Player๊ฐ ์์ฑ๋ ๋ ํด๋น ๋ฆฌ์์ค๋ฅผ ๋ง๋ค๊ณ ์๋ฉธ๋ ๋ ํด์ ํ๋๋ก ํ๋ค.
๊ธฐ์กด Object์์ ๊ทธ๋ ธ์ง๋ง, ์ด์ ๋ ๋ฆฌ์์ค๋ฅผ ๊ฐ๊ณ ๊ทธ๋ ค์ผ ํ๋ฏ๋ก renderํจ์๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋ง์ฝ ์์ ์ฝ๋๊ฐ ์๋๋ผ ์๋์ BitBlt์ผ๋ก ๊ทธ๋ฆฌ๋ฉด ๋ชจ๋ ํฝ์ ์ ์ฎ๊ฒจ ์ฐ์์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํต์งธ๋ก ์ฐ๊ฒ ๋๋ค.
BitBlt(_dc
,int(vPos.x - (float)(width / 2))
,int(vPos.y - (float)(height / 2))
,width, height
, tex->GetDC()
, 0, 0, SRCCOPY);
๊ทธ๋ ๊ธฐ์ ํน์ ์์ ์ ์ธํ๊ณ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ด ์๋๋ฐ ์ด๋ ์ด ํน์ ์์ ๋ณดํต RPG(255, 0, 255) ์ ๋ง์ ํ ์์ ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์ ๋ง์ ํ ์์ ํ์ค์์ ๊ฑฐ์ ์ ์ฐ๋ ์์ ์๋ฏธํ๋ค.
TransparentBlt ํจ์๊ฐ ํน์ ์์ ์ ์ธํ๊ณ ๊ทธ๋ฆฌ๋ ํจ์๋ค. ์์ธํ ์ค๋ช ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋๋ก ํด๋ผ.
https://blog.naver.com/power2845/50147965306
TransparentBlt ํจ์
์ด ๋ด์ฉ์ MSDN์ ๋ฐํ์ผ๋ก ์์ฑ๋์์ต๋๋ค. Microsoft Visual C++ 2008 ๊ธฐ์ค...
blog.naver.com
[ ์ฃผ์ ]
์ด ํจ์๋ฅผ ์ฐ๋ ค๋ฉด ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค. pch ํ์ผ์ ์๋๋ฅผ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค!!!
#pragma comment(lib, "Msimg32.lib")
์ง๊ธ๊น์ง ํฌ์คํ ํ ์ฝ๋๋ ์ฌ๊ธฐ์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
ํฌ์คํ ์ ๊ธฐ์ค์ผ๋ก ์ปค๋ฐํ์ฌ ๋๋์ด ๋จ๋ค.
https://github.com/MiyeongEom/GameBasic/commits/main/
GitHub - MiyeongEom/GameBasic
Contribute to MiyeongEom/GameBasic development by creating an account on GitHub.
github.com
์ฌ์ฉํ ํ ์ค์ฒ ํ์ผ๋ ์์ ๊นํ๋ธ์์ ๋ฐ์ ์ ์๋ค. ๊ฐค๋ฌ๊ทธ์์ ๋ฐ์จ๊ฑด๋ฐ ๋ฐํ์ ๋ด๊ฐ ์ด์ฌํ ์ฒ๋ฆฌํจ..
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ง ์ฝ๋์ ๋ฌธ์ ๊ฐ ์์๊น?
๋ง์ฝ ๋ชฌ์คํฐ๋ ์ด์ ๊ฐ์ด ์ง ๋ค๋ฉด, ๋ชฌ์คํฐ๋ฅผ ๋ช ์ฒ๋ง๋ฆฌ, ๋ช ๋ง๋ง๋ฆฌ๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋ฆฌ์์ค๊ฐ ๊ทธ๋งํผ ๋์ ์ผ๋ก ํ ๋น๋๋ค๐ต๐ต๐ต. ์ด๋ ๊ฒ ๋์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋จน๋ค๊ฐ ์ฉ๋ ๋ถ์กฑ์ผ๋ก ์ฃฝ์ ์๋ ์๊ณ ๊ทธ์ ์ ์ผ๋จ ๊ฐ์ ๋ฆฌ์์ค๋ฅผ ๊ณ์ํด์ ๋ถ๋ฌ ๋ง๋๋ ๊ฒ ์์ฒด๊ฐ ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์ ํ์ํ ๊ฒ์ด Resource Manager๋ค.
์๋ฅผ ํตํด ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ฉด, ์ค๋ฅ๊ฐ ์๊ฒผ์ ๋๋ ๊ธ๋ฐฉ ์ฐพ์ ์ ์๊ฒ ๊ตฌ์กฐ๊ฐ ์ง์ฌ์ ์ข๋ค.
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 12] Collider(1) (0) | 2024.06.06 |
---|---|
[winAPI 11] Resource Manager (0) | 2024.06.06 |
[winAPI 09] ๊ธฐ์ด ์ํ (0) | 2024.06.05 |
[winAPI 08] Object (0) | 2024.06.05 |
[winAPI 07] Scene & Scene Manager (1) | 2024.06.04 |