因为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. python模块—urllib

    1. 网页操作 urllib.urlopen(url[,data[,proxies]]) 打开一个url,返回一个文件对象,然后可以进行类似文件对象操作 url:远程数据的路径,即网址 data:表示 ...

  2. Scala主构造器、私有构造器、构造器重载

    Scala中的主构造器跟在定义类的时候声明类名之后 如下: class scala(arg : String) { // } private[this] 修饰该字段只能被当前所对应的对象所访问,其他对 ...

  3. 走进C标准库(5)——"stdio.h"中的其他部分函数

    函数介绍来自:http://ganquan.info/standard-c/ 函数名: freopen 功  能: 替换一个流 用  法: FILE *freopen(char *filename, ...

  4. linux 关于动态库的知识

    问题起缘于编译一个程序时,使用glib2-2.28.8的动态库,而系统自带的是glib2-2.22.5 不想升级系统的glib2库,而使用程序自带库文件的方式加载(类似windows系统,优先加载当前 ...

  5. HTML5学习笔记之Input类型

    Input类型——email email类型用于包含email地址的输入域,在输入地址时会自动验证email域的值 例:Email:<input type="email" n ...

  6. delphi中覆盖最大化消息(WM_GETMINMAXINFO)

    unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; ...

  7. uva 10129 poj 1386 hdu 1116 zoj 2016 play on words

    //本来是想练一下欧拉回路的,结果紫书上那题是大水题!!!!! 题意:给出n个单词,是否可以把单词排列成每个单词的第一个字母和上一个单词的最后一个字母相同 解:欧拉通路存在=底图联通+初度!=入度的点 ...

  8. VC++2008 用空工程创建 DLL

    VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...

  9. sass的cd进入目录

    今天在弄sass安装进入项目文件命令 直接f:

  10. 一个SQL update语句

    须要每隔一段时间选取最老的商户更新时间戳: update DP_Shop set DP_Shop.LastDate = now() where DP_Shop.ShopId in (select Sh ...