local MJ=MJFramework.MJImport("mj.luaScript.Views.Game.MJ") local MJDefine=MJFramework.MJImport("mj.luaScript.MJDefine") local MJGroupFactory=MJFramework.MJImport("mj.luaScript.Views.Game.MJGroupFactory") local MJPositionCompnent = MJFramework.MJImport("mj.luaScript.Views.Compnent.MJPositionCompnent") local MJMessage=MJFramework.MJImport("mj.luaScript.Protocol.MJMessage") local MJSound=MJFramework.MJImport("mj.luaScript.MJSound") local MJHandCardView = class("MJHandCardView",cc.UIView) local SWAP_CARD_TAG = 999 -- function() -- local node=cc.Layer:create()--LayerColor:create(cc.c4b(255,255,255,255)) -- -- -- node:setAnchorPoint(cc.p(0.5,0.5)) -- -- -- node:ignoreAnchorPointForPosition(false) -- return node -- end) --左边麻将的高度 -- local MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT=30 --左边麻将的X轴偏移修正 -- local MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X=7 -- local MJDefine.MJ_HAND_CARD_RIGHT_OFFSET_X=7.5 --对家牌的X轴偏远量 -- local MJDefine.MJ_HAND_CARD_TOP_OFFSET_X=3 --触摸牌Y的偏移量 -- local MJDefine.MJ_HAND_CARD_TOUCH_Y=20 --触摸按钮的偏移量 -- local MJDefine.MJ_OPERATE_PADDING=150 -- local MJDefine.MJ_MAX_ZORDER=14 -- local MJDefine.MJ_TOP_SCALE=1 -- local MJDefine.MJ_TOUCH_OUT_CARD_Y=250 --出牌速度 -- local MJDefine.MJ_TIME_OUT_CARD=0 -- local MJDefine.MJ_TIME_OUT_CARD_SCALE=0.1 -- local MJDefine.MJ_TIME_OUT_CARD_WAIT=0.3 -- local MJDefine.MJ_OUT_CARD_SCALE=0.5 function MJHandCardView:ctor(viewId,desktopType) MJHandCardView.super.ctor(self) -- self.ui.Items.Layout_Hand_Card:setVisible(false) -- self.ui.Items.Layout_Operate:ignoreAnchorPointForPosition(true) self.viewId=viewId or MJDefine.MyViewId self.desktopType=desktopType or MJDefine.DesktopType.ThreeD --初始化视图 self:initView() self.handCards={} self.handGroupCards={} self.outCards={} self.touchMJ=nil self.isOutCard=false self.isReplay=false --self:onEnter() if self.viewId == MJDefine.PlayerViewType.My then self:initTouchEvent() end end function MJHandCardView:loadUI() local ui if self.desktopType==MJDefine.DesktopType.TwoD or self.desktopType==MJDefine.DesktopType.TwoDGold then ui = loadUI("mj/res/ui/ui_fangjian/mj_ui_hand_card_2d.ui"); else ui = loadUI("mj/res/ui/ui_fangjian/mj_ui_hand_card.ui"); end self.ui = ui; self:addChild(ui) end function MJHandCardView:initView() if self:isUseNew3D() then self:initNew3DUI() else self:loadUI() self.ui.Items.Layout_Operate:setVisible(false) self.ui.Items.Button_Sure:setVisible(false) self.ui.Items.Button_Sure:registerClick(function() if not self.touchMJ then showTooltip("请选择要出的麻将!") end self:sendOutCard() end) print("MJHandCardView:"..self.viewId) self.initX=self.ui.Items["ImageView_Start_"..self.viewId]:getPositionX()--MJDefine.MJStartPositions[self.viewId].x self.initY=self.ui.Items["ImageView_Start_"..self.viewId]:getPositionY()--MJDefine.MJStartPositions[self.viewId].y print("手牌起始位置self.initX = "..self.initX.."self.initY"..self.initY) if self.viewId == MJDefine.PlayerViewType.My then self.initX = self.initX + (CONST_WIDTH*g_radio_x-CONST_WIDTH)/2 print("调整过后我的位置self.initX = "..self.initX.."self.initY"..self.initY) else self.initX = self.initX*g_radio_x self.initY = self.initY*g_radio_y print("调整过后其他人位置self.initX = "..self.initX.."self.initY"..self.initY) end self.outX=self.ui.Items["ImageView_Out_"..self.viewId]:getPositionX() self.outY=self.ui.Items["ImageView_Out_"..self.viewId]:getPositionY() print("出牌起始位置self.outX = "..self.outX.."self.outY"..self.outY) self.outX = self.outX*g_radio_x self.outY = self.outY*g_radio_y print("出牌调整后的起始位置self.outX = "..self.outX.."self.outY"..self.outY) --如果是2人房 调整出牌坐标 if app.room:getMaxPlayerCount()==2 then if self.viewId == MJDefine.PlayerViewType.My then self.outX=self.outX-200 elseif self.viewId == MJDefine.PlayerViewType.Top then self.outX=self.outX+180 end end -- if self.viewId~=MJDefine.MyViewId then self.showCardPostion=self.ui.Items["ImageView_Show_"..self.viewId]:getPosition() -- end print("showCard起始位置self.showCardPostion x = "..self.showCardPostion.x.."y = "..self.showCardPostion.y) self.showCardPostion.x = self.showCardPostion.x*g_radio_x self.showCardPostion.y = self.showCardPostion.y*g_radio_y print("showCard调整后起始位置self.showCardPostion x = "..self.showCardPostion.x.."y = "..self.showCardPostion.y) self.ui.Items.Layout_Hand_Card:removeAllChildren() end end --- -- 初始化新3d牌 -- function MJHandCardView:initNew3DUI() self:loadUI() if self.ui.Items.Layout_Hand_Card then self.ui.Items.Layout_Hand_Card:setVisible(false) end if self.ui.Items.Layout_OperateItem then self.ui.Items.Layout_OperateItem:setVisible(false) end if self.ui.Items.Button_Sure then self.ui.Items.Button_Sure:setVisible(false) end local MJConfig = MJDefine.MJConfig_2d if self.desktopType == MJDefine.DesktopType.ThreeD then MJConfig = MJDefine.MJConfig_3d end local MahjongHandCard = require(MJConfig.HANDCARD_VIEW) local MahjongOutCardView = require(MJConfig.OUTCARD_VIEW) local MahjongHuCardView = require(MJConfig.HU_CARD_VIEW) self._outCardView = MahjongOutCardView:new(self.viewId) self:addChild(self._outCardView) -- 手牌和胡牌互换位置 self._handcard = MahjongHandCard:new(self.viewId, self.desktopType) self:addChild(self._handcard) self._huCardView = MahjongHuCardView:new(self.viewId) self:addChild(self._huCardView) self.ui:setLocalZOrder(10) end --设置是否回放 function MJHandCardView:setReplay(b) if self:isUseNew3D() then self._handcard:setReplay(b) else self.isReplay=b end end function MJHandCardView:onEnter() MJHandCardView.super.onEnter(self) -- local argGroup={ -- -- {opType=MJDefine.MJGroupType.Chi,values={1,2,3}}, -- -- {opType=MJDefine.MJGroupType.Chi,values={11,12,13}}, -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}}, -- -- -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}}, -- {opType=MJDefine.MJOperateType.OPREATE_ZHIGANG,showType=MJDefine.MJGroupType.Gang,values={1,1,1,1}}, -- -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}}, -- -- {opType=MJDefine.MJOperateType.OPREATE_BAGANG,showType=MJDefine.MJGroupType.AnGang,values={2,2,2,2}}, -- } -- self:createGroupCards(argGroup) -- -- -- -- self:createGroupCards(argGroup) -- cc.SpriteFrameCache:getInstance():addSpriteFramesWithFile("mj/res/ui/zy_fangjian/mj_2d.plist") -- local arg={ -- {card=0x25}, -- {card=0x21}, -- {card=0x22}, -- {card=0x23}, -- {card=0x24}, -- {card=0x25}, -- {card=0x26}, -- {card=0x27}, -- {card=0x28}, -- {card=0x29}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- -- -- {card=0x01}, -- -- -- {card=0x01}, -- -- -- {card=0x01}, -- } -- self:createHandCards(arg) -- self:createHandCards(arg) -- self:moveLastCard() -- self:createOpenHandCards(arg) -- self:createGroupCards(argGroup) -- self:resetHandCards() -- arg={ -- {card=0x25}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- {card=0x01}, -- } -- self:createOutCards(arg) --绑定事件 self:bindEvent(app.room , MJDefine.MJEvent.SelectCard , handler(self , self.selectCard)) self:bindEvent(app.room , MJDefine.MJEvent.OutCardFalg , handler(self , self.outCardFalg)) self:bindEvent(app.room , MJDefine.MJEvent.ShowTangView , handler(self , self.showTangView)) self:bindEvent(app.room , MJDefine.MJEvent.BaiError , handler(self , self.BaiError)) self:bindEvent(app.room , MJDefine.MJEvent.ClearBaiView , handler(self , self.ClearBaiView)) end function MJHandCardView:pushTing() if self:isUseNew3D() then self._handcard:pushTing() else local tings=app.room.roomInfo.tings if tings then for value,v in pairs(tings) do for _,mj in pairs(self.handCards) do if mj.value==value then mj:setTing(true) end end -- local mj=self:getMjByValue(value) end end end end --最后一张牌显示箭头 function MJHandCardView:pushLastCardTing() if self:isUseNew3D() then self._handcard:pushLastCardTing() else --爆牌状态只给最后一张牌加听标志 self:setTing(false) local mj = self.handCards[#self.handCards] mj:setTing(true) end end function MJHandCardView:setTing(b) local handCarsNum = self:getHandCardsNum() if not (handCarsNum%3 == 2) then--如果不是出牌阶段,不显示箭头 b = false end if self:isUseNew3D() then self._handcard:setTing(b) else for k,mj in pairs(self.handCards) do mj:setTing(b) end end end function MJHandCardView:selectCard(event) --if not self.touchMJ then return end if event.value then for k,v in pairs(self.outCards) do if not tolua.isnull(v) then if v.value==event.value then v:setStatus(MJDefine.MJStatus.Select) else v:setStatus(MJDefine.MJStatus.Normal) end end end else --self:setTing(false) for k,v in pairs(self.outCards) do if v.status~=MJDefine.MJStatus.Disable and (not tolua.isnull(v)) then v:setStatus(MJDefine.MJStatus.Normal) end end end -- app.room:dispatchEvent({name = "showProp",response = response}); end function MJHandCardView:outCardFalg(event) if self:isUseNew3D() then self._outCardView:outCardFalg(event) else for k,v in pairs(self.outCards) do for i,child in pairs(v:getChildren()) do local tag = child:getTag() if tag ~= MJ.MJ_HAND_CARD_FLAG_LAIZI then child:removeFromParent() end end end local mj=self.outCards[#self.outCards] if event.value and mj and mj.value==event.value and event.viewId==self.viewId then local falg=cc.Sprite:createWithSpriteFrameName("mj_room_out_falg.png") -- falg:setScale(0.8) mj:addChild(falg) falg:setPosition(mj:getContentSize().width/2,mj:getContentSize().height+10) local moveBy=cc.MoveBy:create(0.5,cc.p(0,5)) falg:runAction(cc.RepeatForever:create(cc.Sequence:create(moveBy,moveBy:reverse()))) end end end --显示躺界面 function MJHandCardView:showTangView(event) end --摆牌错误 function MJHandCardView:BaiError(event) end --清除摆牌界面 function MJHandCardView:ClearBaiView(event) end --躺成功了 function MJHandCardView:setTangSuccess(is) if is and self.tangView and (not tolua.isnull(self.tangView)) then self.tangView:removeFromParent() self.tangView = nil end self:tangCardEnabled(false) if self:isUseNew3D() then self._handcard:setTangSuccess(is) else self.isTangCard = is end end function MJHandCardView:isCanOutCard() if self:isUseNew3D() then return self._handcard:isCanOutCard(true) else return self.isOutCard end end function MJHandCardView:setOutCardEnable(b) logD("MJHandCardView:setOutCardEnable", b) if self:isUseNew3D() then self._handcard:setOutCardEnable(b) else self.isOutCard=b if b then self:moveLastCard() end if self.viewId==MJDefine.MyViewId and self.ui.Items.Button_Sure then self.ui.Items.Button_Sure:setVisible(b) end end end function MJHandCardView:moveLastCard() local count=#self.handCards if count>=2 then local frontMj=self.handCards[count-1] local lastMj=self.handCards[count] local margin=0 local frontX=frontMj:getPositionX() local frontY=frontMj:getPositionY() local lastX=lastMj:getPositionX() local lastY=lastMj:getPositionY() local MJLastHandCardOffset=MJDefine.MJLastHandCardOffset[self.desktopType] local MJ_HAND_CARD_LEFT_PADDING_HEIGHT = MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT[self.desktopType] --根据视图ID 计算坐标 if self.viewId==MJDefine.PlayerViewType.My then margin=lastMj:getContentSize().width local space = math.ceil(math.abs(lastX-frontX)) if space == margin then lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x) end elseif self.viewId==MJDefine.PlayerViewType.Left then margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT if math.abs(lastY-frontY)==margin then lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x) lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y) end elseif self.viewId==MJDefine.PlayerViewType.Right then margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT if math.abs(lastY-frontY)==margin then lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x) lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y) end elseif self.viewId==MJDefine.PlayerViewType.Top then margin=lastMj:getContentSize().width-MJDefine.MJ_HAND_CARD_TOP_OFFSET_X -- print("width:"..lastMj:getContentSize().width) if math.abs(lastX-frontX)==margin then lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x) end end end end function MJHandCardView:createGroupCards(arg,fromViewId) if self:isUseNew3D() then self._handcard:createGroupCards(arg, fromViewId) else --[[arg={ -- {opType=MJDefine.MJGroupType.Chi,values={1,2,3}}, -- {opType=MJDefine.MJGroupType.Chi,values={11,12,13}}, {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}}, {opType=MJDefine.MJOperateType.OPREATE_ZHIGANG,showType=MJDefine.MJGroupType.Gang,values={1,1,1,1}}, {opType=MJDefine.MJOperateType.OPREATE_BAGANG,showType=MJDefine.MJGroupType.AnGang,values={2,2,2,2}}, }--]] local x=self.initX local y=self.initY local MJGroupStartOffSet = MJDefine.MJGroupStartOffSet[self.desktopType] for k,v in pairs(arg) do if not fromViewId then fromViewId = v.fromViewId end local group=MJGroupFactory.CreateGroup(v.values,v.showType,self.viewId,self.desktopType,fromViewId) if group then group.opType=v.opType self.ui.Items.Layout_Hand_Card:addChild(group,-4+#self.handGroupCards) group:setPosition(cc.p(x+MJGroupStartOffSet[self.viewId].x,y+MJGroupStartOffSet[self.viewId].y)) if group and (v.opType == MJDefine.MJOperateType.OPREATE_PENG or v.opType == MJDefine.MJOperateType.OPREATE_ZHIGANG or v.opType == MJDefine.MJOperateType.OPREATE_BAGANG) then --设置吃碰杠来源 group:setDirection(self.viewId,fromViewId) end -- --根据视图ID 计算坐标 -- if self.viewId==MJDefine.PlayerViewType.My then -- x=x+group:getContentSize().width -- elseif self.viewId==MJDefine.PlayerViewType.Left then -- x=x-MJDefine.MJGroupMarginOffSet[self.viewId].x -- y=y-group:getContentSize().height-MJDefine.MJGroupMarginOffSet[self.viewId].y -- elseif self.viewId==MJDefine.PlayerViewType.Right then -- x=x-MJDefine.MJGroupMarginOffSet[self.viewId].x -- y=y+group:getContentSize().height+MJDefine.MJGroupMarginOffSet[self.viewId].y -- elseif self.viewId==MJDefine.PlayerViewType.Top then -- x=x-group:getContentSize().width -- end x,y=MJPositionCompnent.getGroupPosition(self.viewId,x,y,group,self.desktopType) table.insert(self.handGroupCards,group) end end --更新起始位置 self.initX=x self.initY=y -- self:updateInitPostion(x,y) end end --更新初始坐标 function MJHandCardView:getInitHandCardPostion() local initX=self.initX local initY=self.initY local MJGroupWithMJMargin=MJDefine.MJGroupWithMJMargin[self.desktopType] --如果有麻将组重新定位手牌位置 if #self.handGroupCards>0 then local lastGroup=self.handGroupCards[#self.handGroupCards] if self.viewId==MJDefine.PlayerViewType.My then -- initX=initX--+MJGroupWithMJMargin[self.viewId].x elseif self.viewId==MJDefine.PlayerViewType.Left then initX=initX+MJGroupWithMJMargin[self.viewId].x initY=lastGroup:getPositionY()-lastGroup:getContentSize().height/2-MJGroupWithMJMargin[self.viewId].y elseif self.viewId==MJDefine.PlayerViewType.Right then initX=initX+MJGroupWithMJMargin[self.viewId].x initY=lastGroup:getPositionY()+lastGroup:getContentSize().height/2+MJGroupWithMJMargin[self.viewId].y elseif self.viewId==MJDefine.PlayerViewType.Top then -- initX=initX--+MJGroupWithMJMargin[self.viewId].x end end return initX,initY end function MJHandCardView:getGroup(card,opType) if self:isUseNew3D() then self._handcard:getGroup(card, opType) else for k,v in pairs(self.handGroupCards) do if v.opType==opType and v.mjs[1].value==card then return v end end end end function MJHandCardView:buGang(card) if self:isUseNew3D() then self._handcard:buGang(card) else local oldGroup=self:getGroup(card,MJDefine.MJOperateType.OPREATE_PENG) if not oldGroup then return end local newGroup=MJGroupFactory.CreateGroup({card,card,card,card},MJDefine.MJGroupType.Gang,self.viewId,self.desktopType) newGroup.opType=MJDefine.MJOperateType.OPREATE_BAGANG newGroup:setPosition(oldGroup:getPosition()) self.ui.Items.Layout_Hand_Card:addChild(newGroup) local index=table.indexOf(self.handGroupCards,oldGroup) table.remove(self.handGroupCards,index) table.insert(self.handGroupCards,index,newGroup) oldGroup:removeFromParent() end end function MJHandCardView:retoreBuGang(card) if self:isUseNew3D() then self._handcard:restoreBuGang(card) else local oldGroup=self:getGroup(card,MJDefine.MJOperateType.OPREATE_BAGANG) if not oldGroup then return end local newGroup=MJGroupFactory.CreateGroup({card,card,card},MJDefine.MJGroupType.Peng,self.viewId,self.desktopType) newGroup.opType=MJDefine.MJOperateType.OPREATE_PENG newGroup:setPosition(oldGroup:getPosition()) self.ui.Items.Layout_Hand_Card:addChild(newGroup) local index=table.indexOf(self.handGroupCards,oldGroup) table.remove(self.handGroupCards,index) table.insert(self.handGroupCards,index,newGroup) oldGroup:removeFromParent() end end -- function MJHandCardView:get( ... ) -- -- body -- end function MJHandCardView:createHandCards(arg) if self:isUseNew3D() then self._handcard:createHandCards(arg) else if not arg then return end if type(arg)=="number" then arg={ {card=arg} } end local initX,initY=self:getInitHandCardPostion()--=self.initX -- local initY=self.initY for k,v in pairs(arg) do local mj--=MJ:new(v.card,MJDefine.MJType.Stand,self.viewId) if v and v.card then if self.isReplay and self.viewId~=MJDefine.MyViewId then mj=MJ:new(v.card,MJDefine.MJType.Operate,self.viewId,self.desktopType) else mj=MJ:new(v.card,MJDefine.MJType.Stand,self.viewId,self.desktopType) end self.ui.Items.Layout_Hand_Card:addChild(mj) -- local x=initX -- local y=initY -- --根据视图ID 计算坐标 -- if self.viewId==MJDefine.PlayerViewType.My then -- x=initX+#self.handCards*mj:getContentSize().width -- elseif self.viewId==MJDefine.PlayerViewType.Left then -- x=initX-MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X*#self.handCards -- y=initY-MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT*#self.handCards -- mj:setLocalZOrder(#self.handCards) -- elseif self.viewId==MJDefine.PlayerViewType.Right then -- x=initX-MJDefine.MJ_HAND_CARD_RIGHT_OFFSET_X*#self.handCards -- y=initY+MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT*#self.handCards -- mj:setLocalZOrder(MJDefine.MJ_MAX_ZORDER-#self.handCards) -- elseif self.viewId==MJDefine.PlayerViewType.Top then -- x=initX-mj:getContentSize().width*#self.handCards+MJDefine.MJ_HAND_CARD_TOP_OFFSET_X*#self.handCards -- end local x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,#self.handCards,self.desktopType) mj:setPosition(x,y) table.insert(self.handCards,mj) end end -- for k,v in pairs(self.handCards) do -- logD(v.newValue.."->zorder:"..v:getLocalZOrder()) -- end end function MJHandCardView:resetHandCards(insertMj,isAnimation) if self:isUseNew3D() then self._handcard:resetHandCards() else -- local initX=self.initX -- local initY=self.initY local initX,initY=self:getInitHandCardPostion() local x=initX local y=initY local insertX=0 local insertY=0 self:sortHandCards() for k,mj in pairs(self.handCards) do mj:setStatus(MJDefine.MJStatus.Normal) if insertMj==mj then --记录插入麻将的坐标 动画需要 insertX=x insertY=y else if isAnimation then mj:runAction(cc.MoveTo:create(0.1,cc.p(x,y))) else mj:setPosition(x,y) end end x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,k,self.desktopType) end return insertX,insertY end end function MJHandCardView:sortHandCards() --if self.viewId~=MJDefine.MyViewId then -- return --end local function sortMj(mjA,mjB) if mjA.sortValue 2 or self.queType < 0 then return end local handcardNum = #self.handCards local isMyGetCard = (handcardNum%3 == 2)--是否是自己摸牌阶段 if isMyGetCard and self:checkHandCardHaveQue() then for k,v in pairs(self.handCards) do if v:getMJColorType() ~= self.queType then v:setStatus(MJDefine.MJStatus.Disable) else v:setStatus(MJDefine.MJStatus.Normal) end end else for k,v in pairs(self.handCards) do v:setStatus(MJDefine.MJStatus.Normal) end end self.touchMJ = nil end end --设置所有手牌状态为Disable function MJHandCardView:setHandCardsDidable() if self:isUseNew3D() then self._handcard:setHandCardsDidable() else for k,v in pairs(self.handCards) do v:setStatus(MJDefine.MJStatus.Disable) end end end --设置非打出去能听的牌Disable function MJHandCardView:setNotTingCardDidable(is) if self:isUseNew3D() then self._handcard:setNotTingCardDidable(is) else if is then for _,mjNode in pairs(self.handCards) do if not mjNode:getTing() then mjNode:setStatus(MJDefine.MJStatus.Disable) else mjNode:setStatus(MJDefine.MJStatus.Normal) end end else for _,mjNode in pairs(self.handCards) do mjNode:setStatus(MJDefine.MJStatus.Normal) end end end end --创建换三张的牌 function MJHandCardView:createSwapCards(cards) if self:isUseNew3D() then local group = self._handcard:createSwapCards(cards) if group then self.ui.Items.Layout_Animation:addChild(group,1,SWAP_CARD_TAG) local pos = self:getAnimationPostion() if self.viewId==MJDefine.MyViewId then pos.x = pos.x - 50 elseif self.viewId==MJDefine.PlayerViewType.Top then pos.y = pos.y - 20 end group:setPosition(pos) end else local group = MJGroupFactory.CreateGroup(cards,MJDefine.MJGroupType.Chi,self.viewId,self.desktopType,0) if group then self.ui.Items.Layout_Animation:addChild(group,1,SWAP_CARD_TAG) local pos = self:getAnimationPostion()--cc.p(x+MJGroupStartOffSet[self.viewId].x,y+MJGroupStartOffSet[self.viewId].y) group:setPosition(pos) end end end --删除换三张的牌 function MJHandCardView:deleteSwapCards() local swapCardsUI = self.ui.Items.Layout_Animation:getChildByTag(SWAP_CARD_TAG) if swapCardsUI and (not tolua.isnull(swapCardsUI)) then swapCardsUI:removeFromParent() swapCardsUI = nil end end function MJHandCardView:onTouchBegan(touch) logD("onTouchBegan : ------------1") ----躺牌状态,自动出牌,屏蔽触摸时间 if self.isTangCard and self.isTangCard == true then return false end if self.touchMJ and self.isTouchMove then logD("onTouchBegan : ------------2") self:touchOutCard() return false end logD("onTouchBegan : ------------3") local lastMj=self.touchMJ self.touchMJ=nil self.isTouchMove=false -- if self.touchMJ then -- self.touchMJ:setPositionY(self.initY) -- self.touchMJ:setStatus(MJDefine.MJStatus.Normal) -- self.touchMJ=nil -- end local touchPos=self:convertToNodeSpace(touch:getLocation()) for k,v in pairs(self.handCards) do local width = v:getContentSize().width local height = v:getContentSize().height local x = v:getPosition().x-width/2 local y = v:getPosition().y-height/2 local rect = cc.Rectangle:new(x,y,width,height) if rect:contains(touchPos.x,touchPos.y) then if v:getStatus() == MJDefine.MJStatus.Disable then return end self.touchMJ=v if self.touchMJ.status==MJDefine.MJStatus.Select then --双击出牌 self:sendOutCard() return false else self.touchMJ:recordPostion(cc.p(self.touchMJ:getPositionX(),self.initY)) self.touchMJ:runSelectAnimation() self.touchMJ:setStatus(MJDefine.MJStatus.Select) app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing,card=self.touchMJ.value}) end break end end --lastMj 有可能被移除 必须 tolua.isnull 判断一次 if lastMj and not tolua.isnull(lastMj) and lastMj~=self.touchMJ then lastMj:runDeSelectAnimation(true) lastMj:setStatus(MJDefine.MJStatus.Normal) end if self.touchMJ then app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard,value = self.touchMJ.value}) else app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) return false end return true end function MJHandCardView:onTouchMove(touch) -- if not self.isOutCard then return end local touchPos=self:convertToNodeSpace(touch:getLocation()) local prePos=self:convertToNodeSpace(touch:getPreviousLocation()) local x=math.abs(prePos.x-touchPos.x) local y=math.abs(prePos.y-touchPos.y) if x>5 or y>5 then logD("onTouchMove : ------------2") self.isTouchMove=true end if self.touchMJ and self.isTouchMove==true then -- self.isTouchMove=true self.touchMJ:setPosition(touchPos) self.touchMJ:setLocalZOrder(1) --return true end --return false end function MJHandCardView:onTouchEnd(touch) logD("onTouchEnd : ------------1") self:touchOutCard() end function MJHandCardView:onTouchCancel(touch) logD("onTouchCancel : ------------1") self:touchOutCard() end function MJHandCardView:touchOutCard() logD("touchOutCard : ------------1") if self.touchMJ and self.isTouchMove then logD("touchOutCard : ------------2") if self.touchMJ:getPositionY()>MJDefine.MJ_TOUCH_OUT_CARD_Y and self.isOutCard then logD("touchOutCard : ------------3") self:sendOutCard() else logD("touchOutCard : ------------4") self.touchMJ:restorePostion() self.touchMJ:setStatus(MJDefine.MJStatus.Normal) app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) -- if self.isOutCard then -- self:moveLastCard() -- end end end logD("touchOutCard : ------------5") self.isTouchMove=false end --发送出牌消息 function MJHandCardView:sendOutCard() if self:isUseNew3D() then if not self.isOutCard or not self.touchMJ then return end local card = self.touchMJ:getValue() self._outCardView:onOutCard(card, nil) self._handcard:sendOutCard() else if not self.isOutCard or not self.touchMJ then return end if self.touchMJ:getIsPaoPai() and (not self:getHandCardsIsAllPaoCard()) then self.touchMJ:restorePostion() self.touchMJ:setStatus(MJDefine.MJStatus.Normal) showTooltip("不能打出别人要胡的牌!"); return end local request = MJMessage.Card:new() request.card = self.touchMJ.value -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request)) self.ui:sendMsg(app.room, MJDefine.MJEvent.OutCard, request, function(status, response) logE("MJHandCardView sendOutCard() response = ", table.tostring(response)) end) --音效 local userInfo=app.room:getUserInfoByViewId(self.viewId) if userInfo then MJSound.PlayMJSound(userInfo.sex,request.card) end self:runOutCardAction(self.touchMJ.value) app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg,value=self.touchMJ.value,viewId=self.viewId}) self:setOutCardEnable(false) --插牌 if self.touchMJ==self.handCards[#self.handCards] then table.removeItem(self.handCards,self.touchMJ) self:resetHandCards() else table.removeItem(self.handCards,self.touchMJ) self:runInsertCardAction() end self.touchMJ:removeFromParent() self.touchMJ=nil app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) self:setTing(false) app.room:resetTings() end end --插牌动画 function MJHandCardView:runInsertCardAction() self:getEventDispatcher():removeEventListenersForTarget(self) local insertMj=self.handCards[#self.handCards] local iX=insertMj:getPositionX() local iY=insertMj:getPositionY() local height=insertMj:getContentSize().height local x,y=self:resetHandCards(insertMj,true) local actions={ cc.MoveTo:create(0.1,cc.p(insertMj:getPositionX(),insertMj:getPositionY()+height)), cc.MoveTo:create(0.1,cc.p(x,insertMj:getPositionY()+height)), cc.MoveTo:create(0.1,cc.p(x,self.initY)), cc.CallFunc:create(function() self:initTouchEvent() if self.touchMJ and not tolua.isnull(self.touchMJ) then self:resetHandCards() end end) } insertMj:runAction(cc.Sequence:create(actions)) end --出牌动画 function MJHandCardView:runOutCardAction(value,callback) MJSound.PlayOutCard() self:createOutCards(value) local outCard=self.outCards[#self.outCards] local showCard=MJ:new(value,MJDefine.MJType.Stand,MJDefine.MyViewId,self.desktopType) self:addChild(showCard) if self.viewId==MJDefine.MyViewId then outCard:setVisible(false) local mj=nil if self.touchMJ and not tolua.isnull(self.touchMJ) then mj = self.touchMJ else mj = self:getMjByValueReverseOrder(value) end if mj and (not tolua.isnull(mj)) then showCard:setPosition(mj:getPosition()) end local actions={ cc.MoveTo:create(MJDefine.MJ_TIME_OUT_CARD,outCard:getPosition()), cc.CallFunc:create(function() -- MJSound.PlayOutCard() if outCard and not tolua.isnull(outCard) then outCard:setVisible(true) end if callback then callback() end end), cc.RemoveSelf:create(), } showCard:runAction(cc.Sequence:create(actions)) else showCard:setScale(MJDefine.MJ_OUT_CARD_SCALE) showCard:setPosition(self.showCardPostion) local rotate=0 if self.viewId==MJDefine.PlayerViewType.Left then rotate=-45 elseif self.viewId==MJDefine.PlayerViewType.Right then rotate=45 end local actions={ cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD_SCALE,1), cc.DelayTime:create(MJDefine.MJ_TIME_OUT_CARD_WAIT), cc.Spawn:create( cc.Spawn:create( cc.MoveTo:create(MJDefine.MJ_TIME_OUT_CARD,outCard:getPosition()), cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD,MJDefine.MJ_OUT_CARD_SCALE) ), cc.RotateBy:create(MJDefine.MJ_TIME_OUT_CARD,rotate) ), cc.CallFunc:create(function() -- MJSound.PlayOutCard() if outCard and not tolua.isnull(outCard) then outCard:setVisible(true) end if callback then callback() end end), cc.RemoveSelf:create(), } showCard:runAction(cc.Sequence:create(actions)) -- showCard:runAction(cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD,MJDefine.MJ_TOP_SCALE)) end -- showCard:runAction() end function MJHandCardView:getMjByValue(value) if self:isUseNew3D() then return self._handcard:getMjByValue(value) else for k,v in pairs(self.handCards) do if v.value==value then return v end end end end --倒序遍历手牌 function MJHandCardView:getMjByValueReverseOrder(value) for i = #self.handCards,1,-1 do local v = self.handCards[i] if v.value==value then return v end end end function MJHandCardView:removeHandCard(arg) if self:isUseNew3D() then self._handcard:removeHandCard(arg) else if type(arg)=="number" then arg={ {card=arg} } end if self.viewId==MJDefine.MyViewId or self.isReplay then for k,v in pairs(arg) do local mj=self:getMjByValue(v.card) if mj then table.removeItem(self.handCards,mj) mj:removeFromParent() end end else -- local num=#self.handCards-#arg -- print(num) for i=#self.handCards,#self.handCards-#arg+1,-1 do if self.handCards[i] then self.handCards[i]:removeFromParent() table.remove(self.handCards,i) end end end end end function MJHandCardView:removeHandCardByNum(value,num) if self:isUseNew3D() then self._handcard:removeHandCardByNum(value,num) else if self.viewId==MJDefine.MyViewId or self.isReplay then for i=1,num do local mj=self:getMjByValue(value) if mj then table.removeItem(self.handCards,mj) mj:removeFromParent() end end else -- local num=#self.handCards-#arg -- print(num) for i=#self.handCards,#self.handCards-num+1,-1 do if self.handCards[i] then self.handCards[i]:removeFromParent() table.remove(self.handCards,i) end end end end end function MJHandCardView:removeOutCard(arg) if self:isUseNew3D() then self._outCardView:removeOutCard(arg) else if type(arg)=="number" then arg={ {card=arg} } end local function getMjByValue(value) for i=#self.outCards,1,-1 do if self.outCards[i] then if self.outCards[i].value==value then return self.outCards[i] end end end -- for k,v in pairs(self.outCards) do -- if v.value==value then -- return v -- end -- end end for k,v in pairs(arg) do local mj=getMjByValue(v.card) if mj then table.removeItem(self.outCards,mj) mj:removeFromParent() end end end end --玩家出牌 function MJHandCardView:onOutCard(card,callback) -- self:createOutCards(card) if self:isUseNew3D() then self._handcard:onOutCard(card, callback) self._outCardView:onOutCard(card, callback) else self:runOutCardAction(card,callback) if self.viewId~=MJDefine.MyViewId then --其他玩家删除最后一个牌 local mj=self:getMjByValue(card) if mj then self:removeHandCard(card) self:resetHandCards() -- mj:removeFromParent() else local last=#self.handCards if last and self.handCards[last] then self.handCards[last]:removeFromParent() table.remove(self.handCards,last) end end else -- self:runOutCardAction(self.touchMJ.value) -- app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg,value=self.touchMJ.value,viewId=self.viewId}) self:setOutCardEnable(false) local mj=self:getMjByValueReverseOrder(card) --插牌 if mj==self.handCards[#self.handCards] then table.removeItem(self.handCards,mj) self:resetHandCards() else table.removeItem(self.handCards,mj) self:runInsertCardAction() end -- self:removeHandCard(card) -- self:resetHandCards() if mj then mj:removeFromParent() mj=nil end end -- local memberInfo=app.room.roomInfo.memberList[data.response.nUserId] local userInfo=app.room:getUserInfoByViewId(self.viewId) if userInfo and (self.viewId~=MJDefine.MyViewId or self.isReplay) then MJSound.PlayMJSound(userInfo.sex,card) end end end --摸牌 function MJHandCardView:onGetCard(operates,card) self:createHandCards(card) if self.viewId==MJDefine.PlayerViewType.Right and not self.isReplay then self:resetHandCards() end if not operates or table.nums(operates)==0 then self:setOutCardEnable(true) else self:setOutCardEnable(false) self:moveLastCard() end if self.viewId==MJDefine.MyViewId then MJSound.PlayGetCard() end -- self:moveLastCard() end --显示操作 function MJHandCardView:showOperate(operates,card) if not operates or table.nums(operates)==0 then return end print(table.tostring(operates)) --有操作默认添加过的操作 -- if operates[1] and operates[1].opType~=MJDefine.MJOperateType.OPREATE_CANCEL then local operate=MJMessage.OperateCard:new() operate.opType=MJDefine.MJOperateType.OPREATE_CANCEL operate.opCard=card table.insert(operates.Datas,1,operate) -- end self.ui.Items.Layout_Operate:removeAllChildren() self.ui.Items.Layout_Operate:setVisible(true) local x=self.ui.Items.Layout_Operate:getContentSize().width local y=self.ui.Items.Layout_Operate:getContentSize().height/2 for k,v in pairs(operates) do if MJDefine.MJOperateImage[v.opType] then local btnOperate=cc.Button:createNode() btnOperate:setDefaults() btnOperate:setText("") btnOperate:loadTextureNormal(MJDefine.MJOperateImage[v.opType]) btnOperate:ignoreAnchorPointForPosition(false) btnOperate:setPosition(cc.p(x-MJDefine.MJ_OPERATE_PADDING*(k-1), y)) self.ui.Items.Layout_Operate:addChild(btnOperate) btnOperate:registerClick(function() playBtnEffect() local request = MJMessage.OperateCard:new() request.opType = v.opType request.opCard = v.opCard -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request)) self.ui:sendMsg(app.room, MJDefine.MJEvent.Operate, request, function(status, response) logE("MJHandCardView showOperate() response = ", table.tostring(response)) end) -- MJDefine.MJEvent.Operate self:hideOperate() self:setTing(false) app.room:resetTings() --TODO:点过后判断能否出牌 (出牌是否该为服务器控制) -- if #self.handCards%2==0 and v.opType==MJDefine.MJOperateType.OPREATE_CANCEL and self.isOutCard==false then -- self:setOutCardEnable(true) -- end end) end end end function MJHandCardView:hideOperate() self.ui.Items.Layout_Operate:removeAllChildren() self.ui.Items.Layout_Operate:setVisible(false) end function MJHandCardView:getAnimationPostion() return self.ui.Items["Layout_Aniamtion_"..self.viewId]:getPosition() end function MJHandCardView:isUseNew3D() return self.desktopType == MJDefine.DesktopType.ThreeD and MJDefine.IS_NEW_3D end --获取手牌数量 function MJHandCardView:getHandCardsNum() if self:isUseNew3D() then return self._handcard:getHandCardsLength() else if self.handCards and type(self.handCards) == 'table' then return #self.handCards end return 0 end end function MJHandCardView:tangCardEnabled(is) if self:isUseNew3D() then return self._handcard:tangCardEnabled(is) else if is then for _,mjNode in pairs(self.handCards) do if not mjNode:getTing() then mjNode:setStatus(MJDefine.MJStatus.Disable) else mjNode:setStatus(MJDefine.MJStatus.Normal) end end else for _,mjNode in pairs(self.handCards) do --mjNode:restorePostion() mjNode:setStatus(MJDefine.MJStatus.Normal) end end end end --设置躺状态 function MJHandCardView:setIsTanging(is) if self:isUseNew3D() then return self._handcard:setIsTanging(is) else self.isTangOp = is or false end end --设置躺牌 function MJHandCardView:setTangCard(is,cards) if self:isUseNew3D() then return self._handcard:setTangCard(is,cards) else if is then for _,card in pairs(cards) do for _,mjNode in pairs(self.handCards) do if mjNode:getValue() == card.card and (not mjNode.tang) then local color = cc.c3b(218, 218, 128) mjNode:setColor(color) mjNode.tang = true end end end else for _,mjNode in pairs(self.handCards) do mjNode:setNormalColor() mjNode.tang = false end end end end --设置炮牌 function MJHandCardView:setPaoCard(is,cards) if self:isUseNew3D() then return self._handcard:setPaoCard(is,cards) else if is then self.paoCards = self.paoCards or {} if cards and type(cards) == 'table' and #cards > 0 then for _,card in pairs(cards) do table.insert(self.paoCards,card.card) end end for _,card in pairs(self.paoCards) do for _,mjNode in pairs(self.handCards) do if mjNode:getValue() == card then mjNode:setPaoFlag(true) end end end else self.paoCards = {} for _,mjNode in pairs(self.handCards) do mjNode:setPaoFlag(false) end end end end --显示别人的躺牌 function MJHandCardView:showTangCard(is,cards) if self:isUseNew3D() then return self._handcard:showTangCard(is,cards) else --[[if is then local index = 1 for _,card in pairs(cards) do local mjNode = self._handCardNodes[index] mjNode:setValue(card.card) mjNode:setMJType(MJDefine.MJConfig_2d.MJType.Open) mjNode:initMahjongImage() index = index + 1 end else for _,mjNode in pairs(self._handCardNodes) do mjNode:setPaoFlag(false) end end--]] end end function MJHandCardView:setBaoPai(flag) if self:isUseNew3D() then self._handcard:setBaoPai(flag) else self.baopai = flag end self.baopai = flag end function MJHandCardView:checkBaoAndDisableCard() if self:isUseNew3D() then self._handcard:checkBaoAndDisableCard(flag) else if self.baopai and self.baopai == 1 then self:setHandCardsDidable() else self:setNotTingCardDidable(false) end end end -- 获取手牌是否全是炮牌,全手炮牌可以出任意牌 function MJHandCardView:getHandCardsIsAllPaoCard() if self:isUseNew3D() then return self._handcard:getHandCardsIsAllPaoCard() else --如果爆牌了,则只能出摸上来的牌 if self.baopai and self.baopai == 1 then return true end for _,mjNode in pairs(self.handCards) do if mjNode:getIsPaoPai() == false then return false end end return true end end -- 获得麻将的initY坐标 function MJHandCardView:getHandCardPosInitY() if self:isUseNew3D() then local lastCard = self._handcard:getLastCard() if not lastCard then return 0 end local x, y = self._handcard:getCardPosition(lastCard, self._handcard:getViewId(), self._handcard:getHandCardsLength()) return y or 0 else return self.initY or 0 end end return MJHandCardView