cocos2d-x中锚点设置及定位方式

问题

在cocos2d演示样例代码HelloCpp中,为什么要将CCMenu设置位置到CCPointZero,即使CCMenu的锚点是在(0.5, 0.5)?

回答

这是由于CCMenu没有使用锚点进行坐标定位,而是使用的坐标原点。也就是说,CCMenu的坐标原点放到了其父节点的坐标原点。

延伸

不光是CCMenu没有使用锚点定位,像CCLayer,CCScene都没有使用锚点定位。详细设定是在构造函数中设计标记m_bIgnoreAnchorPointForPosition = true;下表描写叙述了节点的默认锚点位置及定位方式

节点类型 锚点位置 使用锚点?
CCNode (0, 0)
CCScene及其子类 (0.5, 0.5)
CCLayer及其子类 (0.5, 0.5)
CCSprite及其子类 (0.5, 0.5)

说明:CCNode的其他子类假设没有特殊指定,都是继承了CCNode的锚点位置及定位方式。典型的是CCLabelAtlas,它就是使用CCNode的定位方式,由于它及它的父类CCAtlasNode都没有对锚点位置和是否使用锚点进行设置,而CCLabelFont使用与CCSprite的锚点和定位方式。由于它是CCSprite的子类。

应用

锚点位置和定位方式都是能够改变的。前者通过CCNode::setAnchorPoint()改变,后者通过设定CCNode::m_bIgnoreAnchorPointForPosition来改变。

普通情况下,使用默认的就能够了。什么情况下须要改变呢?像下图这样的情形可能须要改变锚点位置。

这是同一个窗体中使用了两个页面。第一个页面包括一个背景、一幅图和一个字标。后者包括一个背景、一幅图和一个按键。这两个页面能够切换。假设为了实现比較方便地进行变换,每一个页面由一个节点表示是比較合理的。可是是使用哪一个类来表示根节点呢?可选的有四种,各自是CCNode、CCLayer、CCScene和CCSprite。

  • 对于使用CCSprite,假设背景是图像。则比較方便实现。可是对于label是图像的孩子理解上有些别扭。
  • 对于使用CCLayer,推荐是不使用那么多的Layer,由于第一个页面不须要交互。可是它仍然占用了消息处理的时间。
  • 比較好的方式CCScene或CCNode,尽管使用CCScene对于理解上仍然有一些别扭。

    不管是使用CCScene和CCNode作为根节点,easy操作的方式都是将锚点设置到(0.5, 0.5),而且使用锚点进行定位。

    所以假设使用CCScene须要设定CCNode::m_bIgnoreAnchorPointForPosition=false。而假设使用CCNode须要设定CCNode::setAnchorPoint(ccp(0.5, 0.5))

getAnchorPointInPixel

对于锚点在中心(0.5, 0.5)的结点,使用getAnchorPointInPixel获取到的是此结点的中心坐标。

利用此接口,能够方便地定位到结点的中心。

当然。使用getContentSize取半也能够。此信息用于对齐结点非常实用处。

CCLayer与CCNode的boundingBox值怎么不一样?

刚才測试出一个奇怪的问题,代码例如以下:

?


1

2

3

4

5

6

7

8

9

10

CCNode*
testLayer = CCNode::create();

//
CCNode* testLayer = CCLayer::create();

testLayer->setAnchorPoint(ccp(0,
1));

testLayer->setPosition(ccp(50,
100));

testLayer->setContentSize(CCSizeMake(300,
300));

this->addChild(testLayer);

CCLOG("testlayer
boundingBox: (%f, %f)"
,

  testLayer->boundingBox().origin.x,
testLayer->boundingBox().origin.y);

打印的结果是 (50, -200); 这个是正常的结果;

可是假设将testLayer的类型换成 CCLayer (也就是上面加了凝视那句), 值就变成了 (50, 100)

不知道是哪里的问题??

我的理解 CCLayer 仅仅是在 CCNode上加了一些事件代理, 应该没本质的差别才对. 这里是什么原因呢?

原因是CCNode里有个属性: m_bIgnoreAnchorPointForPosition 表示是否使用锚点定位, 默认是true

但 CCLayer 里这个值是false, 也就是CCLayer根本不适用锚点, 所以会有坐标计算问题

时间: 2024-10-25 14:24:43

cocos2d-x中锚点设置及定位方式的相关文章

