๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒฑ/๐ŸŒฑ์—ฐ์Šต๐ŸŒฑ

221229_๋ณต์Šต

by Nessie! 2022. 12. 30.

์ˆ˜์—… ์ค‘ ์ดํ•ด๊ฐ€ ์•ˆ๋๋˜ ๋ถ€๋ถ„์ด๋‚˜, ๊ธฐ์–ต์ด ์ž˜ ์•ˆ๋‚˜๋Š” ๋ถ€๋ถ„์„ ๊ฐ•์˜์˜์ƒ์„ ์‹œ์ฒญํ•˜๋ฉฐ ๋‹ค์‹œํ•œ๋ฒˆ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

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://modoocode.com/254

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๋ฅผ ๋„ฃ์–ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ.

 

๋˜์ž‰!! ๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์“ฐ๋Š”๊ฑด๊ฐ€๋ณด๋‹ค.

์ดํ•ดํ•˜๊ณ ๋‚˜๋‹ˆ ์ด๊ฑธ ์ดํ•ดํ•˜๋Š”๋ฐ ์™œ ํ•œ์‹œ๊ฐ„์ด๋„˜๊ฒŒ ๊ฑธ๋ฆฐ๊ฑด์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.. ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ๋ฐ..

 

๋Œ“๊ธ€