因为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; //控制点1
c.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;
}
}
} }



Cocos2d-X 动作展示《一》的更多相关文章

  1. 【Cocos2d入门教程四】Cocos2d-x菜单篇

    游戏世界多姿多彩,无论多靓丽的游戏,多耐玩的游戏,在与游戏用户交互上的往往是菜单. 上一章我们已经大概了解了导演.节点.层.精灵.这一章以菜单为主题. 菜单(Menu)包含以下内容: 1.精灵菜单项( ...

  2. Cocos2D中Action的进阶使用技巧(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都很清楚了,其实本身act ...

  3. 自然语言交流系统 phxnet团队 创新实训 项目博客 (二)

    基本要求 打开软件,即可进入2D文本交流界面, 软件此时已经连接到服务器,点击文本输入框输入你想说的话,点击发送按钮即可进行交流,点击CHAT和STUDY分别切换到聊天模式或是学习模式,聊天模式是机器 ...

  4. 【Cocos2dX(2.x)_Lua开发之三】

    [Cocos2dX(2.x)_Lua开发之三]在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解 本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明 ...

  5. Web可用性设计的247条指导方针

    首页可用性设计 首页元素要清晰的关注用户的关键任务(避免“增加功能倾向(featuritis)”) 如果网站比较大,那么首页应包含搜索输入框 首页要十分清楚的提供产品(内容)分类 在首页或首页内一次点 ...

  6. odoo12从零开始:三、1)创建你的第一个应用模型(module)

    前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...

  7. N1试卷常考词汇总结

    免れる まぬがれる 免去,幸免 軽率 けいそつ 轻率,草率 捩れる ねじれる 拧劲儿,扭歪,弯曲 裂ける さける 裂开,破裂 避ける さける 躲避,避开 つまむ 挟,捏,掐 追及 ついきゅう 追上.追 ...

  8. django 创建管理员用户

    7.2 create 创建管理员用户: python manage.py run server python manage.py createsuperuser password :123456789 ...

  9. 【Mock平台】测试开发实战01-开篇PRD和需求详细

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 平台背景 从业务特性上,不少测试的服务很多是依赖第三方的接口的,比如其中的支付场景,就需要很多状态的返回进行验证,但大部分服务提供商没有很 ...

随机推荐

  1. linux----定义命令别名

    1.定义命令别名的语法: alias nickName='command'#用于定义. unalias  nickName#用于撤消一个别名的定义. 如:alias cls='clear' 2.应该要 ...

  2. 强制删除正在连接的Oracle用户,以删除SDE用户为例

    . 有时候想强制删除一个已经连接的Oracle用户,不能直接删除,可以用Kill会话信息. 比如今天想删除一个被连接的SDE用户,可以用以下方法删除一个“正在被连接”的用户. 1.查看所有用户的会话信 ...

  3. 无线功率 mW 和 dBm 的换算

    无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去.电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机.因此在无线网络的工程 ...

  4. 如何在Delphi中调用VC6.0开发的COM

    上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过. ...

  5. 【Windows 8 Store App】学习二:ResourceLoader

    原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093308.html 在项目开发时,通常有一些资源信息需要存储起来,比如请求的URL, ...

  6. 07.31 zepto

    tag事件 viewport标签 flexbox弹性布局 响应式布局 rem 交互优化 touchstart touchend 高清图片 1px  单文本溢出  多文本溢出

  7. 枚举与剪枝_观察算式(比标准答案还要牛B)

    观察算式 观察以下的算式: △△△ * △△ = △△△△ 某3位数乘以2位数,结果为4位数 要求:在9个△所代表的数字中.1~9的数字恰好每一个出现1次. 暴力破解代码: package lianx ...

  8. MD5和sha1加密算法

    在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加 ...

  9. SQL学习之使用视图

    1.简介:视图是虚拟的表.与包含的数据不一样,视图只包含使用时动态检索数据的查询.重点:视图是一个查询,不是一个表!

  10. vs2012新建项目产生的问题

    当用vs新建web项目时遇到