使用Cocos2d-x裁剪精灵
2017-5-23 12:13:7
收藏:0
阅读:115
评论:1
我无法对简单的精灵进行裁剪。我使用的是Cocos2d-x 3.1rc0。以下是代码:
这遵循与以下问题相同的模式:
- Opposite of glscissor in Cocos2D?
- Cocos2d-x - how to set part of CCLayer transparent?
- http://www.onemoresoftwareblog.com/2013/12/cocos2d-x-ccclippingnode-triple-c.html (提供了一个很好的例子)
以下是描述问题的图像:

我尝试了各种不同的组合,例如设置clipper:setAlphaThreshold(0)。我甚至试图实现这个人的代码:
顺便说一下,depthFormat设置为GL_DEPTH24_STENCIL8_OES。因此,那不是问题。
另外,为什么模板的绘制从中间开始而不是左下角?我设置了剪辑器和形状的anchorPoint,但无法移动它。困惑。
这是我的AppController.mm代码:
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这是我的解决方案。我使用这段代码来填充进度条。
local size = cc.Director:getInstance():getVisibleSize() local origin = cc.Director:getInstance():getVisibleOrigin() local empty = cc.Sprite:createWithSpriteFrame(cc.SpriteFrameCache:getInstance():getSpriteFrame(_frameName)) -- 将进度条框架完全放入视野中。 local bbox = empty:getBoundingBox() empty:setPosition(bbox.width/2, bbox.height/2) -- 框架的背景层(一个漂亮的透明背景) local bg = createSpriteWithOffset(_bgName, bbox) -- 填充进度条的层 local fill = createSpriteWithOffset(_fillName, bbox) -- 显示在进度条上的文本纹理 local text = cc.Sprite:createWithSpriteFrame(cc.SpriteFrameCache:getInstance():getSpriteFrame(_textName)) local tbbox = text:getBoundingBox() text:setPosition(tbbox.width+70+bbox.x, (tbbox.height*0.5)+bbox.y+bbox.height) -- 左上角调整 -- 模板(掩蔽层) local mask = cc.c4b(0, 0, 0, 1) -- 需要显示的填充像素数 local fillAmt = bbox.width * percent local polygon = {cc.p(0, 0), cc.p(0, bbox.height), cc.p(fillAmt, bbox.height), cc.p(fillAmt, 0), cc.p(0, 0)} local stencil = cc.DrawNode:create() stencil:drawPolygon(polygon, 5, mask, 0, mask) local clipper = cc.ClippingNode:create(stencil) local paper = cc.ClippingNode:create(stencil) paper:addChild(fill) paper:addChild(clipper) local render = cc.RenderTexture:create(bbox.width, bbox.height+(tbbox.height*0.5), cc.TEXTURE2_D_PIXEL_FORMAT_RGB_A8888, gl.DEPTH24_STENCIL8_OES) render:begin() render:addChild(bg) render:addChild(paper) render:addChild(empty) render:addChild(text) bg:visit() paper:visit() empty:visit() text:visit() render:endToLua() local sprite = cc.Sprite:createWithTexture(render:getSprite():getTexture()) sprite:setFlippedY(true) return sprite这是最终结果的图片。
诀窍在于如何创建模板。
始终记住,你的绘图从0,0开始;这很有意义,对吧?同时,有几点需要注意:最好在渲染纹理之后缩放_rendered_纹理,而不是在渲染图像之前缩放纹理。如果你在渲染之前将纹理缩小到一定程度,渲染的质量会很低。最后,我发现将图形渲染在0,0位置要容易得多,而不是在渲染之后将元素定位到你想要的位置。这使得定位最终结果变得更加容易。