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中的数学函数
Apr 04 Javascript
扩展jQuery 键盘事件的几个基本方法
Oct 30 Javascript
javascript 异步页面查询实现代码(asp.net)
May 26 Javascript
JavaScript中几种常见排序算法小结
Feb 22 Javascript
前台js改变Session的值(用ajax实现)
Dec 28 Javascript
js 为label标签和div标签赋值的方法
Aug 08 Javascript
基于JS实现二维码图片固定在右下角某处并跟随滚动条滚动
Feb 08 Javascript
微信小程序 按钮滑动的实现方法
Sep 27 Javascript
vue webpack打包优化操作技巧
Feb 22 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
Element Tooltip 文字提示的使用示例
Jul 26 Javascript
详解jQuery的核心函数和事件处理
Feb 18 jQuery
浅谈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
玛琪朵 Macchiato
2021/03/03 咖啡文化
PHP 开源框架22个简单简介
2009/08/24 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
自动化Nginx服务器的反向代理的配置方法
2015/06/28 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
Python实现的本地文件搜索功能示例【测试可用】
2018/05/30 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
浅谈flask源码之请求过程
2018/07/26 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
简单了解python中的与或非运算
2019/09/18 Python
python中setuptools的作用是什么
2020/06/19 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
英国奢侈品牌时尚购物平台:Farfetch(支持中文)
2020/02/18 全球购物
Java如何调用外部Exe程序
2015/07/04 面试题
工厂仓管员岗位职责
2014/01/01 职场文书
《都江堰》教学反思
2014/02/07 职场文书
座谈会主持词
2014/03/20 职场文书
就业协议书样本
2014/08/20 职场文书
2014年高中生自我评价范文
2014/09/26 职场文书
公司股份合作协议书
2014/12/07 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
小学大队委竞选口号
2015/12/25 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis