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