用过Iphone的都知道,Iphone在定位光标位置的时候会把内容进行放大,这样我们就能很快的把光标移动到指定的位置。那么在我们的Cocos2dX的游戏中,怎么可以实现这种功能呢。起先我就是想起了Iphone自带的功能,但是这样的话,我们必须做个接口,然后有Iphone和Android两种实现才能完成。在Cocos2dx中,我们更希望的是能过写一套代码能够兼容两个系统,那么我们就要尽量使用Cocos2dx的代码。
后面跟一些朋友讨论后,得出了一个解决方法。
首先我们需要一个东西,能实现把你所要放大的东西按指定的形状进行显示,然后再把显示的内容进行放大。抱着这么一个理念,我们很容易想到了ClippingNode根据指定的模版对精灵进行截取。那么初步思路有了。但是,放大后我们要保证图片的位置不变,放大的区域是以放大镜的中心为锚点放大的,这就要求我们要获得每次放大镜位置改变后被放大物体的锚点,锚点改变后,相应的位置也得改变,才不会造成图像偏移。
好,讲了这么多,大家都应该很好奇效果。那就上两张效果图吧。
我们可以看到了熊猫位置的背景被放大了。
下面我们看看代码怎么实现
--这个不重要,就是示例用的快速创建的层和场景
local scene, layer = game:enterDemoScene()
--获取自己的层
local mainLayer = require("app.test.layer.MainLayer")
--移除测试层,添加自己的层
layer:remove()
layer = mainLayer.new():p(0,0):to(scene)
--放大镜效果
--magnifier 放大镜图片
--parent 放大镜父亲节点
--point 放大镜的位置
--magnifierNode 被放大的精灵
function layer:magnifier(magnifierImage,parent,point,magnifierNode)
--放大镜的模板,也是放大区域 local magnifierRect = D.img(magnifierImage):p(point):to(parent,1)
if parent._mclip ~= nil then
parent._mclip:removeFromParentAndCleanup(true)
parent._mclip = nil
end
--创建ClippingNode,这里要将模板传进去
parent._mclip = CCClippingNode:create(magnifierRect)
parent._mclip:setInverted(false)
parent._mclip:setAlphaThreshold(0)
parent._mclip:setZOrder(1)
parent:addChild(parent._mclip)
--添加放大镜照片,盖在放大镜区域上
parent.magnifierNode = magnifierNode:anchor(D.BOTTOM_LEFT):p(0,0):to(layer._mclip)
parent.magnifierNode:setScale(1.2)
--真实的放大镜
local magnifier = D.img(magnifierImage):p(point):to(parent,2)
--在放大镜上绑定点击功能
magnifier:bindTouch()
function magnifier:onTouchBegan(x,y,touches)
return true
end --移动的时候实时计算放大物件的锚点和位置,当然还有放大模板的位置
function magnifier:onTouchMoved(x,y,touches)
self:p(x,y)
magnifierRect:p(x,y)
local anchor1 = parent.magnifierNode:getAnchorPoint()
--把锚点定位到要放大的位置
parent.magnifierNode:setAnchorPoint(ccp(x/magnifierNode.width ,y/magnifierNode.height))
local anchor2 = parent.magnifierNode:getAnchorPoint()
parent.magnifierNode:p(ccp(parent.magnifierNode:px() + parent.magnifierNode:px() * (anchor2.x - anchor1.x),
parent.magnifierNode:py()+ parent.magnifierNode:py() *(anchor2.y - anchor1.y) ))
end
function magnifierRect:onTouchEnded(x,y,touches)
end
end
--调用代码,要指定width和height,后面计算锚点用
local magnifierNode = mainLayer.new();
magnifierNode.width = 960
magnifierNode.height= 640 layer:magnifier("panda/panda_1.png",layer,ccp(480,320),magnifierNode)
以上是用ClippingNode实现放大镜效果的代码!
结语
- 实现了放大镜功能,学会了ClippingNode使用
本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 )
转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4495550.html
|
请发表评论