程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Cocos2d-x 系列五之動畫與動作

Cocos2d-x 系列五之動畫與動作

編輯:C++入門知識

1.場景切換
新建一個類ImageScene

#ifndef IMAGESCENE_H
#define    IMAGESCENE_H
#include <iostream>
#include <cocos2d.h>

USING_NS_CC;

class ImageScene : public Layer {
public:

    virtual bool init() {
        Sprite *s = Sprite::create("HelloWorld.jpg");
        Size size = Director::getInstance()->getVisibleSize();
        s->setPosition(Point(size.width / 2, size.height / 2));
        addChild(s);
        return true;
    };

    static Scene* createScene() {
        Scene *s = Scene::create();
        ImageScene *layer = ImageScene::create();
        s->addChild(layer);
        return s;
    };

    CREATE_FUNC(ImageScene);
private:
};

#endif    /* IMAGESCENE_H */

在最初始的scene中添加一個labelTTF,並且點擊它的時候切換到下一個場景(ImageScene)

bool HelloWorld::init() {
    //////////////////////////////
    // 1. super init first
    if (!Layer::init()) {
        return false;
    }
    Size size = Director::getInstance()->getVisibleSize();

    LabelTTF *label = LabelTTF::create("Show Next Scene", "Courier", 36);
    addChild(label);
    label->setPosition(Point(size.width / 2, size.height / 2));
    EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create(); //
    listener->onTouchBegan = [label, size](Touch* t, Event * e) { //
        Point p = t->getLocation();
        p -= Point(size.width / 2, size.height / 2);
        if (label->getBoundingBox().containsPoint(p)) {
            log("change scene");
            Director::getInstance()->replaceScene(ImageScene::createScene());
        }
        return false;
    };
    Director::getInstance()->getEventDispatcher()
            ->addEventListenerWithSceneGraphPriority(listener, label);// 為label添加監聽
    return true;
}

2.場景動畫效果

往往在場景切換的時候,都需要添加一些動畫,使看起來不是那麼突然;

Director::getInstance()->replaceScene(ImageScene::createScene()); 改為如下代碼即可場景切換時添加一個動畫;

Director::getInstance()->replaceScene(TransitionFadeBL::create(1, ImageScene::createScene())); // 1表示動畫時長為1s

其它的場景效果可通過Api查看具體使用,在此不再一一說明;

3.cocos2d-x中的動作
>>1.動作
如果想要改變某一個node的位置,這就需要用到cocos2d-x中的動作Action了

label->runAction(MoveTo::create(1, Point(100, 100))); // 移動到(100,100),1表示動作時長1s

上面的方法是MoveTo,表示移動到某一個點,當然,也可以移動一段距離,對應的類就是MoveBy;
在cocos2d-x中,動作可以反轉,下面看一句代碼:

label->runAction(MoveBy::create(1, Point(50, 50))->reverse());

上面的代碼,如果沒有reverse,就表示向右上角移動(50,50)的距離,但是添加了reverse之後,動作就變成向左下角移動(50,50);

>>2.動作重復

    label->runAction(Repeat::create(RotateBy::create(1,180),4));// 動作重復4次
    label->runAction(RepeatForever::create(RotateBy::create(1,180)));// 動作一直重復

>>3.混合動作

auto actions = Spawn::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), NULL);
label->runAction(actions);        

混合動作的關鍵就是使用一個Spawn,將多個動作包裝起來,一並執行;

>>4.序列動作

auto actions = Sequence::create(MoveBy::create(1, Point(100, 100)), RotateBy::create(1, 360), NULL);
label->runAction(actions);

序列動作和混合動作的區別就是把Spawn換成Sequence,把動作添加到一個序列裡邊按順序執行;

>>5.動作偵聽

在一個動作執行完畢後,往往都會進行一些附加的其它操作,如同android裡面的動畫偵聽一樣;

            auto actions = Sequence::create(
                    MoveBy::create(1, Point(100, 100)),
                    RotateBy::create(1, 360),
                    CallFunc::create([]() {
                        log("Action complete");
                    })
            , NULL); //
            label->runAction(actions);

通過在創建action的時候,傳入一個動作完成的偵聽函數,即可實現動作的偵聽;該函數返回值為void,無參數;
CallFunc * CallFunc::create(const std::function<void()> &func)

在cocos2d-x中,已經封裝好了很多的動作,在實際的使用中,可以根據這些動作來進行組合出更炫的動作;


 4.幀動畫

    auto cache = SpriteFrameCache::getInstance();// 獲取一個幀動畫緩存實例
    cache->addSpriteFramesWithFile("anim.plist");// 從文件中添加一個幀動畫
    char name[15];
    memset(name, 0, 15);//
    Vector<SpriteFrame*> vec;//
    for (int i = 0; i < 20; i++) {
        sprintf(name, "anim%04d", i);//
        vec.pushBack(cache->getSpriteFrameByName(name));
    }

    Animation *anim = Animation::createWithSpriteFrames(vec, 0.1f); // 根據SpriteFrame*集合 創建一個動畫;
    Animate *animate = Animate::create(anim); // 從動畫中創建一個Animate Action;
    
    auto sprite = Sprite::create();
    addChild(sprite);
    sprite->setPosition(200, 200);
    sprite->runAction(RepeatForever::create(animate));

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved