-- 借用了花麻将的翻萝卜动画 local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine") local yibinmajiangFanBenJinView = class("yibinmajiangFanBenJinView", cc.UIView); local OTHER_CARD_MOVE_X = 115 -- 上下牌的偏移值 local LAYOUT_SCALE = 0.35 -- 整个layout缩小值 function yibinmajiangFanBenJinView:ctor (desktopType) yibinmajiangFanBenJinView.super.ctor(self); self.desktopType = MJDefine.DesktopType.TwoD self.cardValue = nil self.endCallback = nil self.isShowAni = true self:loadUI(); end function yibinmajiangFanBenJinView:onEnter () yibinmajiangFanBenJinView.super.onEnter(self); self:initViews(); end function yibinmajiangFanBenJinView:loadUI( ) local ui = loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_fanbenjin.ui"); self.ui = ui; self:addChild(ui); end function yibinmajiangFanBenJinView:initViews () self.ui.Items.ImageView:setVisible(false) self.ui.Items.Layout_BenJinCards:setTouchEnabled(true) end -- 设置结束回调 function yibinmajiangFanBenJinView:setEndCallback(endCallback) self.endCallback = endCallback end -- 设置是否要播放动画 function yibinmajiangFanBenJinView:setIsShowAni(isShow) self.isShowAni = isShow end function yibinmajiangFanBenJinView:setCards (cardValue, tingCardTable) self:clearCards() self.cardValue = cardValue self.tingCardTable = tingCardTable local layoutCards = self.ui.Items.Layout_BenJinCards; local card = self:createCard(cardValue, false) local cardBlack = self:createCard(cardValue, true) card:setName('card_benjin') cardBlack:setName('card_black') layoutCards:addChild(card) layoutCards:addChild(cardBlack) self:createTingYongCard() self:startCard() end function yibinmajiangFanBenJinView:startCard() if self.isShowAni then self:startAniOpenCard() else self:startOpenCard() end end -- 开牌动画 --[[ 1.翻转背面 2.翻转正面 3.延迟若干秒数后,显示其他牌 4.其他牌执行显示动画 5.其他牌执行缩小和移动动画 6.结束 ]] function yibinmajiangFanBenJinView:startAniOpenCard() local layoutCards = self.ui.Items.Layout_BenJinCards local card = layoutCards:getChildByName("card_benjin") local cardBlack = layoutCards:getChildByName("card_black") local card_prev = layoutCards:getChildByName("card_prev") local card_next = layoutCards:getChildByName("card_next") card_prev:setVisible(false) card_next:setVisible(false) if not card or not cardBlack or not card_prev or not card_next then return end local cardDelayTime = 0.25 local otherCardMoveTime = 0.25 -- 其他牌移动的时间 card:setScale(cc.p(0, 1.7)) -- 结束操作 local endCallback = function() self:setTingCardColor(card, card_prev, card_next) if self.endCallback then self.endCallback() end end -- 执行缩小和移动动画(移动到左上角) local setCardScaleAndMove = function() local time = 0.5 local layoutSize = self.ui:getContentSize() local moveToPos = cc.p(68, layoutSize.height - 95) -- 移动到的位置 local scaleBy = cc.ScaleBy:create(time, LAYOUT_SCALE) local moveTo = cc.MoveTo:create(time, moveToPos) local end_func = cc.CallFunc:create(endCallback) self.ui.Items.Layout_1:setBackGroundColorOpacity(0) self.ui.Items.ImageView:setVisible(false) self.ui.Items.Layout_BenJinCards:runAction(cc.Sequence:create(cc.Spawn:create(scaleBy, moveTo), end_func)) end -- 执行显示上下牌动画 local showOtherCard = function() card_prev:setVisible(true) card_next:setVisible(true) local prev_moveBy = cc.MoveBy:create(otherCardMoveTime, cc.p(-OTHER_CARD_MOVE_X, 0)) local next_moveBy = cc.MoveBy:create(otherCardMoveTime, cc.p(OTHER_CARD_MOVE_X, 0)) -- local endFunction = cc.CallFunc:create(handler(self, self.hideOpenCard)) card_prev:runAction(prev_moveBy) card_next:runAction(next_moveBy) self:runDelay(otherCardMoveTime + 0.25, setCardScaleAndMove) end -- 正面牌翻转完之后的回调 local cardScaleEndCallback = function() self:runDelay(cardDelayTime, showOtherCard) end -- 背面牌翻转完之后的回调 local blackCardScaleEndCallback = function() local acScale = cc.ScaleTo:create(0.1, 1.7, 1.7, 1) local acCallFunc = cc.CallFunc:create(cardScaleEndCallback) card:runAction(cc.Sequence:create(acScale, acCallFunc)) end local acScaleBlack = cc.ScaleTo:create(0.1, 0, 1.7, 1) local acScaleBlackCb = cc.CallFunc:create(blackCardScaleEndCallback) cardBlack:runAction(cc.Sequence:create(acScaleBlack, acScaleBlackCb)) end -- 不需要动画,直接开牌 function yibinmajiangFanBenJinView:startOpenCard() local layoutCards = self.ui.Items.Layout_BenJinCards local card = layoutCards:getChildByName("card_benjin") local cardBlack = layoutCards:getChildByName("card_black") local card_prev = layoutCards:getChildByName("card_prev") local card_next = layoutCards:getChildByName("card_next") local tingyong = app.room.roomInfo:getGameRule().jingnum local layoutSize = self.ui:getContentSize() cardBlack:setVisible(false) self.ui.Items.Layout_BenJinCards:setVisible(false) -- 先将该层隐藏,避免突然放大缩小 self.ui.Items.Layout_1:setBackGroundColorOpacity(0) self.ui.Items.ImageView:setVisible(false) card_prev:setPositionX(card_prev:getPositionX() - OTHER_CARD_MOVE_X) card_next:setPositionX(card_next:getPositionX() + OTHER_CARD_MOVE_X) self.ui.Items.Layout_BenJinCards:setScale(LAYOUT_SCALE) -- self.ui.Items.Layout_BenJinCards:setPosition(cc.p(68, layoutSize.height - 95)) -- 与上面动画位置一致 self.ui.Items.Layout_BenJinCards:setPositionPercent( cc.p( 68 / layoutSize.width, (layoutSize.height - 95) / layoutSize.height ) ) -- 与上面动画位置一致(这里要用百分比) self:setTingCardColor(card, card_prev, card_next) -- 执行显示动画和结束操作 local function fun_show() self.ui.Items.Layout_BenJinCards:setVisible(true) if self.endCallback then self.endCallback() end end fun_show() end function yibinmajiangFanBenJinView:createCard(cardValue, isBlack) -- local mjType = isBlack and MJDefine.MJType.OutBlack or MJDefine.MJType.Operate local mjType = MJDefine.MJType.Operate -- 用新版的创建时候 -- local CardClass = require('mj_yibinmajiang.luaScript.Views.2d.Card_2d') local CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD) local card = CardClass:new(cardValue, MJDefine.PlayerViewType.My, mjType, -1) local scale = 1.7 local layoutWidth = 200 local w = card:getContentSize().width * scale local x = layoutWidth / 2 card:setAnchorPoint(cc.p(0.5, 0.5)) card:setPositionX(x) card:setScale(scale) -- 显示为盖牌 if isBlack then card:setOperateBackImage() end return card end -- 清除牌 function yibinmajiangFanBenJinView:clearCards( ) self.cardValue = nil self.tingCardTable = nil self.ui.Items.Layout_BenJinCards:removeAllChildren() end -- 重置所有数据 function yibinmajiangFanBenJinView:defaultState() self:clearCards() self.endCallback = nil self.isShowAni = true end -- 创建听用卡 function yibinmajiangFanBenJinView:createTingYongCard() local prevCardValue, nextCardValue = self:getPrevAndNextValue(self.cardValue) local prevCard = self:createCard(prevCardValue, false) local nextCard = self:createCard(nextCardValue, false) prevCard:setName('card_prev') nextCard:setName('card_next') self.ui.Items.Layout_BenJinCards:addChild(prevCard) self.ui.Items.Layout_BenJinCards:addChild(nextCard) end -- 根据牌值获取上下值 function yibinmajiangFanBenJinView:getPrevAndNextValue(cardValue) local prevValue, nextValue = MJDefine.getPrevAndNextValue(cardValue) return prevValue, nextValue end function yibinmajiangFanBenJinView:hideOpenCard() self:setVisible(false) self:defaultState() end function yibinmajiangFanBenJinView:setTingCardColor(card, card_prev, card_next) local tingyong = app.room.roomInfo:getGameRule().jingnum if tingyong then if tingyong == 4 then card_next:setTingColor() elseif tingyong == 8 then card_prev:setTingColor() card_next:setTingColor() elseif tingyong == 11 then card:setTingColor() card_prev:setTingColor() card_next:setTingColor() end end end return yibinmajiangFanBenJinView