W e S D
0 1

[COCOS2DX-LUA]0-001.利用ClippingNode实现放大镜功能

  用过Iphone的都知道,Iphone在定位光标位置的时候会把内容进行放大,这样我们就能很快的把光标移动到指定的位置。那么在我们的Cocos2dX的游戏中,怎么可以实现这种功能呢。起先我就是想起了Iphone自带的功能,但是这样的话,我们必须做个接口,然后有IphoneAndroid两种实现才能完成。在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

 

posted @ 2015-05-11 20:43  SD.Team  阅读(1455)  评论(1编辑  收藏  举报