zoukankan      html  css  js  c++  java
  • [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

  • 相关阅读:
    加州大学Santa Barbara量化课程
    专利分析与申请(2):SILK 专利的特点
    两种可分级语音编码器的量化器
    芬兰赫尔辛基工业大学DirAC工程:Directional audio coding
    SILK 的 Delay Decision 和 Dither
    Fraunhofer 研究院
    ICASSP 论文发表相关问题
    SILK 学习总结之位分配与低码率编码
    今天测试VOIP软件结果
    国内部分音频语音相关研究企业(实时更新)
  • 原文地址:https://www.cnblogs.com/superdo/p/4495550.html
Copyright © 2011-2022 走看看