cocos2d 相关概念整理

本文来自http://blog.csdn.net/u012972188 ,引用必须注明出处!

cocos2d 相关概念整理

温馨提醒:使用二维码扫描软件,就可以在手机上访问我的博客啦!另外大家可以访问另一个博客http://blog.csdn.net/runaying

图文并茂


基本概念

     1.在cocos2d-X方法'init'返回布尔值, 而不是在cocos2d-iphone返回'id' cpp 里面没有 'id',所以我们推荐返回确切的类指针
      2.两个类非常地相似,但是功能上还是有些区别的:
CCAnimation是用于将一些的sprite对象载入其中,其实就是将一帧帧的图片放在一起,形成一个连贯的动作;
CCAnimate就是赋予sprite(人物角色)对象CCAnimation动作。

lua

把游戏逻辑写到lua脚本里,更新功能的时候就可以在线更新lua脚本,而不需要重新提交客户端

LUA就是一种可以在不必修改C++代码的情况下实现逻辑处理的手段。稍微讲的再明白一点,就是你用指定语法写一些逻辑处理函数然后保存成文本格式,这个文件称为脚本文件,可以被游戏执行。经过若干年的发展,现在在LUA中写逻辑,除了调用注册到LUA的静态C函数外,也已经可以方便的访问到C++工程中的类的成员函数。这是游戏开发史上最重要的技术之一。其改变了很多设计方案,使游戏变的灵活强大而极具扩展性。

  在Cocos2d-x中,有两个类来完成对于LUA脚本文件的处理。

1. CCLuaEngine:LUA脚本引擎

2. CCScriptEngineManager:脚本引擎管理器。

lua的优势

1. 运行效率:Lua 的性能在各种测试里都比 JavaScript 快不少。而移动设备上存在不支持 JIT 的情况(未越狱的 iOS 设备),Lua 对比 JavaScript 的性能优势就更明显。

2. 安全性:现在 cocos2d-x 使用 LuaJIT 来执行 Lua,所以可以把 Lua 代码编译为字节码再打包到游戏里。由于 LuaJIT 的字节码是高度优化过的,所以目前还没有反编译工具。而 JS 虽然也可以用字节码,但从目前的情况看还达不到 LuaJIT 的安全性。

3. 与 C/C++ 的交互:Lua 原本就是作为嵌入式语言来设计的,所以天然和 C/C++ 很容易交互。JS 这方面是个劣势。

4. 与 Java/Objective-C 的交互:不管是 quick-cocos2d-x 里提供的 luaoc/luaj 模块,还是 wax, luajava 这些开源项目,都让我们可以绕过 C/C++ 层实现 Lua 和 Java/Objc 的交互。这个优势在游戏发行阶段,集成各种第三方 SDK 时绝对会节约巨量时间!!!

我选择了lua,但是没有一个好的ide,没有一个好的调试工具,生产率正的很低。

Lua的优点:可编译,效率高,跟c/c++/java/objective-c之间的相互调用较方便,在游戏业内久经考验。
Lua的缺点:本身不直接支持面向对象,需要拐弯实现,不能发布html5。

坐标系简介

OpenGL坐标系 

    

     Cocos2D-X以OpenGL和OpenGL ES为基础,所以自然支持OpenGL坐标系。该坐标系原点在屏幕左下角,X轴向

右,y轴向上。 

     屏幕坐标系使用的是不同的坐标系统,原点在屏幕左上角,x轴向右,y轴向下。 iOS的屏幕触摸时间CCTouch传

入的位置信息使用的是该坐标系。因此在Cocos2D-X中对触摸事件做出响应前,需要首先把触摸点转化到OpenGL坐

标系。这一点我们会在后面的触屏信息中详细介绍,可以使用CCDirector的convertToGL方法来完成这一转化。


世界坐标系

(1)屏幕坐标系

        在windows系统中,默认的原点在屏幕的左上角,X轴向右,Y轴向下。

      

(2)GL坐标系

        原点在左下角,X轴向右,Y轴向上。由于cocos2d-x使用的是open gl渲染引擎,而不是directx 3d引擎,那么GL坐标系就不和屏幕坐标系重合,这是要注意的一点。因此,当我们调用了一个屏幕响应事件时,如ccTouchEnded(CCTouch* touch, CCEvent* event);

此时我们CCPoint location = touch->locationInView(touch->View)返回点击处在屏幕坐标系的位置,而不是GL坐标系。因此就有将屏幕坐标系转换成GL坐标系的函数。

CCPoint convertedLocation = CCDirector::sharedDirector()->convertToGL(location);

 

