当前位置: 首页 > news >正文

【2014-01-26】cocos2dx学习笔记:CCClippingNode

[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2014-01-26| 标题:cocos2dx学习笔记:CCClippingNode分类:编程 / C && C++ / cocos2dx |标签:cocos2dx·CCClippingNode


cocos2dx学习笔记:CCClippingNode

    • CCClippingNode 使用注意事项
    • CCClippingNode 例子
    • CCClippingNode源码分析
      • CCClippingNode中的Stencil节点的位置

以下内容转自【 http://blog.sina.com.cn/s/blog_59b4c31c0101iom0.html 】

CCClippingNode 使用注意事项

最近使用了cocos2d-x 的CCClippingNode,在VC下编译可以出现效果,但是在IOS上毫无效果,发现网上也有人提出这个问题,先把方法记下来。

原帖地址:http://cocos2d-x.org/boards/6/topics/20141?r=20567#message-20567

for
iOS:

in AppController replace the gl-view creation with:

EAGLView*__glView=[EAGLView viewWithFrame:pixelFormat:kEAGLColorFormatRGBA8 depthFormat:GL_DEPTH24_STENCIL8_OES preserveBackbuffer:NO sharegroup:nil multiSampling:NO numberOfSamples:0];

for
Android:

in
game activity:

publicCocos2dxGLSurfaceViewonCreateView(){Cocos2dxGLSurfaceViewglSurfaceView=newCocos2dxGLSurfaceView(this);glSurfaceView.setEGLConfigChooser(5,6,5,0,16,8);returnglSurfaceView;}

CCClippingNode 例子

首先是两张图片:

background.png:来自cocos2dx的例子资源

smallcircle.png:

可以看到,smallcircle.png中间是透明****的,最外侧是透明的,整个png是个正方形

代码1:

CCSprite*bg=CCSprite::create("background.png");CCSprite*stencilA=CCSprite::create("smallcircle.png");CCClippingNode*clipA=CCClippingNode::create();clipA->setStencil(stencilA);clipA->addChild(bg);clipA->setAnchorPoint(ccp(0,0));clipA->setPosition(ccp(300,300));this->addChild(clipA);

效果图:

加了透明度阈值判断的代码2:

CCSprite*bg=CCSprite::create("background.png");CCSprite*stencilA=CCSprite::create("smallcircle.png");CCClippingNode*clipA=CCClippingNode::create();clipA->setStencil(stencilA);clipA->addChild(bg);clipA->setAlphaThreshold(GLfloat(0.5f));clipA->setAnchorPoint(ccp(0,0));clipA->setPosition(ccp(300,300));this->addChild(clipA);

效果图:

设置了反转的代码3:

CCSprite*bg=CCSprite::create("background.png");CCSprite*stencilA=CCSprite::create("smallcircle.png");CCClippingNode*clipA=CCClippingNode::create();clipA->setStencil(stencilA);clipA->addChild(bg);clipA->setAlphaThreshold(GLfloat(0.5f));clipA->setInverted(true);clipA->setAnchorPoint(ccp(0,0));clipA->setPosition(ccp(300,300));this->addChild(clipA);

效果图:

CCClippingNode源码分析

后面用到了在仔细分析吧。

先贴个网址【 http://blog.csdn.net/crazyjumper/article/details/1968567 】

更新【2014年5月8日11:38:06】

CCClippingNode中的Stencil节点的位置

首先看下CCSprite的部分代码,通过这部分代码,我们可以知道,CCSprite在有texture的时候,默认锚点和默认位置分别为【0.5,0.5】和【0,0】:

constCCPoint CCPointZero=CCPointMake(0,0);。。classCC_DLLCCSprite:publicCCNodeRGBA,publicCCTextureProtocol 。。classCC_DLLCCNodeRGBA:publicCCNode,publicCCRGBAProtocol 。。CCNode::CCNode(void)。。。。,m_obPosition(CCPointZero),m_obAnchorPointInPoints(CCPointZero),m_obAnchorPoint(CCPointZero)。。。。// designated initializerboolCCSprite::initWithTexture(CCTexture2D*pTexture,constCCRect&rect,boolrotated){。。。// default transform anchor: centersetAnchorPoint(ccp(0.5f,0.5f));。。。}

那么stencil的绘制位置是如何确定的,看下CCClippingNode的部分代码:

voidCCClippingNode::setStencil(CCNode*pStencil){CC_SAFE_RELEASE(m_pStencil);m_pStencil=pStencil;CC_SAFE_RETAIN(m_pStencil);}voidCCClippingNode::visit(){。。。。。 。。。。。// draw the stencil node as if it was one of our child// (according to the stencil test func/op and alpha (or alpha shader) test)kmGLPushMatrix();transform();m_pStencil->visit();kmGLPopMatrix();。。。。。 。。。。。}

这里就很明显了,Stencil在绘制时是作为CCClippingNode的子节点绘制的

我们这样看下最简单的代码:

CCSprite*background=CCSprite::create("background.jpg");CCSprite*stencil=CCSprite::create("stencil.png");CCClippingNode*clipA=CCClippingNode::create();clipA->setStencil(stencil);clipA->addChild(background);//==>>background的锚点(0.5,0.5),位置(0,0)//==>>stencil的锚点(0.5,0.5),位置(0,0)

这里可以知道background和stencil都是clipA的子节点,而且锚点和位置都相同,那么它们都会被绘制到clipA的中心位置。

http://www.jsqmd.com/news/1199335/

相关文章:

  • Visio数据流图绘制:从零基础到专业建模的实战指南
  • AI Agent智能体开发:从架构设计到生产部署的完整指南
  • 蓝牙模块选型实战:从协议解析到硬件接口的避坑指南
  • [一]开源ERP:odoo19二次开发问题-原库存模块问题
  • C语言文件大小获取:fseek/ftell与stat方法详解与实践
  • Rider接入豆包与智谱AI的插件开发实战指南
  • oeAware-scenario:华为开源的低开销场景感知工具完整指南
  • KV缓存量化技术:提升大模型长文本生成效率
  • 为什么Hive的元数据需要存放在传统的关系型数据库内
  • agent面试必备38-AI Agent 核心架构:短期记忆(Working Memory)
  • 广州爱彼回收价格查询与各大回收平台实测排行(2026年7月最新) - 诚收名表回收平台
  • Linux文件共享服务:FTP与NFS配置与安全实践
  • 免费投票链接制作平台哪个靠谱?2026无广告专业平台推荐 - 微信投票小程序
  • 青岛市南香奈儿二手包回收头部商家逸程,香奈儿在线鉴定估价顶尖 - 全城热点
  • 实战解析:基于Spring Boot的微信支付服务商模式多商户收款APP开发
  • VSCode新特性:操作系统级快捷键
  • 2026 无锡逸程|宝曼兰朵回收价曝光,卖之前一定要自查! - 全城热点
  • ArcGIS JS 基础教程(18):SceneLayer 场景图层
  • 格局全面跃升!东软光子CT多维领跑,确立国产绝对龙头地位
  • 多传感器融合定位:从松紧耦合到算法实战
  • HarmonyOS 6.1 单元测试与自动化Mock:保障代码质量的最后一道防线
  • AICoding工程化:从模型崇拜到规格驱动的实践
  • 苏州万国回收价格查询及靠谱平台实测排行(2026年7月最新数据) - 收的高名表回收平台
  • 数字水印技术解析:原理、应用与深度学习实现
  • 计算机二级C语言备考攻略:高频考点与应试技巧解析
  • 下半年昆明前兴路回收名表选逸程!拒绝虚假报价,线上线下报价一致 - 融媒生活
  • Python数据分析课程
  • 贵州某211-实验7助睿“自媒体运营分析-数据清洗与预处理+作品特征构建+可视化探索”三合一
  • 华为设备6to4隧道实战:打通IPv6孤岛的自动隧道配置
  • 劳力士成都官方售后服务体系全攻略|最新网点地址及官网热线权威公布(2026年7月最新) - 劳力士中国服务中心