원글 출처 : http://horns.tistory.com/6
-3- 액션(Action)
1. 적 Action 추가
HelloWorldScene.h
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class HelloWorld : public cocos2d::Layer { private: Size _screenSize; Action* _enemyMove; Action* _treeMove; public: // there's no 'id' in cpp, so we recommend returning the class instance pointer static cocos2d::Scene* createScene(); // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone virtual bool init(); // implement the "static create()" method manually CREATE_FUNC(HelloWorld); ~HelloWorld(void);//클래스 소멸자 추가 void createGameScene(void); void createGameAction(void); }; |
HelloWorldScene.cpp
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | HelloWorld::~HelloWorld(){ CC_SAFE_RELEASE(_enemyMove); } // on "init" you need to initialize your instance bool HelloWorld::init() { ////////////////////////////// // 1. super init first if (!Layer::init()) { return false; } createGameAction(); createGameScene(); return true; } |
여기까지 해두고 바로 빌드해버리면 당연히 에러가 난다.
init()에서 createGameAction()을 호출해놓고 createGameAction()을 정의해두지 않았기 때문에.
나처럼 성질이 급해서 바로 빌드해보고 싶다면 아래쪽에 빈 함수라도 정의해놓고 빌드해봐서 오타가 있는지 없는지 확인하면 된다.
이제 엑션을 추가한다.
HelloWorldScene.cpp
65 66 67 68 69 70 71 72 | void HelloWorld::createGameAction(){ FiniteTimeAction* enemySwing = Sequence::create( EaseInOut::create(RotateTo::create(1.2f, -10), 2), EaseInOut::create(RotateTo::create(1.2f,10),2), NULL); _enemyMove = RepeatForever::create((ActionInterval*)enemySwing); _enemyMove->retain(); } |
Sequence::create( A, B, NULL);
액션 A와 B를 순차적으로 실행한다.
RotateTo 지정한 각도까지 회전한다.
RotateBy 지정한 각도만큼 회전한다.
기억이 맞다면 각도 값은 라디안이 아니라 디그리로.
EaseIn 점점 빠르게
EaseOut 점점 느리게
EaseInOut 빨랐다가 느리게
Speed 해당 속도값대로
EaseInOut::create(action, rate)
rate는 탄성이라고 하는데 이걸 바꾸면 어떻게 동작하는거라고 콕 찝어 설명해준게 없는듯..
RepeatForever::create(action);
action을 무한 반복한다.
HelloWorldScene.cpp
59 60 61 62 63 | //적 이미지 추가 Sprite* enemy = Sprite::create("enemy_01.png"); enemy->setPosition(ccp(_screenSize.width * 0.7f, _screenSize.height * 0.8f)); enemy->runAction(_enemyMove); this->addChild(enemy); |
여기까지 빌드하고 실행하면 적 이미지가 좌우로 왔다갔다 하게 된다.
왔다갔다..
2. 나무 Action 추가
* 회전 중심 변경한 상태로 바로 적용한다.
HelloWorldScene.cpp
19 20 21 22 | HelloWorld::~HelloWorld(){ CC_SAFE_RELEASE(_enemyMove); CC_SAFE_RELEASE(_treeMove); } |
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | void HelloWorld::createGameAction(){ FiniteTimeAction* enemySwing = Sequence::create( EaseInOut::create(RotateTo::create(1.2f, -10), 2), EaseInOut::create(RotateTo::create(1.2f,10),2), NULL); _enemyMove = RepeatForever::create((ActionInterval*)enemySwing); _enemyMove->retain(); FiniteTimeAction* treeSwing = Sequence::create( EaseInOut::create(RotateTo::create(2.0f, -5), 2), EaseInOut::create(RotateTo::create(2.0f, 5), 2), NULL); _treeMove = RepeatForever::create((ActionInterval*)treeSwing); _treeMove->retain(); } |
그리고 나서 나무에 액션을 추가합시다.
그런데.... [tree->runAction((CCAction*)_treeMove->copy()->autorelease());]를 사용하니 분명 빌드는 되는데,
실행을 하니 아주 예쁘게 에러를 뱉으면서 앱이 죽으셨습니다--;;; 검색해보니 copy()는 3.0버전부터 더이상 지원을 안하는군요.
실행을 하니 아주 예쁘게 에러를 뱉으면서 앱이 죽으셨습니다--;;; 검색해보니 copy()는 3.0버전부터 더이상 지원을 안하는군요.
아래 내용을 참고하여 변경합니다.
릴리즈 노트 원본을 못찾겠네요....여튼 이제 오토릴리즈 할 필요가 없다고 고치라니까 고쳐봅니다.
HelloWorldScene.cpp
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | //나무 이미지 삽입 Sprite* tree = Sprite::create("tree_01.png"); tree->setPosition(ccp(_screenSize.width * 0.2f, _screenSize.height * 0.7f)); tree->setAnchorPoint(ccp(0.5f,0)); tree->runAction((Action*)_treeMove->clone()); this->addChild(tree); tree = Sprite::create("tree_02.png"); tree->setPosition(ccp(_screenSize.width * 0.35f, _screenSize.height * 0.7f)); tree->setAnchorPoint(ccp(0.5f,0)); tree->runAction((Action*)_treeMove->clone()); this->addChild(tree); tree = Sprite::create("tree_03.png"); tree->setPosition(ccp(_screenSize.width * 0.8f, _screenSize.height * 0.7f)); tree->setAnchorPoint(ccp(0.5f,0)); tree->runAction((Action*)_treeMove->clone()); this->addChild(tree); |
실행 결과:
잘 움직이네요..
-----------------------------------------------------------------------------------------------------------------
이거 정리하느라 퇴근을 못해서 배고프네요
소스 설명이나 그런건 내일 추가해야겠습니다.
내일부터는 걍 소스 라인넘버 변경 안하고 해야겠네요..이게 은근 번거롭네요