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数组组合成字符串的脚本
Jan 06 Javascript
在Windows上安装Node.js模块的方法
Sep 25 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
jquery focus(fn),blur(fn)方法实例代码
Dec 16 Javascript
js如何获取object类型里的键值
Feb 18 Javascript
bootstrap改变按钮加载状态
Dec 01 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
Jul 27 Javascript
Vue实现路由跳转和嵌套
Jun 20 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
详解React中setState回调函数
Jun 14 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
浅谈Vue SSR中的Bundle的具有使用
Nov 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自定义图片缩放函数实现等比例不失真缩放的方法
2016/08/19 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
浅谈javascript中基本包装类型
2015/06/03 Javascript
JS实现的不规则TAB选项卡效果代码
2015/09/18 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
JS点击图片弹出文件选择框并覆盖原图功能的实现代码
2017/08/25 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
微信小程序实现点击按钮后修改颜色
2019/12/05 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
简述Python中的面向对象编程的概念
2015/04/27 Python
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
Python网络编程之TCP与UDP协议套接字用法示例
2018/02/02 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python递归实现打印多重列表代码
2020/02/27 Python
python实现梯度下降法
2020/03/24 Python
windows支持哪个版本的python
2020/07/03 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
2014年元旦促销活动方案
2014/02/22 职场文书
八项规定对照检查材料
2014/08/31 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
公司车辆管理制度
2015/08/04 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书