
지난 시간에는 Sprite와 Sprite를 움직이는 Action에 대해 알아보았다.
오늘은 Action들을 어떻게 조합하는지 알아보도록 하자.
Sequence
Sprite* sp = Sprite::create("HelloWorld.png");
sp->setAnchorPoint({0.5f , 0.5f});
sp->setPosition(centerPos);
addChild(sp);
auto moveAction = MoveBy::create(2,Vec2(50,0));
auto jumpAction = JumpBy::create(0.5, Vec2(0, 0), 100, 1);
Sequence* seq = Sequence::create(moveAction , jumpAction, nullptr);
sp->runAction(seq);
다음 코드는 Sprite를 만들고 위치를 화면 중앙으로 잡은 다음에 오른쪽으로 움직이고 위로 점프한다.
실행해 보면 알겠지만 액션들이 순서대로 진행된다.
첫번째 행동이 끝나면 두번째 행동을 하는식으로 말이다.
Sequence는 등록한 액션들을 순서대로 진행시켜 준다.
그리고 Create를 할때 맨 마지막에 꼭 nullptr을 넣어주어야 한다.
왜냐하면 저 Create메소드는 가변인자를 사용하고 있기 때문에 끝을 알려주어야 하기 때문이다.
DelayTime
Action 사이 사이에 딜레이를 주고 싶을땐 어떻게 할까?
DelayTime란 이름의 액션을 만들어서 Sequence에 넣어주면 된다.
auto moveAction = MoveBy::create(2,Vec2(50,0));
auto jumpAction = JumpBy::create(0.5, Vec2(0, 0), 100, 1);
DelayTime* delay = DelayTime::create(1.f);
Sequence* seq = Sequence::create(moveAction , delay, jumpAction, nullptr);
sp->runAction(seq);
Create할때 nullptr넣어주는거 잊으면 안된다!!
Spawn
Spawn은 action을 동시에 실행시켜 주는 클래스이다.
Spawn도 Sequence와 마찬가지로 Create할때 nullptr을 넣어주어야 한다.
auto moveAction = MoveBy::create(2,Vec2(50,0));
auto colorAction = TintTo::create(2,Color3B(125,125,1));
DelayTime* delay = DelayTime::create(1.f);
Spawn* spawn = Spawn::create(moveAction , colorAction,nullptr);
sp->runAction(spawn);
다음 코드는 오른쪽으로 이동하면서 색깔또한 동시에 바꿔주는 행동을 한다.
Clone
만약 같은 action을 여러번 활용하고 싶으면 Clone을 해주어야 한다.
auto heroSprite = Sprite::create("herosprite.png");
auto enemySprite = Sprite::create("enemysprite.png");
auto moveBy = MoveBy::create(10, Vec2(400,100));
heroSprite->runAction(moveBy);
enemySprite->runAction(moveBy);
다음과 같은 코드가 있을때 hereSprite만 정상적으로 움직이고 enemySprite는 움직이지 않을것이다.
이때 Clone을 하면 된다.
auto heroSprite = Sprite::create("herosprite.png");
auto enemySprite = Sprite::create("enemysprite.png");
auto moveBy = MoveBy::create(10, Vec2(400,100));
heroSprite->runAction(moveBy);
enemySprite->runAction(moveBy->clone());
clone을 해주어야 하는 이유는 action은 한번에 한 객체의 상태만 변경 시켜줄수 있기 때문에
별개의 action객체를 만들어 주어야 하기 때문이다.
Reverse
Reverse는 말그대로 액션의 행동을 뒤집어 준다.
auto moveAction = MoveBy::create(2,Vec2(50,0));
auto* seq = Sequence::create(moveAction , moveAction->reverse(), nullptr);
sp->runAction(seq);
이러면 오른쪽으로 이동했다가 다시 원래의 위치로 돌아온다.
Reverse는 Spawn이나 Sequence처럼 복잡한 액션들의 집합에도 쓸수 있다.
auto moveAction = MoveBy::create(2, Vec2(100, 0));
auto rotateAction = RotateBy::create(2, 180);
auto spawn = Spawn::create(moveAction, rotateAction, nullptr);
auto reverseSpawn = Spawn::create(moveAction->reverse(), rotateAction->reverse(), nullptr);
auto seq = Sequence::create(spawn, reverseSpawn, nullptr);
sp->runAction(seq);
이처럼 복잡한 액션에 사용하여도 반대로 잘 움직이는걸 볼수 있다.
'cocos2d-x' 카테고리의 다른 글
| [cocos2d-x]#5 UI에 대해 알아보자2. (1) | 2025.01.15 |
|---|---|
| [cocos2d-x]#4 UI에 대해 알아보자. (2) | 2025.01.08 |
| [cocos2d-x]#2 Sprite와 Action을 알아보자 (1) | 2024.12.29 |
| [cocos2d-x]#1 Director와 SceneGraph를 알아보자. (8) | 2024.10.08 |
| [cocos2d-x]#0 시작하기 (13) | 2024.09.28 |