local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine") local MJ = MJFramework.MJImport("mj.luaScript.Views.Game.MJ") local MJWanFa=MJFramework.ImportWanFa("luaScript.SubGameDefine.MaJiang.MJWanFa") local CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD) -- 麻将牌 local MJRoomXiaoJuView = MJFramework.MJFrameworkClassImprot("mj.luaScript.Views.Room.MJRoomXiaoJuView") local yibinmajiangRoomXiaoJuView = class("yibinmajiangRoomXiaoJuView", MJRoomXiaoJuView) local MJ_WIDTH = 47 local MJ_HAND_CARD_INIT_X = 130 -- 所有牌的起始位置 local MJ_HAND_CARD_INIT_Y = 50 -- 手牌y轴 local MJ_OPERATE_CARD_INIT_Y = 45 -- 操作牌y轴 local MJ_GROUP_PADDING_X = 10 -- 麻将组牌组间x轴间隔 local MJ_HANDCARD_PADDING_X = -38 -- 手牌麻将直接间隔(牌与牌) local MJ_OPERATE_PADDING_X = -3 -- 操作麻将直接间隔(牌与牌) local MJ_HU_X = 16 -- 胡牌麻将间隔 local MJ_TING_START_PADDING_X = 0 -- 听牌的起始位置 local MJ_TING_INTERVAL_X = 14 -- 各个听牌的间隔 local MJ_HANDCARD_SCALE = 0.6 -- 手牌麻将的缩小值 local MJ_OPERATE_SCALE = 0.75 -- 操作麻将的缩小值 local IS_SHOW_ANGANG_CARD = false -- 暗杠牌是否要显示起来 function yibinmajiangRoomXiaoJuView:ctor(...) yibinmajiangRoomXiaoJuView.super.ctor(self,...) self.desktopType = MJDefine.DesktopType.TwoD end function yibinmajiangRoomXiaoJuView:loadUI() local ui = loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_xiaoju_jiesuan.ui") self.ui = ui self:addChild(ui) end function yibinmajiangRoomXiaoJuView:onEnter() yibinmajiangRoomXiaoJuView.super.onEnter(self) self:initTingYongCard() end -- 初始化玩家信息 function yibinmajiangRoomXiaoJuView:initPlayerView() local roomInfo=app.room.roomInfo self.ui.Items.Layout_Player:removeAllChildren() self.items={} for k,v in pairs(roomInfo.memberList) do local userId = app.room:getViewIdByUserId(v.nUserId) local nSeatId = app.room:getSeatIdByViewId(userId) local i = nSeatId+1 local item=self:createPlayerItem() item.index = i; self:setPlayerItemInfo(item,v) self.items[i]=item end table.sort(self.items, function(a, b) return a.index < b.index end) for k, v in pairs(self.items or {}) do self.ui.Items.Layout_Player:addChild(self.items[k]) end end -- 创建玩家面板 function yibinmajiangRoomXiaoJuView:createPlayerItem() local ui=loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_xiaoju_item.ui") return ui end -- 设置单个玩家信息 function yibinmajiangRoomXiaoJuView:setPlayerItemInfo(ui,player) local roomInfo=app.room.roomInfo local resultInfo=roomInfo.memberList local nodeBg = ui.Items["ImageView_ItemBg"] -- local nodeBg2 = ui.Items[bg2] -- local nodeLose = self.ui.Items[lose] local nodeHead = ui.Items["ImageView_Head"] local nodeName = ui.Items["Text_Name"] local nodeBenJu = ui.Items["TextBMFont_Score"] local bmFontScore = true if not nodeBenJu then nodeBenJu = ui.Items["Text_Score"] bmFontScore = false end local nodeHuType = ui.Items["ImageView_HuType"] local nodeHuIndex = ui.Items["ImageView_HuIndex"] local nodeBanker= ui.Items["ImageView_Banker"] local nodeResult= ui.Items["Text_ResultInfo"] local imgViewId = ui.Items["ImageView_ViewId"]; local dpImageSeatId = ui.Items['ImageView_DPSeatId'] local viewOrder = player.nSeatId + 1; imgViewId:loadTexture(string.format("mj_yibinmajiang/res/zy_fangjian/player/yibinmajiang_seat_%s.png", viewOrder)); local color = (app.room:getMyUserId() == player.nUserId) and cc.c3b(255,243,176) or cc.c3b(230,192,117); local huStr = self:getHuInfo(player.paiType, player.subPaiType) local genStr = self:getGenInfo(player.genCount) local gangStr = self:getGangInfo(player.gangCount) -- 番型显示 local infoStr = huStr .. genStr .. gangStr nodeResult:setText(infoStr) nodeResult:setColor(color); local userInfo = app.room:getUserInfo(player.nUserId) --先设置默认头像 local width = nodeHead:getContentSize().width local nickname = "" if userInfo and userInfo.nickname then nickname = getSubStringNickname(userInfo.nickname) self:updateUserHead(nodeHead,player.nUserId, userInfo.sex, userInfo.headimgurl); end nodeName:setText(nickname) nodeHuType:setVisible(false) nodeHuIndex:setVisible(false) dpImageSeatId:setVisible(false) ui.Items.Text_FanShu:setVisible(false) -- if table.nums(player.huCards) > 0 then if next(player.huCards) and next(player.huCards[1]) and player.huCards[1].huCard and player.huCards[1].huCard > 0 then if player.huType > 0 and player.huIndex > 0 then -- 胡牌类型 local huTypeTable = { [MJDefine.MJGameHuType.HU_ZIMO] = 'mj/res/ui/zy_fangjian/operate/mj_effect_zimo.png', [MJDefine.MJGameHuType.HU_DIANPAO] = 'mj/res/ui/zy_fangjian/operate/mj_effect_jiepao.png', [MJDefine.MJGameHuType.HU_QIANGGANG] = 'mj/res/ui/zy_fangjian/operate/mj_effect_hupai.png', } local huTypeImg = 'mj/res/ui/zy_fangjian/operate/mj_effect_hupai.png' huTypeImg = huTypeTable[player.huType] and huTypeTable[player.huType] or huTypeImg nodeHuType:loadTexture(huTypeImg) nodeHuType:setVisible(true) -- 胡牌顺序 local huIndexTable = { [1] = 'mj/res/ui/zy_fangjian/operate/mj_effect_num1.png', [2] = 'mj/res/ui/zy_fangjian/operate/mj_effect_num2.png', [3] = 'mj/res/ui/zy_fangjian/operate/mj_effect_num3.png', } local huIndexImg = 'mj/res/ui/zy_fangjian/operate/mj_effect_num1.png' huIndexImg = huIndexTable[player.huIndex] and huIndexTable[player.huIndex] or huIndexImg nodeHuIndex:loadTexture(huIndexImg) nodeHuIndex:setVisible(true) -- 如果是点炮胡,则还要显示放炮玩家seatid if player.huType == MJDefine.MJGameHuType.HU_DIANPAO then local dpSeatId = player.dpId + 1 dpImageSeatId:loadTexture(string.format("mj_yibinmajiang/res/zy_fangjian/player/yibinmajiang_seat_%s.png", dpSeatId)) dpImageSeatId:setVisible(true) elseif player.huType == MJDefine.MJGameHuType.HU_ZIMO then -- 如果是自摸胡,则还要显示输的玩家seatid(根据当前胡的顺序来判断) local loseSeatId = {} for i, v in pairs(roomInfo:getHuIndexInfo()) do -- 没有胡牌,或者在本玩家胡之后的玩家都是要输自摸钱 if v == 0 or v > player.huIndex then local seatId = app.room:getSeatIdByUserId(i) + 1 -- seatid是0-3,所以要加1 table.insert(loseSeatId, seatId) end end local function sortFunction(a, b) return a < b end table.sort(loseSeatId, sortFunction) for i, v in ipairs(loseSeatId) do local node = dpImageSeatId:getCopied() node:loadTexture(string.format("mj_yibinmajiang/res/zy_fangjian/player/yibinmajiang_seat_%s.png", v)) node:setVisible(true) node:setPositionX(dpImageSeatId:getPositionX() + node:getContentSize().width * (i-1)) node:setPositionX(node:getPositionX() - (node:getContentSize().width/2)*(#loseSeatId - 1)) dpImageSeatId:getParent():addChild(node) --[[ tips: 这里坐标设置是先把全部都往右添加,如 o oo ooo, 然后在根据当前index向左移动width/2个像素. ]] end end end -- 番数 ui.Items.Text_FanShu:setVisible(true) ui.Items.Text_FanShu:setText(player.fanshu.."番") end --黄庄才会查叫和查花猪 if roomInfo:getStopFlag() == MJDefine.StopFlag.STOP_FLAG_HUANG_ZHUANG then if player.isDj == 1 then nodeHuType:loadTexture("mj/res/ui/zy_fangjian/operate/mj_effect_chajiao.png") nodeHuType:setVisible(true) nodeHuType:setPositionX(nodeHuType:getPositionX() + 15) nodeHuType:setScale(0.4) end end local bankSeatId = roomInfo:getBankSeatId(); if app.room:getUserIdBySeatId(bankSeatId) ~= player.nUserId then nodeBanker:setVisible(false) end if app.room:getMyUserId() == player.nUserId then nodeBg:loadTexture("xj_my_bg.png",cc.TextureResType.plistType) --[[else nodeBg:loadTexture("xj_other_bg.png",cc.TextureResType.plistType)--]] end if tonumber(player.nTurnScore) > 0 then nodeBenJu:setText("+"..player.nTurnScore) else nodeBenJu:setText(player.nTurnScore) if tonumber(player.nTurnScore) < 0 and bmFontScore == true then nodeBenJu:setFntFile("res/fonts/dt_jian_num.fnt") end end -- 飘 ui.Items.ImageView_Pos:setVisible(player.piaostate == 1) end -- 创建手牌 function yibinmajiangRoomXiaoJuView:createHandCards(layer,arg,seatId) for k,v in pairs(arg) do local mj = CardClass:new(v.card, MJDefine.MyViewId, MJDefine.MJType.Stand, 10) mj:setScale(MJ_HANDCARD_SCALE) layer:addChild(mj) mj:setPosition(cc.p(self.initX[seatId],MJ_HAND_CARD_INIT_Y)) self.initX[seatId]=self.initX[seatId]+mj:getContentSize().width+MJ_HANDCARD_PADDING_X end end -- 创建胡牌 function yibinmajiangRoomXiaoJuView:createHuCard(layer,card,seatId) local mj = CardClass:new(card, MJDefine.MyViewId, MJDefine.MJType.Stand, 10) mj:setScale(MJ_HANDCARD_SCALE) layer:addChild(mj) mj:setPosition(cc.p(self.initX[seatId],MJ_HAND_CARD_INIT_Y)) self.initX[seatId]=self.initX[seatId]+mj:getContentSize().width+MJ_HANDCARD_PADDING_X local flag = cc.Sprite:create("mj/res/ui/zy_fangjian/mj_hu_flag.png") mj:addChild(flag) flag:setScale(2) flag:setPosition(cc.p(32,82)) end -- 创建吃牌(碰牌也走这) function yibinmajiangRoomXiaoJuView:createChi(values) local node=cc.Layer:create() node:setAnchorPoint(cc.p(0.5,0.5)) node:ignoreAnchorPointForPosition(false) local width=0 local height=0 for i=1,3 do if values[i] then local mj = CardClass:new(values[i], MJDefine.MyViewId, MJDefine.MJType.Operate, 10) mj:setScale(MJ_OPERATE_SCALE) node:addChild(mj) local mjWidth=mj:getContentSize().width * MJ_OPERATE_SCALE local mjHeight=mj:getContentSize().height * MJ_OPERATE_SCALE local x=mjWidth/2+(i-1)*(mjWidth+MJ_OPERATE_PADDING_X) local y=mjHeight/2 width=width+mjWidth height=mjHeight mj:setPosition(x,y) end end node:setContentSize(cc.size(width,height)) return node end -- 创建杠牌 function yibinmajiangRoomXiaoJuView:createGang(values, cardNum) local node=cc.Layer:create() node:setAnchorPoint(cc.p(0.5,0.5)) node:ignoreAnchorPointForPosition(false) local width=0 local height=0 for i=1,4 do if values[i] then local mj = CardClass:new(values[i], MJDefine.MyViewId, MJDefine.MJType.Operate, 10) mj:setScale(MJ_OPERATE_SCALE) node:addChild(mj) local mjWidth=mj:getContentSize().width * MJ_OPERATE_SCALE local mjHeight=mj:getContentSize().height * MJ_OPERATE_SCALE if i <= 3 then local x=mjWidth/2+(i-1)*(mjWidth+MJ_OPERATE_PADDING_X) local y=mjHeight/2 width=width+mjWidth height=mjHeight mj:setPosition(x,y) else local x = mjWidth/2+(2-1)*(mjWidth+MJ_OPERATE_PADDING_X) local y=mjHeight/2 + 12 height = mjHeight mj:setPosition(x,y) end mj:setTag(1000 + i); end end node:setContentSize(cc.size(width,height)) return node end -- 创建暗杠牌 function yibinmajiangRoomXiaoJuView:createAnGang(values, cardNum) local node=cc.Layer:create() node:setAnchorPoint(cc.p(0.5,0.5)) node:ignoreAnchorPointForPosition(false) local width=0 local height=0 for i=1,4 do if values[i] then local mj = CardClass:new(values[i], MJDefine.MyViewId, MJDefine.MJType.Operate, 10) mj:setScale(MJ_OPERATE_SCALE) -- 暗杠盖牌 if not IS_SHOW_ANGANG_CARD then if i <= 3 then mj:setOperateBackImage() end end node:addChild(mj) local mjWidth=mj:getContentSize().width * MJ_OPERATE_SCALE local mjHeight=mj:getContentSize().height * MJ_OPERATE_SCALE if i <= 3 then local x=mjWidth/2+(i-1)*(mjWidth+MJ_OPERATE_PADDING_X) local y=mjHeight/2 width=width+mjWidth height=mjHeight mj:setPosition(x,y) else local x=mjWidth/2+(2-1)*(mjWidth+MJ_OPERATE_PADDING_X) - 1 local y=mjHeight/2 + 16 height=mjHeight mj:setPosition(x, y); end end end node:setContentSize(cc.size(width,height)) return node end -- 创建巴杠,直接走杠牌创建 function yibinmajiangRoomXiaoJuView:createBaGang(values, cardNum) local node = self:createGang(values, cardNum) local mj = node:getChildByTag(1000 + 4) return node end -- 创建牌组 function yibinmajiangRoomXiaoJuView:createGroupCards(layer,arg,seatId) -- 定义牌组类型需要调用的创建方法 local handlers={ [MJDefine.MJGroupType.Chi]=handler(self,self.createChi), [MJDefine.MJGroupType.Peng]=handler(self,self.createChi), [MJDefine.MJGroupType.Gang]=handler(self,self.createGang), [MJDefine.MJGroupType.AnGang]=handler(self,self.createAnGang), [MJDefine.MJGroupType.BaGang] = handler(self, self.createBaGang), [MJDefine.MJGroupType.Fei] = handler(self, self.createChi), [MJDefine.MJGroupType.Ti] = handler(self, self.createChi), } for k,v in pairs(arg) do if handlers[v.opType] then local group=handlers[v.opType](v.values, v.cardNum) local w=(group:getContentSize().width-MJ_WIDTH)/2 group:setPosition(cc.p(self.initX[seatId]+w,MJ_OPERATE_CARD_INIT_Y)) if k<#arg then self.initX[seatId]=self.initX[seatId]+group:getContentSize().width+MJ_GROUP_PADDING_X else self.initX[seatId]=self.initX[seatId]+group:getContentSize().width+MJ_GROUP_PADDING_X end layer:addChild(group) end end end -- 获取组合牌组 function yibinmajiangRoomXiaoJuView:getChangeGruopDatas(g) -- dump(g, "getChangeGruopDatas") local opType=MJDefine.MJOperateToGroupType[g.opType] local showType=MJDefine.MJOperateToGroupType[g.opType] local opCard=g.opCard local cardNum = 3 local fromViewId = nil local targetSeatId = g.targetSeatId -- 操作位置座位号 local fromUserId = g.opUserId or g.fromUserId -- 触发操作玩家 local redNum = g.useRedNum local redCard = g.lziCard local temp = { MJDefine.MJGroupType.Gang, MJDefine.MJGroupType.BaGang, MJDefine.MJGroupType.AnGang } -- 如果是杠,则为4张 for i, v in ipairs(temp) do if v == opType then cardNum = 4 break end end if fromUserId<=0 or targetSeatId==nil then else fromViewId = app.room:transPos( targetSeatId, app.room:getSeatIdByUserId(fromUserId)) --判断是否是对面玩家,对面玩家的话要做一次翻转 local opViewId = app.room:getViewIdBySeatId(targetSeatId) if opViewId == 2 then --对面 if fromViewId==1 then fromViewId = 3 elseif fromViewId==3 then fromViewId = 1 end end --三人玩只有上下家 if app.room:getMaxPlayerCount()==3 and fromViewId==2 then fromViewId = 3 end if app.room:getMaxPlayerCount()==2 and fromViewId~=0 then if showType == MJDefine.MJGroupType.Peng then fromViewId = 2 else fromViewId = 4 end end end -- 组合一下牌 local group={ opType=opType, showType=showType, values={}, opCard = opCard, cardNum = cardNum, fromViewId = fromViewId } if MJDefine.MJGroupType.Chi==showType then elseif MJDefine.MJGroupType.Peng==showType then group.values={opCard,opCard,opCard} elseif MJDefine.MJGroupType.Fei==showType then for i = 1, 3 do if i <= redNum then table.insert(group.values, redCard) else table.insert(group.values, opCard) end end elseif MJDefine.MJGroupType.Ti==showType then group.values={opCard,opCard,opCard} else group.values={opCard,opCard,opCard,opCard} end return group end -- 组织创建牌 function yibinmajiangRoomXiaoJuView:initWeaveCard() local roomInfo=app.room.roomInfo self.initX={} for k,v in pairs(roomInfo.memberList) do local userId = app.room:getViewIdByUserId(v.nUserId) local nSeatId = app.room:getSeatIdByViewId(userId) local i = nSeatId+1 local groups={} for _, group in pairs(v.operates) do table.insert(groups, self:getChangeGruopDatas(group)) end self.initX[i]=MJ_HAND_CARD_INIT_X self:createGroupCards(self.items[i].Items.Layout_Player,groups,i) self.initX[i] = self.initX[i] + MJ_GROUP_PADDING_X * 2 self:createHandCards(self.items[i].Items.Layout_Player,v.handCards,i) -- 判断有胡牌并且有值 if next(v.huCards) and next(v.huCards[1]) and v.huCards[1].huCard and v.huCards[1].huCard > 0 then self.initX[i]=self.initX[i]+MJ_HU_X self:createHuCard(self.items[i].Items.Layout_Player,v.huCards[1].huCard,i) -- protol那边是以表形式存储的,所以直接取第一个 end end end -- 其他信息 function yibinmajiangRoomXiaoJuView:initOther() local roomInfo = app.room.roomInfo self.ui.Items.Text_Round:setText("局数:"..roomInfo.nGameStartCount..'/'..roomInfo.nTotalGameNum) --规则 local ruleAll = MJWanFa.getWanFaInfo(roomInfo:getStrGameInfo()) -- self.ui.Items.Text_Rule:setText(ruleAll) local item = self.ui.Items.Text_Rule:getCopied() item:setVisible(true) item:setText(ruleAll) self.ui.Items.ListView:addChild(item) self.ui.Items.ListView:hideAllBar() self.ui.Items.ListView:getInnerContainer():setAutoSize(true) self.ui.Items.ListView:requestDoLayout(); self.ui.Items.ListView:doLayout(); --时间 self.ui.Items.Text_Time:setText(os.date("%m-%d %X"))--(getTimeString()) --房号 self.ui.Items.Text_RoomNum:setText("房号:" .. roomInfo:getShowTableId()); if roomInfo:getStopFlag() == MJDefine.StopFlag.STOP_FLAG_HUANG_ZHUANG then self.ui.Items.ImageView_Title:loadTexture("xj_liuju.png",cc.TextureResType.plistType) end end -- 初始化听用牌 function yibinmajiangRoomXiaoJuView:initTingYongCard() local roomInfo = app.room.roomInfo local benjinCard = roomInfo:getBenJinCard() if not benjinCard then return end local tingCardInfo = roomInfo:getTingYongCard() local prevValue, nextValue = MJDefine.getPrevAndNextValue(benjinCard) -- local CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD) local temp = {prevValue, benjinCard, nextValue} for i=1,3 do if temp[i] > 0 then local mj = CardClass:new(temp[i], MJDefine.MyViewId, MJDefine.MJType.Stand, 10) mj:setScale(MJ_HANDCARD_SCALE) mj:setAnchorPoint(cc.p(0, 0)) self.ui.Items.Layout_TingYongCard:addChild(mj) local mjWidth = mj:getContentSize().width * MJ_HANDCARD_SCALE local mjHeight = mj:getContentSize().height * MJ_HANDCARD_SCALE local x = mjWidth * (i - 1) + MJ_TING_START_PADDING_X + MJ_TING_INTERVAL_X mj:setPosition(x, -4) for _, j in ipairs(tingCardInfo) do if temp[i] == j.card then mj:setTingColor() break end end end end end -- 获得胡牌类型内容 (huType胡牌类型, subHuType胡牌子类型) function yibinmajiangRoomXiaoJuView:getHuInfo(huType, subHuType) local str = '' if not huType or not subHuType then return str end -- 胡牌类型 for k,v in pairs(MJDefine.MJGamePaiType) do local newType = getNumBand(huType, v) if newType > 0 then str = str .. ' ' .. MJDefine.MJGameHuStr[v] end end -- 胡牌子类型 for k,v in pairs(MJDefine.MJGameSubPaiType) do local newType = getNumBand(subHuType, v) if newType > 0 then str = str .. ' ' .. MJDefine.MJGameSubHuStr[v] end end return str end -- 获得根数 function yibinmajiangRoomXiaoJuView:getGenInfo(genCount) local str = '' if not genCount then return str end if genCount > 0 then str = str .. ' ' .. genCount .. '根' end return str end -- 获得杠数 function yibinmajiangRoomXiaoJuView:getGangInfo(gangCount) local str = '' if not gangCount then return str end if gangCount > 0 then str = str .. ' ' .. gangCount .. '杠' end return str end return yibinmajiangRoomXiaoJuView