์์ ์ค ์ดํด๊ฐ ์๋๋ ๋ถ๋ถ์ด๋, ๊ธฐ์ต์ด ์ ์๋๋ ๋ถ๋ถ์ ๊ฐ์์์์ ์์ฒญํ๋ฉฐ ๋ค์ํ๋ฒ ์ ๋ฆฌํ์ต๋๋ค.
1. ๊ธฐ์ธ๊ธฐ์ ๋ฐ๋ฅธ ์์ง์ ๋ง๊ธฐ
- ์ด๋ ๋ฐฉํฅ์ ๊ตฌ๋ถํ๋ค.(ํ์ธ ์ํ๋ ์บ๋ฆญํฐ ํด๋์ค์์ velocity.x > 0 ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์๋, velocity.x < 0 ์ผ์ชฝ์ผ๋ก ๊ฐ๊ณ ์์ ๋๋ก ๊ตฌ๋ถ ๊ฐ๋ฅ)
- ๋ณธ์ธ ์์น์์ ๋์ด๋ฅผ ์บ๋ฆญํฐ์ Top์ผ๋ก ์ค์ ํด์ฃผ๊ณ , x๋ ์ผ์ ๊ฑฐ๋ฆฌ๋งํผ ๋ํ๊ฑฐ๋ ๋นผ์ฃผ์ด ํด๋น ์์น์ ํฝ์
๋์ด๋ฅผ ๊ตฌํ๋ค.
- ์บ๋ฆญํฐ์ ๋ฐ๋ฅ์์ ๋ค์์ง์ ์ ํฝ์ ๋์ด๊น์ง์ slope (๊ฒฝ์ฌ) ๋ฅผ ๊ตฌํ๊ณ , ๊ฒฝ์ฌ๊ฐ ์ผ์ ์ด์์ด๋ฉด ์ด๋์ ๋ง๋๋ค.
ใด ๊ฒฝ์ฌ๋ฅผ MAX_SLOPE ๋ผ๋ ์์๊ฐ์ผ๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์, ๋ค๋ฅธ ํด๋์ค์์ ์ฌ์ฉ์ ์ํ๋ค๋ฉด ์์ ์ด ํ์ํ๋ค.
bool PixelCharacter::CanMove()
{
Vector2 nextPos = pos;
nextPos.y = Top();
if (velocity.x > 0)
nextPos.x += CHECK_DIST;
else if (velocity.x < 0)
nextPos.x -= CHECK_DIST;
float nextHeight = landTexture->GetPixelHeight(nextPos);
float slope = Bottom() - nextHeight;
if (slope > MAX_SLOPE)
return false;
return true;
}
2. ๋ชฌ์คํฐ์ ์์ฐฐ์ํ ์ค์ ํ๊ธฐ
- ์์ฐฐ์ ์์ํ๋ฉด ์บ๋ฆญํฐ์ ์ํ๊ฐ์ ์ค์
- ์์ฐฐํ ์๊ฐ์ ์ง์ ํด ์๊ฐ๋งํผ ์ง์ ํด์ง ๋ฐฉํฅ์ผ๋ก ์ญ ์ด๋ (์์๊ฐ์ผ๋ก)
- ๋๋ค๊ฐ์ 2์ ๋๋จธ์ง๋ฅผ ๊ตฌํด 1์ด๋ฉด๋ฉด ์ผ์ชฝ, 0์ด๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๊ฒ velocity๋ฅผ ์ค์ ํด์ค๋ค.
- ์์ฐฐ์๊ฐ์ ๊ณ์ DELTA๋ฅผ ๋ํด์ฃผ๋ค๊ฐ ์์๊ฐ์ผ๋ก ์ง์ ํ PATROL_TIME ๊ณผ ๊ฐ๊ฑฐ๋ ์ปค์ง๋ฉด ์ด๊ธฐํํด์ฃผ๊ณ IDLE ์ํ๋ก ๋ณ๊ฒฝ
- IDLE์ํ์์๋ ์์๊ฐ์ผ๋ก ์ง์ ํด๋ IDLE_TIME์ด ๋์ด๊ฐ๋ฉด StartPatrol ํจ์๋ฅผ ์คํํ๋ค.
void Siva::StartPatrol()
{
state = PATROL;
velocity.x = (rand() % 2) ? -SPEED : SPEED;
velocity.y = JUMP_POWER;
}
void Siva::Patrol()
{
patrolTime += DELTA;
if (CanMove())
{
pos.x += velocity.x * DELTA;
}
else
{
velocity.x *= -1.0f;
}
if (velocity.x > 0)
SetAction(RUN_RIGHT);
else
SetAction(RUN_LEFT);
if (patrolTime >= PATROL_TIME)
{
state = IDLE;
if (velocity.x > 0)
SetAction(IDLE_RIGHT);
else
SetAction(IDLE_LEFT);
patrolTime = 0.0f;
}
if (Left() < 0.0f)
{
velocity.x = SPEED;
}
else if (Right() > landTexture->GetSize().x)
{
velocity.x = -SPEED;
}
}
void Siva::Idle()
{
idleTime += DELTA;
if (idleTime >= IDLE_TIME)
{
idleTime = 0.0f;
StartPatrol();
}
}
3. ์ต์ ๋ฒ ํจํด
- ํจ์ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ฉฐ, ๋ค๋ฅธ ํด๋์ค์์ ์ด๋ค ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์์์ผํ ๋ ์ฌ์ฉํ ์ ์๋ค
Ohh ํด๋์ค์์ Wow ํด๋์ค๋ฅผ ์ฐ๋ ๊ฐ์ฒด์ ์ฃผ์๊ฐ ํ์ํ๋ค๋ฉด Wow*๋ก ๋ฉค๋ฒ๋ณ์ aa๋ฅผ ๋ง๋ค๊ณ aa์ ํ์ํ Ohh ๊ฐ์ฒด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ์์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค.
*Wow aa;
aa = ํ์ํ ๊ฐ์ฒด์ ์ฃผ์;
ใด ์ด๋ ๊ฒ ์ฐ๋๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ผ๋ ํจ์ ํจ์จ์ ์ด๋ผ๊ณ ํ๋ค. (๊ทผ๋ฐ ๋๋ฌด ์ด๋ ค์ ๋ค..)
(์๋ ๋ด์ฉ๋ค์ ๋์์ธํจํด์ ๊ด์ฐฐ์ํจํด์ ๊ฐ๋ํ์ ๋๋ก ๋ณด๋ฉด๋๋ค)
void* : ์ด๋ค ์๋ฃํ์ธ์ง ์ ํด์ง์ง ์์์ ๋ ์ฌ์ฉํ๋ ํฌ์ธํฐ (๊ด๋ จ ๋ฉ๋ชจ๋ ์ ์๊ธ์ฐธ๊ณ )
float* int* ๋ ๋ค 64๋นํธ ํ๊ฒฝ์์๋ 8๋ฐ์ดํธ์ด๋ค (ํฌ์ธํฐ๊ฐ 8๋ฐ์ดํธ๋ผ์)
์ด์ฐจํผ ๊ฐ์ ํฌ๊ธฐ์ด๊ธฐ๋๋ฌธ์ ์ด๋ค ์๋ฃํ์ด๋ ๋ฃ์ ์ ์๋ ๊ฒ์ ์ด์ฉํด์ ์๋ฃํ์ด ์ ํด์ง์ง ์์์ ๋ void*๋ฅผ ์ฌ์ฉํ๋ค. (ํ
ํ๋ฆฟ์ฒ๋ผ ์ธ ์ ์์ด์ ํธ๋ฆฌํ๋ค)
์ฃผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ๋ ์์ฃผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
Rect* rect;
void* a;
a = rect;
((Rect*)rect)->
ใด ์ด๋ฐ์์ผ๋ก ํ๋ณํ์ ํด์ฃผ์ด์ผ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
========================================
ํด๋น ๋ด์ฉ์ ๋ณต์ตํ๋ ๋์ค ํจ์ ํฌ์ธํฐ์ ๋ํ ๊ฐ๋ ์ด ๋ถ์กฑํ ๊ฒ ๊ฐ์ ํจ์ ํฌ์ธํฐ์ ๋ํด ๋ค์ ๊ณต๋ถํ๋ค.
[ํจ์ํฌ์ธํฐ]
ํจ์ํฌ์ธํฐ๋ ๊ฐ๋จํ ํจ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๋ณ์๋ผ๊ณ ๋ณด๋ฉด๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก C์์ ์ฐ๋ ๋ฐฉ๋ฒ์ ๋์ถฉ ์๋์ฒ๋ผ ์ฐ๋ฉด ๋๋ค.
์ ์ญํจ์์ผ๋
void Attack()
{
cout << "์ดํ" << endl;
}
void main()
{
//๋ฐํํ (*๋ณ์์ด๋ฆ)(๋งค๊ฐ๋ณ์);
void(*action)();
action = Attack;
action();
}
๊ฐ์ฒด ๋ด์ ์๋ ๋ฉค๋ฒํจ์์ผ๋
class Character
{
public:
void Attack()
{
cout << "์ดํ" << endl;
}
}
int main()
{
void (*action)();
action = Character::Attack; //๊ฐ์ฒด ์์์๋ ํจ์๋ ์ด๋ ๊ฒ ์ฌ์ฉํ ์ ์๊ธฐ๋๋ฌธ์ ์คํํฑ์ผ๋ก ์ ์ญํจ์๋ก ๋ณ๊ฒฝํด์ ๋ฃ์ด์ฃผ๋๊ฐ ํด์ผํ๋ค.
void (Character:: *characterAction)(); //๊ทธ๋ ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ ๊ฒํ๋ฉด๋๋ค.
characterAction = &Charater::Jump(); //์ ๋๋ก ํ ๋น๋๊ฒ์ด ์๋๊ธฐ๋๋ฌธ์ &๋ฅผ ๋ถ์ฌ์ผํ๋ค.
Character character; //๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฑด ํ ๋น์ ํด์ค์ผ์ง๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํจ
(character.*characterAction)();
}
๋ฉค๋ฒํจ์์ผ๋๋ ๋ญ๊ฐ ๊ต์ฅํ ๋ณต์กํด์ ๋งค์ฐ ๊ทนํ์ด๋ค!
C++์์๋ functional ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ๊ธฐ๋๋ฌธ์ ์ ๋ ๊ฒ ์์จ๋๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉด std::function ๋ฅผ ์ฌ์ฉํด ํจ์ํฌ์ธํฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
std::function ์ ๊ฒฝ์ฐ ํจ์ ๋ฟ๋ง์ด ์๋๋ผ ๋ชจ๋ Callable ๋ค์ ๋ณด๊ดํ ์ ์๋ ๊ฐ์ฒด๊ธฐ ๋๋ฌธ์ด๋ค.
C++์์ Callable ์ด๋ ๊ฐ๋จํ () ๋ฅผ ๋ถ์ฌ์ ํธ์ถํ ์ ์๋ ๋ชจ๋ ๊ฒ์ Callable ์ด๋ผ๊ณ ์ ์ํ๊ณ ์๋ค.
์๋์ฒ๋ผ #include ์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจ์์ผ์ค์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค
ใด #include <functional> ์ด๊ฑธ ์ถ๊ฐํด์ผํจ!
std namesapce์ ์๊ธฐ ๋๋ฌธ์ std::function ์ด๋ ๊ฒ ์ฐ๋๊ฐ using namespace std; ๋ฅผ ํ๊ณ ์จ์ผํ๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์ด๋ ๋ค.
function<๋ฐํ๊ฐ(๋งค๊ฐ๋ณ์)> ๋ณ์๋ช ; (๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ๋น์ฐ๋ฉด๋๋ค)
function<void()> event = bind(&Character::Jump, character);
event();
ใด ์ด๋ ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
ใด ํจ์์ ๋ฐํํ๋ง ๊ฐ์ผ๋ฉด ๋ค๋ฅธ ๊ฐ์ฒด์ ํจ์๋ฅผ ๋ฃ์ ์๋ ์์. (๊ทธ๋ฅ ํจ์ํฌ์ธํฐ๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅผ๊ฒฝ์ฐ ๋ค์ ๋ณ์๋ฅผ ์์ฑํด์ค์ผํจ)
ใด ๋๋ฒ์งธ๊ฐ, ์ฆ character๋ ํ ๋นํ ๊ฐ์ฒด๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ถ๋ถ์ด๋ค.
์ ๋ณด๋ผ์ ๊ธ์จ ๋ถ๋ถ์ด ์ ์ดํด๊ฐ ๋์ง ์์ bind ํจ์์ ๋ํด ์ฐพ์๋ณด๋, ์๋ฐ์์ผ๋ก ์ฐ๋๊ฑฐ๋ผ๊ณ ํ๋ค.
bind(ํจ์๋ช , ์ธ์ 1, ์ธ์ 2,...);
์ฆ, ํจ์์ ์ธ์ 1, ์ธ์ 2๋ฅผ ๋ถ์ฌ์ฃผ๋? ๋ญ ๊ทธ๋ฐ ํจ์๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ std::placeholders ๋ผ๋๊ฒ์ bind ํจ์๋ฅผ ์ฐพ์๋ณผ๋ ๊ฐ์ด ๋์ค๊ธฐ๋ํ๊ณ , ์๋ ์ต์ ๋ฒํจํด์ ์ฌ์ฉํ ๋ ์ด์ฉํ๊ธธ๋
๊ฐ์ด ํ์ธํด ๋ณด๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํด์ฃผ๋? ๊ทธ๋ฐ๊ฑฐ๋ผ๊ณ ๋ณด์ฌ์ง๋ค. (๊ฐ์์์์์๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ช๊ฐ ์ง ์ง์ ํด์ฃผ๋ ๊ฒ ์ด๋ผ๊ณ ๋ง์ํ์๊ธด ํ์ จ์ผ๋, ๊ฒ์ํด๋ณด๋ placeholders::_1๋ 1๋ฒ์งธ ์ธ์๋ฅผ, placeholders::_2๋ ๋๋ฒ์งธ ์ธ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค.)
๊ฐ๋จํ ๋งํ๋ฉด ํธ์ถ์ด ๊ฐ๋ฅํ ๊ฐ์ฒด์ ์ธ์๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๊ฒ ์ด๋ผ๋๋ฐ,
์ธ๋ฒ์งธ ๋ธ๋ก๊ทธ์ ์๋ ์์๋ฅผ ์ฐธ๊ณ ํด๋ณด๋ฉด ๋ณด๋ค ์ฝ๊ฒ ์ดํด๊ฐ ๋๋ค.
int sum(int a, int b, int c)
{
return a+b*10+c*100;
}
int main()
{
....
auto func3 = std::bind(sum, 1, std::placeholder::_2, std::placeholder::_1);
cout<< func3(2,3) << endl;
}
//=> 231
//func3์์ sum์ ์ฒซ๋ฒ์งธ ์ธ์๋ ์ด๋ฏธ 1๋ก ๊ณ ์ ๋๋จธ์ง ๋ ์ธ์๋ placeholder๋ก ์ค์ ๋จ
//func3์ ์ฒซ๋ฒ์งธ ์ธ์๋ ์๋ ํจ์ sum์ ์ธ๋ฒ์งธ ์ธ์๊ฐ ๋๊ณ
//func3์ ๋๋ฒ์งธ ์ธ์๋ ์๋ ํจ์ sum์ ๋๋ฒ์งธ ์ธ์๊ฐ ๋๊ณ
//์ฆ, ๊ณ ์ ๋์ง ์์ ๋จ์ ์ธ์๋ค์ ์์๋ฅผ palceholder๋ก ๋ณ๊ฒฝํ ์ ์์
์ดํดํ๊ฒ ๋ง๋์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ๊ฐ๋จํ ๋งํ๋ฉด ํจ์ํฌ์ธํฐ๋ก ํจ์๋ฅผ ๋ณ์์ ์ ์ฅํ ๋ ๋ฐ์ ์ธ์์ ๊ฐ์๋ฅผ ์กฐ์ ํ ์ ์๊ฒ ํ๋ ๊ฒ ๊ฐ๋ค. (๋ช๋ฒ์งธ๋ก ์ค์ ํ ์ง๋ ์ค์ ํ๊ธฐ ๋๋ฆ์ธ๋ฏ)
Observer::Get()->AddParamEvent("SivaDamage", bind(&Siva::Damage, this, placeholders::_1));
ใด ์ด ๊ตฌ๋ฌธ์ AddParamEvent์ ๋๋ฒ์งธ ์ธ์๋ก &Siva::Damage๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ ๊ฐ์๋ฐ placeholders::_1 ์ด๊ฒ ์ ํ์ํ๊ฑด์ง๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค. ์์์์๋ ๋งค๊ฐ๋ณ์๊ฐ ๋ช๊ฐ์ธ์ง๋ฅผ ๋ฃ์ด์ค์ผํ๋ค๊ณ ํ๋๋ฐ, ์ ์ด์ Siva::Damageํจ์๋ ๋งค๊ฐ๋ณ์๊ฐ 1๊ฐ ๋ฐ..? ์ ๋ชจ๋ฅด๊ฒ ๋ค. ๊ทผ๋ฐ ๋นผ๋ณด๋๊น ๋นจ๊ฐ์ค์ด ๋ฌ๋ค ๊ฑ ํ์ํ๊ฐ๋ณด๋ค (?)
๊ฐ์์์๊ณผ ์๋ ์ฌ์ดํธ๋ค์ ์ฐธ๊ณ ํ์ฌ ๋ณต์ตํ๋ค.
https://mititch.tistory.com/100
https://happynotepad.tistory.com/27
=========================================
framework.h์ typedef์ผ๋ก ์๋ ์๋ฃํ ๋ฑ๋ก
//framework.h
typedef function<void()> Event;
typedef function<void(void*)> ParamEvent;
Observer.h
public:
void AddEvent(string key, Event event);
void AddParamEvent(string key, ParamEvent event);
void ExcuteParamEvents(string key);
void ExcuteParamEvents(string key, void* object);
private:
typedef vector<ParamEvent> ParamEvents;
typedef vector<Event> Events;
map<string, Events> totalEvent;
map<string, ParamEvents> totalParamEvent;
Observer.cpp
void Observer::AddEvent(string key, Event event)
{
totalEvent[key].push_back(event);
}
void Observer::AddParamEvent(string key, ParamEvent event)
{
totalParamEvent[key].push_back(event);
}
void Observer::ExcuteParamEvents(string key)
{
if (totalEvent.count(key) == 0)
return;
for (Event event : totalEvent[key])
{
event();
}
}
void Observer::ExcuteParamEvents(string key, void* object)
{
if (totalParamEvent.count(key) == 0)
return;
for (ParamEvent event : totalParamEvent[key])
{
event(object);
}
}
์ฌ์ฉํ๋ ๋ถ๋ถ
//Siva.cpp
Siva::Siva()
: PixelCharacter(L"Textures/siva_run.bmp", 8, 2)
{
CreateAnimations();
animations[IDLE_LEFT]->Play();
Observer::Get()->AddParamEvent("SivaDamage", bind(&Siva::Damage, this, placeholders::_1));
}
void Siva::Damage(void* bomb)
{
GameObject* object = (GameObject*)bomb;
float distance = (pos - object->pos).Length();
if (distance < 100)
{
state = HIT;
if (velocity.x > 0)
SetAction(IDLE_RIGHT);
else
SetAction(IDLE_LEFT);
}
}
//Bomb.cpp
void Bomb::Timer()
{
time += DELTA;
if (time >= EXP_TIME)
{
isActive = false;
SelectObject(landTexture->GetMemDC(), hBrush);
SelectObject(landTexture->GetMemDC(), hPen);
int left = pos.x - EXP_RANGE;
int right = pos.x + EXP_RANGE;
int top = pos.y - EXP_RANGE;
int bottom = pos.y + EXP_RANGE;
Ellipse(landTexture->GetMemDC(), left, top, right, bottom);
Observer::Get()->ExcuteParamEvents("SivaDamage", this);
}
}
- AddEvent ํจ์์ key์ event๋ฅผ ๋ฐ์ map์ผ๋ก ์์ฑ๋ totalEvent์ key๊ฐ์ผ๋ก second๋ ๋ฒกํฐ๊ธฐ๋๋ฌธ์ event๋ฅผ ์ถ๊ฐํ๋ค. (์๋ ์๋ ์ถ๊ฐํ ์์ )
- ExcuteParamEvents ํจ์๋ ์ด๋ฒคํธ๋ฅผ ์คํํ๋ ํจ์์ธ๋ฐ, ์๋์๋ฆฌ๋ฅผ ๋ณด๋ฉด
key๊ฐ์ ๋ฐ์ ์๋์ง ์๋์ง ์ฒดํฌํ๊ณ , ์๋ค๋ฉด function<void(void*)> ํ์ธ ParamEvent ์๋ฃํ์ ์ฌ์ฉํ๋ ๋ฒกํฐ ParamEvents๋ฅผ ๊ฐ์ง๋ map์ธ totalParamEvent์ key๋ฅผ ๋ฐ์ ParamEvent ์๋ฃํ์ ์ฌ์ฉํ๋ ๋ฒกํฐ์ ๊ฐ์ ๊ฐ์ ํ์ ์ฌ์ฉํ๋ event์ ์ ๋ฌ๋ฐ์ object๋ฅผ ์ธ์๋ก ๋ฃ์ด ์คํํ๋ ๊ฒ์ผ๋ก ๋ณด์ฌ์ง๋ค.
...๋ญ์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค..
event๋ ParamEvent ์ธ๋ฐ,
ParamEvent ๋ function<void(void*)> ์ด๋ค.
๋งค๊ฐ๋ณ์ void* object๋ Bomb.cpp์์
Observer::Get()->ExcuteParamEvents("SivaDamage", this);
์ด๋ ๊ฒ ์ฐ๋๊น object๋ Bomb ๊ฐ์ฒด์ ์ฃผ์๋ค.
totalParamEvent[key]๋ ParamEvents
ParamEvents๋ vector<ParamEvent>
ParamEvent ํ์ ์ ์ฅํ๋ ๋ฒกํฐ์ ํฌ๊ธฐ๋งํผ for๋ฌธ ๋๊ณ
ParamEvent ๋ ๊ฒฐ๊ตญ function<void(void*)> ์ด๊ฑฐ๋๊น
event๋ function<void(void*)>์ ์๋ฃํ์ ๊ฐ์ง๋ ํฌ๋ฌธ ๋ด ์ง์ญ ๋ณ์๊ฐ ๋๋๋ฐ(?)...
๊ทธ๋ ๊ฒ๋๋ฉด...?
totalParamEvent[key]์ second๊ฐ ๋น์ด์์ง ์์ ๊ฒฝ์ฐ๋ง for๋ฌธ์ด ๋๊ฒ๋๊ณ ,
for๋ฌธ์ด ๋๊ฒ๋๋ฉด second์ ์ ์ฅ๋์ด์๋ ํจ์์ object๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋์ด ์ ์ฅ๋์ด์๋ ํจ์๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ธ ๊ฒ ๊ฐ๋ค.
์ฆ, ์ฌ์ฉ๋ถ๋ถ์ ๋ณธ๋ค๋ฉด ์๋์ ๊ฐ์ด ํธ์ถ๋๋ค๊ณ ๋ณด๋ฉด๋๋ ๊ฒ ๊ฐ๋ค (์๋ ๋ง๊ตฌ ใ )
(์ดํด๋ฅผ ์ํด ์ญ ๋์ดํ๋ฉด์ ์์ฑํ๋ค)
(์ ์ฅ๋ถ๋ถ)
Siva.cpp
Observer::Get()->AddParamEvent("SivaDamage", bind(&Siva::Damage, this, placeholders::_1));
ใด SivaDamage ํค๊ฐ์ผ๋ก Siva::Damage ํจ์๋ฅผ ๋ฃ์ (Siva::Damage ๋ Bomb* ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์)
(ํธ์ถ๋ถ๋ถ)
Bomb.cpp
Observer::Get()->ExcuteParamEvents("SivaDamage", this);
ใด SivaDamage ๋ผ๋ ํค๊ฐ์ผ๋ก ๊ธฐ์กด ์ ์ฅ๋ ํจ์์ this๋ฅผ ๋ฃ์ด ํจ์๋ฅผ ํธ์ถ.
๋์!! ๊ทธ๋์ ์ฑ๊ธํค์ผ๋ก ์ฐ๋๊ฑด๊ฐ๋ณด๋ค.
์ดํดํ๊ณ ๋๋ ์ด๊ฑธ ์ดํดํ๋๋ฐ ์ ํ์๊ฐ์ด๋๊ฒ ๊ฑธ๋ฆฐ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ๋ค.. ์๊ฐ๋ณด๋ค ๊ฐ๋จํ๋ฐ..

'๐ฑ > ๐ฑ์ฐ์ต๐ฑ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DX11_์ด์์๊ธฐ (0) | 2023.01.12 |
---|---|
231011_DX11 ๋๋ค์คํฐ (0) | 2023.01.11 |
221227_๋ฆฌ๋ฌ๊ฒ์ ๋ง๋ค๊ธฐ (0) | 2022.12.27 |
221226_์ ๋๋ฉ์ด์ (0) | 2022.12.26 |
221222_ํ๋ํผ ๋ฒ๋ ๋ง๋ค๊ธฐ (0) | 2022.12.22 |
๋๊ธ