본문 바로가기

Cocos2d-x v3.17/기본기능

[Cocos2d-x 기본기능] Clone,Reverse

반응형

Action의 Clone 

 

Clone의 기능은 단어의 뜻과 같다.만약 당신이 하나의 노드에 Clone()을 사용했다면 당신은 이노드의 Clone을 복사해온다. 

 

왜 우리는 clone()을 사용하는가?

왜냐면 Action을 실행하면 노드의 속성과 변화를 기록하는 내부상태가 하나 발생한다.

당신이 하나의 Action을 생성하고 해당 Action을 다른 노드에 계속 사용하고 싶으면 clone()을 사용해야 한다.

왜냐면 이Action의 동작속성이 어떻게 되있는지 알수가 없기 떄문이다.(이미 사용되었기때문에 언급했던 내부상태가 발생했다)

이것은 예측할수 없는 결과를 낳을수 있다.


예제를 보자.

만약 당신에게 좌표위치가 (0,0)의 heroSprite가 있다.

아래 코드를 실행해보자. 

C++ 

MoveBy::create(10, Vec2(400,100)); 

 

당신의 heroSprite는 10초의 시간중에 (0,0)부터 (400,100)위치로 이동했다.

따라서 heroSprite는 새로운 위치값(400,100)이 생겼다.

더 중요한것은 Action에도 노드위치와 관련이 있는 내부상태가 발생한것이다.

이제 당신이 좌표값이(200,200)의 enermySprite가 있고 당신이 heroSprite와 같은 Action을 재활용이 하고싶다.

그럼 enermySprite는 (800,200)의 위치로 이동한다.

이것은 내가 원했던 결과가 아니다.

왜냐면 두번째 이Action이 실행되었을때 이미 내부상태가 있는상황이기 때문이다.

clone()을 사용하면 이런상황을 면할수 있다.

Clone은 새로운 Action을 만들고 그 Clone한 Action은 내부상태가 없기때문이다. 


   

코드를 보면서 사용법을 익히자.먼저 잘못된 상황을 봐보자. 

C++ 

// create our Sprites

auto heroSprite = Sprite::create("herosprite.png");

auto enemySprite = Sprite::create("enemysprite.png"); 

// create an Action

auto moveBy = MoveBy::create(10, Vec2(400,100)); 

// run it on our hero

heroSprite->runAction(moveBy); 

// run it on our enemy

enemySprite->runAction(moveBy); // oops, this will not be unique!

// uses the Actions current internal state as a starting point. 

 

정확한 clone()사용법을 보자 

C++ 

// create our Sprites

auto heroSprite = Sprite::create("herosprite.png");

auto enemySprite = Sprite::create("enemysprite.png"); 

// create an Action

auto moveBy = MoveBy::create(10, Vec2(400,100)); 

// run it on our hero

heroSprite->runAction(moveBy); 

// run it on our enemy

enemySprite->runAction(moveBy->clone()); // correct! This will be unique 

 

Action 의 Reverse 

 

Reverse의 기능도 단어의 뜻과 같다.

reverse()는 동작순서를 거꾸로 실행시킨다.

reverse()는 간단한 하나의 Action만 거꾸로 실행시키는것 뿐만이 아니다 Sequence와 Spawn도 사용가능하다. 

 

사용법은 굉장히 간단하다. 

C++ 

// reverse a sequence, spawn or action

mySprite->runAction(mySpawn->reverse()); 

 

아래의 코드가 실행되면 내부적으로 어떤상황이 발생하는가? 

C++ 

// create a Sprite

auto mySprite = Sprite::create("mysprite.png");

mySprite->setPosition(5056); 

// create a few Actions

auto moveBy = MoveBy::create(2.0f, Vec2(500,0));

auto scaleBy = ScaleBy::create(2.0f2.0f);

auto delay = DelayTime::create(2.0f); 

// create a sequence

auto delaySequence = Sequence::create(delay, delay->clone(), delay->clone(),

delay->clone(), nullptr); 

auto sequence = Sequence::create(moveBy, delay, scaleBy, delaySequence, nullptr); 

// run it

mySprite->runAction(sequence); 

// reverse it

mySprite->runAction(sequence->reverse()); 

 

머리로 생각하면 좀 어렵다고 느낄수 있다.우리가 step by step으로 설명하겠다.

 

1.mySprite생성 

 

2.mySprite의 좌표위치를 (50,56)으로 설정한다. 

 

3.Sequence가 실행된다. 

 

4.Sequence는 첫번째 동작 moveBy가 실행되고 2s내에 mySprite가 (550,56)위치로 이동한다. 

 

5.Sequence가 두번째 Action을 수행한다.2s 딜레이. 

 

6.Sequence가 세번쨰 동작 scaleBy를 수행한다.2s동안 2배 스케일된다. 

 

7.Sequence가 네번째 Action을 delaySequence를 수행한다. 

 

8.Reverse()가 사용되고 순서가 바뀌어서 반대로 실행된다. 

 

9.Sequence가 네번째 Action delaySequence가 수행된다.6초 딜레이. 

 

10.Sequence가 세번째 Action scaleBy,2s중 mySprite는 2배 작아진다(주의:시퀀스내의 Action도 반대로 실행된다) 

 

11.Sequence가 2번째 action을 수행한다.2초 딜레이. 

 

12.Sequence가 첫번째 동작 moveBy를 수행한다.2초동안 mySprite좌표위치를 (550,56)에서 (50,56)으로 이동한다. 

 

13.mySprite가 원래 초기위치로 돌아왔다. 

 

우리는 reverse()가 얼마나 간단하게 사용할수 있는지 알았다.

하지만 내부적으로 구현부분을 보면 하나도 간단하지 않다.

Cocos2d-x가 당신을 위하여 복잡한 로직을 패키징하고 간단하고 사용하기 쉬운 인터페이스를 남겨놨기 때문이다. 

   

출처: <http://cocos2d-x.org/docs/cocos2d-x/zh/actions/sequence_internals.html

   


반응형