Cocos2d实现刮刮卡效果


Posted in Javascript onDecember 20, 2018

本文实例为大家分享了Cocos2d实现刮刮卡效果展示的具体代码,供大家参考,具体内容如下

本文代码适用于Cocos2d-x Quick-Community3.6

local TestScene = class("TestScene", function()
 return display.newScene("TestScene")
end)

function TestScene:ctor()
 
end

function TestScene:onEnter()
 self:initUI()
end

function TestScene:initUI()
 --刮刮卡底层容器
 local scratchLayer = display.newLayer()
 scratchLayer:setContentSize(self:getBoundingBox())
 self:addChild(scratchLayer)

 scratchLayer:setTouchEnabled(true)
 scratchLayer:setTouchMode(cc.TOUCH_MODE_ONE_BY_ONE)

 --创建RenderTexture
 local scratch = cc.RenderTexture:create(scratchLayer:getBoundingBox().width,scratchLayer:getBoundingBox().height)
 scratch:setPosition(scratchLayer:getBoundingBox().width/2,scratchLayer:getBoundingBox().height/2)
 scratch:retain()

 --需要被挂掉的精灵 本文以纯白背景代替
 local bg = cc.Sprite:createWithTexture(nil, cc.rect(0,0 , scratchLayer:getBoundingBox().width,scratchLayer:getBoundingBox().height))
 bg:setColor(cc.c3b(255,255,255))
 bg:setPosition(scratchLayer:getBoundingBox().width/2,scratchLayer:getBoundingBox().height/2)

 --渲染
 scratch:begin()
 bg:visit()
 scratch:endToLua()

 scratchLayer:addChild(scratch)

 --利用DrawNode创建模拟的刮除媒介
 local eraser = cc.DrawNode:create()
 --刮除媒介是个圆 半径为20 具体可自行定义
 local r = 20

 eraser:drawSolidCircle(cc.p(0,0),
 r,
 0,
 r,
 1,
 1,
 cc.c4f(0,0,0,0)
 )

 eraser:retain()

 --开始添加触摸事件
 scratchLayer:addNodeEventListener(cc.NODE_TOUCH_EVENT, function (event)
 --首先把点击区域刮除
 eraser:setPosition(event.x,event.y)

 eraser:setBlendFunc(gl.ONE,gl.ZERO)

 scratch:begin()
 eraser:visit()

 --[[
  重点:因为点击事件回调次数限制,如果没有下面处理,
  当我们快速在屏幕上滑动的时候调用次数不够,会产生一个一个刮除点
  而中间并没有刮除。
  以下代码为刮除两次移动中间矩形区域
 ]]
 local isEnded = false
 if event.name ~= "began" then
  if eraser.lastPos then
  --矩形宽高
  local width = self:getP2PDis(event, eraser.lastPos)
  local height = 2*r
  --矩形中点
  local midPos = cc.p((event.x+eraser.lastPos.x)/2,(event.y+eraser.lastPos.y)/2)
  --旋转角度
  local rotate = self:getP2PAngle(eraser.lastPos, event)

  --矩形刮除媒介
  local polygonEraser = cc.DrawNode:create()
  local points = {
   cc.p(-width/2,-height/2),
   cc.p(-width/2,height/2),
   cc.p(width/2,height/2),
   cc.p(width/2,-height/2)
  }
  polygonEraser:drawPolygon(points, {
   fillColor = cc.c4f(0, 0, 0, 0),
   borderWidth = 1,
   borderColor = cc.c4f(0, 0, 0, 0),
  })

  --刮除矩形区域
  polygonEraser:setRotation(-rotate)

  polygonEraser:setPosition(midPos)

  polygonEraser:setBlendFunc(gl.ONE,gl.ZERO)

  polygonEraser:visit()
  scratch:endToLua()
  isEnded = true
  end
 end

 if not isEnded then
  scratch:endToLua()
 end

 eraser.lastPos = cc.p(event.x,event.y)

 if event.name == "ended" then
  eraser.lastPos = nil
 end

 return true
 end)
end

--两点间距
function TestScene:getP2PDis(p1,p2)
 local x = p1.x - p2.x
  local y = p1.y - p2.y
  return math.abs(math.sqrt(math.pow(x,2)+math.pow(y,2)))
end

--两点连接线倾斜角度
function TestScene:getP2PAngle(p1,p2)
  local x = p1.x - p2.x
  local y = p1.y - p2.y
  return 180 * (math.atan2(y, x) / math.pi)
end

return TestScene

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript学习历程和心得小结
Aug 16 Javascript
javascript学习笔记之函数定义
Jun 25 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
Jun 15 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
Dec 21 Javascript
利用Node.js+Koa框架实现前后端交互的方法
Feb 27 Javascript
JS闭包可被利用的常见场景小结
Apr 09 Javascript
JavaScript面向对象程序设计创建对象的方法分析
Aug 13 Javascript
ES6入门教程之变量的解构赋值详解
Apr 13 Javascript
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue脚手架项目创建步骤详解
Mar 02 Vue.js
原生JS实现飞机大战小游戏
Jun 09 Javascript
浅谈Fetch 数据交互方式
Dec 20 #Javascript
cocos2dx+lua实现橡皮擦功能
Dec 20 #Javascript
element-ui table span-method(行合并)的实现代码
Dec 20 #Javascript
fetch 如何实现请求数据
Dec 20 #Javascript
JS闭包经典实例详解
Dec 20 #Javascript
JS闭包原理与应用经典示例
Dec 20 #Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 #Javascript
You might like
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
超级退弹代码
2008/07/07 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
js浏览器滚动条卷去的高度scrolltop(实例讲解)
2017/07/07 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
js实现日历
2020/11/07 Javascript
Javascript生成器(Generator)的介绍与使用
2021/01/31 Javascript
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python编写一个闹钟功能
2017/07/11 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
Python实现获取nginx服务器ip及流量统计信息功能示例
2018/05/18 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
10个示例带你掌握python中的元组
2020/11/23 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
linux比较文件内容的命令是什么
2013/03/04 面试题
文明家庭事迹材料
2014/12/20 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书
酒店工程部的岗位职责汇总大全
2019/10/23 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis
Python+腾讯云服务器实现每日自动健康打卡
2021/12/06 Python
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技