|
- 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
-
|