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(50, 56);
// create a few Actions
auto moveBy = MoveBy::create(2.0f, Vec2(500,0));
auto scaleBy = ScaleBy::create(2.0f, 2.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>
'Cocos2d-x v3.17 > 기본기능' 카테고리의 다른 글
[Cocos2d-x 기본기능]Scene 전환 (0) | 2018.08.11 |
---|---|
[Cocos2d-x 기본기능]Scene 소개 및 생성 (0) | 2018.08.11 |
[Cocos2d-x 기본기능]Sequence,Spawn (0) | 2018.08.11 |
[Cocos2d-x 기본기능]변속운동 (0) | 2018.08.11 |
[Cocos2d-x 기본기능]프레임 애니메이션 (0) | 2018.08.11 |