学习cocos2d有半个月了,一直从2.x学起,2.x是基础,前几天做触摸方面的东西,感受到2.x和3.x封装上一些区别,研究了一阵做出来,但是今天猛然发现前几天做的翻出来都忘记了。所以现在打算研究一点东西,就记录下来,与君共勉。
=======================================================
1、地图用tiled做好后导入到cocos2d相应的程序位置中,用下面这段很普通的语句:(TMXTiledMap::create("..."))
也会在如下位置报错:return _hasPremultipliedAlpha
原因是我需要将使用的tmx文件和产生tmx文件所使用的png文件都放到资源文件夹并加入工程中,我就是少了对应的png文件。
========================================================
2、不同于2.x,3.x用下面语句创建一个menuitemlabel:
auto labelup = Label::createWithSystemFont("UP", "Arial", 52);
auto upMenuItem = MenuItemLabel::create(labelup, CC_CALLBACK_1(HelloMap::menuCallback, this));
这里不能用CC_CALLBACK_0而只能用1,从http://www.cocoachina.com/bbs/read.php?tid=198291上面找到这样的讲解,摘录如下,可以解决此疑惑:
// 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_CALLBACK_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__)
看完后恍然大悟!不看不知道,一看...和没看一样...这里主要注意两点:一是 std::bind,二是##_VA_ARGS_; ##_VA_ARGS_是可变参数宏,我就不多说了。重点讲的是std::bind。
std::bind是在C++ 11里新加入的成员。可以将bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表.
调用bind的一般形式为:
auto newCallback = bind(callback,arg_list);
其中,newCallback是一个可调用对象,arg_list是可以用逗号分隔的参数列表,至于是啥参数,那就看callback函数里有啥参数啦。也就是说,当我们调用newCallback时,newCallback会调用函数callback,并传递参数arg_list给callback.
看完上面的内容你的理解可能还比较模糊,那直接来个例子:有一个函数callback,如下,
1
|
int callback( int one, char two, double three);
|
1
2
|
auto newCallback = bind(callback,_1,_2,1.5);
int x = newCallback(10, 'h' ); //这句相当于:int x = callback(10,'h',1.5);
|
在强调一点就是:_1这类占位符都定义在一个名为placeholders的命名空间中,而这个命名空间本身定义在std的命名空间中。为了使用这些名字,两个命名空间都要写上,如:
std::placeholders::_1;
这样编写贼麻烦,所以在要使用_1时,可以加上这么一句:
using namespace namespace_name; 恩,ok
恩,bind就介绍到这,讲的比较浅,不理解的可以百度研究下。最后再回过头来看下CC_CALLBACK的定义,是不是清晰多了?
======================================================================
3、一些tips
Xcode6.3中默认的iphone6模拟器的分辨率是:1334*750
把地图中最小单元的长和宽定义成宏,这样在精灵移动时好操作:#define MAPTILESIZE 33