Cocos2D-X 学习笔记

1. 3.4final控制台创建项目后,安卓编译会失败,必须手动把cocos/平台/andorid/java/src目录里的文件复制到安卓项目的src文件夹即可

2. 安卓的文件目录与win的略有不同,读取文件时最好把文件目录输完整,以防出错

3. 物理世界不要放在inti()里初始化。因为init()是在layer创建后立刻自动执行的初始化程序,而m_World是在layer的init()执行完后再初始化的,如果在init里使用m_World,会发生异常。

4. 使用不同版本的COCOS之前需要先运行目录下setup设置下目录等

5. 切换NDK版本直接去环境变量里改就可以

6. 创建场景最好不要用Director::getInstance()->replaceScene(MyScene::creatScene());的方式进行,可操控性差。

可以直接让一个类继承SCENE而不是layer,这样直接new MyScene;然后在构造函数里Director::getInstance()->replaceScene(this);即可。

7. 关于物理引擎的补充,有了6的步骤,物理引擎的使用合理多了,在MyScene的构造函数里MyScene::initWithPhysics();即可。

8. 有些成员使用后不会自动释放,即使replaceScene后,仍然在内存中,会导致内存益处。需手动清除。

9. 关于调试信息,GL verts表示当前场景的渲染顶点数。GL calls表示即渲染多少个贴图出来。

10. 关于update

scheduleUpdate(); 每帧都执行update()

schedule(schedule_selector(Updatedemo::myupdate),1.0f); 每1.0秒执行自定义函数一次

scheduleOnce(schedule_selector(Updatedemo::myupdate2),3.0f); 只执行自定义函数一次

11.导入csb文件如果有粒子,而且粒子文件与粒子图片分离的话,一定要记得导入图片,不然会出错,因为stdio不会自己加载图片

12. 物理引擎的碰撞,需要利用碰撞监听器EventListenerPhysicsContact创建碰撞检测,还要加载一个碰撞处理函数,然后记得给刚体分类,共32类,即给刚体加上碰撞种类子演马。不然不会调用碰撞函数。

13. 关于碰撞,Category为组别,默认为0xFFFFFFFF。Collision为碰撞发生码,默认0xFFFFFFFF,只有别人的组别跟我的发生码相与不为零才能碰撞。

如果类型Category为0,则不与任何人发生碰撞。如果Collision为零,则任何人都不能与我碰撞。

也就是说,要发生碰撞,两者任何一个都不能为零。就算碰撞方的组别与被碰撞方的发生码相与为零也不可以。

ContactTest为碰撞测试码,只有别人的组别跟自己的碰撞测试码相与不为零的时候,就会激活碰撞检测函数,即onContactBegin()

注意:碰撞时相互的,不管是collision或者是contact,两者的两对参数必须相互相与不为零才会发生,例如contact,

假设A与B碰撞,则(A.contact & B.category != 0) && (A.cagegory & B.contact != 0)时才会成功触发

14. cocos创建的node默认tage = -1,必须手动设置,不然后果很严重

15. chimunk引擎有个严重的问题,如果你边创造物体边删除它们,你会发现内存并不会增长,但如果你先把它们创建到一定数量,再一次性删除它们,就会发性,内存回不去了。。。。

或者说,如何解决引擎一旦内存上去,就降不下来的问题。

***16. 因为chimunk引擎缺陷太多,设置物体setDynamic会崩溃,听说是设置setDynamic后就把BODY取消了只剩下SPRITE,所以想让物体变成动态,只能先>setVelocity(Vec2(0, 0)),再>setVelocityLimit(0);

17. 在触摸事件中,记得onTouchMove跟onTouchEnd之前必须有声明onTouchBegan,只有onTouchBgean声明并且返回true的条件下,这两个才会被调用。

18. 在chimunk引擎中,setDynamic(false)是可以的。不知道为啥之前会出BUG崩溃。设置后刚体就静止不动了。

19. 在cocos封装的physic中,sprite与body是紧紧绑定的,即body的移动,会引起sprite位置的改变,而spriet的移动,也会改变其body的位置。就算是RunAction也有用。

20. setVelocity是立刻发生的,设置完后立刻就改变原有速度。而applyFroce()与applyImup()是一个瞬间量,即使用后一瞬间有效果。就像对物体施力,施力瞬间有效果,要一直有效果,需要持续施力。