Flex 4中组件背景设置(填充方式)group为例子

以下以Group为例子讲述如何在Flex 4中填充背景颜色.图片: 1.图片填充方式: <s:Group x="0" y="0" height="100%" width="100%"> <s:Rect x="0" y="0" height="100%" width="100%"> <s:fill> <s:B

CSS的三种定位方式介绍(转载)

在CSS中一共有N种定位方式,其中,static ,relative,absolute三种方式是最基本最常用的三种定位方式.他们的基 本介绍如下. static默认定位方式relative相对定位,相对于原来的位置,但是原来的位置仍然保留absolute定位,相对于最近的非标准刘定位,原来的位置消失,被后边的位置所顶替 下面先演示相对定位的案例 [html] view plain copyprint? <!DOCTYPE html> <html> <head> <

Cocos2d-x学习(3) - cocos2d坐标系,锚点

1.OpenGL的坐标系 Cocos2d是基于OpenGL开发的,所以Cocos2d的坐标系和OpenGL的坐标系是一致的,都是按照图示方向.和我们平时最常见到的坐标系也是一致的. 2.屏幕坐标系 屏幕坐标系是界面编程中很常见的坐标系.它规定的则是屏幕的左上角为坐标原点,向右为X轴正方向,向下为Y轴正方向.这个相比OpenGL坐标系,X轴方向其实是一致的,不同就在与Y轴方向. 3.元素的位置 每个元素的坐标系都是相对于其父节点的,也就是说如果父节点移动那么该父节点下的元素坐标也是相对移动的.就像

Android应用中使用百度地图API定位自己的位置(二)

官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发者们提供了如下类型的地图覆盖物: 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标): Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层: 路线图层(RouteOverlay):公交.步行和驾车线路图层,将公交.步行和驾车出行方案的路线及关键点显示在地图上(起.终

CSS通过设置position定位的三种常用定位

CSS中可以通过设置为元素设置一个position属性值,从而达到将不同的元素显示在不同的位置,或者固定显示在某一个位置,或者显示在某一层页面之上. position的值可以设为relative,absolute,fixed,static. HTML代码里定义两个区块: 1 <div class="box"> 2 <div class="box1"></div> 3 </div> 1.相对定位: 1 .box { 2

ffmpeg视频格式转换中关键帧的设置

在用ffmpeg转换视频到flv过程中,需要设置关键帧的间隔,以便在播放过程中实现精确定位.在网上查找了不少,最后发现这个指令有效: -g 1 -keyint_min 2 . http://blog.csdn.net/windflow/article/details/6228088 还没试,要试试-- ffmpeg视频格式转换中关键帧的设置,布布扣,bubuko.com

【转】HTML中的几种定位方式

http://www.cnblogs.com/Jerry-Chou/archive/2011/11/02/2233094.html 1,static(默认) 当你没有为一个元素(例如div)指定定位方式时,默认为static,也就是按照文档的流式(flow)定位,将元素放到一个合适的地方.所以在不同的分辨率下,采用流式定位能很好的自适合,取得相对较好的布局效果. 一般来说,我们不需要指明当前元素的定位方式是static——因为这是默认的定位方式.除非你想覆盖从父元素继承来的定位系统. 2,rel

浅析网站结构优化中导航系统的设置技巧

站长们,你们对于网站结构优化中导航系统的设置知多少呢?导航系统的设置的好坏对于网站结构的优化有着相当大的影响.咱们的导航做的目标越清晰,越符合用户的体验度.人性化一点来说,网站导航就跟汽车导航的作用差不多,指明目标,所以我们要从两个方面考虑如何导航系统. 从用户的角度来看,第一点用户可能会从任何一个内页进入到咱们的网站,导航系统要做的就是随时清除的让用户知道自己在网站的哪个位置.因为点开多个网站的内页后,用户自己也已经晕了,不知道自己是怎么点进这个页面的.所以,我们在设计的时候最好统一页面的风格

在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)

使用最新版本的百度地图需要注意的几个地方: 1.libs文件夹下要有android-support-v4.jar.baidumapapi_v2_1_0.jar.locSDK_3.1.jar三个jar包和armeabi文件夹. 2.布局文件要写成<com.baidu.mapapi.map.MapView />,旧版本是写作<com.baidu.mapapi.MapView />的. 3.AndroidMainfest这个配置文件要把该添加的东西都加上.比如各种权限.比如屏幕支持.比如