Cocos2dx开发之锚点
Cocos2dx开发之锚点实例讲解
锚点概念
由于我们在使用Cocos2dx进行开发时,一般都是在场景中加载精灵来实现的,而精灵上挂载的往往都不是一个点而是一张图片资源,那么我们在场景中设置这个精灵的位置时,对这张资源图片来说是应该把这张图片资源中的哪个点与我们设置的点对齐呢?这里就引出了锚点这个概念,我们通过设置锚点来确定资源图片上哪个点与我们设置位置点对齐。简而言之,锚点确定精灵自己在父节点的加载位置。
几何图形说明
上面的文字描述可能不太容易理解,下面作者发扬严谨的科研风格,绘图做以下说明:
假设我们要把一个精灵加载到场景中去,这个精灵上使用的图片资源是一张四边形图片,如下图所示
图 1
OK,当我们使用Cocos2dx下对应的API要给这个精灵设置一个特定的位置时,设置的结果是什么样的呢?这就与我们给定这个精灵的锚点有关,设置不同的锚点,加载结果也会不同。锚点的设置可以根据你的喜好随意设置,但是一般来说常用的锚点有哪些呢?如下图红色圈所表示的——左下角、左上角、右上角、右下角,在Cocos2dx中默认使用的锚点坐标是四边形的几何中心点。
图 2
在Cocos2dx中,我们可以使用setAnchorPoint这个接口来设置锚点,参数是一个cocos2d::CCPoint类型,这个点是(0.0f,0.0f)~(1.0f,1.0f)之间的一个值。
锚点Demo演示
我们在下面这个场景中来做测试,首先如下图所示,我们在这个场景中添加一个精灵A作为背景精灵:
加载代码:
// 添加背景资源
cocos2d::CCSprite* pBg = cocos2d::CCSprite::create("wndbg.png");
CC_BREAK_IF( !pBg );
pBg->setPosition(ccp(300.0f,300.0f));
this->addChild(pBg);
图 3
然后我们在这个精灵上开始增加另外一个精灵B作为测试精灵。
好,我们把测试精灵B的锚点设置为左下角(0.0f,0.0f),然后加载到精灵A之上,如下图所示:
加载代码:
// 加载测试精灵
cocos2d::CCSprite* pTestSprite = cocos2d::CCSprite::create("bubble.png");
CC_BREAK_IF( !pTestSprite );
pTestSprite->setAnchorPoint(ccp(0.0f,0.0f));
pTestSprite->setPosition(ccp(0.0f,0.0f));
pBg->addChild(pTestSprite);
结果展示:
图 4
再看下面,我们把测试精灵B的锚点设置为中间(Cocos2dx中默认锚点也是如此),加载结果:
加载代码:
// 加载测试精灵
cocos2d::CCSprite* pTestSprite = cocos2d::CCSprite::create("bubble.png");
CC_BREAK_IF( !pTestSprite );
pTestSprite->setAnchorPoint(ccp(0.5f,0.5f));
pTestSprite->setPosition(ccp(0.0f,0.0f));
pBg->addChild(pTestSprite);
加载结果如下
图 5
下来呢,再把测试精灵B的锚点设置为右上角(1.0f,1.0f),加载结果如下:
加载代码:
// 加载测试精灵
cocos2d::CCSprite* pTestSprite = cocos2d::CCSprite::create("bubble.png");
CC_BREAK_IF( !pTestSprite );
pTestSprite->setAnchorPoint(ccp(1.0f,1.0f));
pTestSprite->setPosition(ccp(0.0f,0.0f));
pBg->addChild(pTestSprite);
加载结果展示:
图 6
NICE,至此,我们可以看到,测试精灵B锚点设置不会影响它在背景精灵上的位置(这个位置只是根据setPosition接口来改变),只会影响测试精灵B本身的资源图片上的哪一点来与这个位置对齐。
=====================================
图层的旋转失败的案例
【http://blog.csdn.net/davidsu33/article/details/9849945】
cocos2dx中经常会用到节点的旋转,一旦涉及到物体的旋转则会涉及到旋转所相对的中心点的位置,对于CCNode而言,其提供了设置锚点的接口,用来设置锚点的相对位置。
见CCNode源代码中CCNode.cpp
- /// anchorPoint getter
- const CCPoint& CCNode::getAnchorPoint()
- {
- return m_obAnchorPoint;
- }
- void CCNode::setAnchorPoint(const CCPoint& point)
- {
- if( ! point.equals(m_obAnchorPoint))
- {
- m_obAnchorPoint = point;
- m_obAnchorPointInPoints = ccp(m_obContentSize.width * m_obAnchorPoint.x, m_obContentSize.height * m_obAnchorPoint.y );
- m_bTransformDirty = m_bInverseDirty = true;
- }
- }
其锚点的坐标值是一个相对值0~1,其中m_obAnchorPoint表示的是相对锚点坐标,m_obAnchorPointInPoints表示的是锚点在屏幕中的像素坐标,所以对于CCNode的坐标系转换会涉及到多种转换方式。
我们也可以通过设置ignoreAnchorPointForPosition来忽略锚点的作用。
对于图层而言其ignoreAnchorPointForPosition的默认值为false,CCSprite默认值为true,但是有时候大家会发现,即便咱们设置了图层的ignoreAnchorPointForPosition为false,但是图层的旋转仍然没有按照预定的结果来进行,原因是因为默认CCLayer的图层的大小为CCSize(0,0),所以不管你怎么设置图层的大小始终为(0,0),经过锚点比例进行计算之后其锚点的坐标仍然是(0,0),如下图所示:
但是设置了CCLayer的大小之后,就会发现,咱们设置的锚点就能起到作用了
- void LayerIgnoreAnchorPointPos::onEnter()
- {
- LayerTest::onEnter();
- bool ignore = this->isIgnoreAnchorPointForPosition();
- //this->ignoreAnchorPointForPosition(false);
- //CCSize layerSize = this->getContentSize();
- setContentSize(CCDirector::sharedDirector()->getWinSize());
- setAnchorPoint(ccp(0.5, 1));
- //CCSize layerSize2 = this->getContentSize();
- //CCPoint pt = this->getPosition();
- //setPosition(ccp(layerSize2.width/2, layerSize2.height/2));
- CCSize s = CCDirector::sharedDirector()->getWinSize();
- CCLayerColor *l = CCLayerColor::create(ccc4(255, 0, 0, 255), 150, 150);
- l->setAnchorPoint(ccp(0.5f, 0.5f));
- l->setPosition(ccp( s.width/2, s.height/2));
- CCMoveBy *move = CCMoveBy::create(2, ccp(100,2));
- CCMoveBy * back = (CCMoveBy *)move->reverse();
- CCSequence *seq = CCSequence::create(move, back, NULL);
- l->runAction(CCRepeatForever::create(seq));
- this->addChild(l, 0, kLayerIgnoreAnchorPoint);
- CCSprite *child = CCSprite::create("Images/grossini.png");
- l->addChild(child);
- CCSize lsize = l->getContentSize();
- child->setPosition(ccp(lsize.width/2, lsize.height/2));
- CCMenuItemFont *item = CCMenuItemFont::create("Toggle ignore anchor point", this, menu_selector(LayerIgnoreAnchorPointPos::onToggle));
- CCMenu *menu = CCMenu::create(item, NULL);
- this->addChild(menu);
- menu->setPosition(ccp(s.width/2, s.height/2));
- //this->setAnchorPoint(ccp(0.5, 0.5));
- CCDirector::sharedDirector()->getActionManager()->addAction(
- CCRepeatForever::create(
- CCSequence::create(CCRotateBy::create(2, 360),
- CCRotateBy::create(2, -360),
- 0)
- ),
- this,
- false);
- }
Cocos2dx开发之锚点相关推荐
- 【Cocos2dx开发】精灵
[Cocos2dx开发]精灵 写在前面--有不对的地方,烦请大家批评指正,我也会继续努力提高自己.如果转载请注明出处,谢谢大家支持--Forward. ...
- Cocos2d-X开发教程-捕鱼达人-欧阳坚-专题视频课程
Cocos2d-X开发教程-捕鱼达人-24521人已学习 课程介绍 本次视频全程以捕鱼达人为项目案例讲述如何使用Cocos2d-X来开发这样一款游戏.本次视频使用了主流的C++开发语言 ...
- cocos2d-x开发中wstring和string的转换
cocos2d-x开发中汉字操作技术是必须要面对的,其中可能要用到wstring和string的相互转换.我在网络上搜索到的能够应用于android 和WIN32(其他的平台没有试)环境下的汉字的可选 ...
- 用Cocos2dx开发棋牌游戏的观点解析
众所周知,目前棋牌游戏特别的火.很多游戏公司都想在这一块赚钱,可是却不知用什么软件比较好的去开发棋牌游戏,对此,我列出了两款比较靠谱的软件去开发棋牌游戏,希望对大家有帮助! 第一款软件是cocos2d ...
- [cocos2dx开发技巧4]工具CocosBuilder的使用--复杂动画
转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8760957 一个网友推荐过一款制作动画的工具,叫做 Spriter: 其中有个Demo ...
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第九节:卡通渲染
<使用Cocos2d-x 开发3D游戏>系列在线课程 第九节:卡通渲染 视频地址:http://edu.csdn.net/course/detail/1330/20809?auto_sta ...
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第十九节:雾
<使用Cocos2d-x 开发3D游戏>系列在线课程 第十九节:雾 视频地址:http://edu.csdn.net/course/detail/1330/20819?auto_start ...
- 锯齿数独 cocos2d-x 开发 (一)
先放一张游戏截图: 实现功能: 1.两种模式,普通数独和锯齿数独 2.不使用题库,数字及锯齿均纯随机生成,有且仅有唯一解. 3.难度控制. 4.生成时间控制在1s内(ipad mini2) 一.生成普 ...
- 锯齿数独 cocos2d-x 开发 (二)
锯齿数独 cocos2d-x 开发 (一) 二.锯齿的生成 1.9*9的格子划分成9个随机形状的连通块. 这里采用了bfs + 并查集的算法. 在bfs生成连通块的同时,检测整个图所有的联通分量, 一 ...
最新文章
- 车险赔付率分析报告_车险改革究竟是涨价还是降价了?9月19号后买会便宜吗?...
- 内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!
- 将Java应用程序作为Windows服务安装
- CODE[VS] 1346 HelloWorld编译器
- 查看AIX系统cpu、内存、网卡、硬盘、HBA卡信息命令
- 解码H264视频出现花屏或马赛克的问题
- 存储器——存储器容量扩充
- Ghost Win10 企业版LTSC 2020.05(32位+64位)
- 计算机英语教学设计,英语教学设计doc范文精选
- win7 OneNote不能登录一直登录
- iphone开蓝牙wifi上网慢_iPhone手机网速慢解决方法
- 2-1 Socket家族的基石
- IPD的决策评审DCP(1):概念、战略性
- 前端-js网页特效(一)倒计时效果及原理
- 《信号与系统》奥本海姆第二版中文版勘误
- ArcGIS小知识(九)——坡度、剖面曲率、坡向、等高线
- LeetCode:Database 96.净现值查询
- 《港联证券》股票必须持仓多久才能卖?股票买入多久显示持仓?
- 一粒云文控模块使用心得
- zencart忘记后台密码的解决办法
热门文章
- 2018年一线互联网公司Java高级面试题总结
- Less语法基于node\grunt/gulp编译
- JSI2性能测试报告
- Int与String之间相互转换
- 大数据、AI“武装”企业服务:风控、检索、安全
- 20170429,上市公司2016年报全出炉(附最新排行榜)
- wordpress的手动更新
- CentOS6.5搭建SVN服务器(Apache+SVN)
- [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
- Python与C之间的相互调用(Python C API及Python ctypes库)