这点chimunk与box2d有所不同。chimunk要想有持续有效果,必须一直对物体applyFroce,即把applyForce放到Update里。而BOX2D一applyForce就立刻对物体有施加力。但过后力气立刻消失,当然,速度也发生了改变。这点,box2d比chhimunk真实多了。

21. cocos2dx 3.x 开启debug的方法:首先在3.x的目录下搜索GLES-Render.h 和 .cpp。然后把它们复制到项目目录下,并在项目中导入。

在world的初始化部分加入:

b2Draw *d = new GLESDebugDraw(PTM_RATIO);

uint32 flags = 0;

flags += b2Draw::e_shapeBit;

d->SetFlags(flags);

mWorld->SetDebugDraw(d);

然后重写Node的void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags);方法。

在里面加入:

GL::enableVertexAttribs(cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION);

mWorld->DrawDebugData();

CHECK_GL_ERROR_DEBUG();

22. win32打包后的程序别人运行不了怎么办?在引擎的Cocos\cocos-simulator-bin\win32中将里面所有.dll文件复制进去,就可以了

反思:cocos的模拟器中将所有的.dll都包含进去了,所以复制进去就可以了

23. body的角度转为sprite的旋转角度:

float angle = ((b2Body *)sprite->getUserData())->GetAngle();

/*

* angle = 弧度, rotation = 角度

* (弧度*180)/3.14 = 角度

* 因为通过getAngle获取的是全部转过的弧度数,因此结果必须取360余数获取相对转过的角度

*/

sprite->setRotation(-(int(angle * 180 / 3.14f) % 360));

24. 内存管理方面,cocos中的对象如果是通过构造工厂构造的,都会自动回收,不用担心。

以下两种情况需要手动释放对象,必须在所属对象的析构函数里手动release():

对象不是通过 Class::create()创建的,而是通过new 创建的

对象使用过retain()方法

25. MotionStreak类可以做出切西瓜那种轨迹的拖曳线。

26. 3.x开始引擎会自动优化,不再需要SpriteBatchNode

27. 以上提到的种种内存只上去不回退的解决方法。就是创建新场景使用官方的继承一个layer,然后返回一个scene,并在这个scene里增加layer。

记住切合场景使用Director::sharedDirector()->replaceScene(scene);

以前使用的方法是直接new 一个我创建的变量。然后再里面在replaceScene,这样new 的对象没手动deleat,会一直存在于堆中。使内存泄露。

28. cocos里的节点使用默认的create函数创造的话,会自动加入回收池,autorelease,如果继承node,并修改了创建方法,记得手动添加atuolease

29. BOX2D物理世界的body,析构函数已经设置为不可访问,既不用手动删除new过的body,添加它的world在delete时会自动删除

30.  removeFromParent 就是 removeFromParentAndCleanup(true)

31. 创建效果示例:

auto _gridNodeTarget = NodeGrid::create();

auto liquid = Waves::create(10, Size(16, 12), 4, 20, true, true);

_gridNodeTarget->runAction(liquid);

_gridNodeTarget->addChild(s);

this->addChild(_gridNodeTarget);

32. cocos2dx最佳资源释放时机:http://www.cocoachina.com/bbs/read.php?tid-309621.html

33. cocos2dx里重写父类的方法时,如果是续写,注意一定要调用父类的该方法,不然会导致父类的该方法被覆盖,如:

void MyScene::onEnter()

{

Layer::onEnter();

CCLOG("enter");

}

此种写法是在父类的onEnter之后再添加代码

void MyScene::onEnter()

{

CCLOG("enter");

}

此种写法是直接将父类的代码替换成自己的代码

时间: 2024-11-07 21:39:06

Cocos2D-X 学习笔记的相关文章

Cocos2D学习笔记(1)- 常用的类

