cocos 杂记
一、Tile map http://www.cocoachina.com/bbs/read.php?tid=196685 PointHelloWorld::tileCoordForPosition(Point position) { intx =position.x / _tileMap->getTileSize().width; inty =((_tileMap->getMapSize().height * _tileMap->getTileSize().height) -position.y) / _tileMap->getTileSize().height; returnPoint(x,y); } voidHelloWorld::setPlayerPosition(Pointposition) { Point tileCoord =this->tileCoordForPosition(position); inttileGid= _blockage->getTileGIDAt(tileCoord); if(tileGid){ autoproperties= _tileMap->getPropertiesForGID(tileGid).asValueMap(); if(!properties.empty()){ autocollision = properties["Blockage”].asString(); if("True"== collision) { return; } } } _player->setPosition(position); } boolHelloWorld::init() { `````` for(auto&eSpawnPoint: objects->getObjects()){ ValueMap& dict =eSpawnPoint.asValueMap(); if(dict["Enemy"].asInt()== 1){ x =dict["x"].asInt(); y =dict["y"].asInt(); this->addEnemyAtPos(Point(x,y)); } }`````` } autocollectable =properties["Collectable"].asString(); if("True"==collectable) { _blockage->removeTileAt(tileCoord); _foreground->removeTileAt(tileCoord);
_player->setPosition(position); }
二、创建一个新项目
D/work/andriod/android-ndk-r9d D:workandriodapache-ant-1.9.4
cdD:workCocos2d_xcocos2d-x-3.0 .setup.py cocosnew StageTool -p com.MyCompany.StageTool-l cpp -d .tests
@echo off echo =============新建项目============== set /p name=请输入项目的名称: echo 项目名为: %name%
echo 正在创建新项目...
set pk=com.mycom.
D:workCocos2d_xcocos2d-x-3.0toolsproject-creatorcocosnew %name% -p %pk%%name% -l cpp -d .tests
echo 创建完成正在打开....
D:workCocos2d_xcocos2d-x-3.0tests%name%proj.win32%name%.vcxproj
Pause
TexturePacker
1. CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("images.plist"); 2.CCSprite*sprite=CCSprite::createWithSpriteFrameName("grossini_dance_01.png");
使用16-bit纹理最快速地减少纹理内存占用的办法就是把它们作为16位颜色深度的纹理来加载。cocos2d默认的纹理像素格式是32位颜色深度。如果把颜色深度减半,那么内存消耗也就可以减少一半。并且这还会带来渲染效率的提升,大约提高10%。 你可以使用CCTexture2D对象的类方法setDefaultAlphaPixelFormat来更改默认的纹理像素格式,代码如下: 你可以使用CCTexture2D对象的类方法setDefaultAlphaPixelFormat来更改默认的纹理像素格式,代码如下: [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB5A1]; [[CCTextureCache sharedTextureCache] addImage:@"ui.png"]; generate 32-bit textures: kCCTexture2DPixelFormat_RGBA8888 (default) generate 16-bit textures: kCCTexture2DPixelFormat_RGBA4444 generate 16-bit textures: kCCTexture2DPixelFormat_RGB5A1 generate 16-bit textures: kCCTexture2DPixelFormat_RGB565 (no alpha) 理解在什么时候、在哪里去清除缓存不要随机清除缓存,也可以心想着释放一些内存而去移除没有使用的纹理。s那不是好的代码设计。有时候,它甚至会增加加载次数,并多次引发“间歇内存飙高”。分析你的程序的内存使用,看看内存里面到底有什么,以及什么应该被清除,然后只清除该清除的。 你可以使用dumpCachedTextureInfo方法来观察哪些纹理被缓存了: [[CCTextureCache sharedTextureCache] dumpCachedTextureInfo]; 这个方法的输出如下:(为了清楚起见,我把那些与-hd后缀有关的信息屏蔽掉了) cocos2d: "ingamescorefont.png" rc=9 name=ingamescorefont-hd.png id=13 128 x 64 @ 32 bpp => 32 KB cocos2d: "ui.png" rc=15 name=ui-hd.png id=5 2048 x 2048 @ 16 bpp => 8192 KB cocos2d: "ui-ingame.png" rc=36 name=ui-ingame-hd.png id=8 1024 x 1024 @ 16 bpp => 2048 KB cocos2d: "digits.png" rc=13 name=digits-hd.png id=10 512 x 64 @ 16 bpp => 64 KB cocos2d: "hilfe.png" rc=27 name=hilfe-hd.png id=6 1024 x 2048 @ 32 bpp => 8192 KB cocos2d: "settings.png" rc=8 name=settings-hd.png id=9 1024 x 1024 @ 16 bpp => 2048 KB cocos2d: "blitz_kurz.png" rc=1 name=(null) id=12 50 x 50 @ 32 bpp => 9 KB cocos2d: "gameover.png" rc=8 name=gameover-hd.png id=7 1024 x 2048 @ 32 bpp => 8192 KB cocos2d: "home.png" rc=32 name=home-hd.png id=4 2048 x 2048 @ 16 bpp => 8192 KB cocos2d: "particleTexture.png" rc=2 name=(null) id=11 87 x 65 @ 32 bpp => 22 KB cocos2d: "stern.png" rc=2 name=(null) id=2 87 x 65 @ 32 bpp => 22 KB cocos2d: "clownmenu.png" rc=60 name=clownmenu-hd.png id=1 1024 x 2048 @ 32 bpp => 8192 KB cocos2d: CCTextureCache dumpDebugInfo: 13 textures using 60.1 MB (纹理总共占用的内存大小!!!) 上面包含了非常多有用的信息。纹理的大小、颜色深度(bpp)和每一个被缓存的纹理在内存中所占用大小等。这里的“rc”代表纹理的“引用计数”。如果这个引用计数等于1或2的话,那么意味着,这个纹理当前可能不会需要使用了,此时,你可以放心地把它从纹理cache中移除出去。 SpriteFrames retain textures!上面提到的例子中,纹理的引用计数可能有点让人看不懂。你会发现,纹理集有很高的retain count,即使你知道这些纹理集中的纹理当前并没有被使用。 你可能忽略了一件事:CCSprteFrame会retain它的纹理。因此,如果你使用了纹理集,你要完全移除它不是那么容易。因为,由这个纹理集产生的sprite frame还是保留在内存中。所以,你必须调用CCSpriteFrameCache的removeSpriteFramesFromTexture方法,能彻底清除纹理缓存中的纹理集。(译注:记住,不是你调用对象的release方法了,对象的内存就会被释放掉,而是引用计数为0了,内存才会被删除) [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFramesFromTexture:uncachedTexture]; 你也可以使用removeSpriteFramesFromFile,并指定一个纹理集的.plist文件来清除缓存起来的精灵帧(spriteframes). s 杂记:@Override是什么意思@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 1、可以当注释用,方便阅读 2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法) example: 在重写父类的onCreate时,在方法前面加上@Override系统可以帮你检查方法的正确性。 例如,public void onCreate(BundlesavedInstanceState){…….}这种写法是正确的, 如果你写成public void oncreate(BundlesavedInstanceState){…….} 这样编译器回报如下错误—— The method oncreate(Bundle) of type HelloWorld must override orimplement a supertype method, 以确保你正确重写onCreate方法。(因为oncreate应该为onCreate) 而如果你不加@Override,则编译器将不会检测出错误,而是会认为你新定义了一个方法oncreate。
final函数和类C++11的关键字final有两个用途。第一,它阻止了从类继承;第二,阻止一个虚函数的重载。
__declspec(deprecated )
C++11新特性:Range-based for loops收藏我要投稿 很多语言都有Range-based forloops这个功能,现在C++终于知道把这个重要功能加进语法中了。这个功能实在不知道该怎么翻译,语文没有学到家。 基本语法 [cpp] 比如说: 对于比较复杂的容器可以用auto语句来简化类型声明 [cpp]
请注意,你依然可以用continue语句来开始下一次迭代,使用break跳出循环。这一点和普通的for循环一样。 深入分析 “等价于”
通过ranged-based for loops的等价语句可以看出,可以知道只要符合一定的要求,那么自己定义的类也可以放在ranged-based for loops中进行迭代。事实上要想进行迭代,一个类需要满足以下条件:
JDK:配置环境变量:新建环境变量:JAVA_HOME值为:D:Program FilesJavajdk1.7.0 单击“开始”—>“运行”—>输入:cmd命令,在CMD窗口中输入:java –version python1. 首先需要在系统中注册python环境变量:假设python的安装路径为c:python2.6,则修改我的电脑->属性->高级->环境变量->系统变量中的PATH为: (为了在命令行模式下运行Python命令,需要将python.exe所在的目录附加到PATH这个环境变量中。) PATH=PATH;c:python26 上述环境变量设置成功之后,就可以在命令行直接使用python命令。或执行"python *.py"运行python脚本了。 2. 此时,还是只能通过"python *.py"运行python脚本,若希望直接运行*.py,只需再修改另一个环境变量PATHEXT: PATHEXT=PATHEXT;.PY;.PYM 3. 另外,在使用python的过程中,可能需要经常查看某个命令的帮助文档,如使用help('print')查看print命令的使用说明。默认安装的python无法查看帮助文档,尚需进行简单的配置: 在python安装目录下,找到python25.chm,使用hh -decompile .python26.chm将其反编译出来,然后将其所在的目录加入到上面提到的PATH环境变量中即可。
Android 运行你可以运行一下示例... 使用命令行: $ cd cocos2d-x $ ./setup.py $ cd build $ ./android-build.py cpp-empty-test -p 10 $ adb install cocos2d-x/tests/cpp-empty-test/proj.android/bin/CppEmptyTest-debug.apk $ cd cocos2d-x/build $ python ./android-build.py cpp-empty-test -p 10 $ adb install ../tests/cpp-empty-tst/proj.android/bin/CppEmptyTest-debug.apk 然后点击安卓设备上的程序运行测试例, 使用Eclipse $ cd cocos2d-x $ ./setup.py $ cd build $ ./android-build.py cpp-empty-test -p 10 然后
·cocos2d-x TiledMap黑边问题
· 在用TiledMap作为地图,当放大或者缩小时,会出现黑点或者黑边,解决办法:将ccConfig.h中 ·#ifndefCC_FIX_ARTIFACTS_BY_STRECHING_TEXEL ·#endif
黑边SetAliasTexParameters
【2013年12月13日补充】: 对于裂缝、黑边、模糊、透明等问题,这里Himi再详细描述补充下:
1.首先如果你使用TP(Texturepacker)进行的图片打包的话: 首先确定是否打包时,帧之间保证了>=1像素距离。 然后确定是否勾选了”premultplyalhpa”这一项(应该勾选) 最后确认你项目中是否设置了如下代码: CCTexture2D::PVRImagesHavePremultipliedAlpha(true); 如上代码设置的作用是 2.图片缩放后模糊透明问题 首先cocos2d/cocos2dx引擎中,默认的贴图设置了抗锯齿,如下函数: setAntiAliasTexParameters()//设置抗锯齿(但是会模糊透明) 那么缩放后的图片由于设置了抗锯齿会造成图片边缘模糊透明,所以对此的解决方式,我们单独处理缩放的图进行设置非抗锯齿,如下函数: setAliasTexParameters() //设置非抗锯齿(但是不抗锯齿) 3.图片感觉模糊不清晰 首先对于此问题的原因是:引擎默认使用的是透视投影模式,此模式的效果为近大远小的效果,所以远处的则模糊不清晰 所以我们如果想让整体所有贴图清晰,那么我们可以设置引擎为正交投影模式即可,如下代码设置: CCDirector::sharedDirector()->setProjection(kCCDirectorProjection2D);
OK,完美解决; 简化ANDROID.MK 一次加*cpp#遍历目录及子目录的函数 define walk $(wildcard$(1)) $(foreach e,$(wildcard $(1)/*),$(call walk,$(e))) endef
#遍历Classes目录 ALLFILES = $(call walk,$(LOCAL_PATH)/../../Classes) FILE_LIST := hellocpp/main.cpp #从所有文件中提取出所有.cpp文件 FILE_LIST += $(filter %.cpp,$(ALLFILES)) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
详解cocos2dx 3.0的release版本在android平台的签名过程
|
Keytool 选项 |
描述 |
-genkey |
生成一个key pair (公钥和私钥) |
-v |
允许详细内容输出. |
-alias <alias_name> |
key的别名.只会用到前8个字符. |
-keyalg <alg> |
生成key时的加密算法.支持 DSA 和 RSA. |
-keysize <size> |
生成的key的大小(bits).如果不提供,Keytool使用默认的Key大小:1024. |
-dname <name> |
描述key的创建者的标识名称. 在自签名证书中,本参数会出现在发布者和主题字段. |
-keypass <password> |
key的密码.安全起见,不要在命令行中包含这个选项. 此时Keytool会提示你输入密码. |
-validity <valdays> |
key的有效期,以天数为单位.注意:推荐使用10000或更大的数字. |
-keystore <keystore-name>.keystore |
保存私钥的keystore名称. |
-storepass <password> |
keystore的密码. 安全起见,不要在命令行中包含这个选项. |
生成keystore后,按照提示输入即可,注意此处输入的alias_name要与.keystore中的一致。
cocos2dx 3.0 事件分发机制详解
首先3.0中使用两个vector来存储事件监听器:
std::vector<EventListener*>* _fixedListeners; 存储fixedListener
std::vector<EventListener*>* _sceneGraphListeners; 存储SceneGraphListener
然后事件通过cocos2dx的EventDispatcher中的dispatchEvent函数来传递,
传递主要针对上述两个ListenerVector
是对fixedListener 和 sceneGraphListener进行排序(fixedListeners按照fixedPriority从小到大的顺序进行排序,sceneGraphListeners按照priority由大到小排序,这里估计是按照显示层级来排序了)
其次,对排序后的两个listeners 数组进行事件传递,传递的原则是首先把事件传递到fixedLisener中优先级<0的Lisener中,如果事件被处理则break终止传递,如果不被处理则传递到sceneListener中,同理不被处理继续传递到fixedListener中优先级>0的Listener中,直到事件被处理或者被丢弃(没有任何节点处理)。
至此完成了一个事件传递过程。
1.获取时间的方式是:
gettimeofday(&start,NULL);
2.计算两个时间的差的方法需要自己写
double timersubCocos2d(struct timeval *start,struct timeval *end) { if (! start || ! end) { return 0; } return ((end->tv_sec*1000.0+end->tv_usec/1000.0) - (start->tv_sec*1000.0+start->tv_usec/1000.0)); }
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!