Cocos2d-X 動作展示《一》,cocos2d-x《一》

來源:互聯網
上載者:User

Cocos2d-X 動作展示《一》,cocos2d-x《一》

由於Cocos2d-X中的動作較多,我將所有的動作製作成了一個滾動視圖,每個滾動視圖上都有動作名,單擊滾動視圖就可以展示相應的動作

程式:

使用滾動視圖實現動作切換


動作展示



程式碼:

首先建立一個ActionShow類

在ActionShow.h中的代碼

#ifndef _ActionShow_H_#define _ActionShow_H_#include "cocos2d.h"  #include "cocos-ext.h"  USING_NS_CC;  USING_NS_CC_EXT;class ActionShow : public CCLayer{public:    static CCScene* scene();    bool init();    CREATE_FUNC(ActionShow);        bool ccTouchBegan(CCTouch*, CCEvent*);void ccTouchEnded(CCTouch*, CCEvent*);CCNode* _c;void testAction(int idx, CCLayerColor*);    void func();    void funcN(CCNode*);    void funcND(CCNode*, void*);};#endif

ActionShow.cpp中的代碼

#include "ActionShow.h"static const char* _actionName[] ={"CCMoveBy","CCMoveTo","CCRotateBy","CCRotateTo","CCScaleBy","CCScaleTo","CCSkewBy","CCSkewTo","CCJumpBy","CCJumpTo","CCBezierBy","CCBezierTo","CCFadeIn","CCFadeOut","CCTintTo","CCTintBy","CCBlink","CCDelayTime","CCOrbitCamera","CCCardinalSplineTo","CCCardinalSplineBy","CCCatmullRomTo","CCCatmullRomBy",    "CCFollow","CCCallFunc","CCCallFuncN","CCCallFuncND"};CCScene* ActionShow::scene(){    CCScene* scene = CCScene::create();    ActionShow* layer = ActionShow::create();    scene->addChild(layer);    return scene;}bool ActionShow::init(){    CCLayer::init();        CCSize winSize = CCDirector::sharedDirector()->getWinSize();    //建立Node結點用於ScrollView    CCNode* c = CCNode::create();_c = c;    //ScrollView中展示的動作的個數int actionCount = sizeof(_actionName) / sizeof(*_actionName);    //使用for迴圈建立視圖用於展示動作for (int i = 0; i < actionCount; i++){CCLayerColor* layer;        //        if (i % 2 == 0){            //建立帶有顏色的背景層(背景層的顏色為深灰色)layer = CCLayerColor::create(ccc4(192, 192, 192, 255), winSize.width, winSize.height);}else{            //建立帶有顏色的背景層(背景層的顏色為淺灰色)layer = CCLayerColor::create(ccc4(128, 128, 128, 255), winSize.width, winSize.height);}c->addChild(layer);layer->setPosition(ccp(i*winSize.width, 0));        //儲存動作的名字const char* title = _actionName[i];        //建立標籤用於顯示動作的名字        CCLabelTTF* label = CCLabelTTF::create(title, "Arial", 36);layer->addChild(label);        //設定標籤的位置label->setPosition(ccp(winSize.width / 2, winSize.height - 80));}    //建立滾動視圖CCScrollView* view = CCScrollView::create(winSize, c);    //設定滾動視圖的滾動方向為水平滾動    view->setDirection(kCCScrollViewDirectionHorizontal);    //設定滾動視圖的大小view->setContentSize(CCSize(winSize.width*actionCount, winSize.height));addChild(view);//能觸摸setTouchEnabled(true);setTouchMode(kCCTouchesOneByOne);return true;}bool ActionShow::ccTouchBegan(CCTouch*, CCEvent*){return true;}void ActionShow::testAction(int idx, CCLayerColor* layer){CCSize winSize = CCDirector::sharedDirector()->getWinSize();    //得到使用者建立的精靈    CCSprite* sprite = (CCSprite*)layer->getUserObject();    //當沒有精靈的時候if (sprite == NULL){       //建立一個新的精靈sprite = CCSprite::create("CloseNormal.png");layer->addChild(sprite);        //設定精靈的關聯對象        layer->setUserObject(sprite);}    //儲存使用者選擇的動作const char* an = _actionName[idx];    //動作類    CCAction* action;    //設定精靈的位置    sprite->setPosition(ccp(winSize.width / 2, winSize.height / 2));if (an == "CCMoveTo")//運動{action = CCMoveTo::create(2, ccp(100, 100));}if (an == "CCMoveBy")//運動{action = CCMoveBy::create(2, ccp(100, 100));}if (an == "CCRotateBy")//旋轉{action = CCRotateBy::create(2, 250);}if (an == "CCRotateTo")//旋轉{action = CCRotateTo::create(2, 250);}if (an == "CCScaleBy")//放大或縮小{        //2表示放大兩倍        //-2表示縮小兩倍action = CCScaleBy::create(2, 2);}if (an == "CCScaleTo")//放大或縮小{action = CCScaleTo::create(2, -2);}if (an == "CCSkewBy")//扭曲{        //第一個參數:完成扭曲所花的時間        //第二個參數:x軸方向扭曲的值        //第三個參數:y軸方向扭曲的值action = CCSkewBy::create(2, 35, 87);}if (an == "CCSkewTo")//扭曲{action = CCSkewTo::create(2, 35, 87);}if (an == "CCJumpBy")//跳躍    {        //第一個參數:完成跳躍所花的時間        //第一個參數:跳躍到的位置        //第一個參數:跳躍的高度        //第一個參數:跳躍的次數action = CCJumpBy::create(3, ccp(100, 100), 50, 6);}if (an == "CCJumpTo")//跳躍{action = CCJumpTo::create(3, ccp(100, 100), 50, 6);}if (an == "CCBezierBy")//貝茲路徑(相對){        //設定控制點ccBezierConfig c;        //控制點1c.controlPoint_1 = ccp(400, 400);        //控制點2        c.controlPoint_2 = ccp(250, 360);        //終點        c.endPosition = ccp(100, 100);        //第一個參數:時間        //第二個參數:控制點action = CCBezierBy::create(3, c);}if (an == "CCBezierTo")//貝茲路徑(絕對){ccBezierConfig c;c.controlPoint_1 = ccp(400, 400);c.controlPoint_2 = ccp(250, 360);c.endPosition = ccp(100, 100);action = CCBezierTo::create(3, c);}if (an == "CCFadeIn")//淡入(通過修改透明度實現){action = CCFadeIn::create(3);}if (an == "CCFadeOut")//淡出(通過修改透明度實現){action = CCFadeOut::create(3);}if (an == "CCTintTo")//在精靈上混合一個顏色{action = CCTintTo::create(3, 255, 0, 0);}if (an == "CCTintBy")//在精靈上混合一個顏色{action = CCTintBy::create(3, 23, 47, 37);}if (an == "CCBlink")//精靈閃爍{action = CCBlink::create(3, 10);}if (an == "CCDelayTime")//精靈停頓一會兒{        //2秒鐘內精靈移動到(100,100)        CCMoveBy* move = CCMoveBy::create(2, ccp(100, 100));        //停頓1秒鐘CCDelayTime* delay = CCDelayTime::create(1);        //精靈返回CCFiniteTimeAction* back = move->reverse();        //動作的順序封裝(先執行move後執行delay)        action = CCSequence::create(move, delay, back, NULL);}if (an == "CCOrbitCamera")//根據球面座標軌跡旋轉{         //參數1:旋轉的時間         //參數2:起始半徑         //參數3:半徑差         //參數4:起始z角         //參數5:旋轉z角         //參數6:起始x角         //參數7:旋轉x角       action = CCOrbitCamera::create(5, 80, 13, 55, 13, 80, 24);}if (an == "CCCardinalSplineTo")//樣條曲線動作{        //建立樣條曲線動作CCPointArray* arr = CCPointArray::create(20);        //建立圍城曲線框的四個點arr->addControlPoint(ccp(200, 200));arr->addControlPoint(ccp(200, 100));arr->addControlPoint(ccp(100, 100));arr->addControlPoint(ccp(100, 200));action = CCCardinalSplineTo::create(5, arr, 5.0f);}if (an == "CCCardinalSplineBy")//樣條曲線動作{CCPointArray* arr = CCPointArray::create(20);arr->addControlPoint(ccp(200-50, 200-50));arr->addControlPoint(ccp(200-50, 100-50));arr->addControlPoint(ccp(100-50, 100-50));arr->addControlPoint(ccp(100-50, 200-50));action = CCCardinalSplineBy::create(5, arr, 5.0f);}if (an == "CCCatmullRomTo")//雲性曲線{CCPointArray* arr = CCPointArray::create(20);arr->addControlPoint(ccp(200, 200));arr->addControlPoint(ccp(200, 100));arr->addControlPoint(ccp(100, 100));arr->addControlPoint(ccp(100, 200));action = CCCatmullRomTo::create(5, arr);}if (an == "CCCatmullRomBy")//雲性曲線{CCPointArray* arr = CCPointArray::create(20);arr->addControlPoint(ccp(200, 200));arr->addControlPoint(ccp(200, 100));arr->addControlPoint(ccp(100, 100));arr->addControlPoint(ccp(100, 200));action = CCCatmullRomBy::create(5, arr);}    if (an == "CCFollow")//鏡頭跟著目標走,超過範圍就結束。{CCSprite* sprite2 = CCSprite::create("green_edit.png");layer->addChild(sprite2);sprite2->setPosition(ccp(winSize.width / 2, winSize.height / 2));sprite2->runAction(CCJumpBy::create(100, ccp(800, 800), 800, 60));action = CCFollow::create(sprite2);}if (an == "CCCallFunc")//建立一個回調動作(不帶參數){action = CCCallFunc::create(this, callfunc_selector(ActionShow::func));}if (an == "CCCallFuncN")//建立一個回調動作(傳調用者為參數){action = CCCallFuncN::create(this, callfuncN_selector(ActionShow::funcN));}if (an == "CallFuncND")//建立一個回調動作(帶2個參數){void* p = NULL;action = CCCallFuncND::create(this, callfuncND_selector(ActionShow::funcND), p);}sprite->runAction(action);}void ActionShow::func(){}void ActionShow::funcN(CCNode*){}void ActionShow::funcND(CCNode*, void*){}void ActionShow::ccTouchEnded(CCTouch* t, CCEvent*){    //得到按下滑鼠時的位置    CCPoint ptStart = t->getStartLocation();    //得到鬆開滑鼠時的位置    CCPoint ptEnd = t->getLocation();    //如果兩個位置的距離的平方小於或者等於25    if(ptStart.getDistanceSq(ptEnd) <= 25){// click// 點中了哪個子視窗// 轉換ptStart為ScrollView中的Container的座標// 再判斷被點擊的LayerColor//將滑鼠點下的時候的位置的座標轉換成結點座標        CCPoint ptInContainer = _c->convertToNodeSpace(ptStart);        //建立一個數組用於儲存LayerColor        CCArray* arr = _c->getChildren();// 所有的layercolor        //用於尋找點中的LayerColor        for (int i = 0; i < sizeof(_actionName) / sizeof(*_actionName); i++){            //CCLayerColor* layer = (CCLayerColor*)arr->objectAtIndex(i);if (layer->boundingBox().containsPoint(ptInContainer)){testAction(i, layer);break;}}}}



cocos2dx 不同精靈的動作可以不可以集中到一個動作序列中?

可以用CCTargetedAction,比如:

CCTargetedAction* t = CCTargetedAction::create(sprite2, moveto);
sprite->runAction(CCSequence::create(moveto, t, moveto, NULL));
sprite先moveto,然後sprite2執行moveto,最後sprite執行moveto。
 
cocos2d-x怎把動作翻轉

用這個 CCReverseTime
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.