cocos2d-x 几何绘制: DrawingPrimitives 和 CCDrawNode
在看书的时候只提到了DrawingPrimitives,然后我去搜索这个类,结果没搜到。心想难道是类名改了,那我搜方法名吧,搜了下DrawLine,果然被我搜到了。结果发现原来这些各方法都是全局函数,而没有被封装到类里做静态函数,囧,果然不能全相信书上的。
同时看到源代码中有注释指名建议使用CCDrawNode来代替,于是顺便看了下CCDrawNode的源代码,发现函数比较少,要传递的参数比较多。当时心想那我为什么不直接使用函数名称简单易懂的DrawingPrimitives系列函数呢,然后去做了下实验,发现在helloworldscene函数里调用ccDrawLine竟然没有画出来。好吧,再仔细看了下说明,原来DrawingPrimitives系列的函数是必须在draw函数中调用才生效的,并且它们不是批处理的,效率比不上CCDrawNode,怪不得推荐使用CCDrawNode呢。
吸取教训后,就去尝试使用CCDrawNode画了点几何图形。最终想到将来可能会需要显示某个结点对象的框架位置,来查看是否出错等。于是补上两个函数来做辅助,代码如下:
static int giFrameTag = ;
static const float gfFrameWidth = 1.0f;
static const ccColor4F gdFrameColor = ccc4f(0.0f, 0.0f, 1.0f, 1.0f);
void DrawNodeFrame(CCNode* npNode)
{
CCAssert(NULL != npNode, "DrawNodeFrame function can`t accept null attribute"); // 画框架
CCDrawNode* lpoDrawNode = CCDrawNode::create();
CCPoint ldLeftBottomPt = ccp(npNode->getPositionX() + gfFrameWidth,
npNode->getPositionY() + gfFrameWidth);
CCPoint ldRightBottomPt = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth,
npNode->getPositionY() + gfFrameWidth);
CCPoint ldLeftTopPt = ccp(npNode->getPositionX() + gfFrameWidth,
npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth);
CCPoint ldRightTop = ccp(npNode->getPositionX() + npNode->getContentSize().width - gfFrameWidth,
npNode->getPositionY() + npNode->getContentSize().height - gfFrameWidth); CCPoint ldPoints[] = {ldLeftBottomPt, ldRightBottomPt, ldRightTop, ldLeftTopPt};
lpoDrawNode->drawPolygon(ldPoints, sizeof(ldPoints)/sizeof(ldPoints[]),
ccc4f(0.0f, 0.0f, 0.0f, 0.0f), gfFrameWidth, gdFrameColor); // 获取当前子节点中最大的zorder
int liMaxZorder = ;
if(npNode->getChildrenCount() > )
{
CCArray* lpoChildrenArray = npNode->getChildren();
int liCurrentZorder = ;
for(int i = ; i < lpoChildrenArray->count(); ++i)
{
liCurrentZorder = ((CCNode*)lpoChildrenArray->objectAtIndex(i))->getZOrder();
if(liMaxZorder < liCurrentZorder)
liMaxZorder = liCurrentZorder;
}
}
liMaxZorder += ; // 获取一个不存在的Tag
while(NULL != npNode->getActionByTag(giFrameTag))
{
++giFrameTag;
} npNode->addChild(lpoDrawNode, liMaxZorder, giFrameTag);
}
void UndrawNodeFrame(CCNode* npNode)
{
if(NULL != npNode && NULL != npNode->getActionByTag(giFrameTag))
{
npNode->removeChildByTag(giFrameTag, true);
}
}
功能并不复杂,在需要显示的结点对象中调用DrawNodeFrame并传入对应的指针即可(最好是在增加完所有的子对象之后才调用),不需要显示了则调用UndrawNodeFrame即可。
cocos2d-x 几何绘制: DrawingPrimitives 和 CCDrawNode的更多相关文章
- Cocos2D v3.4.9粒子效果不能显示的原因分析及解决办法
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在游戏App中为了衬托气氛我们往往使用一些特殊的图形效果,粒子 ...
- Cocos2D中的Framerate状态
对于额外绘制调试物理引擎的支持,Cocos2D同样可以绘制概述计数器,尤其是帧速率(framerate)显示. 为了启用这些概述计数器标签,你只需添加如下一行代码,比如说在AppDelegate.m里 ...
- 06. Web大前端时代之:HTML5+CSS3入门系列~HTML5 画布
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 我们先看看画布的魅力: 初始画布 canvas默认是宽3 ...
- VR 相关专业词汇
最近在看 SIGGRAPH2015 有关 VR Display and Interaction 的几篇文章,之前从来没看过有关方面的 paper,一看才发现专业词汇太多了,根本不懂啊,幸亏 Paper ...
- 百度地图SDK for Android v2.1.2全新发布
2013年6月20日 Android SDK:V2.1.2产品上线 新增: 自定义指南针位置(类:MapController,方法:setCompassMargin) 自定义当前位置图标(类:MyLo ...
- cocos2d-x使用CCClippingNode实现跑马灯
直接在代码,这是一个很好的包layer,可以直接调用 //原来白白 bool TestLayer::init() { CCSize size = CCDirector::sharedDirector ...
- ArcGIS API for JavaScript 4.4学习笔记[新] AJS4.4和AJS3.21新特性
ESRI官网悄无声息突然更新4.4和3.21,公众号也没有什么消息.照例,给大家看看这次更新有什么新特性吧. 1. AJS 4.4 官方更新日志:点我,比较详细.我在这里抽一些主干作为说明. 1.1 ...
- UML设计,可以设计程序的用例图、类图、活动图等_SurfaceView
« 对Cocos2d游戏引擎有一定的了解和实践,并接触过处理3D图形和模型库的OpenGL 在进行游戏界面的绘制工作中,需要处理大量的工作,这些工作有很多共性的操作:并且对于游戏界面的切换,元素动作的 ...
- REHの收藏列表
搬运自本人的AcWing,所以那里的文章会挺多. 友链(同类文章) :bztMinamoto 世外明月 mlystdcall 新人手册:AcWing入门使用指南 前言 有看到好文欢迎推荐(毛遂自荐也可 ...
随机推荐
- CI框架源代码阅读笔记5 基准測试 BenchMark.php
上一篇博客(CI框架源代码阅读笔记4 引导文件CodeIgniter.php)中.我们已经看到:CI中核心流程的核心功能都是由不同的组件来完毕的.这些组件类似于一个一个单独的模块,不同的模块完毕不同的 ...
- 持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
在EJB 2.x中.EJB有3种类型的Bean.各自是会话Bean(Session Bean).消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean). 随 ...
- [置顶] 我的Android进阶之旅------>介绍一款集录制与剪辑为一体的屏幕GIF 动画制作工具 GifCam
由于上一篇文章:我的Android进阶之旅------>Android之动画之Frame Animation实例 中展示的是Frame动画效果,但是之前我是将图片截取下来,不好说明确切的动画过程 ...
- [Angular + Webpack] ocLazyLoad compoment
$stateProvider .state('landing', { url: '/', views: { 'body@': { template: '<olr-landing></ ...
- jsp if else c标签 总结
JSTL标签使用方法 keyword:JSTL标签.<c:choose>.<c:forEach>.<c:forTokens>.<c:if>.<c: ...
- Java基础知识强化90:Date类之Data类中日期和毫秒相互转换
1.Date两个方法: public long getTime():获取时间,以毫秒为单位 public void setTime(long time):设置时间 2. 代码示例: package c ...
- Laravel 加载 js css image 文件
写在前面的话: 1.前提是需要使用blade模板引擎 2.css js image 文件夹建在laravel 的 public 目录下面 3.生成的路径默认都是相对路径 A: 加载css文件 (用下面 ...
- noip 2009 细胞分裂
/*数论题 考察唯一分解定理 当然用到一些技巧*/ #include<iostream> #include<cstdio> #include<cstring> #d ...
- Python 的数据类型
列表 #coding=utf-8 students=["小明","小华","小李","小娟","小云" ...
- ASP.NET-FineUI开发实践-5
1.tree的右键事件和单击事件 页面就不写了,准备一个树和一个菜单控件,随便写点啥 JS:注意注释 var menuSettings = F('menuSettings'); var tree = ...