用过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(,):to(scene) --放大镜效果
--magnifier 放大镜图片
--parent 放大镜父亲节点
--point 放大镜的位置
--magnifierNode 被放大的精灵
function layer:magnifier(magnifierImage,parent,point,magnifierNode)
    --放大镜的模板,也是放大区域
    local magnifierRect = D.img(magnifierImage):p(point):to(parent,)
    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()
    parent._mclip:setZOrder()
    parent:addChild(parent._mclip)     --添加放大镜照片,盖在放大镜区域上
    parent.magnifierNode = magnifierNode:anchor(D.BOTTOM_LEFT):p(,):to(layer._mclip)
    parent.magnifierNode:setScale(1.2)
    --真实的放大镜
    local magnifier = D.img(magnifierImage):p(point):to(parent,)
    --在放大镜上绑定点击功能
    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 =
  magnifierNode.height=   
  layer:magnifier("panda/panda_1.png",layer,ccp(480,320),magnifierNode)

  以上是用ClippingNode实现放大镜效果的代码!

 

结语

  • 实现了放大镜功能,学会了ClippingNode使用

本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士)

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4495550.html

[COCOS2DX-LUA]0-001.利用ClippingNode实现放大镜功能的更多相关文章

  1. Cocos2d-x教程(26)-Cocos2d-x + Lua脚本实现大地图缩放功能

    欢迎增加 Cocos2d-x 交流群: 193411763 视频教程地址:http://www.tudou.com/programs/view/qRiOfppMghM/ 转载请注明原文出处:http: ...

  2. javascript 实现图片放大镜功能

    淘宝上经常用到的一个功能是利用图片的放大镜功能来查看商品的细节 下面我们来实现这样一个功能吧,原理很简单: 实现一个可以随鼠标移动的虚框 在另外一个块中对应显示虚框中的内容 实现思路: 虚框用css中 ...

  3. cocos2d-x 3.0 在C++中调用lua函数

    代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_d ...

  4. cocos2d-x 3.0 在lua中调用自定义类

    环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...

  5. 8、Cocos2dx 3.0三,找一个小游戏开发3.0存储器管理的版本号

    重开发人员的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27693365 复杂的内存管理 移动设备上的硬件资源十 ...

  6. 【cocos2d-x + Lua(1) 绑定Lua并使用tolua++】

    为什么要使用Lua进行游戏开发?转载请注明出处http://www.cnblogs.com/zisou/p/cocos2dx-lua1.html 上面一个问题我觉得在我们使用Lua之前需要深入思考的, ...

  7. cocos2d-x lua绑定解析

    花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...

  8. cocos2d-x + Lua接入iOS原生SDK的实现方案[转]

    相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...

  9. Cocos2dx lua 3D实例代码

    用cocoside 创建一个项目 cocos2dx lua 项目即可 ,然后替换掉gamescene 就可以,具体效果还有函数的参数,相信大家一看就明白.简单说下ide 创建的 cocos lua 项 ...

随机推荐

  1. linux多线程入门

    linux下的多线程通过pthread实现,下面给个简单的例子. #include <stdio.h> #include <stdlib.h> #include <pth ...

  2. matlab-均值滤波

    均值滤波 主要思想为邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度.有效抑制加性噪声.缺点:容易引起图像模糊,可以对其进行改进,主要避开对景物边缘的平滑处理. 均值滤波器的缺点是存在着边缘模 ...

  3. 软件——Ubuntu16.04设置静态ip地址

    1.获取网卡名称 在命令行输入ifconfig -a 2.修改网卡配置文件 sudo vim /etc/network/interfaces 加上下面的配置,IP地址可以成适合你的 auto eth0 ...

  4. Shell简单实现多线程

        一.目的 解决Shell脚本单线程下效率低下的问题 二.适用场景 需要在Linux系统执行同一项命令,但是针对不同的对象,例如PING检测主机,当然可以延展,只要是命令之间不会产生冲突就可以了 ...

  5. maven项目变成web项目

    具体步骤如图所示: 第一步:建议一个Maven Webapp项目  第二步:右击项目,选择属性,找到project facets,点击tuntimes标签选择apache tomcat v6.0选中P ...

  6. python3语法学习第五天--函数(1)

    函数:函数能提高应用的模块性,和代码的重复利用率,是一段可重复使用的代码块 自定义函数: 1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). 2.任何传入参数和自变量必须放在圆括 ...

  7. 02JAVA基础-运算符及选择语句

    一.运算符 1.算数运算符 算数运算符 备注 + 可以用作拼接 - * / 整数相除得整数,需要获得小数,需一方为浮点数 % 取余数 ++ 自增 -- 自减 扩展(1) 对于++和--的扩展(以++为 ...

  8. shrine

    0x01 import flask import os app = flask.Flask(__name__) app.config['FLAG'] = os.environ.pop('FLAG') ...

  9. 黑马程序员_毕向东_Java基础视频教程——进制(随笔)

    进制的特点 进制的由来 任何数据在计算机中都是以二进制的形式存在.二进制最早由电信号演变而来. 一个整数在内存中一样也是二进制,但是使用一大串的0 1组成的二进制数进行使用很麻烦所以就想把一大串缩短点 ...

  10. Docker 集成 Jenkins Gitlab 实现 CI/CD

    首先介绍下环境部分,文章中共涉及到三台服务器,分别用 Gitlab,Jenkins,Deploy 三个名称代替,部署在内网环境,同时因为政策原因,服务器无法直接连通外网.下载 Jenkins 插件时需 ...