您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

262 行
8.7 KiB

  1. -- 借用了花麻将的翻萝卜动画
  2. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  3. local yibinmajiangFanBenJinView = class("yibinmajiangFanBenJinView", cc.UIView);
  4. local OTHER_CARD_MOVE_X = 115 -- 上下牌的偏移值
  5. local LAYOUT_SCALE = 0.35 -- 整个layout缩小值
  6. function yibinmajiangFanBenJinView:ctor (desktopType)
  7. yibinmajiangFanBenJinView.super.ctor(self);
  8. self.desktopType = MJDefine.DesktopType.TwoD
  9. self.cardValue = nil
  10. self.endCallback = nil
  11. self.isShowAni = true
  12. self:loadUI();
  13. end
  14. function yibinmajiangFanBenJinView:onEnter ()
  15. yibinmajiangFanBenJinView.super.onEnter(self);
  16. self:initViews();
  17. end
  18. function yibinmajiangFanBenJinView:loadUI( )
  19. local ui = loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_fanbenjin.ui");
  20. self.ui = ui;
  21. self:addChild(ui);
  22. end
  23. function yibinmajiangFanBenJinView:initViews ()
  24. self.ui.Items.ImageView:setVisible(false)
  25. self.ui.Items.Layout_BenJinCards:setTouchEnabled(true)
  26. end
  27. -- 设置结束回调
  28. function yibinmajiangFanBenJinView:setEndCallback(endCallback)
  29. self.endCallback = endCallback
  30. end
  31. -- 设置是否要播放动画
  32. function yibinmajiangFanBenJinView:setIsShowAni(isShow)
  33. self.isShowAni = isShow
  34. end
  35. function yibinmajiangFanBenJinView:setCards (cardValue, tingCardTable)
  36. self:clearCards()
  37. self.cardValue = cardValue
  38. self.tingCardTable = tingCardTable
  39. local layoutCards = self.ui.Items.Layout_BenJinCards;
  40. local card = self:createCard(cardValue, false)
  41. local cardBlack = self:createCard(cardValue, true)
  42. card:setName('card_benjin')
  43. cardBlack:setName('card_black')
  44. layoutCards:addChild(card)
  45. layoutCards:addChild(cardBlack)
  46. self:createTingYongCard()
  47. self:startCard()
  48. end
  49. function yibinmajiangFanBenJinView:startCard()
  50. if self.isShowAni then
  51. self:startAniOpenCard()
  52. else
  53. self:startOpenCard()
  54. end
  55. end
  56. -- 开牌动画
  57. --[[
  58. 1.翻转背面
  59. 2.翻转正面
  60. 3.延迟若干秒数后,显示其他牌
  61. 4.其他牌执行显示动画
  62. 5.其他牌执行缩小和移动动画
  63. 6.结束
  64. ]]
  65. function yibinmajiangFanBenJinView:startAniOpenCard()
  66. local layoutCards = self.ui.Items.Layout_BenJinCards
  67. local card = layoutCards:getChildByName("card_benjin")
  68. local cardBlack = layoutCards:getChildByName("card_black")
  69. local card_prev = layoutCards:getChildByName("card_prev")
  70. local card_next = layoutCards:getChildByName("card_next")
  71. card_prev:setVisible(false)
  72. card_next:setVisible(false)
  73. if not card or not cardBlack or not card_prev or not card_next then
  74. return
  75. end
  76. local cardDelayTime = 0.25
  77. local otherCardMoveTime = 0.25 -- 其他牌移动的时间
  78. card:setScale(cc.p(0, 1.7))
  79. -- 结束操作
  80. local endCallback = function()
  81. self:setTingCardColor(card, card_prev, card_next)
  82. if self.endCallback then
  83. self.endCallback()
  84. end
  85. end
  86. -- 执行缩小和移动动画(移动到左上角)
  87. local setCardScaleAndMove = function()
  88. local time = 0.5
  89. local layoutSize = self.ui:getContentSize()
  90. local moveToPos = cc.p(68, layoutSize.height - 95) -- 移动到的位置
  91. local scaleBy = cc.ScaleBy:create(time, LAYOUT_SCALE)
  92. local moveTo = cc.MoveTo:create(time, moveToPos)
  93. local end_func = cc.CallFunc:create(endCallback)
  94. self.ui.Items.Layout_1:setBackGroundColorOpacity(0)
  95. self.ui.Items.ImageView:setVisible(false)
  96. self.ui.Items.Layout_BenJinCards:runAction(cc.Sequence:create(cc.Spawn:create(scaleBy, moveTo), end_func))
  97. end
  98. -- 执行显示上下牌动画
  99. local showOtherCard = function()
  100. card_prev:setVisible(true)
  101. card_next:setVisible(true)
  102. local prev_moveBy = cc.MoveBy:create(otherCardMoveTime, cc.p(-OTHER_CARD_MOVE_X, 0))
  103. local next_moveBy = cc.MoveBy:create(otherCardMoveTime, cc.p(OTHER_CARD_MOVE_X, 0))
  104. -- local endFunction = cc.CallFunc:create(handler(self, self.hideOpenCard))
  105. card_prev:runAction(prev_moveBy)
  106. card_next:runAction(next_moveBy)
  107. self:runDelay(otherCardMoveTime + 0.25, setCardScaleAndMove)
  108. end
  109. -- 正面牌翻转完之后的回调
  110. local cardScaleEndCallback = function()
  111. self:runDelay(cardDelayTime, showOtherCard)
  112. end
  113. -- 背面牌翻转完之后的回调
  114. local blackCardScaleEndCallback = function()
  115. local acScale = cc.ScaleTo:create(0.1, 1.7, 1.7, 1)
  116. local acCallFunc = cc.CallFunc:create(cardScaleEndCallback)
  117. card:runAction(cc.Sequence:create(acScale, acCallFunc))
  118. end
  119. local acScaleBlack = cc.ScaleTo:create(0.1, 0, 1.7, 1)
  120. local acScaleBlackCb = cc.CallFunc:create(blackCardScaleEndCallback)
  121. cardBlack:runAction(cc.Sequence:create(acScaleBlack, acScaleBlackCb))
  122. end
  123. -- 不需要动画,直接开牌
  124. function yibinmajiangFanBenJinView:startOpenCard()
  125. local layoutCards = self.ui.Items.Layout_BenJinCards
  126. local card = layoutCards:getChildByName("card_benjin")
  127. local cardBlack = layoutCards:getChildByName("card_black")
  128. local card_prev = layoutCards:getChildByName("card_prev")
  129. local card_next = layoutCards:getChildByName("card_next")
  130. local tingyong = app.room.roomInfo:getGameRule().jingnum
  131. local layoutSize = self.ui:getContentSize()
  132. cardBlack:setVisible(false)
  133. self.ui.Items.Layout_BenJinCards:setVisible(false) -- 先将该层隐藏,避免突然放大缩小
  134. self.ui.Items.Layout_1:setBackGroundColorOpacity(0)
  135. self.ui.Items.ImageView:setVisible(false)
  136. card_prev:setPositionX(card_prev:getPositionX() - OTHER_CARD_MOVE_X)
  137. card_next:setPositionX(card_next:getPositionX() + OTHER_CARD_MOVE_X)
  138. self.ui.Items.Layout_BenJinCards:setScale(LAYOUT_SCALE)
  139. -- self.ui.Items.Layout_BenJinCards:setPosition(cc.p(68, layoutSize.height - 95)) -- 与上面动画位置一致
  140. self.ui.Items.Layout_BenJinCards:setPositionPercent(
  141. cc.p(
  142. 68 / layoutSize.width,
  143. (layoutSize.height - 95) / layoutSize.height
  144. )
  145. ) -- 与上面动画位置一致(这里要用百分比)
  146. self:setTingCardColor(card, card_prev, card_next)
  147. -- 执行显示动画和结束操作
  148. local function fun_show()
  149. self.ui.Items.Layout_BenJinCards:setVisible(true)
  150. if self.endCallback then
  151. self.endCallback()
  152. end
  153. end
  154. fun_show()
  155. end
  156. function yibinmajiangFanBenJinView:createCard(cardValue, isBlack)
  157. -- local mjType = isBlack and MJDefine.MJType.OutBlack or MJDefine.MJType.Operate
  158. local mjType = MJDefine.MJType.Operate
  159. -- 用新版的创建时候
  160. -- local CardClass = require('mj_yibinmajiang.luaScript.Views.2d.Card_2d')
  161. local CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD)
  162. local card = CardClass:new(cardValue, MJDefine.PlayerViewType.My, mjType, -1)
  163. local scale = 1.7
  164. local layoutWidth = 200
  165. local w = card:getContentSize().width * scale
  166. local x = layoutWidth / 2
  167. card:setAnchorPoint(cc.p(0.5, 0.5))
  168. card:setPositionX(x)
  169. card:setScale(scale)
  170. -- 显示为盖牌
  171. if isBlack then
  172. card:setOperateBackImage()
  173. end
  174. return card
  175. end
  176. -- 清除牌
  177. function yibinmajiangFanBenJinView:clearCards( )
  178. self.cardValue = nil
  179. self.tingCardTable = nil
  180. self.ui.Items.Layout_BenJinCards:removeAllChildren()
  181. end
  182. -- 重置所有数据
  183. function yibinmajiangFanBenJinView:defaultState()
  184. self:clearCards()
  185. self.endCallback = nil
  186. self.isShowAni = true
  187. end
  188. -- 创建听用卡
  189. function yibinmajiangFanBenJinView:createTingYongCard()
  190. local prevCardValue, nextCardValue = self:getPrevAndNextValue(self.cardValue)
  191. local prevCard = self:createCard(prevCardValue, false)
  192. local nextCard = self:createCard(nextCardValue, false)
  193. prevCard:setName('card_prev')
  194. nextCard:setName('card_next')
  195. self.ui.Items.Layout_BenJinCards:addChild(prevCard)
  196. self.ui.Items.Layout_BenJinCards:addChild(nextCard)
  197. end
  198. -- 根据牌值获取上下值
  199. function yibinmajiangFanBenJinView:getPrevAndNextValue(cardValue)
  200. local prevValue, nextValue = MJDefine.getPrevAndNextValue(cardValue)
  201. return prevValue, nextValue
  202. end
  203. function yibinmajiangFanBenJinView:hideOpenCard()
  204. self:setVisible(false)
  205. self:defaultState()
  206. end
  207. function yibinmajiangFanBenJinView:setTingCardColor(card, card_prev, card_next)
  208. local tingyong = app.room.roomInfo:getGameRule().jingnum
  209. if tingyong then
  210. if tingyong == 4 then
  211. card_next:setTingColor()
  212. elseif tingyong == 8 then
  213. card_prev:setTingColor()
  214. card_next:setTingColor()
  215. elseif tingyong == 11 then
  216. card:setTingColor()
  217. card_prev:setTingColor()
  218. card_next:setTingColor()
  219. end
  220. end
  221. end
  222. return yibinmajiangFanBenJinView