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类定义例子
Sep 12 Javascript
JS:window.onload的使用介绍
Nov 13 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 Javascript
JS制作手机端自适应缩放显示
Jun 11 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
Document.body.scrollTop的值总为零的快速解决办法
Jun 09 Javascript
JS实现鼠标框选效果完整实例
Jun 20 Javascript
微信jssdk用法汇总
Jul 16 Javascript
vue中各选项及钩子函数执行顺序详解
Aug 25 Javascript
js实现页面导航层级指示效果
Aug 25 Javascript
微信小程序实现倒计时功能
Nov 19 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防注
2007/01/15 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
PHP实现新型冠状病毒疫情实时图的实例
2020/02/04 PHP
js里的prototype使用示例
2010/11/19 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
js之onload事件的一点使用心得
2013/08/14 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
AngularJS学习笔记之基本指令(init、repeat)
2015/06/16 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
搭建基于express框架运行环境的方法步骤
2018/11/15 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
Python 正则表达式实现计算器功能
2017/04/29 Python
python识别验证码图片实例详解
2020/02/17 Python
深入理解Python 多线程
2020/06/16 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
2020/12/08 Python
综合实践活动方案
2014/02/14 职场文书
会计岗位描述
2014/02/22 职场文书
元旦活动感言
2014/03/08 职场文书
2014年个人总结范文
2015/03/09 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
办公室管理规章制度
2015/08/04 职场文书
MySQL基础(一)
2021/04/05 MySQL
python用字节处理文件实例讲解
2021/04/13 Python