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