1.坐标系 >屏幕坐标系(UIKit):原点在左上角! >OpenGl坐标系:原点在屏幕的左下角! 2.游戏设计:Director--Scene--Layer--Sprite. >CCDirector:导演类,相当于是游戏策划,负责整个游戏的布局和运行规则的制定. >CCScene:场景类,每个场景可以是一个界面或一个关卡. >CCLayer:图层类,为了方便游戏界面的渲染管理. >CCSprite:精灵类, 小结:一个导演类(CCDirector)可以指挥多个场景类(

cocos2d-js引擎学习笔记

Scale9Sprite 在用Scale9Sprite.create的时候出现Uncaught TypeError: Cannot call method 'create' of undefined这个错误, 后来发现在默认情况下,project.json里的modules只自带cocos2d模块,通过检查frameworks/cocos2d-html5/moduleConfig.json,可以看到cocos2d模块里并没有CCScale9Sprite.js这个类. 它在GUI里,所以可以在mo

cocos2dx游戏开发学习笔记2-从helloworld开始

一.新建工程 具体安装和新建工程的方法在cocos2dx目录下的README.md文件中已经有详细说明,这里只做简单介绍. 1.上官网下载cocos2dx-3.0的源码,http://www.cocos2d-x.org/ 2.安装python2.7 3.运行setup.py安装 4.执行cocos new helloworld -p helloworld -l cpp,生成新工程 二.新建工程中包含的东西 -Classes AppDelegate.cpp      -----游戏真正开始执行的地

《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音

<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内容主要都是介绍如何在屏幕上显示图像,事实上除了图像之外,音乐的播放也可以被理解为一种显示的方式,本节将学习在Cocos2d-x中播放声音的方法. (1)在HelloWorld.h中对HelloWorld类进行如下定义: class HelloWorld : public Cocos2d::Layer { pu

cocos2dx游戏开发&mdash;&mdash;微信打飞机学习笔记(三)&mdash;&mdash;WelcomeScene的搭建

一.场景与层的关系: cocos2dx的框架可以说主要由导演,场景,层,精灵来构成: 1.其中导演,意如其名,就是操控整个游戏的一个单例,管理着整个游戏. 2.场景就像电影的一幕剧情,所以说,懂得如何划分好游戏的场景,是开始动手做游戏的第一步. 3.一个场景会有很多层,用来处理场景不同的功能. 4.而精灵则是最小的单位,比如子弹,飞机,敌机都是一个个的精灵所组成的.   二.WelcomeScene的搭建: 1.场景和层的二种搭建方法: (1)一种就是跟HelloWorld示例一样的方法,以一个

Cocos2d-x 3.2 学习笔记(五)Sprite Node

游戏中最重要的元素Sprite精灵,关于精灵的创建,精灵的控制等等. 涉及到的类Class: AnimationFrame 动画帧. Animation 动画对象:一个用来在精灵对象上表现动画的动画对象. AnimationCache 动画缓存单例类. 如何你想要保存动画,你需要使用这个缓存. Sprite 精灵;定义为二维图像. SpriteBatchNode 与批量节点类似,如果包含子节点会在一次OpenGL调用内绘制完成. SpriteFrame 一个精灵帧. SpriteFrameCac

【Cocos2D-X 学习笔记】为精灵添加单点触控

由于Cocos2d-x处于新学的阶段,因此最近也无法进行系统地更新,只会选择一些典型的Demo贴上来,一来是与大家分享,而来也可以作为以后回顾时的参考. 今天介绍一下Cocos2d-x的触摸事件处理,了解Android开发的朋友们知道,Android里会用一个OnClickListener()进行事件监听,而在J2SE中也会有Event类实现专门的监听处理.在Cocos2d-x中,因为是游戏引擎,用户在玩游戏时总是要通过屏幕与游戏进行交互,可想而知触摸事件是主要处理的事件.这里主要讲一下如何为精

Cocostudio学习笔记(3) ImageView + Slider

这篇记录了两个控件的使用流程:ImageView 和 Slide. ---------------------------------------------------------------------------------------------------------------------------- ImageView ---------------------------------------------------------------------------------

Cocos2dx 学习笔记整理----场景切换

据说Cocos2dx场景切换的方法有32种:cocos2dx 常见的32种切换场景的动画 无需一一求证,只需要知道切换场景需要怎么做就行了. 作为导演CCDirector,切换场景的事情当然归它管了. 切换场景的接口如下: ? 1 CCDirector::sharedDirector()->replaceScene(cocos2d:CCScene * pScene); 所以,我们只要把需要切换的场景实例传进去就可以了. ? 1 2 CCScene * pScene = GameMain::sce

cocos2dx游戏开发——微信打飞机学习笔记(一)——开发准备

一.环境的搭建 1.Windows开发准备: (1)软件下载及安装 •下载Cocos2d-x 最新版本:http://www.cocos2d-x.org/download 或者从Cocos2d-x GitHub主页中克隆Develop分支:https://github.com/cocos2d/cocos2d-x •配置Python 2.7 环境:http://www.python.org/download/releases/ •建议IDE:Visual Studio 2013 •运行cocos2