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 相关文章推荐
用一段js程序来实现动画功能
Mar 06 Javascript
prototype Element学习笔记(篇一)
Oct 26 Javascript
js 图片缩放(按比例)控制代码
May 27 Javascript
JavaScript通过RegExp实现客户端验证处理程序
May 07 Javascript
jquery对元素拖动排序示例
Jan 16 Javascript
二叉树的非递归后序遍历算法实例详解
Feb 07 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
jQuery使用each遍历循环的方法
Sep 19 jQuery
微信小程序性能优化之checkSession的使用
Mar 06 Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 Javascript
对TypeScript库进行单元测试的方法
Jul 18 Javascript
vue.js实现左边导航切换右边内容
Oct 21 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
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
JavaScript驾驭网页-DOM
2016/03/24 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
JavaScript模块详解
2017/12/18 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
Electron 调用命令行(cmd)
2019/09/23 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
python使用PyCharm进行远程开发和调试
2017/11/02 Python
使用Python向DataFrame中指定位置添加一列或多列的方法
2019/01/29 Python
详解Python sys.argv使用方法
2019/05/10 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
pytorch标签转onehot形式实例
2020/01/02 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
大学生入党思想汇报
2014/01/14 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
《宿建德江》教学反思
2014/04/23 职场文书
小学班长竞选演讲稿
2014/04/24 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
销售求职信范文
2014/05/26 职场文书
基层党员对照检查材料
2014/08/25 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
实习协议书范本
2014/09/25 职场文书
护士业务学习心得体会
2016/01/25 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python