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中,已經封裝好了很多的動作,在實際的使用中,可以根據這些動作來進行組合出更炫的動作;
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));