cocos2d-x 공부용2014. 9. 3. 18:34

원글 출처 : 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버전부터 더이상 지원을 안하는군요.
아래 내용을 참고하여 변경합니다.
1// v2.1
2CCMoveBy *action = (CCMoveBy*) move->copy();
3action->autorelease();
4
5// v3.0
6// No need to do autorelease, no need to do casting.
7auto action = move->clone();
릴리즈 노트 원본을 못찾겠네요....여튼 이제 오토릴리즈 할 필요가 없다고 고치라니까 고쳐봅니다.

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);

실행 결과:

 

잘 움직이네요..

오늘은 여기까지입니다.

-----------------------------------------------------------------------------------------------------------------
이거 정리하느라 퇴근을 못해서 배고프네요
소스 설명이나 그런건 내일 추가해야겠습니다.
내일부터는 걍 소스 라인넘버 변경 안하고 해야겠네요..이게 은근 번거롭네요




Posted by 아이시네프