欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Cocos2d实现刮刮卡效果

程序员文章站 2022-03-24 13:02:43
本文实例为大家分享了cocos2d实现刮刮卡效果展示的具体代码,供大家参考,具体内容如下 本文代码适用于cocos2d-x quick-community3...

本文实例为大家分享了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

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