(3)本地坐标系

         游戏中,每一个对象都有一个自己的坐标系,这些坐标系就叫做本地坐标系。

         相对于父对象的坐标系,原点在左下角,X轴向右,Y轴向上。举个例子,以我自己作为坐标原点,那么在我附近(在我这个坐标系内)的对象就是子对象,而我就是父对象,这些子对象的位置都是本地坐标系,是相对于我(父对象)来说的。下面我举一个代码来做说明:

      ..........

      CCLayer* layer = new CCLayer();

      CCSprite* player = CCSprite::spriteWithFile("player.png");

     layer->addChild(player, 1);

     ................

在这里,player对象就是子对象,layer就是父对象,那么player相对于layer的位置就是在本地坐标系中的位置。如果,layer(父对象)发生移动,就是我们说的背景移动,那么,player(子对象)也会跟着移动,但子对象在本地坐标系中的位置不变,改变的是子对象在世界坐标系中的位置。

(4)世界坐标系

         世界坐标就是所谓的绝对坐标,所有的对象虽然都有自己的本地坐标系,但这些对象同样的在世界坐标系中也有一个坐标。例如,整个地球就是一个世界坐标系,在地球上的每一个人都有一个唯一的坐标。


     世界坐标系也叫作绝对坐标系,是游戏开发中建立的概念,因此“世界”即是游戏世界。它建立了描述其他坐标系所

需要的参考标准。我们能够用世界坐标系来描述其他坐标系的位置。它是Cocos2D-X中一个比较大的概念。

     Cocos2D-X中的元素是有父子关系的层级结构。通过CCNode设置位置使用的是相对其父节点的本地坐标系,而非

世界坐标系。最后在绘制屏幕的时候,Cocos2D-X会把这些元素的本地节点坐标映射成世界坐标系坐标。世界坐标系

和OpenGL坐标系方向一致,原点在屏幕左下角,x轴向右,y轴向上。

     下面让我们暂时从纷乱的坐标系中抽出来,看一个重要概念:锚点


锚点


      锚点指定了贴图上和所在节点原点(也就是设置位置的点)重合的点的位置,因此只有在CCNode类节点使用贴

图的情况下,锚点才有意义。

      锚点的默认值是(0.5,0.5),表示的并不是一个像素点,而是一个乘数因子。(0.5,0.5)表示锚点位于贴图长

度乘0.5和宽度乘0.5的地方,即贴图的中心。

      改变锚点的值虽然可能看起来节点的图像位置发生了变化,但其实并不会改变节点的位置,其实变化的只是贴图

相对于你设置的位置的相对位置,相当于你在移动节点里面的贴图,而非节点本身。如果把锚点设置成(0,0),贴

图的左下角就会和节点的位置重合,这可能使得元素定位更为方便,但会影响到元素的缩放和旋转等一系列变换。因

此并没有一种锚点设置是放之四海而皆准的,要根据你这个对象的使用情况来定义。在Cocos2D-X中锚点为默认值

(0.5,0.5),这样的锚点设置要把一个节点放置到贴图的中央。


节点坐标系


      节点坐标系是和特定节点相关联的坐标系。每个节点都有独立的坐标系。当节点移动或改变方向时,和该节点关

联的坐标系(它的子节点)将随之移动或改变方向。这一切都是相对的,相对于基准的,只有在节点坐标系中才有意

义。

     CCNode类的设置位置使用的就是父节点的节点坐标系。它和OpenGL坐标系的方向也是一致的,x轴向右,y轴向

上,原点在父节点的左下角。如果父节点是场景树中的顶层节点,那么它使用的节点坐标系就和世界坐标系重合了。


CCNode类对象中有两个方便的函数可以做坐标转换:

<1> convertToWorldSpace:把基于当前节点的本地坐标系下的坐标转换到世界坐标系中。

<2> convertToNodeSpace:把世界坐标转换到当前节点的本地坐标系中。

      

      这两种转换都是不考虑锚点的,都以当前节点父类的左下角的坐标为准。另外,CCNode还提供了

convertToWorldSpaceAR和convertToNodeSpaceAR。这两个方法完成同样的功能,但是它们的基准坐标是基于坐标

锚点的。几乎所有的游戏引擎都会使用类似的本地坐标系而非世界坐标系来指定元素的位置。

      这样做的好处就是,当计算物体运动的时候,使用同一本地坐标系的元素可以作为一个子系统独立计算,最后再

加上坐标系的运动即可,这是物理研究中常用的思路。例如,一个在行驶的车厢内上下跳动的人,只需要在每帧绘制

的时候计算他在车厢坐标系中的位置,然后加上车的位置就可以计算出人在世界坐标系中的位置。如果使用单一的世

界坐标系,人的运动轨迹就变复杂了,就涉及中学所学到的运动轨迹的合成与分解。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值