ITPub博客

首页 > 应用开发 > IT综合 > Cocos2dx怎么位置的坐标系_浙江联通畅想张海波

Cocos2dx怎么位置的坐标系_浙江联通畅想张海波

原创 IT综合 作者:浙江联通畅想张海波 时间:2014-12-19 11:48:26 0 删除 编辑

  在这里浙江联通畅想张海波仅仅讨论设置位置的坐标系,TILE地图坐标系、触屏坐标系等不在讨论范围之内。

  先看一段HelloWorld的代码:

  [cpp] view plaincopyprint?

  CCSprite* pSprite = CCSprite::create("HelloWorld.png");

  CC_BREAK_IF(! pSprite);

  // Place the sprite on the center of the screen

  pSprite->setPosition(ccphttp://blog.gxnews.com.cn/u/862338/a/1226261.html(size.width/2, size.height/2));

  // Add the sprite to HelloWorld http://www.eoeandroid.com/thread-553096-1-1.htmllayer as a child layer.

  this->addChild(pSprite, 0);

  CCSprite* pSprite = CCSprite::create("HelloWorld.png");

  CC_BREAK_IF(! pSprite);

  // Place the sprite on the center of the screen

  pSprite->setPosition(ccp(size.widthttp://www.k518.com/beijing/zhuangxiuzhuangshi/a14303199.htmlh/2, size.height/2));

  // Add the sprite to HelloWorld layer as a child layer.

  this->addChild(pSprite, 0);

  这段代码是在 HelloWorld 的 init 中的代码,其中 HelloWorld 是一个 CCLayer,HelloWorld.png是一张和屏幕大小(480 * 320)一样的图片,最终显示的效果是这张图片恰好占据了整个屏幕的大小,显示出来。我们就从这里开始。

  1、源:图片

  首先我们有一张图片,HelloWorld.png,480 * 320,这个是实际上要显示的内容的真正来源,对于坐标系的研究而言,最核心的关心,是这张图片上的某个点 (x, y),最后映射到屏幕的什么位置。

  2、子节点 -》 父节点

  接下来是pSprite,它是CCSprite的对象,是一个节点。在这段代码中,pSprite通过加载HelloWorld.png,获得了展示的内容纹理,在CCSprite中可以看到,他实际上就是通过 ccGLBindTexture2D 将纹理绘制了出来,并且将自己的内容区域设置成纹理的大小。

  但pSprite并不是我们所想要显示的全部,他只是整个界面的一部分,被加载进父节点helloWorld中。这个动作是由addChild完成的,而具体摆放在父节点的什么位置呢?pSprite 设置了自己的位置 setPosition。不过注意到这个setPosition是在 addChild之前,也就是说,pSprite在还不知道自己的父亲在什么地方的时候,就已经设置好自己的位置了。因此可以猜测,这个Position是与父节点相对独立的。

  3、根节点 -》 世界

  HelloWorld这个根节点在加载了所有的子布局之后,对他而言,已经没有父节点了,那么就需要把自己显示在屏幕上,这一步的变换就是从自己的坐标系映射向屏幕。不过在cocos之中,目前我还没有看到类似于 glFrustum 这样的透视裁剪设置(毕竟移动设备总是全屏显示的),所以实际上世界坐标系到屏幕坐标系的映射基本是固定的,这里就合一了。

  4、对流程的总结

  子节点坐标系 -> 父节点坐标系 -> ………… -> 根节点的坐标系 -> 世界坐标系

  在节点中的位置 在父节点中的位置 在根节点中的位置 在世界中的位置

  二、从CCNode分析坐标系的变换

  1、齐次变换矩阵 CCAffineTransform

  根据从OpenGL中的经验可以知道,坐标系的切换的核心,就是变换矩阵。在cocos中,有个类是专门用来表示这样的矩阵的,就是 CCAffineTransform。由于cocos2D是一个二维引擎,所以坐标是二维的,那么齐次变换矩阵就应该是3*3的,所以 CCAffihttp://beijing.jinti.com/zhuangxiu/18633974.htmneTransform 的矩阵如下(函数可见 __CCAffineTransformMake() ):

  


  (式2-1)

  需要注意的是这个矩阵和《4.坐标系其二——OpenGL中的坐标系》中的变换矩阵的表示方式不同,两者成转置关系,所以这里的矩阵是右乘坐标点的(函数代码可见 __CCPointApplyAffineTransform(const CCPoint& point, const CCAffineTransform& t) ):

  


  (式2-2)

  【这个类,我有一个地方没有弄明白,就是 CCAffineTransformTranslate 这个函数实际上是左乘了位移矩阵,转置之后,就相当于在第四节中的齐次矩阵右乘了位移矩阵,相当于先进行位移,再进行剩余变换,不过幸好我们这里不需要涉及到这个方法】(浙江联通畅想张海波日志)

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30029683/viewspace-1373102/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2014-11-19

  • 博文量
    3
  • 访问量
    4952