controller.cpp

 std::function<TestScene*()> callback;//一个是返回值,一个是参数。返回值是TestScene*,参数是()里的东西
 Controller g_aTestNames[] = {

     //
// TESTS MUST BE ORDERED ALPHABETICALLY
// violators will be prosecuted
//
{ "ActionManager", [](){return new ActionManagerTestScene(); } },

这里是lambda的语法。

C++11 的 lambda 表达式规范如下:

  • [ capture ] ( params ) mutable exception attribute -> ret { body }
  • [ capture ] ( params ) -> ret { body }
  • [ capture ] ( params ) { body }
  • [ capture ] { body }

如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:

  • [a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
  • [this] 以值的方式捕获 this 指针。
  • [&] 以引用的方式捕获所有的外部自动变量。
  • [=] 以值的方式捕获所有的外部自动变量。
  • [] 不捕获外部的任何变量。

此外,params 指定 lambda 表达式的参数。

ActionManagerTest.cpp

 grossini->runAction( Sequence::create(
MoveBy::create(, Vec2(,)),
CallFuncN::create(CC_CALLBACK_1(LogicTest::bugMe,this)),
nullptr)
);
 auto pCallback = CallFunc::create(CC_CALLBACK_0(StopActionTest::stopAction,this)); // 注意这里没有传进参数就是0咯

CC_CALLBACK_N (摘自:http://my.oschina.net/u/555701/blog/219844

 // new callbacks based on C++11
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALCC_CALLBACK_1(HelloWorld::menuCloseCallback,this)LBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3 ##__VA_ARGS__)

bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指定的参 数,可以使用占位符_1、_2、_3来表示。_1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。

CC_CALLBACK_1不事先指定的有一个,也就是可以传进一个参数。不事先指定的参数就在LogicTest::bugMe的参数列表上。 这个个数和具体的函数个数是一致的。

但是下面这个还是没有理解,得之后再看下引擎的接口应该就知道了。

     auto action = Sequence::create(
Place::create(Vec2(,)),
Show::create(),
MoveBy::create(, Vec2(,)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback1,this)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback2,this,_grossini)),
CallFunc::create( CC_CALLBACK_0(ActionSequence2::callback3,this,_grossini,0xbebabeba)),
nullptr); _grossini->runAction(action);

CC_CALLBACK_0已经不需要了,直接用std::bind就行了。

     auto action1 = Sequence::create(
MoveBy::create(, Vec2(,)),
CallFunc::create( std::bind(&ActionCallFunction::callback1, this) ),
 l->setPosition(VisibleRect::center().x, VisibleRect::top().y-);

Cocos2d引擎家族,包括Cocos2d-x,Cocos2d-JS的坐标系统是继承于OpenGL的右手笛卡尔坐标系(Right-handed Cartesian Coordinate System)。

Cocos2d坐标系的特点是:

  • 原点为屏幕左下角
  • 向右为X轴正方向
  • 向上为Y轴正方向
     auto pMove1 = MoveBy::create(, Vec2(, ));
auto pMove2 = MoveBy::create(, Vec2(-, ));
auto pSequenceMove = Sequence::createWithTwoActions(pMove1, pMove2);
auto pRepeatMove = RepeatForever::create(pSequenceMove);
pRepeatMove->setTag(kTagSequence); auto pScale1 = ScaleBy::create(, 1.5f);
auto pScale2 = ScaleBy::create(, 1.0f/1.5f);
auto pSequenceScale = Sequence::createWithTwoActions(pScale1, pScale2);
auto pRepeatScale = RepeatForever::create(pSequenceScale);
pRepeatScale->setTag(kTagSequence); // 用同一个tag
 void StopAllActionsTest::stopAction(float time)
{
auto sprite = getChildByTag(kTagGrossini);
sprite->stopAllActionsByTag(kTagSequence);
}

这里将pRepeatMove和pRepeatScale设置成同一个tag,然后stopAllActionsByTag就可以停止这两个运用了。

ActionEaseTest.cpp

  // rotate and jump
auto jump1 = JumpBy::create(, Vec2(-s.width+, ), , );
auto jump2 = jump1->reverse();
auto rot1 = RotateBy::create(, *);
auto rot2 = rot1->reverse(); auto seq3_1 = Sequence::create(jump2, jump1, nullptr);
auto seq3_2 = Sequence::create( rot1, rot2, nullptr);
auto spawn = Spawn::create(seq3_1, seq3_2, nullptr);
auto action = Speed::create(RepeatForever::create(spawn), 1.0f);

Spawn是同时动作,Sequence是顺序动作。

CocosDenshionTest.cpp

 class Button : public Node//, public TargetedTouchDelegate
{
public:
static Button *createWithSprite(const char *filePath)
{
auto b = new (std::nothrow) Button();
if (b && !b->initSpriteButton(filePath)) {
delete b;
b = nullptr;
}
b->autorelease();
return b;
}

自定义button类,继承自Node。

 Button *btnPlay = Button::createWithText("play");
btnPlay->onTriggered([]() {
SimpleAudioEngine::getInstance()->playBackgroundMusic(MUSIC_FILE, true);
});

点击触发事件用OnTriggered和匿名函数。

     // preload background music and effect
SimpleAudioEngine::getInstance()->preloadBackgroundMusic( MUSIC_FILE );//用于预加载背景音乐,其中 pszFilePath 为音乐文件所在的目录位置。
SimpleAudioEngine::getInstance()->preloadEffect( EFFECT_FILE ); //用于预加载音效文件,其中 pszFilePath 为音效文件所在的目录位置。

加载音乐和音效通常是一个耗时的过程,为了防止由即时加载产生的延迟导致实际播放与游戏不协调的现象发生,在播放音效和背景音乐之前,需要预加载音乐文件。

cocos2d-x test学习[1]的更多相关文章

  1. cocos2d&amp;cocos2dx学习资源

    汇总一下自己学习Cocos2d和cocos2dx认为比較好的一些资源: 书籍: <iPhone&iPad cocos2d游戏开发实战> Steffen Itterheim < ...

  2. xcode5. 安装cocos2d-x 学习中。。。

    找了一些帖子  没搞出来,后来找到原因了   如今的cocos2d版本号在xcode.5上 没右模版了. 用命令行 来运行.看了官方的文档.最终攻克了--- 对于自己解决的问题都会感到点兴奋. .. ...

  3. Cocos2D iOS之旅:如何写一个敲地鼠游戏(十一):完善游戏逻辑

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  4. iOS手势学习UIGestureRecognizer & cocos2d 手势推荐

    iOS手势学习UIGestureRecognizer & cocos2d 手势推荐 手势识别类型: UILongPressGestureRecognizer  // 长按UIPanGestur ...

  5. ios游戏开发--cocos2d学习(1)

    学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...

  6. cocos2d 粒子效果以及Particle Designer粒子工具的学习

    最近在学习cocos2d中的粒子效果吧,下面就把学到的和大家分享下吧! Now!我们先了解下类结构吧 -- CCParticleSystem(所有粒子系统的父类) -- CCParticleSyste ...

  7. 开始写下自己的python的cocos2d, pyglet学习

    开始写下自己的python的cocos2d, pyglet学习 2014年01月18日 13:52:36 我要做程序达人 阅读数 9051更多 分类专栏: python的cocos2d和pyglet ...

  8. cocos2d学习记录

    视频 - http://www.manew.com/forum-105-3.html一个论坛帖 - http://www.zhihu.com/question/21114802官网 - http:// ...

  9. cocos2d学习笔记

    doxygen工具 生成cocos2d的api文档 位图字体编辑工具 Glyph Designer http://www.71squared.com/glyphdesigner  收费的 CCLabl ...

  10. Cocos2d 学习资料推荐

    总算找到了一本介绍cocos2d的好书,注意,不是cocos2d-x!这本书叫 <cocos2d 权威指南> 定价99元,淘宝60多元,详细介绍了cocos2d的各个方面!不过你需要有oc ...

随机推荐

  1. CentOS Linux系统下更改Apache默认网站目录

    引言: Apache默认的网站目录是在/var/www/html,我们现在要把网站目录更改到/home/wwwroot/web1/htdocs,操作如下 准备工作: 创建目录: cd /home mk ...

  2. Asp.Net Core--基于声明的授权

    翻译如下: 当创建身份时,其可以被分配由可信方发布的一个或多个声明. 索赔是名称值对,表示主题是什么,而不是主体可以做什么. 例如,您可能有驾驶执照,由当地驾驶执照颁发. 您的驾驶执照上有您的出生日期 ...

  3. Xcode7建立自己的自定义工程和类模板

    首先进入系统模板的目录 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library ...

  4. 解决SprngMVC中ResponseBody注解中文乱码

    配置文件前面加入如下结构,版本号3.2.5 <bean class="org.springframework.web.servlet.mvc.method.annotation.Req ...

  5. push 到下一界面明显卡顿的现象

    今天搭建界面,界面间的跳转使用了 push方法,结果发现界面间转换时有明显的卡顿现象,并没有做过数据请求之类的处理,所以感觉好神奇.以前好像也遇到过,当时在push 到的下级界面加个背景色.现在重新这 ...

  6. android 扫描

    http://blog.csdn.net/abidepan/article/details/11902041

  7. 如何从零基础学习VR

    转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 近期很多搞技术的朋友问我,如何步入VR的圈子?如何从零基础系统性的学习VR技术? 本人将于2017年1月 ...

  8. 文本切割软件Replace Pioneer

    工作中遇到一些大文本,或者一些文件需要在特定的行切割开的.Replace Pioneer正好用于此的软件. 把一个文本切分不同文本的步骤: 1先把文本数据放到打开

  9. Git版本控制管理学习笔记1-介绍

    几乎所有的版本控制工具都是出于同样的目的:开发以及维护开发出来的代码,方便读取代码的历史,记录所有的修改.这里,介绍的是当前在开源社区内非常流行的版本控制工具Git.它是由Linus Torvalds ...

  10. vue

    vue.js 插件 setting--> plugins 搜索vue,下载安装如果想要高亮显示*.vue文件,可以在File Types 选项里找到HTML,然后在下方手动添加*.vue,这样就 ...