local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine") local MJMessage = MJFramework.MJImport("mj.luaScript.Protocol.MJMessage") local MJSound = MJFramework.MJImport("mj.luaScript.MJSound") local Mahjong3DHandCard = MJFramework.MJFrameworkClassImprot("mj.luaScript.Common.3d.Mahjong3DHandCard") local HandCard3D = class("HandCard3D", Mahjong3DHandCard) function HandCard3D:ctor(...) HandCard3D.super.ctor(self, ...) end --- HandCard3D:onAfterCreateHandcards 创建手牌之后的处理 function HandCard3D:onAfterCreateHandcards() HandCard3D.super.onAfterCreateHandcards(self) end function HandCard3D:onAfterCreateOpenHandcards() HandCard3D.super.onAfterCreateOpenHandcards(self) end function HandCard3D:createGroupCards(arg, fromViewId) for _, v in pairs(arg) do if not fromViewId then fromViewId = v.fromViewId end local group = nil if v.opType == MJDefine.MJOperateType.OPREATE_ANGANG then group = self:getGroup(v.values[1], {MJDefine.MJOperateType.OPREATE_ANGANG}) if group then group:setCardNum(v.cardNum) group:customRefresh(v) return end end local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId] group = self:createGroup(v.values, v.showType, self._viewId, table.nums(self._groupNodes) + 1, v.cardNum) if group then local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].x local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].y group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要 group.opType = v.opType group:setPosition(cc.p(x, y)) group:customRefresh(v) self:addChild(group) table.insert(self._groupNodes, group) end end self:refreshGroupZOrder() end function HandCard3D:createGroup(values, showType, viewId, groupIndex, cardNum) local group = nil if showType == 1 then group = require(MJDefine.MJConfig_3d.GROUP_CHI):new(values, viewId, groupIndex) elseif showType == 2 then group = require(MJDefine.MJConfig_3d.GROUP_PENG):new(values, viewId, groupIndex) elseif showType == 3 then group = require(MJDefine.MJConfig_3d.GROUP_GANG):new(values, viewId, groupIndex, cardNum) elseif showType == 4 then group = require(MJDefine.MJConfig_3d.GROUP_ANGANG):new(values, viewId, groupIndex, cardNum) elseif showType == 5 then group = require(MJDefine.MJConfig_3d.GROUP_BAGANG):new(values, viewId, groupIndex, cardNum) elseif showType == MJDefine.MJGroupType.Fei then group = require(MJDefine.MJConfig_3d.GROUP_FEI):new(values, viewId, groupIndex) elseif showType == MJDefine.MJGroupType.Ti then group = require(MJDefine.MJConfig_3d.GROUP_TI):new(values, viewId, groupIndex) end if group and viewId == 1 then group:setLocalZOrder(4 - groupIndex) end return group end --- -- 补杠 -- @param card 补杠的牌 -- @param cardNum 多头杠牌张数 -- @return -- function HandCard3D:buGang(card, cardNum) local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG}) if oldGroup then -- 如果没有碰牌,则查看是否已经有补杠 local cards = oldGroup:getCards() if cards and cards[4] then oldGroup:setCardNum(cardNum) cards[4]:setOperateBackImage() end return else oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_PENG}) if not oldGroup then oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_TI}) end end if not oldGroup then return end local fromViewId = oldGroup.fromViewId -- 杠牌对家,换成第四张 if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then fromViewId = 4 end if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then fromViewId = 4 end local index = table.indexOf(self._groupNodes, oldGroup) table.remove(self._groupNodes, index) oldGroup:removeFromParent() local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId, index, cardNum) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG table.insert(self._groupNodes, index, newGroup) local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId] local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y newGroup:setPosition(cc.p(x, y)) newGroup:customRefresh(newGroup) self:addChild(newGroup) self:refreshGroupZOrder() end --- HandCard3D:retoreBuGang 还原补杠 -- @param card 牌值 -- @param cardNum 牌张数 function HandCard3D:restoreBuGang(card, cardNum) local oldGroup = self:getGroup( card, { MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ANGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG }) if not oldGroup then return end local oldCardNum = oldGroup:getCardNum() if oldCardNum > 4 then oldCardNum = oldCardNum - 1 oldGroup:setCardNum(oldCardNum) oldGroup:customRefresh() return end local fromViewId = oldGroup.fromViewId -- 杠牌对家,换成第四张 if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then fromViewId = 4 end if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then fromViewId = 4 end local index = table.indexOf(self._groupNodes, oldGroup) table.remove(self._groupNodes, index) oldGroup:removeFromParent() local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index, cardNum) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG table.insert(self._groupNodes, index, newGroup) local startPos = MJDefine.MJConfig_3d.HandCardStartPos[self._viewId] local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y newGroup:setPosition(cc.p(x, y)) self:addChild(newGroup) self:refreshGroupZOrder() end -- 提操作(这里是用换牌操作,所以要改变类型; 当然也可以使用移除重新原有位置上添加的操作处理) function HandCard3D:ti(value, lziCard) -- 更改操作牌 local group = self:getGroup(value, {MJDefine.MJOperateType.OPREATE_FEI}) local cards = group:getCards() for i, v in pairs(cards) do local cardValue = v:getValue() if cardValue ~= value then v:setValue(value) v:setValueImage(value) v:setIsTingYongCard(false) end end -- 操作类型从提更改为碰 group.opType = MJDefine.MJOperateType.OPREATE_TI -- 更改手牌 if self:getViewId() == MJDefine.PlayerViewType.My or self._isReplay then local card = self:getMjByValue(value) card:setValue(lziCard) card:setValueImage(lziCard) card:setIsTingYongCard(true) -- 提操作后,要把提的牌重置到最后一张。如果是不需要放置最后一张,注释代码即可 self:removeHandCard(lziCard) self:resetHandCards() self:createHandCards(lziCard) local lastCard = self:getLastCard() -- 最后一张就是刚创建的牌了 lastCard:setIsTingYongCard(true) end end -- 检查出牌 -- 添加判断所有玩家是否都定缺完毕 -- 添加不可打出听用牌 -- 添加打出最后一张手牌,也会重置手牌顺序 function HandCard3D:sendOutCard() local gameRule = app.room.roomInfo:getGameRule() if getNumBand(gameRule.specialrule, 0x01) > 0 then if table.nums(app.room.roomInfo:getDingQueInfo()) ~= app.room:getPlayerCount() then showTooltip('等待其他玩家操作定缺') return end end if self.touchMJ:getIsTingYongCard() then if self.touchMJ:getPositionY() > MJDefine.MJ_TOUCH_OUT_CARD_Y then self.touchMJ:restorePostion() self.touchMJ:setStatus(MJDefine.MJStatus.Normal) -- app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard}) -- 广播 app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing}) -- 广播 end showTooltip('不可打出听用牌') return end if not (self.isOutCard and self.touchMJ) then return end local request = MJMessage.Card:new() request.card = self.touchMJ:getValue() -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request)) self: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:getValue()) app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg, value = self.touchMJ:getValue(), viewId = self._viewId}) app.room:dispatchEvent({name = MJDefine.MJEvent.LOCAL_OUT_CARD, card = self.touchMJ:getValue()}) self:setOutCardEnable(false) --插牌 if self.touchMJ == self._handCardNodes[#self._handCardNodes] then table.removeItem(self._handCardNodes, self.touchMJ) self:resetHandCards() -- 打出最后一张手牌,也要刷新手牌 else table.removeItem(self._handCardNodes, 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() app.room.roomInfo.lastOutViewId = MJDefine.MyViewId end -- 判断手牌是否全是听用牌(针对胡操作,如果全是听用则不显示过操作) function HandCard3D:getIsAllTingYongCard() local handCardNode = self:getHandCardNodes() for i, v in pairs(handCardNode) do if not v:getIsTingYongCard() then return false end end return true end -- 重写排序,让听用牌放在最左边 function HandCard3D:sortHandCards() -- 拆分 local temp = {} local tCard = {} local nCard = {} local qCard = {} for i, v in ipairs(self._handCardNodes) do if v:getIsTingYongCard() then table.insert(tCard, v) elseif v:getIsDingQueCard() then table.insert(qCard, v) else table.insert(nCard, v) end end -- 按牌值顺序排序 local function sortFun(c1, c2) return c1:getValue() < c2:getValue() end table.sort(tCard, sortFun) table.sort(nCard, sortFun) table.sort(qCard, sortFun) -- 添加到大表temp里面 for i, v in ipairs(tCard) do table.insert(temp, v) end for i, v in ipairs(nCard) do table.insert(temp, v) end for i, v in ipairs(qCard) do table.insert(temp, v) end self._handCardNodes = temp end -- 重写创建手牌,根据viewID,走不同的创建方式 function HandCard3D:createHandCards(cards, isHuCard) if self._viewId == MJDefine.MyViewId then HandCard3D.super.createHandCards(self, cards) else if isHuCard then self:createOpenHandCards(cards) else HandCard3D.super.createHandCards(self, cards) end end end function HandCard3D:cleanTouchMJ() if self.touchMJ then self.touchMJ = nil end end return HandCard3D