local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine") local CommonHandCard = require("mj.luaScript.Common.2d.CommonHandCard") local Mahjong3DHandCard = class("Mahjong3DHandCard", CommonHandCard) function Mahjong3DHandCard:ctor(viewId) Mahjong3DHandCard.super.ctor(self, viewId) end function Mahjong3DHandCard:createHandCards(arg) Mahjong3DHandCard.super.createHandCards(self, arg) end --- Mahjong3DHandCard:onAfterCreateHandcards 创建手牌之后的处理 function Mahjong3DHandCard:onAfterCreateHandcards() Mahjong3DHandCard.super.onAfterCreateHandcards(self) end function Mahjong3DHandCard:createCard(value, viewId, mahjongIndex) local mjType = MJDefine.MJConfig_3d.MJType.Stand local Mahjong3DCard = require(MJDefine.MJConfig_3d.MAHJONG_CARD) local card = Mahjong3DCard:new(value, viewId, mjType, mahjongIndex) local x, y = self:getCardPosition(card, viewId, mahjongIndex) card:setPosition(cc.p(x, y)) return card end function Mahjong3DHandCard:getCardPosition(mjCard, viewId, mjIndex) local defaulOffsetX = 0 if viewId == 1 then defaulOffsetX = 0 defaulOffsetY = 40 elseif viewId == 2 then defaulOffsetX = -40 defaulOffsetY = 0 elseif viewId == 3 then defaulOffsetX = 0 defaulOffsetY = -40 else defaulOffsetX = 85 defaulOffsetY = 0 end logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId) local startPos = self:getHandCardStartPos(self._viewId) local offsetPos = self:getHandCardOffestPos(self._viewId) if not startPos then logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId) startPos = cc.p(0, 0) end if not offsetPos then logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId) offsetPos = cc.p(0, 0) end local x = startPos.x + (mjIndex - 1) * defaulOffsetX + offsetPos[mjIndex].x local y = startPos.y + (mjIndex - 1) * defaulOffsetY + offsetPos[mjIndex].y local dealCardNum = self:getDealHandCardNum() local isGrabCard = mjIndex == (dealCardNum + 1) -- 是否抓的那张牌 if viewId == MJDefine.MyViewId then local groupCount = table.nums(self._groupNodes) if groupCount == 1 then x = x + 30 elseif groupCount == 2 then x = x - 80 elseif groupCount == 3 then x = x - 180 elseif groupCount == 4 then x = x - 280 end x = isGrabCard and (x + 10) or x elseif viewId == MJDefine.PlayerViewType.Right then y = isGrabCard and (y + 10) or y elseif viewId == MJDefine.PlayerViewType.Left then y = isGrabCard and (y - 10) or y elseif viewId == MJDefine.PlayerViewType.Top then x = isGrabCard and (x - 10) or x end return x, y end function Mahjong3DHandCard:refreshHandCardZOrder() local viewId = self:getViewId() local handCardNodes = self:getHandCardNodes() or {} for k, card in ipairs(handCardNodes) do local mjIndex = table.nums(self._groupNodes) * 3 + k local zorder = mjIndex if viewId == 1 then zorder = 14 - mjIndex elseif viewId == 2 then zorder = 7 - mjIndex zorder = zorder > 0 and -zorder or zorder else end card:setLocalZOrder(zorder) end end function Mahjong3DHandCard:createMahongOpenCard() end function Mahjong3DHandCard:createGroupCards(arg, fromViewId) for _, v in pairs(arg) do if not fromViewId then fromViewId = v.fromViewId end local startPos = self:getHandCardStartPos(self._viewId) local group = self:createGroup(v.values, v.showType, self._viewId, table.nums(self._groupNodes) + 1) 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 Mahjong3DHandCard:createGroup(values, showType, viewId, groupIndex) local group = nil if showType == MJDefine.MJGroupType.Chi then group = require(MJDefine.MJConfig_3d.GROUP_CHI):new(values, viewId, groupIndex) elseif showType == MJDefine.MJGroupType.Peng then group = require(MJDefine.MJConfig_3d.GROUP_PENG):new(values, viewId, groupIndex) elseif showType == MJDefine.MJGroupType.Gang then group = require(MJDefine.MJConfig_3d.GROUP_GANG):new(values, viewId, groupIndex) elseif showType == MJDefine.MJGroupType.AnGang then group = require(MJDefine.MJConfig_3d.GROUP_ANGANG):new(values, viewId, groupIndex) elseif showType == MJDefine.MJGroupType.BaGang then group = require(MJDefine.MJConfig_3d.GROUP_BAGANG):new(values, viewId, groupIndex) end if group and viewId == MJDefine.MyViewId then group:setLocalZOrder(4 - groupIndex) end return group end function Mahjong3DHandCard:createOpenCard(value, viewId, mjIndex) local mjType = MJDefine.MJConfig_3d.MJType.Open local mjCard = require(MJDefine.MJConfig_3d.MAHJONG_CARD):new(value, viewId, mjType, mjIndex) return mjCard end function Mahjong3DHandCard:getOpenCardPosition(mjCard, viewId, mjIndex) local offsetConfig = MJDefine.MJConfig_3d.OpenCardOffsetConfig if mjCard:getType() == MJDefine.MJConfig_3d.MJType.OpenBlack then offsetConfig = MJDefine.MJConfig_3d.OpenBlackCardOffsetConfig end local startPos = self:getHandCardStartPos(self._viewId) local x = 0 local y = 0 if viewId == 1 then -- 78*55 local offset = offsetConfig[viewId][mjIndex] x = startPos.x + offset.x y = startPos.y + (mjIndex - 1) * 55 + offset.y elseif viewId == 2 then -- 46*53 local offset = offsetConfig[viewId][mjIndex] x = startPos.x - (mjIndex - 1) * 46 + offset.x y = startPos.y + offset.y elseif viewId == 3 then -- 80*57 local offset = offsetConfig[viewId][mjIndex] x = startPos.x + offset.x y = startPos.y - (mjIndex - 1) * 57 + offset.y end return x, y end function Mahjong3DHandCard: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) oldGroup:customRefresh() end return ; else oldGroup=self:getGroup(card,{MJDefine.MJOperateType.OPREATE_PENG}) 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) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG table.insert(self._groupNodes, index, newGroup) local startPos = self:getHandCardStartPos(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 --- Mahjong3DHandCard:retoreBuGang 还原补杠 -- @param card 牌值 -- @param cardNum 牌张数 function Mahjong3DHandCard:restoreBuGang(card) local oldGroup = self:getGroup( card, { MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ANGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG } ) 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}, MJDefine.MJGroupType.Peng, self._viewId, index) if not newGroup then return end newGroup.fromViewId = fromViewId newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG local startPos = self:getHandCardStartPos(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) table.insert(self._groupNodes, index, newGroup) self:refreshGroupZOrder() end function Mahjong3DHandCard:refreshGroupZOrder() for k, v in ipairs(self._groupNodes) do if self:getViewId() == MJDefine.PlayerViewType.Right then v:setLocalZOrder(table.nums(self._groupNodes) - k) else v:setLocalZOrder(k) end end end --- -- 获取手牌起始位置,3d必须重写 -- @param viewId 玩家本地座位 -- function Mahjong3DHandCard:getHandCardStartPos(viewId) local pos = MJDefine.MJConfig_3d.HandCardStartPos[viewId] if MJDefine.MJConfig_3d.HandCardStartPosOfCardNum then local cardNum = self:getDealHandCardNum() pos = MJDefine.MJConfig_3d.HandCardStartPosOfCardNum[cardNum][viewId] end return pos end --- -- 获取手牌偏移位置,3d必须重写 -- @param viewId 玩家本地座位 -- function Mahjong3DHandCard:getHandCardOffestPos(viewId) return MJDefine.MJConfig_3d.HandCardOffsetPos[viewId] end --- -- 获取组合牌偏移位置,3d必须重写 -- @param viewId 玩家本地座位 -- function Mahjong3DHandCard:getGroupOffsetConfig(viewId) return MJDefine.MJConfig_3d.GroupOffsetConfig[viewId] end -- 刷新手牌,3d重写,刷新手牌时候还要刷新它的旋转位置 function Mahjong3DHandCard:resetHandCards() self:sortHandCards() local startIndex = table.nums(self._groupNodes) * 3 for cardIndex, card in ipairs(self._handCardNodes) do local newCardIndex = startIndex + cardIndex local x, y = self:getCardPosition(card, self._viewId, newCardIndex) if self._viewId ~= MJDefine.MyViewId and self._isReplay then x, y = self:getOpenCardPosition(card, self._viewId, newCardIndex) end card:setPosition(cc.p(x, y)) card:setMJIndex(newCardIndex) card:updateOpenCardFacePosition() if self._viewId ~= 4 then -- 重新排序,手牌可能乱了,需要重新设置一下手牌的背景 card:initBackImage() end end self:refreshHandCardZOrder() end return Mahjong3DHandCard