달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

CallFunc란?

Action이 아닌 함수적 동작을 Action처럼 쓸 수 있게 해주는 기능.


spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFunc::create(CC_CALLBACK_0(HelloWorld::callfuck, this)),

NULL

));



+ 여기서 CC_CALLBACK_0은 자동으로 넘기는게 없는 거지, 호출하는 함수가 파라미터가 없다는게 아니다. CC_CALLBACK_0은 단지 호출 객체를 Ref* sender로 넘겨주지 않을 뿐이지, 다른 파라미터는 가질 수 있다.

+ CallFuncN이 들어가면 뒤에는 CC_CALLBACK_0말고 다른거(1, 2, 3, 4)가 들어간다.


spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFuncN::create(CC_CALLBACK_1(HelloWorld::callFuckN, this)),

NULL

));

//callFuckN에게 spr1을 인자로 넘겨줌

+ 이렇게 CC_CALLBACK_1을 쓰면, CC_CALLBACK_1을 통해서 불려지는 함수에게 파라미터로 함수를 부르는 자기 자신(Ref* sender)을 넘겨준다. (?)



틀린 경우

spr1->runAction(Sequence::create(

MoveTo::create(3.0f, Vec2(380, 100)),

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, 1208)),

NULL

));


void HelloWorld::callFuckN(Ref* sender, int score)

{

CCLOG("Call Fuck %d!", score);

auto spr = (Sprite*)sender;

spr->runAction(ScaleTo::create(1.0f, 2));


}

이러면, CC_CALLBACK_0이기 때문에, 자동으로 Ref* sender로 넘겨주는 값이 없기 때문에 컴파일단계에서 에러가 난다.(callFuckN 내부 두번째에서 에러)


이때, 

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, 1208)), NULL

부분을

CallFuncN::create(CC_CALLBACK_0(HelloWorld::callFuckN, this, spr1, 1208)), NULL

로 해주면, 자연스럽게 spr1이 Ref* sender로 넘어가기 때문에 문제없이 실행된다.

:
Posted by 웽웽