展会信息港展会大全

Cocos2d-X中的动作展示《二》
来源:互联网   发布日期:2015-09-27 15:28:01   浏览:2014次  

导读: 由于Cocos2d-X中的动作较多,我将所有的动作制作成了一个滚动视图,每个滚动视图上都有动作名,单击滚动视图就可以展示相应的动作 程序效果图: 使用滚动视图实现动作切换 动作展示...

由于Cocos2d-X中的动作较多,我将所有的动作制作成了一个滚动视图,每个滚动视图上都有动作名,单击滚动视图就可以展示相应的动作

程序效果图:

使用滚动视图实现动作切换

动作展示

首先创建一个ActionMore类

ActionMore.h中的代码

#ifndef _ActionMore_H_

#define _ActionMore_H_

#include "cocos2d.h"

#include "cocos-ext.h"

USING_NS_CC;

USING_NS_CC_EXT;

class ActionMore : public CCLayer

{

public:

static CCScene* scene();

bool init();

CREATE_FUNC(ActionMore);

bool ccTouchBegan(CCTouch*, CCEvent*);

void ccTouchEnded(CCTouch*, CCEvent*);

CCNode* _c;

void testAction(int idx, CCLayerColor*);

};

#endif

ActionMore.cpp中的代码

#include "ActionMore.h"

static const char* _actionName[] =

{

"CCEaseBounceIn",

"CCEaseBounceOut",

"CCEaseBounceInOut",

"CCEaseBackIn",

"CCEaseBackOut",

"CCEaseBackInOut",

"CCEaseElasticIn",

"CCEaseElasticOut",

"CCEaseElasticInOut",

"CCEaseExponentialIn",

"CCEaseExponentialOut",

"CCEaseExponentialInOut",

"CCEaseIn",

"CCEaseOut",

"CCEaseInOut",

"CCEaseSineIn",

"CCEaseSineOut",

"CCEaseSineInOut",

"CCSpeed",

"CCSpawn",

"CCSequence",

"CCRepeat",

"CCRepeatForever"

};

CCScene* ActionMore::scene()

{

CCScene* scene = CCScene::create();

ActionMore* layer = ActionMore::create();

scene->addChild(layer);

return scene;

}

bool ActionMore::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 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 ActionMore::ccTouchBegan(CCTouch*, CCEvent*)

{

return true;

}

void ActionMore::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));

CCMoveBy* moveBy = CCMoveBy::create(4, ccp(0, sprite->getContentSize().height / 2 - winSize.height / 2));

action= NULL;

if (an == "CCEaseBounceIn")//让目标动作具有反弹效果,从起点反弹

{

action = CCEaseBounceIn::create(moveBy);

}

if (an == "CCEaseBounceOut")//让目标动作具有反弹效果,从终点反弹

{

action = CCEaseBounceOut::create(moveBy);

}

if (an == "CCEaseBounceInOut")//让目标动作具有反弹效果,起点终点都反弹

{

action = CCEaseBounceInOut::create(moveBy);

}

if (an == "CCEaseBackIn")//让目标动作具有回力效果,起点作为回力点

{

action = CCEaseBackIn::create(moveBy);

}

if (an == "CCEaseBackOut")//让目标动作具有回力效果,终点作为回力点

{

action = CCEaseBackOut::create(moveBy);

}

if (an == "CCEaseBackInOut")//让目标动作具有回力效果,起点终点都作为回力点

{

}

if (an == "CCEaseElasticIn")//让目标动作具有弹性效果,起点具有弹性

{

action = CCEaseElasticIn::create(moveBy);

}

if (an == "CCEaseElasticOut")//让目标动作具有弹性效果,终点具有弹性

{

action = CCEaseElasticOut::create(moveBy);

}

if (an == "CCEaseElasticInOut")//让目标动作具有弹力效果,起点终点都具有弹性

{

action = CCEaseElasticInOut::create(moveBy);

}

if (an == "CCEaseExponentialIn")//让目标动作缓慢开始

{

action = CCEaseExponentialIn::create(moveBy);

}

if (an == "CCEaseExponentialOut")//让目标动作缓慢结束

{

action = CCEaseExponentialOut::create(moveBy);

}

if (an == "CCEaseExponentialInOut")//让目标动作缓慢开始并缓慢结束

{

action = CCEaseExponentialInOut::create(moveBy);

}

if (an == "CCEaseIn")//让目标动作由慢到快(速度线性变化)

{

action = CCEaseIn::create(moveBy, 10.0f);

}

if (an == "CCEaseOut")//让目标动作由快到慢(速度线性变化)

{

action = CCEaseOut::create(moveBy, 10.f);

}

if (an == "CCEaseInOut")//让目标动作由慢到快再到慢(速度线性变化)

{

action = CCEaseInOut::create(moveBy, 10.f);

}

if (an == "CCEaseSineIn")//让目标动作由慢到快(速度非线性变化)

{

action = CCEaseSineIn::create(moveBy);

}

if (an == "CCEaseSineOut")//让目标动作由快到慢(速度非线性变化)

{

action = CCEaseSineOut::create(moveBy);

}

if (an == "CCEaseSineInOut")//让目标动作由慢到快再到慢(速度非线性变化)

{

action = CCEaseSineInOut::create(moveBy);

}

if (an == "CCSpeed")//为目标动作速度翻倍(加速)

{

action = CCSpeed::create(moveBy, 10);

}

if (action)

{

sprite->runAction(action);

}

}

void ActionMore::ccTouchEnded(CCTouch* t, CCEvent*)

{

//得到按下鼠标时的位置

CCPoint ptStart = t->getStartLocation();

//得到松开鼠标时的位置

CCPoint ptEnd = t->getLocation();

//如果两个位置的距离的平方小于或者等于25

if(ptStart.getDistanceSq(ptEnd) convertToNodeSpace(ptStart);

//创建一个数组用于保存LayerColor

CCArray* arr = _c->getChildren();// 所有的layercolor

//用于寻找点中的LayerColor

for (int i = 0; i objectAtIndex(i);

if (layer->boundingBox().containsPoint(ptInContainer))

{

testAction(i, layer);

break;

}

}

}

}

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港