์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํด๋ณด์ฅ..
๊ฒ์์์ ์ถฉ๋์ ๋งค์ฐ ํ์์ ์ธ ๋ถ๋ถ์ด๋ค. ์ถฉ๋์ ๋จ์ํ ๋ถ๋ช์ณค๋ค๋ ํ๋์ ์ฌ์ค์ ๊ตฌํํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฌ ์กฐ๊ฑด์ด ํ์ํ๋ค. ์๋์์ ์ด ์กฐ๊ฑด์ ๋ฐ๋ผ ์ธ ๊ฐ์ง ์ด๋ฒคํธ๋ก ๋๋ ๊ฒ์ด๋ค.
์ค๋ธ์ ํธ์ ์ถฉ๋์ด ํ์ํ ๊ฒ์ด ์๊ณ , ์๋ ๊ฒฝ์ฐ(๋ฐฐ๊ฒฝ, UI ๋ฑ)๊ฐ ์๋ค. ์ค๋ธ์ ํธ ๋ด์์ Collider ์ Non-Collider๋ก ๋๋์ด ์์์ ์ฌ์ฉํด ๊ตฌํํ๋ฉด ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค. Non-Collider ์ค์์ ์ผ๋ถ๋ง ์ถฉ๋์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ฉด ๊ตฌ์กฐ๋ฅผ ๋ค ๋ฏ์ด ๊ณ ์ณ์ผ ํ๋ค๋ ๊ฒ. ๊ทธ๋์ ์์ ๊ตฌ์กฐ์ ๊ณ์ธต ๊ตฌ์กฐ๊ฐ ๊น๋ค๋ฉด(์์-์์-์์...) ์ด๋ฐ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ํ๋ฅ ์ด ๋๋ค.
์ด๋ฐ ๋ฉค๋ฒ๋ ํญ์ ๊ฐ๊ณ ์๋ ํ์ํ๋ฉด ์ฐ๊ณ , ์๋๋ฉด ์ ์ฐ๋๋ก ๊ตฌํํ๋ฉด ๋๋ค. ์ด๋ฐ ์ ๋ค์ component๋ผ๊ณ ๋ถ๋ฅํ๊ณ ์๋ค๋ ๋ฐ๋ก class๋ฅผ ๋ง๋ค์ด ๊ตฌํํ๋ค.
Collider๋ Object ์์์ ๋ถํ์ฒ๋ผ ์ฌ์ฉํจ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ฉ๋๋ค.
class Object {
private:
Vec2 vPos;
Vec2 vScale;
Collider* collider; // ํ์ํ๋ฉด ์ฌ์ฉ, ํ์ ์์ผ๋ฉด nullptr
public:
Object();
virtual ~Object();
void setPos(Vec2 _vPos) { vPos = _vPos; }
void setScale(Vec2 _vScale) { vScale = _vScale; }
Vec2 getPos() { return vPos; }
Vec2 getScale() { return vScale; }
Collider* GetCollider() { return collider; } // New!!
void CreateCollider(); // New!!
public:
virtual void update() = 0;
virtual void render(HDC _hdc);
virtual void finalUpdate() final; // ์์์์์ ์ค๋ฐ๋ผ์ด๋ฉ ๊ธ์ง๋จ.
void commponentRender(HDC _hdc); // New!! (์ปดํฌ๋ํธ ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆผ)
};
์ฐ์ ์ถฉ๋์ด ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๊ธฐ์ CreateCollider ํจ์๋ฅผ ์์ฑํ๋๋ก ํ๋ค.
void Object::CreateCollider()
{
collider = new Collider;
collider->owner = this;
}
์ด๋ค ์ค๋ธ์ ํธ๊ฐ ์ถฉ๋์ ๊ฐ๊ณ ์์ด์ผ ํ๋์ง ์์์ผ ํจ์ผ๋ก Collider ๋ด๋ถ์ ์๋์ ๊ฐ์ด ์ฝ๋ฉ ํด์ฃผ๋ฉด ๋๋ค.
// Collider.h
class Object; // ์๊ฐ ๋๊ตฌ ์์์ธ์ง๋ฅผ ์๊ฒ ํ๊ธฐ ์ํด ์ค๋ธ์ ํธ ํ์
class Collider {
private:
Object* owner;
public:
Collider();
~Collider();
friend class Object;
};
// Collider.cpp
#include "pch.h"
#include "Collider.h"
#include "Object.h"
Collider::Collider()
: owner(nullptr)
{
}
Collider::~Collider()
{
}
์ถฉ๋์ด ์กด์ฌํ๋ Player, Monster, Missile ๊ฐ์ฒด ๋ฑ ์ถฉ๋์ด ํ์ํ ๊ฐ์ฒด์ ๊ฐ๊ฐ CreateColliderํจ์๋ฅผ ๋ฃ์ด์ฃผ๋๋ก ํ๋ค.
์๊ฐํด๋ณด์. ์ถฉ๋์ ๊ฒ์ ๋ก์ง์ update๊ฐ ์๋๋ผ ์ถฉ๋์ฒ๋ฆฌ๋ ๊ณ์ ๋ฐ์ํ (update) ์ํฉ์. ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์ฐ์ง ์์๋ ์์์ ๊ณ์ ์งํ๋์ด์ผ ํ๋ ์ ๋ค์์ผ๋ก ์๋ค๋ฅผ ๋ฐ๋ก ๋ชจ์ ์ํ์์ผ์ฃผ์
์ฆ ์ต์ข ์ ๋ฐ์ดํธํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ์. ์ด๋ ํ์ฌ ์ฌ์์ ์ ๋ฐ์ดํธ ์์ผ์ฃผ์ด์ผ ํจ์ผ๋ก Scene Manager์ Scene์ finalUpdate()ํจ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
์ฌ์์ ๋ชจ๋ Object ๋ํด์ finalUpdateํจ์๊ฐ ๋ถ๋ฆฌ์์ผ๋ก ์ด๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ Object์ ์ถฉ๋์ด ๋ถ์ด ์๋ ๊ฒ์์ผ๋ก ์ค๋ฒ๋ผ์ด๋ฉ(์์ํด๋์ค์ ์ฌ์ ์)์ ๊ธ์ง ์์ผ์ผ ํจ์ผ๋ก final ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
Object์ finalUpdateํจ์ ํธ์ถ์ ์ค๋ธ์ ํธ๊ฐ ๊ฐ๊ณ ์๋ Collider์ ํจ์๊ฐ ๋ถ๋ ค์ผ ํจ์ผ๋ก ํด๋์ค ๋ด๋ถ์ ํจ์๋ฅผ ๋ง๋ค์ด ๋์ผ ํ๋ค.
// SceneManager.cpp
void SceneManager::update()
{
currScene->update();
currScene->finalUpdate(); // ์ถ๊ฐ
}
// Scene.cpp
void Scene::finalUpdate() // ์ถ๊ฐ
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
for (size_t j = 0; j < arrObj[i].size(); ++j) {
arrObj[i][j]->finalUpdate();
}
}
}
// Collider.h ์ถ๊ฐ
void finalUpdate();
// Collider.cpp
void Collider::finalUpdate()
{
Vec2 objectPos = owner->getPos();
finalPos = objectPos + offsetPos;
}
// Struct.h
Vec2 operator +(Vec2 other)
{
return Vec2(x + other.x, y + other.y);
}
Vec2 operator -(Vec2 other)
{
return Vec2(x - other.x, y - other.y);
}
Vec2 operator *(Vec2 other)
{
return Vec2(x * other.x, y * other.y);
}
Vec2 operator /(Vec2 other)
{
assert(!(0.f == other.x || 0.f == other.y));
return Vec2(x / other.x, y / other.y);
}
์ถฉ๋์ฒ๋ฆฌ๋ฅผ ํ ๋ ๋ณดํต ๊ทธ ์์ญ์ ํ์ธํ๊ธฐ ์ํด์ ๋ฐ์ด๋ฉ ๋ฐ์ค๋ฅผ ๊ทธ๋ฆฐ๋ค. ์ด๋ฅผ ๊ณ ๋ คํด ์์ฑ๋ ์ฝ๋์ด๋ค.
// define.h
// ์์ฃผ ์ฌ์ฉํ๋ ๋ธ๋ฌ์ฌ์ ํ ๋ฏธ๋ฆฌ ์์ฑํด๋์.
enum class BRUSH_TYPE {
HOLLOW,
END,
};
enum class PEN_TYPE {
RED,
GREEN,
BLUE,
END,
};
// Core.h
class Core {
SINGLE(Core);
private:
HWND handle;
POINT ptResolution;
HDC hDC;
HBITMAP hBit;
HDC mDC;
// ์์ฃผ ์ฌ์ฉํ๋ GDI Object
HBRUSH arrBrush[(UINT)BRUSH_TYPE::END];
HPEN arrPen[(UINT)PEN_TYPE::END];
public:
int Init(HWND _hWnd, POINT _ptResolution);
void Progress();
void CreateBrushPen(); // ์ถ๊ฐ
HWND getMainHandle() { return handle; }
HDC GetMainDC() { return hDC; }
POINT GetResolution() { return ptResolution; }
HBRUSH GetBrush(BRUSH_TYPE _type) { return arrBrush[(UINT)_type]; } // ์ถ๊ฐ
HPEN GetPen(PEN_TYPE _type) { return arrPen[(UINT)_type]; } // ์ถ๊ฐ
};
// Core.cpp
Core::Core()
:handle(0)
, ptResolution{}
, hDC(0)
, hBit(0)
, mDC(0)
, arrBrush{}
, arrPen{}
{
}
int Core::Init(HWND _handle, POINT _ptResolution)
{
// ..
// ์์ฃผ ์ฌ์ฉ ํ ํ ๋ฐ ๋ธ๋ฌ์ฌ ์์ฑ
CreateBrushPen();
// ..
}
void Core::CreateBrushPen()
{
// Hollow Brush
arrBrush[(UINT)BRUSH_TYPE::HOLLOW] = (HBRUSH)GetStockObject(HOLLOW_BRUSH);
// Red / Blue / Green Pen
arrPen[(UINT)PEN_TYPE::RED] = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
arrPen[(UINT)PEN_TYPE::BLUE] = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
arrPen[(UINT)PEN_TYPE::GREEN] = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
}
class Collider {
private:
Object* owner; // collider๊ฐ ์์ ํ๊ณ ์๋ obj
Vec2 offsetPos;
Vec2 finalPos; // finalUpdate์์ ๋งค ํ๋ ์๋ง๋ค ๊ณ์ฐ
Vec2 scale; // ์ถฉ๋์ฒด ํฌ๊ธฐ
public:
Collider();
~Collider();
void SetOffsetPos(Vec2 _pos) { offsetPos = _pos; }
void SetScale(Vec2 _scale) { scale = _scale; }
Vec2 GetOffsetPos() { return offsetPos; }
Vec2 GetScale() { return scale; }
void finalUpdate();
void render(HDC _hdc);
friend class Object;
};
// Collider.cpp
#include "pch.h"
#include "Collider.h"
#include "Object.h"
#include "Core.h"
#include "SelectGDI.h"
Collider::Collider()
: owner(nullptr)
{
}
Collider::~Collider()
{
}
void Collider::finalUpdate()
{
Vec2 objectPos = owner->getPos();
finalPos = objectPos + offsetPos;
}
void Collider::render(HDC _hdc) // ๋ฐ์ด๋ฉ ๋ฐ์ค
{
SelectGDI p(_hdc, PEN_TYPE::RED);
SelectGDI b(_hdc, BRUSH_TYPE::HOLLOW);
Rectangle(_hdc
, (int)(finalPos.x - scale.x / 2.f)
, (int)(finalPos.y - scale.y / 2.f)
, (int)(finalPos.x + scale.x / 2.f)
, (int)(finalPos.y + scale.y / 2.f));
}
์ถฉ๋์ ํค๋/๋ชธํต/๋ค๋ฆฌ ์ด๋ ๊ฒ ๋ฐ๋ก ์ค ์ ์๋ค. ์์ ์ฝ๋์์ ์๋ฏธํ๋ offset์ ์ด๋ค ๊ธฐ์ค ์์น๋ก๋ถํฐ ์ผ๋งํผ ๋จ์ด์ก๋ ๊ฐ๋ฅผ ์๋ฏธํ๋ค. ๊ทธ ๊ธฐ์ค์ ๊ธฐ์ค : Object Pos๋ก ๋ง์ฝ offset์ด ์ ๋ก๋ผ๋ฉด ์ต์ ์ขํ์ ๋์ผํ๋ค.
// Object.h
#pragma once
class Collider;
class Object {
private:
Vec2 vPos;
Vec2 vScale;
Collider* collider;
public:
Object();
virtual ~Object();
void setPos(Vec2 _vPos) { vPos = _vPos; }
void setScale(Vec2 _vScale) { vScale = _vScale; }
Vec2 getPos() { return vPos; }
Vec2 getScale() { return vScale; }
Collider* GetCollider() { return collider; }
void CreateCollider();
public:
virtual void update() = 0;
virtual void render(HDC _hdc);
virtual void finalUpdate() final;
void commponentRender(HDC _hdc); // ๊ทธ๋ฆฌ๊ธฐ
};
// Object.cpp
#include "pch.h"
#include "Object.h"
#include "pch.h"
#include "Collider.h"
Object::Object()
: vPos{}
, vScale{}
, collider(nullptr)
{
}
Object::~Object()
{
if (nullptr != collider)
delete collider;
}
void Object::render(HDC _hdc)
{
Rectangle(_hdc, (int)(vPos.x - vScale.x / 2.f), (int)(vPos.y - vScale.y / 2.f),
(int)(vPos.x + vScale.x / 2.f), (int)(vPos.y + vScale.y / 2.f));
commponentRender(_hdc);
}
void Object::finalUpdate()
{
if (collider)
collider->finalUpdate();
}
void Object::commponentRender(HDC _hdc)
{
if (nullptr != collider)
collider->render(_hdc); // ์ถฉ๋ ํด๋์ค์ ๋ ๋ ํจ์ ํธ์ถ
}
void Object::CreateCollider()
{
collider = new Collider;
collider->owner = this;
}
๋ณธ๋ ์๋์ ์ฌ์ง์ฒ๋ผ ๊ฐ ํ๊ณผ ๋ธ๋ฌ์ฌ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ํ ๊ธฐ์กด ๊ป๋ก ๋ค์ ๊ฐ์ ธ์์ผ ํ๋ ๊ท์ฐฎ์ ์์ ์ด ํ์ํ๋ฐ ์ด๋ฅผ ์ค์ด๊ธฐ ์ํด selectGDI ํด๋์ค๋ฅผ ์์ฑํ๋๋ก ํ๋ค.
// SelectGDI.h
#pragma once
class SelectGDI {
private:
HDC hDC;
HPEN defaultPen;
HBRUSH defaultBrush;
public:
SelectGDI(HDC _dc, PEN_TYPE _type);
SelectGDI(HDC _dc, BRUSH_TYPE _type);
~SelectGDI();
};
// SelectGDI.cpp
#include "pch.h"
#include "SelectGDI.h"
#include "Core.h"
SelectGDI::SelectGDI(HDC _dc, PEN_TYPE _type)
: hDC(_dc)
, defaultBrush(nullptr)
, defaultPen(nullptr)
{
HPEN greenPen = Core::Instance()->GetPen(_type);
defaultPen = (HPEN)SelectObject(_dc, greenPen);
}
SelectGDI::SelectGDI(HDC _dc, BRUSH_TYPE _type)
: hDC(_dc)
, defaultBrush(nullptr)
, defaultPen(nullptr)
{
HBRUSH hollowBrush = Core::Instance()->GetBrush(_type);
defaultBrush = (HBRUSH)SelectObject(_dc, hollowBrush);
}
SelectGDI::~SelectGDI()
{
SelectObject(hDC, defaultPen);
SelectObject(hDC, defaultBrush);
}
// Collider.cpp
void Collider::render(HDC _hdc) // ์ฒดํฌ๋ฐ์ค
{
// ํ
๋๋ฆฌ ๋ผ์ธ๋ง ๊ทธ๋ฆฌ๋๋ก -> ์์ฃผ ์ฌ์ฉํ ํ์ ์ฝ์ด์์ ๊ด๋ฆฌ
SelectGDI p(_hdc, PEN_TYPE::RED);
SelectGDI b(_hdc, BRUSH_TYPE::HOLLOW);
Rectangle(_hdc
, (int)(finalPos.x - scale.x / 2.f)
, (int)(finalPos.y - scale.y / 2.f)
, (int)(finalPos.x + scale.x / 2.f)
, (int)(finalPos.y + scale.y / 2.f));
}
์ถ๊ฐ๋ ์ฝ๋๊ฐ ๊ฝค ๋ง์ผ๋ ์๋์ ๋งํฌ์์ ์ ํํ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋๋ก ํ์.
https://github.com/MiyeongEom/GameBasic/commit/50c36b47990e83c1a28bf6a86c9427b7c4f82492
~ Collider(1) · MiyeongEom/GameBasic@50c36b4
MiyeongEom committed Jun 6, 2024
github.com
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 14] Collider(3) (1) | 2024.06.09 |
---|---|
[winAPI 13] Collider(2) (1) | 2024.06.08 |
[winAPI 11] Resource Manager (0) | 2024.06.06 |
[winAPI 10] Resource & Path Manager (1) | 2024.06.06 |
[winAPI 09] ๊ธฐ์ด ์ํ (0) | 2024.06.05 |