local ZPDef = ZPFramework.ZPImport("zp_base.luaScript.ZPDef") local ZPRoomView = ZPFramework.ZPFrameworkClassImprot("zp_base.luaScript.Views.Room.ZPRoomView") local ZPFuc = ZPFramework.ZPImport("zp_base.luaScript.ZPFunctions") local ZPSound = ZPFramework.ZPImport("zp_base.luaScript.ZPSound") local XichongRoomCard=ZPFramework.ZPImport("zp_xichong.luaScript.Views.Room.xichongRoomCard") local ZPMessage = ZPFramework.ZPImport("zp_base.luaScript.Protocol.ZPMessage") local XiChongRoomOperationView=ZPFramework.ZPImport("zp_xichong.luaScript.Views.Room.xichongRoomOperationView") local ZPRoomPlayerView=ZPFramework.ZPImport("zp_base.luaScript.Views.Room.ZPRoomPlayerView") local ZPRoomToolView=ZPFramework.ZPImport("zp_base.luaScript.Views.Room.ZPRoomToolView") local ZPRoomXiaoJuChaPaiView=ZPFramework.ZPImport("zp_base.luaScript.Views.Room.ZPRoomXiaoJuChaPaiView") local xichongRoomXiaoJuView=ZPFramework.ZPImport("zp_xichong.luaScript.Views.Room.xichongRoomXiaoJuView") local ZPRoomQuickStartView=ZPFramework.ZPImport("zp_base.luaScript.Views.Room.ZPRoomQuickStartView") local xichongRoomSettingView=ZPFramework.ZPImport("zp_xichong.luaScript.Views.Room.xichongRoomSettingView") local ZPWanFa=ZPFramework.ImportWanFa("luaScript.SubGameDefine.ZiPai.ZPWanFa") local XiChongCard = ZPFramework.ZPImport("zp_xichong.luaScript.Views.Room.xichongCard") local ZPRoomCountAllView=ZPFramework.ZPImport("zp_base.luaScript.Views.Room.ZPRoomCountAllView") local xichongRoomView = class("xichongRoomView", ZPRoomView) --每张牌的点数 用于排序 local tempCardVlue ={ [17] = 2, --11 [18] = 3, --12 [49] = 4, --31 [34] = 4, --22 [20] = 5, --14 [50] = 5, --32 [21] = 6, --15 [36] = 6, --24 [51] = 6, --33 [22] = 7, --16 [82] = 7, --52 [52] = 7, --34 [38] = 8, --26 [53] = 8, --35 [68] = 8, --44 [54] = 9, --36 [84] = 9, --54 [70] = 10, --46 [85] = 10, --55 [86] = 11, --56 [102] = 12, --66 } function xichongRoomView:ctor() xichongRoomView.super.ctor(self) --self.BackColor = ZPDef. self.outCardScale = 1 --一共九列 self.lieshulist[1] = {5} self.lieshulist[2] = {5,6} self.lieshulist[3] = {4,5,6} self.lieshulist[4] = {4,5,6,7} self.lieshulist[5] = {3,4,5,6,7} self.lieshulist[6] = {3,4,5,6,7,8} self.lieshulist[7] = {2,3,4,5,6,7,8} self.lieshulist[8] = {2,3,4,5,6,7,8,9} self.lieshulist[9] = {1,2,3,4,5,6,7,8,9} self.lieshulist[10] = {1,2,3,4,5,6,7,8,9,10} self.lieshuBlanklist[1] = {1,2,3,4,6,7,8,9,10} self.lieshuBlanklist[2] = {1,2,3,4,7,8,9,10} self.lieshuBlanklist[3] = {1,2,3,7,8,9,10} self.lieshuBlanklist[4] = {1,2,3,8,9,10} self.lieshuBlanklist[5] = {1,2,8,9,10} self.lieshuBlanklist[6] = {1,2,9,10} self.lieshuBlanklist[7] = {1,9,10} self.lieshuBlanklist[8] = {1,10} self.lieshuBlanklist[9] = {10} self.lieshuBlanklist[10]= {} --扇形最大列数 self.lieShuMax = 10 self.isBingPeng = false self.verticleInterval = 5 --操作牌数组 self.opOutCard = {} --操作牌数量数组 用来保存每个方位操作牌的数量 self.opOutCardNum = {} local cacheStyle = "gameStyleType"..(ZPDef.GameID or app.gameId) self.desktopType = tonumber(loadUserInfo(cacheStyle)) or ZPDef.GameStyleType.JINGDIAN end function xichongRoomView:onEnter() xichongRoomView.super.onEnter(self) end function xichongRoomView:loadRoomUI() local ui = loadUI("zp_xichong/res/ui/ui_fangjian/xichong_ui_fangjian.ui"); self.ui = ui; self:addChild(ui); end function xichongRoomView:loadTextureCache() xichongRoomView.super.loadTextureCache(self) ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_groupCards_jingdian.plist") ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_handCards_jingdian.plist") ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_handCards_xiandai.plist") ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_outCards_jingdian.plist") ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_outCards_xiandai.plist") ZPFuc.loadSpriteFromFile("zp_xichong/res/ui/zy_fangjian/cards1/xichong_samllCards.plist") end function xichongRoomView:initMySelfCardPos() self.boxPosList4 = {} local weaveCardPos4 = self.ui.Items.Layout_StartPos:getPosition() local weaveCardPosXianDai4 = self.ui.Items.Layout_StartPos1:getPosition() for i = 1, self.lieShuMax do --矩形3 if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self.boxPosList4[i] = cc.p(weaveCardPosXianDai4.x + 70 * (i - 1),weaveCardPosXianDai4.y)--手牌间隙改这里 else self.boxPosList4[i] = cc.p(weaveCardPos4.x + 93 * (i - 1) - 100,weaveCardPos4.y)--手牌间隙改这里 end end end function xichongRoomView:changeOutCardPos() if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self.ui.Items.Layout_outCardPoint_1:setPosition(self.JdOutCardPos1) self.ui.Items.Layout_outCardPoint_3:setPosition(self.JdOutCardPos3) else self.ui.Items.Layout_outCardPoint_1:setPosition(self.XDOutCardPos1) self.ui.Items.Layout_outCardPoint_3:setPosition(self.XDOutCardPos3) end end --初始化操作牌数量 function xichongRoomView:initOpOutCardNum() for k = 1,ZPDef.GameMaxPlayer do self.opOutCardNum[k] = 0 end end function xichongRoomView:initBaseNode() --自己的出生坐标,视图是4 self:initMySelfCardPos() --坐标记录 self.srcOutCardPosList = {} self.JdOutCardPos1 = self.ui.Items.Layout_JD_outCardPoint_1:getPosition() self.JdOutCardPos3 = self.ui.Items.Layout_JD_outCardPoint_3:getPosition() self.XDOutCardPos1 = self.ui.Items.Layout_outCardPoint_1:getPosition() self.XDOutCardPos3 = self.ui.Items.Layout_outCardPoint_3:getPosition() self.scorePosList = {} for k = 1,ZPDef.GameMaxPlayer do local name = string.format("Layout_outCardPoint_%d",k) local imgName = string.format("ImageView_outCardImg_%d",k) self.ui.Items[name]:setScale(self.outCardScale) self.srcOutCardPosList[k] = self.ui.Items[imgName]:getPosition() --操作分数坐标 --name = string.format("TextBMFont_Score_%d",k) --self.scorePosList[k] = self.ui.Items[name]:getPosition() end self:initOpOutCardNum() for k = 1,ZPDef.GameMaxPlayer do local name = string.format("Layout_DiPai_%d",k) if self.ui.Items[name] then self.ui.Items[name]:setVisible(false) end end for k = 1,ZPDef.GameMaxPlayer do local name = string.format("Layout_DiPai_JD_%d",k) if self.ui.Items[name] then self.ui.Items[name]:setVisible(false) end end --初始化扎鸟 self.PlayerView:initPlayerPiaoFenByRule() local timestr = os.date("%y-%m-%d %H:%M:%S") self.ui.Items.Text_systemTime:setText(timestr) --定时器 if not self.Time then self.Time = cc.Director:getInstance():getScheduler():scheduleScriptFunc(function() local timestr = os.date("%y-%m-%d %H:%M:%S") self.ui.Items.Text_systemTime:setText(timestr)--(getTimeString()) end,1.0,false) end end function xichongRoomView:initGameButton() --出牌按钮 self.ui.Items.Button_OutCard:registerClick(function() local k = self.ui.Items.ImageView_handTempCard.cIdx local value = self.ui.Items.ImageView_handTempCard.value --send sender self.isGodHand = true; self.handCardItem[k]:setOpacity(0) self:setColorWhite() self:sendOutCard(value) self.bOutCard = false end) --提牌按钮 --[[ self.ui.Items.Button_tipai:registerClick(function() self:requestFlashHandCard() end) --暂时屏蔽提牌功能 self:showTiPaiBtn(true)--]] --点击空白 self.ui.Items.Layout_Touch:registerClick(nil,function() -- local list = { -- ZPDef.BaoOpCode.BAO_ZHAO_CHI, -- ZPDef.BaoOpCode.BAO_TUI, -- ZPDef.BaoOpCode.BAO_HOU_DUI, -- ZPDef.BaoOpCode.BAO_PO_DUI, -- ZPDef.BaoOpCode.BAO_CHENG_KAN, -- ZPDef.BaoOpCode.BAO_SI_ZHANG, -- ZPDef.BaoOpCode.DIAO_CHENG_KAN, -- ZPDef.BaoOpCode.DIAO_CHENG_SIZHANG, -- } -- for i = 1, 4 do -- self.PlayerView:playPaiXingAniList(i, list, 0x31, function () -- end) -- end -- for i = 1, 4 do -- self.PlayerView:playChiChengSiZhang(i, 0x31, true) -- end --[[ for k,v in ipairs(self.handCardItem or {}) do v:removeFromParent() end self:runDelay(0.5, function () local uid = app.user.loginInfo.uid app.room.cards = {} app.room.cards[uid] = { {102, 17}, {86, 18}, {70, 34, 49}, {84, 50, 50, 20}, {68, 53, 51}, {52, 52, 22, 22}, {52, 52, 22, 22}, } self:createCard(true, uid, nil) end) --]] --local list = {102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102} --[[ for k,v in pairs(list) do self:playQiPaiAni(false,v,1,nil,false) self:playQiPaiAni(false,v,2,nil,false) self:playQiPaiAni(false,v,3,nil,false) self:playQiPaiAni(false,v,4,nil,false) end--]] --[[ self.PlayerView:setPClockVisible(4,true) self.PlayerView:setOperatorTipVisible(true) self:setOutCardVisible(true,1,102,false,nil,true)--]] --隐藏工具界面 详情 if self.toolView.ui.Items.ImageView_Rule_bg then self.toolView.ui.Items.ImageView_Rule_bg:setVisible(false) end self.ui.Items.Layout_Rule:setVisible(false) self.ui.Items.Button_wanfa:setVisible(true) end) -- 玩法 self.ui.Items.Button_wanfa:registerClick(function () playBtnEffect() self.ui.Items.Layout_Rule:setVisible(not self.ui.Items.Layout_Rule:isVisible()) self.ui.Items.Button_wanfa:setVisible(false) end) if app.room.roomInfo.nGameStartCount and app.room.roomInfo.nGameStartCount > 0 then self.ui.Items.Layout_Rule:setVisible(false) else self.ui.Items.Layout_Rule:setVisible(true) self.ui.Items.Button_wanfa:setVisible(false) self.ui.Items.Layout_Rule:runAction(cc.Sequence:create( cc.DelayTime:create(2), cc.CallFunc:create(function() self.ui.Items.Layout_Rule:setVisible(false) self.ui.Items.Button_wanfa:setVisible(true) end))) end self.ui.Items.Text_Rule:setVisible(false) local bar = self.ui.Items.ListView:getVBar() bar:setVisible(false) end function xichongRoomView:initToolLayer() --人物头像层 self.PlayerView = ZPRoomPlayerView:new() self.ui.Items.Layout_Player:addChild(self.PlayerView) --操作界面(吃碰杠胡) self.operationView = XiChongRoomOperationView:new() --self.operationView:setVisible(false) self.ui.Items.Layout_Tool:addChild(self.operationView) --加载工具层 self.toolView = ZPRoomToolView:new() self.ui.Items.Layout_Tool:addChild(self.toolView) -- 小局查牌界面 -- 小局查牌界面 self.xiaojuChaPaiView = ZPRoomXiaoJuChaPaiView:new(self.desktopType) self.xiaojuChaPaiView:setVisible(false) --亮牌界面确定 local function cb() --显示小局结算 if self.xiaojuView then self.xiaojuView:setVisible(true) end end self.xiaojuChaPaiView:setQueDingCallBack(cb) self.xiaojuChaPaiView:showHuCardCallBack(handler(self , self.onShowHuCard)) self:addChild(self.xiaojuChaPaiView) end function xichongRoomView:onChangeTable(data) local idx = data.idx self:setTableImg(idx) if self.fapaiqiLeftCard and #self.fapaiqiLeftCard > 0 then for i = 1, #self.fapaiqiLeftCard do if self.fapaiqiLeftCard[i] then self.fapaiqiLeftCard[i]:removeFromParent() self.fapaiqiLeftCard[i] = nil end end end self.fapaiqiLeftCard = nil if self.leftNum and self.leftNum > 0 then self:setCircleCardLeftPanelView(true,nil,self.leftNum) end end function xichongRoomView:setTableImg(idx) if idx and (idx == 1 or idx == 4) then self.colorType = ZPDef.BackType.Green else self.colorType = ZPDef.BackType.Red end local name = string.format("zp_xichong/res/ui/zy_fangjian/bg/fangjian_di_%d.jpg",idx) --桌布 self.ui.Items.ImageView_bg:loadTexture(name) local cacheGameBgPic = "gameBgPicture"..(ZPDef.GameID or app.gameId) saveUserInfo(cacheGameBgPic,idx) end --改变外发光颜色 function xichongRoomView:changeOutCardLight(isMoPai) for i = 1 ,ZPDef.GameMaxPlayer do local outCardLightName = string.format("ImageView_outCardLight_%d",i) local light = self.ui.Items[outCardLightName] local fileName if self.desktopType == ZPDef.GameStyleType.JINGDIAN then fileName = ZPDef.LightType.JINGDIAN else fileName = ZPDef.LightType.XIANDAI end light:loadTexture(fileName) --light:setVisible(false) end end function xichongRoomView:setFaPaiQiPanelView(bVisible,viewId,leftNum) if leftNum then if not self.fapaiqiLeftCard then self.fapaiqiLeftCard = {} local bgsize = self.ui.Items.ImageView_card_bg:getContentSize() for i = 1,tonumber(leftNum) do ---只显示28张底牌牌面,太多了不太好看 self.fapaiqiLeftCard[i] = cc.ImageView:createNode() if self.colorType == ZPDef.BackType.Red then self.fapaiqiLeftCard[i]:loadTexture("zp_xichong/res/ui/zy_fangjian/cardBack/xichong_cardBack_paidun_red.png") else self.fapaiqiLeftCard[i]:loadTexture("zp_xichong/res/ui/zy_fangjian/cardBack/xichong_cardBack_paidun_green.png") end self.ui.Items.ImageView_card_bg:addChild(self.fapaiqiLeftCard[i]) self.fapaiqiLeftCard[i]:setPosition(cc.p(bgsize.width/2,bgsize.height/2+i)) if i > 28 then self.fapaiqiLeftCard[i]:setVisible(false) end end else for i = #self.fapaiqiLeftCard,leftNum+1,-1 do if self.fapaiqiLeftCard[i] then self.fapaiqiLeftCard[i]:removeFromParent() self.fapaiqiLeftCard[i] = nil end end end self.ui.Items.TextBMFont_leftCardNum:setText(tostring(self.leftNum)) end end --更新头家家 function xichongRoomView:updateBanker() --隐藏所有的庄家标志 self.PlayerView:setBankerVisible() self.PlayerView:hideTouJia() --只显示当前的庄家座位号 local nBankerSeatId = app.room.roomInfo.nBankSeatId local viewId = app.room:getViewIdBySeatId(nBankerSeatId) if self.PlayerView:setPlayerTouJiaVisible(viewId,true) then else showTooltip("头家椅子号"..nBankerSeatId.."不匹配") end end --更新当 function xichongRoomView:updateBankerDang() --隐藏所有的庄家标志 self.PlayerView:setBankerVisible() self.PlayerView:hideTouJia() --只显示当前的庄家座位号 local nBankerSeatId = app.room.roomInfo.nBankSeatId local viewId = app.room:getViewIdBySeatId(nBankerSeatId) if self.PlayerView:setPlayerDangVisible(viewId,true) then else showTooltip("头家椅子号"..nBankerSeatId.."不匹配") end end --显示小家 function xichongRoomView:updateXiaojia() self.PlayerView:hideXiaoJia() --只显示当前的庄家座位号 local nBankerSeatId = app.room.roomInfo.xiaoSeatId local viewId = app.room:getViewIdBySeatId(nBankerSeatId) self.PlayerView:setPlayerXiaoJiaVisible(viewId,true) end --隐藏剩余牌层 function xichongRoomView:setCircleCardLeftPanelView(bVisible,viewId,leftNum) self.leftNum = leftNum self.ui.Items.Layout_fapaiqi:setVisible(true) self:setFaPaiQiPanelView(bVisible,viewId,leftNum) if viewId and not self.isRecordStart then self.PlayerView:setPClockVisible(viewId,true) end end --更新房间基础数据 function xichongRoomView:updateRoomBaseData() --初始化背景 local ZiPaigameBgPicture = "gameBgPicture"..(ZPDef.GameID or app.gameId) local idx2 = tonumber(loadUserInfo(ZiPaigameBgPicture)) or 1 self:setTableImg(idx2) local roomInfo = app.room.roomInfo; -- 房间号 self.ui.Items.Text_roomNum:setText(tostring(roomInfo.nShowTableId)); --局数 self:updateGameNums() --房间玩法 --local ruleAll = ZPFuc.getRuleInfo(); --self.toolView.ui.Items.Text_Rule:setText(ruleAll) self:setRoomInfo() self:onUserReadyResponse() for i = 1,ZPDef.GameMaxPlayer do self.PlayerView:updatePlayerInfo(i) end -- 是否显示邀请好友 self:setWetChatVisible(table.nums(app.room.roomInfo.memberList) < ZPFuc.getCreateRoomPlayerNum()) self.toolView:showFastStart(true) if isReviewVersion() then self:setWetChatVisible(false); end -- 更新玩家手牌列表时,按需显示 if app.room.roomInfo.nGameStartCount > 0 then self:setWetChatVisible(false) end if app.room.roomInfo.nGameStartCount == 0 then self.ui.Items.Button_tipai:setVisible(false) end end function xichongRoomView:onGameReconnection() --logE("ZiPai当前版本号:"..ZPFuc.getZPCurVersion()) --更新房间基础数据 self:updateRoomBaseData() local roomInfo = app.room.roomInfo; --self:updateAllGpsInfo() --self:checkGpsDistance(nil,roomInfo.nGameStartCount==0) --self:checkMyGpsNeedUpdate(); self.PlayerView:setPlayerPosByChangeTable(self.desktopType) self:changeOutCardPos() --断线重连 if roomInfo.nGameStartCount > 0 then local function runOnGameReconnection(onEnd) self.ui.Items.Button_tipai:setVisible(false) local roomInfo = app.room.roomInfo; local isBiHu = roomInfo.isBiHu self.ui.Items.ImageView_handTempCard:stopAllActions() --显示庄家 self:updateBankerDang() self:showOwner() self:updateXiaojia() local myUserID = app.room:getMyRecordUserId() --解散状态 local isDismiss = false local uid = 0 for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(k) local nOffLineState = v.nOnlineStatus --显示离线 self.PlayerView:setPlayerOffLine(nOffLineState ~= 1,viewId) local viewId = app.room:getViewIdByUserId(k) --记录玩家解散状态 0:初始状态, 1:发起解散 2: 同意解散 3:不同意解散 app.room.dismissInfo[k] = v.nDisbandStatus; app.room.roomInfo.memberList[k].nDisbandStatus = v.nDisbandStatus; --有人发起解散时才显示解散界面 if v.nDisbandStatus == 1 then isDismiss = true uid = k end --必碰 if viewId == self:getMeViewId() and v.isBiPeng == 1 then self.isBingPeng = true end end --self.PlayerView:setXiaoJiaFlagVis(true) local actualNum = app.room:getActualPlayerNum() --有人发起解散时才显示解散界面 if isDismiss then app.room.roomInfo.nDismissStateTime = roomInfo.nDismissStateTime; app.room.roomInfo.nDismissToTalTime = roomInfo.nDismissToTalTime; local view = require("luaScript.Views.Room.RoomDismissView"):new(uid,app.room.roomInfo.memberList,roomInfo.nDismissStateTime) view:setAnchorPoint(cc.p(0.5, 0.5)); app:showWaitDialog(view); end --如果一局结束,玩家点了准备,不再显示牌信息 if ZPDef.ReconnectState.GAME_STATUS_ROUND_OVER == roomInfo.nStatus and roomInfo.memberList[myUserID].nPlayerFlag == 1 or ZPDef.ReconnectState.GAME_STATUS_GAME_OVER == roomInfo.nStatus and roomInfo.memberList[myUserID].nPlayerFlag == 1 then --游戏为停止或开始状态 self:onUserReadyResponse() self.ui.Items.Button_tipai:setVisible(false) if onEnd then onEnd() end return end --胡牌类型 local huType = ZPDef.ReconnectHuType.NO_HU --状态显示 if ZPDef.ReconnectState.GAME_STATUS_ROUND_OVER == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_GAME_OVER == roomInfo.nStatus then --游戏为停止或开始状态 for hi,hv in pairs(app.room.roomInfo.hupaiInfo) do if hv.huPaiUid > -1 then app.room.roomInfo.fourNormolNum = hv.fourNormolNum app.room.roomInfo.fourHongNum = hv.fourHongNum app.room.roomInfo.threeHongNum = hv.threeHongNum end if hv.weiGuiUid > -1 then app.room.roomInfo.weiGuiUid = hv.weiGuiUid end end self.ui.Items.Button_tipai:setVisible(false) --显示小局结算亮牌画布 self:setLiangPaiVisible(true) --显示底牌 self.xiaojuChaPaiView:showDiPai() --亮手牌 huType = self.xiaojuChaPaiView:liangShouPai(true) local function nextCallBackFun() self:resetGameData() end self.xiaojuView = xichongRoomXiaoJuView:new(nextCallBackFun,true) self:addChild(self.xiaojuView) --播放黄庄动画 if roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_HUANG_ZHUANG then local userInfo=app.room:getUserInfo(app.user.loginInfo.uid) if userInfo then --ZPSound.PlayHuangZhuang(userInfo.sex) end self.xiaojuChaPaiView:PlayHuangZhuangAni(false) end self.xiaojuView:setVisible(true) self:setBtnSitDownVisible(false) end local diPaiMax = table.nums(roomInfo.dipaiList) for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(k) local nScore = v.nTotalMoney or 0 --玩家分数 self.PlayerView:setPlayerScore(viewId,nScore) --扎鸟 --self.PlayerView:setPlayerPiaoFen(viewId,v.nZhaBirdScore) --恢复手牌 if k == myUserID then self:createCard(false,myUserID,nil) end --恢复爆牌动画 if v.nBaoPaiStatus == 2 then self.PlayerView:setPlayerPiaoVisible(viewId,true) end local hushu = 0 --恢复组合牌 for key,value in pairs(v.tableWeaveCard) do local list,operationType = ZPFuc.getZPCardList(value.card,value.type) local isShow = true local card = value.opcard local optype = value.type hushu = hushu + value.hushu list = value.card --上面吃或不吃不要用if else因为还可能都不成立 local isMoPaiOrId = value.seatId --创建桌面操作牌 self:recontactDoOperation(operationType,viewId,list,optype) end self.tableHuXiList[viewId] = hushu --self.PlayerView:setPlayerHuXi(viewId,hushu) --self.PlayerView:setPlayerHuXi("油:"..tostring(hushu)) if viewId ~= self:getMeViewId() then self.PlayerView:setLeftCardNum(viewId,true,tonumber(v.leftCardNum)) end end --self:getLocalHuShu() for i = 1, 4 do local tt = self.qiPaiList[i] end --恢复弃牌 for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(v.nUserId) local qiList = self.qiPaiList[viewId] for key,value in pairs(v.desertedArea) do local card = value.card local maxQi = table.nums(qiList) if maxQi > 0 then --染色弃牌 local isInQiList = false for qiK,qiCard in pairs(qiList) do if qiCard == value.card then --染色弃牌 self:playQiPaiAni(false,value.card,viewId,nil,true) isInQiList = true qiList[qiK] = nil break end end if not isInQiList then self:playQiPaiAni(false,value.card,viewId,nil,false) end else --普通弃牌 self:playQiPaiAni(false,value.card,viewId,nil,false) end end end --显示玩家剩余手牌 if app.room.roomInfo.offLineInfo and next(app.room.roomInfo.offLineInfo) ~= nil then for i,v in pairs(app.room.roomInfo.offLineInfo) do if v.extInfo then local extIf = json.decode(v.extInfo) if extIf.HuShu and v.nUserId then local viewId = app.room:getViewIdByUserId(v.nUserId) self.PlayerView:setPlayerTuoShu(viewId,extIf.HuShu) end end end end local nSeatId = roomInfo.showCardSeatId local viewId = app.room:getViewIdBySeatId(nSeatId) --判断当前操作玩家是否是自己 if viewId == self:getMeViewId() then --吃后巴后油牌 if table.nums(app.room.roomInfo.firstOutCard or {}) > 0 then self:lockMyHandCards() else if table.nums(app.room.roomInfo.disCard or {}) > 0 and (ZPDef.ReconnectState.GAME_STATUS_WAIT_OUT_CARDS == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_WAIT_BANKER_OUTCARD == roomInfo.nStatus) then self:lockYouPai(app.room.roomInfo.disCard) end end end if roomInfo.baoType and roomInfo.baoType > 0 then self.operationView:showBaoPaiOpView(true,roomInfo.baoType) self:setCircleCardLeftPanelView(true,viewId,diPaiMax) end --self:setTotalTuoNum(app.room.roomInfo.totalTuoNum) local myViewId = self:getMeViewId() self.PlayerView:setPlayerTuoShu(myViewId,app.room.roomInfo.totalTuoNum) --状态显示 if ZPDef.ReconnectState.GAME_STATUS_ROUND_OVER == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_GAME_OVER == roomInfo.nStatus then --游戏为停止或开始状态 self.PlayerView:hideLeftCard() --所有的暗偎默认亮起一张 --self:showLastAnWeiPai() --点炮显示 --self:showPaoImage() local winerViewId = -1 for hi,hv in pairs(app.room.roomInfo.hupaiInfo) do if hv.huPaiUid > -1 then winerViewId = app.room:getViewIdByUserId(hv.huPaiUid) app.room.roomInfo.huType = hv.huTypes self:playHuEffect(winerViewId,nil,true) --self:setLayoutScoreTipVisible(true,playerList,false,nil,true) end end local nCard = roomInfo.showCard if nCard > 0 and roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_WEIGUI then self:setOutCardVisible(true,viewId,nCard,false,nil,true) end --显示坨数 for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(v.nUserId) local tuoNum = v.totalTuoNum self.PlayerView:setPlayerTuoShu(viewId,tuoNum) self.PlayerView:setHuCardVisible(viewId, viewId == winerViewId, app.room.roomInfo.huCard) end elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_TIAN_HU == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_AFTER_TURN_OVER == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_TOU == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_AFTER_OUTCARD == roomInfo.nStatus then -- 天胡,翻牌后等待玩家操作中,出牌后等待玩家操作中 local nSeatId = roomInfo.showCardSeatId local nCard = roomInfo.showCard local operateCode = roomInfo.mainOpCode local viewId = app.room:getViewIdBySeatId(nSeatId) local nUserId = app.room:getUserIdBySeatId(nSeatId) local opCardList = {} local curOpeateid = roomInfo.curOpreateID --当前操作ID local curOpView = app.room:getViewIdBySeatId(curOpeateid) --记录真实数据 self.outCard = nCard self.EatOperationCode = operateCode self.moPaiViewId = viewId if ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_TIAN_HU == roomInfo.nStatus then --等待天胡 if nCard > 0 then self:setOutCardVisible(true,viewId,nCard,false,nil,true) --十八烂的时候要显示庄家出的那张牌 end local curOpView = app.room:getViewIdBySeatId(curOpeateid) local opCard = 0 --操作码 if roomInfo.startOpList and #roomInfo.startOpList.ToucardList > 0 then opCard = roomInfo.startOpList.ToucardList[1] end if operateCode > 0 and roomInfo.isSubmitOp == 0 then self.outCard = 0 self:showOpeation(operateCode,opCard, nil, isBiHu) --天胡没有过 end elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_TOU == roomInfo.nStatus then --玩家进牌状态 local opCard = 0 --操作码 if roomInfo.startOpList and #roomInfo.startOpList.ToucardList > 0 then opCard = roomInfo.startOpList.ToucardList[1] end if operateCode > 0 then self.outCard = 0 self:showOpeation(operateCode,opCard, nil, isBiHu) --天胡没有过 end elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_AFTER_OUTCARD == roomInfo.nStatus then --是否已经操作过 0表示没有,非0表示已经提交了操作 if operateCode ~= 0 and roomInfo.isSubmitOp == 0 then opCardList = {} for k,v in ipairs(roomInfo.chiPaiList or {}) do table.insert(opCardList,v) end self:showOpeation(operateCode,nCard,opCardList, isBiHu) self:setOutCardVisible(true,viewId,nCard,false,nil,true) elseif roomInfo.isSubmitOp == 1 or roomInfo.isSubmitOp == 0 or roomInfo.isSubmitOp == 2 then self:setOutCardVisible(true,viewId,nCard,false,nil,true) --playVoiceCardValue(nCard,nUserId) --elseif roomInfo.isSubmitOp == 2 then --比牌不显示出牌或者摸牌 --self.operationView:touchEatOneCardCallBack(true) end elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_AFTER_TURN_OVER == roomInfo.nStatus then if roomInfo.isSubmitOp == 1 then operateCode = 0 self:playMoPaiAni(diPaiMax,nCard,viewId,operateCode,roomInfo.showCardFlag,nil,true, nil, nil, isBiHu) elseif roomInfo.isSubmitOp == 0 then --自己摸牌翻牌 opCardList = {} for k,v in ipairs(roomInfo.chiPaiList or {}) do table.insert(opCardList,v) end self:playMoPaiAni(diPaiMax,nCard,viewId,operateCode,roomInfo.showCardFlag,nil,true,opCardList, nil, isBiHu) elseif roomInfo.isSubmitOp == 2 then --比牌不显示出牌或者摸牌 operateCode = 0 self:playMoPaiAni(diPaiMax,nCard,viewId,operateCode,roomInfo.showCardFlag,nil,true, nil, nil, isBiHu) self.operationView:touchEatOneCardCallBack(true) end end --显示剩余牌 --如果有出的牌,则闹钟显示在该玩家,如果没有则显示在等待操作的玩家 self:setCircleCardLeftPanelView(true,viewId,diPaiMax) elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OUT_CARDS == roomInfo.nStatus or ZPDef.ReconnectState.GAME_STATUS_WAIT_BANKER_OUTCARD == roomInfo.nStatus then --等待玩家出牌中 --显示底牌 local viewId = app.room:getViewIdBySeatId(roomInfo.showCardSeatId) --显示剩余牌 self:setCircleCardLeftPanelView(true,viewId,diPaiMax) if viewId == self:getMeViewId() then self:setGuideView(true) self.bOutCard = true end elseif ZPDef.ReconnectState.GAME_STATUS_AUTO_DISCSRD == roomInfo.nStatus then --玩家自动弃牌中 local nSeatId = roomInfo.showCardSeatId local nCard = roomInfo.disCard local viewId = app.room:getViewIdBySeatId(nSeatId) --显示剩余牌 self:setCircleCardLeftPanelView(true,viewId,diPaiMax) --弃牌 self:playQiPaiAni(true,nCard,viewId,nil) elseif ZPDef.ReconnectState.GAME_STATUS_WAIT_OP_BAO == roomInfo.nStatus then --等待玩家爆牌中 --爆牌中 local viewId = app.room:getViewIdBySeatId(roomInfo.showCardSeatId) self:setCircleCardLeftPanelView(true,viewId,84) for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(k) local nBankerSeatId = app.room.roomInfo.nBankSeatId local toujiaviewId = app.room:getViewIdBySeatId(nBankerSeatId) --等待爆牌状态 if v.nBaoPaiStatus == 1 and k == app.user.loginInfo.uid then self:showPiao(app.user.loginInfo.uid) elseif v.nBaoPaiStatus == 2 and k == app.user.loginInfo.uid then self.PlayerView:setPlayerPiaoVisible(viewId,true) end if k ~= app.user.loginInfo.uid then if v.nBaoPaiStatus == 1 then self.PlayerView:setPlayerDingPiaoVisible(viewId,true) elseif v.nBaoPaiStatus == 2 then self.PlayerView:setPlayerPiaoVisible(viewId,true) self.PlayerView:setPlayerDingPiaoVisible(viewId,false) end end end end if onEnd then onEnd() end end log("2000000000-ZPRoomView - self:addCallBack(runOnGameReconnection)" ) self:addCallBack(runOnGameReconnection) else --未开局正常坐下这里会进来 for k,v in pairs(roomInfo.memberList) do local viewId = app.room:getViewIdByUserId(k) local nOffLineState = v.nOnlineStatus or 1 --显示离线 self.PlayerView:setPlayerOffLine(nOffLineState ~= 1,viewId) end --未开局重连坐下 for k,v in pairs(roomInfo.arrayTableInfo) do local viewId = app.room:getViewIdByUserId(k) local nOffLineState = v.nOnlineStatus --显示离线 self.PlayerView:setPlayerOffLine(nOffLineState ~= 1,viewId) end self.ui.Items.Layout_fapaiqi:setVisible(false) end end --断线重连 function xichongRoomView:recontactDoOperation(operationType,viewId,list,optype) if optype == ZPDef.SendCardType.TOU_THREE_SAME or optype == ZPDef.SendCardType.CHI_PAI_PENG then local card = list[1] if self.desktopType == ZPDef.GameStyleType.JINGDIAN then local templist = {card,card,card} self:createOpOutcard(viewId,templist,3) else local templist = {card,card,card} self:createPengView(viewId,templist,false) end elseif optype == ZPDef.SendCardType.BA_FOUR_SAME then local card = list[1] if self.desktopType == ZPDef.GameStyleType.JINGDIAN then local templist = {card,card,card,card} self:createOpOutcard(viewId,templist,4) else local templist = {card,card,card,card} self:createPengView(viewId,templist,false) end elseif optype == ZPDef.SendCardType.TWO_SUM_CHI then local card = list[1] if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,list,2) else self:createEatView(card,viewId,list,false,nil,nil) end end end -- 立即开始 function xichongRoomView:onQuickStartResponse(event) log("2000000000-ZPRoomView - runnQuickStartResponse()" ) if not event or not event.response then return end logE("onQuickStartResponse() response = ", event.response) local response = event.response --app.room.roomInfo.nShowDismiss = true local isStart = true local selectNums = table.nums(app.room.quickStartInfo) for i,v in pairs(app.room.quickStartInfo) do if v > 1 then --有人投过票 isStart = false end end if tolua.isnull(self.quickStartView) then for i,v in pairs(app.room.quickStartInfo) do if v == 1 then self.quickStartView = ZPRoomQuickStartView:new(i); self.quickStartView:setAnchorPoint(cc.p(0.5, 0.5)); app:showWaitDialog(self.quickStartView); log("onQuickStartResponse() v = 1 "..i ) return else local startuid = 0 for i,v in pairs(app.room.quickStartInfo) do if v == 1 then startuid = i end end self.quickStartView = ZPRoomQuickStartView:new(startuid); self.quickStartView:setAnchorPoint(cc.p(0.5, 0.5)); app:showWaitDialog(self.quickStartView); log("onQuickStartResponse() v ~= 1 "..i ) return end end end end function xichongRoomView:showPiao(uid) local viewId = app.room:getViewIdByUserId(uid) if viewId == self:getMeViewId() then self:hidePiao() local ui=loadUI("zp_xichong/res/ui/ui_fangjian/xichong_ui_piao.ui") self:addChild(ui) self.piao=ui --[[ for i = 1,ZPDef.GameMaxPlayer do self.PlayerView:setPlayerDingPiaoVisible(i, true) end--]] ui.Items.Button_BuPiao:registerClick(function() playBtnEffect() self:hidePiao() local request = ZPMessage.BaoPai:new() request.optType = 0 self.ui:sendMsg(app.room, "BaoPai", request, function(status, response) logE("xichongRoomView baojiao response = ", table.tostring(response)) end) end) ui.Items.Button_Piao:registerClick(function() playBtnEffect() self:hidePiao() local request = ZPMessage.BaoPai:new() request.optType = 1 self.ui:sendMsg(app.room, "BaoPai", request, function(status, response) logE("xichongRoomView baojiao response = ", table.tostring(response)) end) end) else self.PlayerView:setPlayerDingPiaoVisible(viewId, true) end end function xichongRoomView:hidePiao() if self.piao then self.piao:removeFromParent() self.piao=nil end end function xichongRoomView:createCard(bShowAnimation,nUserID,onEnd) logE("====================RoomView:createCard()==================="); local cardList = app.room.cards[nUserID] if not cardList or table.nums(cardList) <= 0 then --重连当自己没有手牌且有7方门子 if onEnd then onEnd() end return end local lieshuMax = table.nums(cardList) local RankCardList = {} local colList = self.lieshulist[lieshuMax] local blankList = self.lieshuBlanklist[lieshuMax] local wuIndex = 0 local youIndex = 0 --重新调整 for k = 1,self.lieShuMax do if not cardList[k] then cardList[k] = {} end if table.nums(cardList[k]) <= 0 then wuIndex = wuIndex + 1 local blankIndex = blankList[wuIndex] -- 1,10 if blankIndex then RankCardList[blankIndex] = {} end else youIndex = youIndex + 1 local index = colList[youIndex] -- 2,3,4,5,6,7,8,9 RankCardList[index] = cardList[k] end end cardList = {} cardList = RankCardList logE("createCard Rank ok :"..table.tostring(cardList)) local index = 1 --不管有无数据,默认创建10列数据 for i = 1,self.lieShuMax do local value = cardList[i] or {} local isKan = self:getCurrentColIsKan(value) local card = XichongRoomCard:new(value,ZPDef.CardType.CARD_TYPE_HAND,i,isKan,false,self.desktopType) local pos = self.boxPosList4[i] card.ui:setPosition(pos) self.ui.Items.LayoutMain_4:addChild(card.ui,1) --数据记录 self.handCardRoot[i] = card self.handCardValueLocal[i] = value self.handCardValueBak[i] = clone(value) --存储所有的单牌节点Image for k = 1 ,self.hangShuMax do self.handCardItem[index] = card.imgList[k] index = index + 1 end end logE("create card finish self.handCardValueLocal : "..table.tostring(self.handCardValueLocal)) if bShowAnimation then --发牌动画(10*0.1+ 0.15 = 1.15miao) local columnWidth = 70 if self.desktopType == ZPDef.GameStyleType.JINGDIAN then columnWidth = 70 else columnWidth = 93 end local startX = nil local totalColumns = table.nums(self.handCardRoot) for k,v in ipairs(self.handCardRoot) do if k == totalColumns / 2 then startX = v.ui:getPositionX() break end end for k,v in ipairs(self.handCardRoot) do if v.ui:isVisible() then v.ui:setOpacity(100) v.ui:setPositionX(startX) local diffCol = k - totalColumns / 2 -- 以第5列为中间,距离中间的差多少列 local offsetX = diffCol * columnWidth -- 需要移动的距离 local delayTime = diffCol * 0.02 -- 每一列的开始移动延迟动画时间 local duration = 0.1 -- 移动过程持续时间 local acDelay = cc.DelayTime:create(delayTime) local acFadeIn = cc.FadeIn:create(duration) local acMoveBy = cc.MoveBy:create(duration, cc.p(offsetX, 0)) local acSpawn = cc.Spawn:create(acFadeIn, acMoveBy) local acCall = cc.CallFunc:create(function () self:runDelay(0.5, function () --排序 self:RankCard() --注册点击 self:registerCardTouch() if onEnd then onEnd() end for _,card in ipairs(self.handCardRoot) do card.ui:setOpacity(255) end end) end) local acSeq = nil if k == self:getVisibleCardLayoutNum() then acSeq = cc.Sequence:create(acDelay, acSpawn, acCall) else acSeq = cc.Sequence:create(acDelay, acSpawn) end v.ui:runAction(acSeq) end end else --注册点击 self:registerCardTouch() --排序 self:RankCard() if onEnd then onEnd() end end end -- 游戏开始 function xichongRoomView:onGameStartResponse() local function runGameStartResponse(onEnd) log("2000000000-xichongRoomView - runGameStartResponse()" ) local actualNum = app.room:getActualPlayerNum() --重置玩家数据 self:resetGameData() app.room.roomInfo.firstOutCard = {} app.room.roomInfo.disCard = {} if not tolua.isnull(self.quickStartView) then self.quickStartView:removeView() self.quickStartView = nil end --写入数据 for k,v in pairs(app.room.roomInfo.memberList) do v.nPlayerFlag = 2 end --更新玩家状态状态 self:onUserReadyResponse() -- 隐藏邀请好友 self:setWetChatVisible(false) self.toolView:showFastStart(false) -- 更新局数 self:updateGameNums() --更新位置 app.room:updateUserSeateShowId() local bankerViewId = app.room:getViewIdBySeatId(app.room.roomInfo.nBankSeatId) --显示剩余牌 self:setCircleCardLeftPanelView(true,nil,84) for k,v in pairs(app.room.roomInfo.memberList) do local nSeatShowId = app.room:getViewIdByUserId(v.nUserId) self.PlayerView:updatePlayerInfo(nSeatShowId) end --翻牌 local fanpaiSeatid = app.room.roomInfo.fanpaiSeatId local fanCard = app.room.roomInfo.fanpaiValue local fanViewId = app.room:getViewIdBySeatId(fanpaiSeatid) local nBankerSeatId = app.room.roomInfo.nBankSeatId local ZhuangviewId = app.room:getViewIdBySeatId(nBankerSeatId) local function jiaoCallBack() self.PlayerView:showOperatorTip(fanViewId,ZPDef.OpType.OP_TYPE_JIAOPAI) end local function callback() self:playMoPaiAni(84,fanCard,fanViewId,0,1,nil,false, nil, nil, nil) end local function call_func() self:setOutCardVisible(false) --local toujiaId = app.room.roomInfo.nBankSeatId --local toujiaViewId = app.room:getViewIdBySeatId(toujiaId) self.PlayerView:showOperatorTip(ZhuangviewId,ZPDef.OpType.OP_TYPE_ZUOZHUANG) --更新庄家 self:updateBanker() self:updateXiaojia() end local function dangCallBack() self.PlayerView:showOperatorTip(ZhuangviewId,ZPDef.OpType.OP_TYPE_DANG) self.PlayerView:setPlayerBankerVisible(ZhuangviewId,false) self.PlayerView:setPlayerDangVisible(ZhuangviewId,true) end local seq = cc.Sequence:create(cc.CallFunc:create(jiaoCallBack),cc.DelayTime:create(0.8),cc.CallFunc:create(callback),cc.DelayTime:create(1),cc.CallFunc:create(call_func),cc.DelayTime:create(0.7),cc.CallFunc:create(dangCallBack),cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end)) self.ui:runAction(seq) end log("2000000000-xichongRoomView - addCallBack(runGameStartResponse)" ) self:addCallBack(runGameStartResponse); end function xichongRoomView:onGameSendCardResponse() local function runGameSendCardResponse(onEnd) self.PlayerView:stopAndHideBaoAnim() log("2000000000-xichongRoomView - runGameSendCardResponse()" ) if self.taiPaiTimer then cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.taiPaiTimer) end for i = 1,ZPDef.GameMaxPlayer do self.PlayerView:setPlayerDingPiaoVisible(i, false) end --local nBankerSeatId = app.room.roomInfo.nBankSeatId --local ZhuangviewId = app.room:getViewIdBySeatId(nBankerSeatId) --self.PlayerView:showOperatorTip(ZhuangviewId,ZPDef.OpType.OP_TYPE_DANG) --显示指示器 local bankerViewId = app.room:getViewIdBySeatId(app.room.roomInfo.nBankSeatId) local leftCardNum = 32 if app.room:getActualPlayerNum() == 4 then--and GameFunctions.getCurFangShu() == 0 leftCardNum = 27 end self:setCircleCardLeftPanelView(true,bankerViewId,leftCardNum) --发牌 self:createCard(true,app.user.loginInfo.uid,onEnd) print("ding piao:"..table.tostring(app.room.roomInfo.memberList)) --self.ui.Items.Button_tipai:setVisible(true) local xiaojiaViewId = app.room:getViewIdBySeatId(app.room.roomInfo.xiaoSeatId) local toujiaViewId = app.room:getViewIdBySeatId(app.room.roomInfo.nBankSeatId) --self:setTotalTuoNum(app.room.roomInfo.totalTuoNum) local myViewId = self:getMeViewId() self.PlayerView:setPlayerTuoShu(myViewId,app.room.roomInfo.totalTuoNum) end log("2000000000-xichongRoomView - addCallBack(runGameSendCardResponse)" ) self:addCallBack(runGameSendCardResponse); end --漂结果 function xichongRoomView:onBaoPaiResponese(data) local function runBaoPai(onEnd) log("2000000000-ZPRoomView - (runBaoPai)") local response = data.response local uid = response.nUserId local viewId = app.room:getViewIdByUserId(uid) --玩家选择了爆牌 播放爆牌动画 local time = 0 if viewId == self:getMeViewId() and app.room:getMeIsInAIStatus() then self:hidePiao() end if response.optType == 1 then --随漂状态 time = 1 self.PlayerView:showOperatorTip(viewId,ZPDef.OpType.OP_TYPE_PIAO) self.PlayerView:setPlayerDingPiaoVisible(viewId,false) self.PlayerView:setPlayerPiaoVisible(viewId,true) local bankerViewId = app.room:getViewIdBySeatId(app.room.roomInfo.nBankSeatId) if bankerViewId == viewId then self.bankerBaoPao = true end elseif response.optType == 2 then --定漂状态 self.PlayerView:setPlayerDingPiaoVisible(viewId,false) self.PlayerView:setPlayerPiaoVisible(viewId,true) else self.PlayerView:setPlayerDingPiaoVisible(viewId,false) self.PlayerView:setPlayerPiaoVisible(viewId,false) local userInfo=app.room:getUserInfo(uid) if userInfo then ZPSound.PlayBuPiao(userInfo.sex) end end --[[ if uid == app.user.loginInfo.uid or app.room:isLittleFamily() then self.operationView:showBaoPaiOpView(false) end--]] self:runAction(cc.Sequence:create(cc.DelayTime:create(time),cc.CallFunc:create(function () if onEnd then onEnd() end end))) end self:addCallBack(runBaoPai) end -- 正在漂 function xichongRoomView:onSystemOperationStart(data) log("2000000000-xichongRoomView piaoing -------") local uid = data.response.nUserId local viewId = app.room:getViewIdByUserId(uid) self.PlayerView:setPlayerDingPiaoVisible(viewId,true) end function xichongRoomView:showOpeation(mainOpCode,card,chilist, isBiHu) self.operationView:setVisible(true) self.operationView:setSameParame(self.outCard,self.handCardValueLocal) local hasGuo = true if self.isBingPeng then hasGuo = false end if isBiHu == 1 then hasGuo = false end self.operationView:showOpeation(mainOpCode,card,chilist,hasGuo) --检测是否少牌 --self:neatenCard(true)--无感知的整理一次手牌 self:checkCardAndRecover() end --通知用户暗的操作 function xichongRoomView:onUserOperateResponse(data) local function runUserOperate(onEnd) log("2000000000-xichongRoomView - (runUserOperate)") logE("runUserOperate :"..table.tostring(data.response)) if data.response.nUserId == app.room:getMyUserId() then if data.response.TouoperateCode ~= ZPDef.OpCode.OP_ERROR or data.response.BaoperateCode ~= ZPDef.OpCode.OP_ERROR then local ishu = data.response.ishu local hasGuo = true local anCard = 0 local opeateCode = 0 self.outCard = 0 if #data.response.BacardList > 0 then opeateCode = getNumOr(opeateCode,data.response.BaoperateCode) end --操作码 if #data.response.ToucardList > 0 then anCard = data.response.BacardList[1] opeateCode = getNumOr(opeateCode,data.response.TouoperateCode) end local mainOpCode = data.response.mainOpCode local retHu = bit32.band(mainOpCode,ZPDef.OpCode.OP_HU) local retHu1 = bit32.band(mainOpCode,ZPDef.OpCode.OP_TIAN_HU) if ishu == 1 then if retHu > 0 then opeateCode = getNumOr(opeateCode,ZPDef.OpCode.OP_HU) else opeateCode = ZPDef.OpCode.OP_TIAN_HU end end local viewId = app.room:getViewIdByUserId(data.response.nUserId) self.operationLocalCode = opeateCode if self.operationLocalCode > 0 then self:showOpeation(opeateCode,anCard, nil, data.response.isBiHu) end local myViewId = self:getMeViewId() self.PlayerView:setPlayerTuoShu(myViewId,data.response.totalTuoNum) self:setGuideView(false) self.bOutCard = false end end local operations = {} --操作码 local viewId = app.room:getViewIdByUserId(data.response.nUserId) operations[viewId] = {} operations[viewId].nUserId = data.response.nUserId operations[viewId].isCanOpereate = 1 self:showDelayTimeTip(operations) if onEnd then onEnd() end end log("2000000000-xichongRoomView - addCallBack(runUserOperate)") self:addCallBack(runUserOperate); end function xichongRoomView:playQiPaiAni(isShowAni,disCard,viewId,onEnd,isDianPaoPeng) if self.desktopType == ZPDef.GameStyleType.JINGDIAN then local outCardname = string.format("ImageView_outCardImg_%d",viewId) local outCardPoint = string.format("Layout_outCardPoint_%d",viewId) local giveupCardname = string.format("Layout_outCardPos_%d",viewId) --牌的图片 local outCardImg = self.ui.Items[outCardname] --牌的图片父节点 local outCardLayout = self.ui.Items[outCardPoint] --弃牌的layout local giveUpLayout = self.ui.Items[giveupCardname] --获取弃牌节点存在的数量 local count = giveUpLayout:getChildrenCount() --创建一张精灵 local mSprite = cc.ImageView:createNode() mSprite:setScale(self.littleCardScale) local finalFileName = ZPFuc.getZPCardImgByValue(disCard,ZPDef.CardType.CARD_TYPE_GROUPCARD,self.desktopType) mSprite:loadTextureFromPlist(finalFileName) mSprite:setVisible(false) mSprite:setAnchorPoint(cc.p(0,0)) mSprite.value = disCard giveUpLayout:addChild(mSprite) local orderPos = cc.p(0,0) local giveCardOffset = ZPDef.GiveCardOffset[viewId] local width = mSprite:getContentSize().width * self.littleCardScale; local height = mSprite:getContentSize().height * self.littleCardScale; local getHeightCount = function (count) if count >= 8 then return math.floor(count/8) else return 0 end end local colMax = getHeightCount(count) if colMax == 1 then if viewId == self:getMeViewId() then orderPos.x = orderPos.x - 40 orderPos.y = orderPos.y - 20 elseif viewId == 1 then orderPos.x = orderPos.x + 40 orderPos.y = orderPos.y - 20 elseif viewId == 2 then orderPos.x = orderPos.x + 40 orderPos.y = orderPos.y + 20 elseif viewId == 3 then orderPos.x = orderPos.x - 30 orderPos.y = orderPos.y + 35 end end count = count % 8 local tarPos if viewId == self:getMeViewId() then mSprite:setEulerRotation(cc.vec3(0, 0, -155)) tarPos = cc.p(orderPos.x + giveCardOffset.x*count,orderPos.y + giveCardOffset.y*count) elseif viewId == 1 then mSprite:setEulerRotation(cc.vec3(0, 0, -25)) tarPos = cc.p(orderPos.x + giveCardOffset.x*count,orderPos.y + giveCardOffset.y*count) elseif viewId == 2 then mSprite:setEulerRotation(cc.vec3(0, 0, 25)) tarPos = cc.p(orderPos.x + giveCardOffset.x*count,orderPos.y + giveCardOffset.y*count) elseif viewId == 3 then mSprite:setEulerRotation(cc.vec3(0, 0, 130)) tarPos = cc.p(orderPos.x + giveCardOffset.x*count,orderPos.y + giveCardOffset.y*count) end mSprite:setPosition(tarPos) --动画显示 if not isShowAni then mSprite:setVisible(true) if isDianPaoPeng then mSprite:setColor(cc.c3b(125,125,125)) end else local fileName = ZPFuc.getZPCardImgByValue(disCard,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType) --弃牌 local giveSprite = cc.ImageView:createNode() giveSprite:loadTextureFromPlist(fileName) giveSprite:setScale(self.outCardScale) giveUpLayout:addChild(giveSprite) giveSprite:setVisible(false) local spriteSizeWidth = giveSprite:getContentSize().width * self.outCardScale local spriteSizeHeight = giveSprite:getContentSize().height * self.outCardScale local worldPos = outCardImg:convertToWorldSpace(outCardImg:getPosition()) local nodePos = giveUpLayout:convertToNodeSpace(worldPos) --调整上下2个玩家的坐标和牌的角度 if viewId == 2 or viewId == 4 then --nodePos = cc.p(nodePos.x - spriteSizeWidth,nodePos.y - spriteSizeHeight/2) --giveSprite:setEulerRotation(cc.vec3(0,0,90)) end giveSprite:setPosition(nodePos) local mSpawn = cc.Spawn:create(cc.MoveTo:create(self.gameSpeedConfig.QI_PAI_TIME,tarPos),cc.ScaleTo:create(self.gameSpeedConfig.QI_PAI_TIME,self.outCardScale - 0.7)) giveSprite:runAction(cc.Sequence:create(cc.DelayTime:create(0.3),cc.CallFunc:create(function() outCardLayout:setVisible(false) giveSprite:setVisible(true) end),mSpawn,cc.CallFunc:create(function() mSprite:setVisible(true) if isDianPaoPeng then mSprite:setColor(cc.c3b(125,125,125)) end end),cc.RemoveSelf:create())) --要求弃牌飞到一半,摸牌就开始摸了 mSprite:runAction(cc.Sequence:create(cc.DelayTime:create(0.4 + self.gameSpeedConfig.QI_PAI_TIME/2),cc.CallFunc:create(function () if onEnd then onEnd() end end))) end else local outCardname = string.format("ImageView_outCardImg_%d",viewId) local outCardPoint = string.format("Layout_outCardPoint_%d",viewId) local giveupCardname = string.format("Layout_giveUp_%d",viewId) --牌的图片 local outCardImg = self.ui.Items[outCardname] --牌的图片父节点 local outCardLayout = self.ui.Items[outCardPoint] --弃牌的layout local giveUpLayout = self.ui.Items[giveupCardname] --获取弃牌节点存在的数量 local count = giveUpLayout:getChildrenCount() --创建一张精灵 local mSprite = cc.ImageView:createNode() mSprite:setScale(self.littleCardScale) local finalFileName = ZPFuc.getZPCardImgByValue(disCard,ZPDef.CardType.CARD_TYPE_TABLE) mSprite:loadTextureFromPlist(finalFileName) mSprite:setVisible(false) mSprite:setAnchorPoint(cc.p(0,0)) mSprite.value = disCard giveUpLayout:addChild(mSprite) local width = mSprite:getContentSize().width * self.littleCardScale; local height = mSprite:getContentSize().height * self.littleCardScale; local getHeightCount = function (count) if count >= 10 then return math.floor(count/10) else return 0 end end local x = count % 10 local tarPos if viewId == 1 then local adjustPos = cc.p(width * x,height * getHeightCount(count)) tarPos = cc.p(0 - adjustPos.x,0 - adjustPos.y) elseif viewId == 2 then local adjustPos = cc.p(width * x,getHeightCount(count) * height) tarPos = cc.p(0 + adjustPos.x,0 - adjustPos.y) elseif viewId == 3 then local adjustPos = cc.p(width * x,height * getHeightCount(count)) tarPos = cc.p(0 + adjustPos.x,0 - adjustPos.y) elseif viewId == self:getMeViewId() then local adjustPos = cc.p(width * x,height * getHeightCount(count)) tarPos = cc.p(0 - adjustPos.x,0 - adjustPos.y) end mSprite:setPosition(tarPos) --动画显示 if not isShowAni then mSprite:setVisible(true) if isDianPaoPeng then mSprite:setColor(cc.c3b(125,125,125)) end else local fileName = ZPFuc.getZPCardImgByValue(disCard,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType) --弃牌 local giveSprite = cc.ImageView:createNode() giveSprite:loadTextureFromPlist(fileName) giveSprite:setScale(self.outCardScale) giveUpLayout:addChild(giveSprite) giveSprite:setVisible(false) local spriteSizeWidth = giveSprite:getContentSize().width * self.outCardScale local spriteSizeHeight = giveSprite:getContentSize().height * self.outCardScale local worldPos = outCardImg:convertToWorldSpace(outCardImg:getPosition()) local nodePos = giveUpLayout:convertToNodeSpace(worldPos) --调整上下2个玩家的坐标和牌的角度 if viewId == 2 or viewId == 4 then --nodePos = cc.p(nodePos.x - spriteSizeWidth,nodePos.y - spriteSizeHeight/2) --giveSprite:setEulerRotation(cc.vec3(0,0,90)) end giveSprite:setPosition(nodePos) local mSpawn = cc.Spawn:create(cc.MoveTo:create(self.gameSpeedConfig.QI_PAI_TIME,tarPos),cc.ScaleTo:create(self.gameSpeedConfig.QI_PAI_TIME,self.outCardScale - 0.7)) giveSprite:runAction(cc.Sequence:create(cc.DelayTime:create(0.3),cc.CallFunc:create(function() outCardLayout:setVisible(false) giveSprite:setVisible(true) end),mSpawn,cc.CallFunc:create(function() mSprite:setVisible(true) if isDianPaoPeng then mSprite:setColor(cc.c3b(125,125,125)) end end),cc.RemoveSelf:create())) --要求弃牌飞到一半,摸牌就开始摸了 mSprite:runAction(cc.Sequence:create(cc.DelayTime:create(0.4 + self.gameSpeedConfig.QI_PAI_TIME/2),cc.CallFunc:create(function () if onEnd then onEnd() end end))) end end end function xichongRoomView:playMoPaiAni(leftCardNum,turnOverCard,viewId,mainOpCode,showCardFlag,onEnd,isNotShowAni,chiOpCardlist,isJinPai, isBiHu) self.isMoPaiOperator = true --重置出牌坐标 self:resetOutCardPoint() --图片 local outCardname = string.format("ImageView_outCardImg_%d",viewId) local outCardLayoutName = string.format("Layout_outCardPoint_%d",viewId) local mSprite = self.ui.Items[outCardname] local srcPos = mSprite:getPosition() local fileName = ZPFuc.getZPCardImgByValue(0xfa,ZPDef.CardType.CARD_TYPE_OUTCARD) local fileNameReal = ZPFuc.getZPCardImgByValue(turnOverCard,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType,self.colorType) self.ui.Items[outCardLayoutName]:setVisible(true) if viewId == self:getMeViewId() then mSprite:loadTextureFromPlist(fileNameReal) end --公谱出牌不串不哨立马亮牌,看到亮牌的听得到牌的音效 if mainOpCode ~= ZPDef.OpCode.OP_CANCEL and mainOpCode ~= ZPDef.OpCode.OP_ERROR then mSprite:loadTextureFromPlist(fileNameReal) else if showCardFlag == 1 then mSprite:loadTextureFromPlist(fileNameReal) if not isNotShowAni and not isJinPai then local nUserId = app.room:getUserIdByViewId(viewId) local userInfo=app.room:getUserInfo(nUserId) if userInfo then ZPSound.PlayZPSound(userInfo.sex,turnOverCard) end end else mSprite:loadTextureFromPlist(fileName) end end self:changeOutCardLight(true) local function callback() if mainOpCode ~= ZPDef.OpCode.OP_CANCEL and mainOpCode ~= ZPDef.OpCode.OP_ERROR then self.EatOperationCode = mainOpCode local chilist = {} for k,v in pairs(chiOpCardlist or {}) do table.insert(chilist,v) end self:showOpeation(mainOpCode,turnOverCard,chilist, isBiHu) end end if isNotShowAni then mSprite:setPosition(srcPos) callback() if onEnd then onEnd() end return else local outCardLightName = string.format("ImageView_outCardLight_%d",viewId) self.ui.Items[outCardLightName]:setVisible(false) mSprite:setScale(0) if showCardFlag ~= 1 then mSprite:loadTextureFromPlist(fileName) --起始坐标调整和角度,扫为横的出来 if viewId == self:getMeViewId() then mSprite:setEulerRotation(cc.vec3(0,0,0)) beginPos = cc.p(srcPos.x,srcPos.y + 200) elseif viewId == 1 then mSprite:setEulerRotation(cc.vec3(0,0,-90)) beginPos = cc.p(srcPos.x - 200 ,srcPos.y) elseif viewId == 2 then mSprite:setEulerRotation(cc.vec3(0,0,0)) beginPos = cc.p(srcPos.x,srcPos.y - 100) elseif viewId == 3 then mSprite:setEulerRotation(cc.vec3(0,0,-90)) beginPos = cc.p(srcPos.x + 200 ,srcPos.y-50) end mSprite:setPosition(beginPos) --目标调整、角度 if viewId == 1 then srcPos = cc.p(srcPos.x + 250,srcPos.y) elseif viewId == 2 then srcPos = cc.p(srcPos.x,srcPos.y+50) elseif viewId == 3 then srcPos = cc.p(srcPos.x - 250,srcPos.y-50) elseif viewId == 4 then srcPos = cc.p(srcPos.x,srcPos.y-100) end mSprite:setScale(1) mSprite:runAction(cc.Sequence:create(cc.MoveTo:create(0.3,srcPos),cc.CallFunc:create(function () self.ui.Items[outCardLightName]:setVisible(true) end),cc.CallFunc:create(function() --恢复原来的角度 if viewId == self:getMeViewId() then mSprite:setEulerRotation(cc.vec3(0,0,90)) elseif viewId == 1 then mSprite:setEulerRotation(cc.vec3(0,0,0)) elseif viewId == 2 then mSprite:setEulerRotation(cc.vec3(0,0,90)) elseif viewId == 3 then mSprite:setEulerRotation(cc.vec3(0,0,0)) end self.ui.Items[outCardLayoutName]:setVisible(false) self:setCircleCardLeftPanelView(true,viewId,leftCardNum) callback() if onEnd then onEnd() end end))) else if mainOpCode ~= ZPDef.OpCode.OP_CANCEL and mainOpCode ~= ZPDef.OpCode.OP_ERROR then local nUserId = app.room:getUserIdByViewId(viewId) local userInfo=app.room:getUserInfo(nUserId) if userInfo and not isJinPai then ZPSound.PlayZPSound(userInfo.sex,turnOverCard) end end --播放摸牌动画(这里最好用出牌器的坐标进行转换,暂时这样调整吧) if viewId == self:getMeViewId() then beginPos = cc.p(srcPos.x,srcPos.y + 200) elseif viewId == 1 then beginPos = cc.p(srcPos.x - 300 ,srcPos.y) elseif viewId == 2 then beginPos = cc.p(srcPos.x ,srcPos.y - 200) elseif viewId == 3 then beginPos = cc.p(srcPos.x + 300 ,srcPos.y) end mSprite:setPosition(beginPos) local mSpawn = cc.Spawn:create(cc.ScaleTo:create(self.gameSpeedConfig.MO_PAI_TIME,1.0),cc.MoveTo:create(self.gameSpeedConfig.MO_PAI_TIME,srcPos)) mSprite:runAction(cc.Sequence:create(mSpawn,cc.CallFunc:create(function () self.ui.Items[outCardLightName]:setVisible(true) --显示指示器 self:setCircleCardLeftPanelView(true,viewId,leftCardNum) end),cc.DelayTime:create(0.15),cc.CallFunc:create(function() callback() if onEnd then onEnd() end end))) end end end function xichongRoomView:removeHandByNums(card,nums) local nums = nums for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 local tempCard = self.handCardRoot[col].imgList[row].value if tempCard and card == tempCard and nums > 0 then table.remove(self.handCardValueLocal[col],row) self:rankDeletOneBakCard(card) --单张图片的值归nil self.handCardRoot[col].imgList[row].value = nil self.handCardRoot[col].imgList[row].isKan = false --单个图片隐藏 self.handCardRoot[col].imgList[row]:setVisible(false) self.handCardRoot[col].imgList[row]:setColor(cc.c3b(255,255,255)) nums = nums - 1 end end end end --用户吃(手动) function xichongRoomView:Chi(viewId,card,onEnd) logD("function do Chi") logE("xichongRoomView chi:",card) local chiShowPaiList = {} --吃的牌放下面 table.insert(chiShowPaiList, self.chiCard) table.insert(chiShowPaiList, card) logE("xichongRoomView chilist:",chiShowPaiList) if viewId == self:getMeViewId() then self:removeHandByNums(card,1) self:neatenCard(true) end if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,chiShowPaiList,2) --self:createOpOutcard(viewId,card,1) else self:createEatView(card,viewId,chiShowPaiList,true,nil,onEnd) end if onEnd then onEnd() end end --创建吃的UI function xichongRoomView:createEatView(card,viewId,list,isShowAni,callbackFunc,onEnd) --是否轮到我 local bMeTurn = viewId == self:getMeViewId() --更新视图 --获取自己的出牌点 local name = string.format("Layout_player1Table_%d",viewId) local UnitCardNode = self.ui.Items[name] --牌大小 local mSprite = cc.ImageView:createNode() local FileName = ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_TABLE) mSprite:loadTextureFromPlist(FileName) local width = mSprite:getContentSize().width * self.littleCardScale + self.cardInterval local height = mSprite:getContentSize().height * self.littleCardScale - self.verticleInterval local mLayout = nil --list 反向操作 local tempList = {} for k,v in pairsByKeys(list) do table.insert(tempList,v) end local endPos = nil logE("tempList:"..table.tostring(tempList)) for k,weaveCard in pairsByKeys(tempList) do if k % 3 == 1 then --获取出牌点的儿子数量 local count = UnitCardNode:getChildrenCount(); --数量即为列数 local col = count; --创建一个空的layout,layout放到组合牌点上 mLayout = cc.Layout:createNode() mLayout:setTag(ZPDef.TableConst.TABLE_CONST_NO_TOUCH) if bMeTurn then endPos = cc.p(width * col,0) elseif viewId == 1 or viewId == 2 then endPos = cc.p(-width * col,0) else endPos = cc.p(width * col,0) end --设置锚点 mLayout:setAnchorPoint(cc.p(0,1)) --设置大小 mLayout:setSize(cc.size(width,height*3)) --layout数据存储: mLayout.type = "chi" --顺子没用到 mLayout:setName("10086") end local cardShow = weaveCard local row = (k % 3) - 1 if k % 3 == 0 then row = 2 end --界面 local mWeiCard = cc.ImageView:createNode() mWeiCard:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(cardShow,ZPDef.CardType.CARD_TYPE_TABLE)) mWeiCard:setScale(self.littleCardScale) mWeiCard:setPosition(width/2,0 + height * row - height /2); mLayout:addChild(mWeiCard,#tempList-k+1); if row == 2 then --mWeiCard:setOpacity(125) end if k % 3 == 2 then --动画 UnitCardNode:addChild(mLayout); if isShowAni then self:playWeaveCardAni(mLayout,viewId,1,endPos,nil,1.0,true) else mLayout:setPosition(endPos) end end end end --用户碰(手动) function xichongRoomView:Peng(viewId,card,onEnd) logD("function do Peng") logE("xichongRoomView Peng:",card) if viewId == self:getMeViewId() then self:removeHandByNums(card,2) self:neatenCard(true) end local list = {card,card,card} if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,list,3) else self:createPengView(viewId,list,true) end self:runAction(cc.Sequence:create(cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end))) end --创建碰的UI function xichongRoomView:createPengView(viewId,list,isShowAni) --是否轮到我 local bMeTurn = viewId == self:getMeViewId() local card = list[1] --更新自己(3张暗加一个数字(值分大小写)) --获取自己的出牌点 local name = string.format("Layout_player1Table_%d",viewId) local UnitCardNode = self.ui.Items[name] --获取出牌点的儿子数量 local count = UnitCardNode:getChildrenCount(); --数量即为列数 local col = count; --牌大小 local mSprite = cc.ImageView:createNode() local FileName = ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_TABLE) mSprite:loadTextureFromPlist(FileName) local width = mSprite:getContentSize().width * self.littleCardScale + self.cardInterval local height = mSprite:getContentSize().height * self.littleCardScale - self.verticleInterval --创建一个空的layout,layout放到组合牌点上 local mLayout = cc.Layout:createNode() --1.记录坐标 local endPos = nil if bMeTurn then endPos = cc.p(width * col,0) elseif viewId == 1 or viewId == 2 then endPos = cc.p(-width * col,0) else endPos = cc.p(width * col,0) end --设置锚点 mLayout:setAnchorPoint(cc.p(0,1)) --设置大小 mLayout:setSize(cc.size(width,height*3)) --layout数据存储: --下面的牌数据: mLayout.cardList = {} --查找layout的唯一性 mLayout:setName(string.format("%d",card)) mLayout.type = "peng4" mLayout:setTag(ZPDef.TableConst.TABLE_CONST_NO_TOUCH) --判断是不是摸牌,如果是摸牌碰就3张,不是就2张,放炮的人显示一张牌为弃牌 local forTimeS = #list for i = 1,forTimeS do local mPengCard; local row = i - 1; --数据 mLayout.cardList[i] = card --界面 mPengCard = cc.ImageView:createNode() mPengCard:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_TABLE)) mPengCard:setScale(self.littleCardScale) mPengCard:setPosition(width/2,0 + height * row - height /2); mLayout:addChild(mPengCard,forTimeS-i+1); end UnitCardNode:addChild(mLayout); --2.全部拷贝动画 if isShowAni then self:playWeaveCardAni(mLayout,viewId,1,endPos,nil,1.0,true) else mLayout:setPosition(endPos) end end --用户暗三张(手动) function xichongRoomView:AnSanZhang(viewId,card,onEnd) logD("function do AnSanZhang") logE("xichongRoomView AnSanZhang:",card) local operateCode = self.operationSuccessCode if viewId == self:getMeViewId() then self:removeHandByNums(card,3) self:neatenCard(true) end local list = {card,card,card} if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,list,3) else self:createPengView(viewId,list,true) end self:runAction(cc.Sequence:create(cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end))) end --用户暗四张(手动) function xichongRoomView:AnSiZhang(viewId,card,onEnd) logD("function do AnSiZhang") logE("xichongRoomView AnSiZhang:",card) local operateCode = self.operationSuccessCode if viewId == self:getMeViewId() then self:removeHandByNums(card,4) self:neatenCard(true) end local list = {card,card,card,card} if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,list,4) else self:createPengView(viewId,list,true) end self:runAction(cc.Sequence:create(cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end))) end --用户暗三张(手动) function xichongRoomView:Kua(viewId,card,onEnd) logD("function do Kua") logE("xichongRoomView Kua:",card) local operateCode = self.operationSuccessCode if viewId == self:getMeViewId() then self:removeHandByNums(card,3) self:neatenCard(true) end local list = {card,card,card} if self.desktopType == ZPDef.GameStyleType.JINGDIAN then self:createOpOutcard(viewId,list,3) else self:createPengView(viewId,list,true) end self:runAction(cc.Sequence:create(cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end))) end function xichongRoomView:doOperation(operationType,viewId,card,onEnd) if operationType == ZPDef.OpType.OP_TYPE_CHI then self:Chi(viewId,card,onEnd) self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_PENG then self:Peng(viewId,card,onEnd) self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_ANSANZHANG then self:AnSanZhang(viewId,card,onEnd) self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_ANSIZHANG then self:AnSiZhang(viewId,card,onEnd) self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_KUA then --垮 self:Kua(viewId,card,onEnd) self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_HU then self:showOperatorTip(viewId,operationType) elseif operationType == ZPDef.OpType.OP_TYPE_WEIGUI then self:showOperatorTip(viewId,operationType) end end --起手偷巴操作 function xichongRoomView:onUserOperateSuccess(data) local function runUserOperateSuccess(onEnd) log("2000000000-xichongRoomView - (runUserOperateSuccess)") logE("runUserOperateSuccess :"..table.tostring(data.response)) local response = data.response local nUserId = response.nUserId local opType = response.operateCodes local opCard = response.opCard local totoalTuoNum = response.totalTuoNum local leftCardNum = tonumber(response.leftCardNum) self.operationSuccessCode = opType local viewId = app.room:getViewIdByUserId(nUserId) if opType == ZPDef.OpCode.OP_TOU_QI_SHOU or opType == ZPDef.OpCode.OP_TOU_ZHUA then --按三张 self:doOperation(ZPDef.OpType.OP_TYPE_ANSANZHANG,viewId,opCard,nil) elseif opType == ZPDef.OpCode.OP_BA_QI_SHOU or opType == ZPDef.OpCode.OP_BA_ZHUA or opType == ZPDef.OpCode.OP_BA_FAN then --按四张 self:doOperation(ZPDef.OpType.OP_TYPE_ANSIZHANG,viewId,opCard,nil) end if viewId == self:getMeViewId() then self.PlayerView:setPlayerTuoShu(viewId,totoalTuoNum) if app.room:getMeIsInAIStatus() then self:hideOperation() end else self.PlayerView:setPlayerTuoShu(viewId,response.otherTuoNum) end if viewId ~= 4 then self.PlayerView:setLeftCardNum(viewId,true,leftCardNum) end self:runAction(cc.Sequence:create(cc.DelayTime:create(0.7),cc.CallFunc:create(function() if onEnd then onEnd() end end))) end log("2000000000-xichongRoomView - addCallBack(runUserOperateSuccess)") self:addCallBack(runUserOperateSuccess); end function xichongRoomView:onUserCanBaoResponse(data) local function runUserCanBao(onEnd) log("2000000000-xichongRoomView - (runUserCanBao)") local response = data.response local baoType = response.operateCode self.operationView:showBaoPaiOpView(true,baoType) if onEnd then onEnd() end end log("2000000000-xichongRoomView - addCallBack(runUserCanBao)") self:addCallBack(runUserCanBao) end function xichongRoomView:onBroadUserBaoResponse(data) local function runUserBaoResponse(onEnd) log("2000000000-xichongRoomView - (runUserBaoResponse)") local response = data.response local uid = response.nUserId local viewId = app.room:getViewIdByUserId(uid) local baoCard = response.baoCard --玩家选择了爆牌 播放爆牌动画 if response.baoType > 0 then self:showOperatorTip(viewId,-55) local baoTypeList = self:getBaoTypeList(response.baoType) self.PlayerView:playBaoTypeAni(viewId,baoTypeList,baoCard) end if viewId == self:getMeViewId() and app.room:getMeIsInAIStatus() then self:hideOperation() end if onEnd then onEnd() end end self:addCallBack(runUserBaoResponse) end function xichongRoomView:getBaoTypeList(baoType) local baoTypeList = {} local ret1 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_ZHAO_CHI) if ret1 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_ZHAO_CHI) end local ret2 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_TUI) if ret2 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_TUI) end local ret3 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_HOU_DUI) if ret3 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_HOU_DUI) end local ret4 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_PO_DUI) if ret4 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_PO_DUI) end local ret5 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_CHENG_KAN) if ret5 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_CHENG_KAN) end local ret6 = bit32.band(baoType,ZPDef.BaoOpCode.BAO_SI_ZHANG) if ret6 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.BAO_SI_ZHANG) end local ret7 = bit32.band(baoType,ZPDef.BaoOpCode.DIAO_CHENG_KAN) if ret7 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.DIAO_CHENG_KAN) end local ret8 = bit32.band(baoType,ZPDef.BaoOpCode.DIAO_CHENG_SIZHANG) if ret8 > 0 then table.insert(baoTypeList,ZPDef.BaoOpCode.DIAO_CHENG_SIZHANG) end return baoTypeList end --锁住吃后不能出的牌 function xichongRoomView:lockYouPai(youlist) --先全部解锁 self:unLockYouPai() --根据服务器发来的牌解锁 for k,v in pairs(youlist or {}) do for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 local cardValue = self.handCardRoot[col].imgList[row].value if v == cardValue and not self.handCardRoot[col].imgList[row].isKan then --防止锁两次 self.handCardRoot[col].imgList[row].isKan = true self.handCardRoot[col].imgList[row]:setTouchEnabled(false) self.handCardRoot[col].imgList[row]:setColor(cc.c3b(125,125,125)) end end end end end --解锁 function xichongRoomView:unLockYouPai() --根据服务器发来的牌解锁 for col = 1, self.lieShuMax do for row = 1,self.hangShuMax do self.handCardRoot[col].imgList[row].isKan = false self.handCardRoot[col].imgList[row]:setTouchEnabled(true) self.handCardRoot[col].imgList[row]:setColor(cc.c3b(255,255,255)) end end end function xichongRoomView:lockMyHandCards() --先把手牌全部锁了 for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 self.handCardRoot[col].imgList[row].isKan = true self.handCardRoot[col].imgList[row]:setTouchEnabled(false) self.handCardRoot[col].imgList[row]:setColor(cc.c3b(125,125,125)) end end local firstOutCardList = app.room.roomInfo.firstOutCard or {} if table.nums(firstOutCardList) <= 0 then self:unLockYouPai() else --根据服务器发来的牌解锁 for k,v in pairs(firstOutCardList) do for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 local cardValue = self.handCardRoot[col].imgList[row].value if v == cardValue then self.handCardRoot[col].imgList[row].isKan = false self.handCardRoot[col].imgList[row]:setTouchEnabled(true) self.handCardRoot[col].imgList[row]:setColor(cc.c3b(255,255,255)) end end end end end end function xichongRoomView:onBroadCastUserOutCard(data) local function fnCallack(onEnd) log("2000000000-xichongRoomView - (onBroadCastUserOutCard)") logE("onBroadCastUserOutCard :"..table.tostring(data.response)) local viewId = app.room:getViewIdByUserId(data.response.nUserId) --吃后不能出的牌 if data.response.nUserId == app.room:getMyUserId() then app.room.roomInfo.disCard = {} app.room.roomInfo.firstOutCard = {} for k,v in ipairs(data.response.disCard or {}) do table.insert(app.room.roomInfo.disCard,v) end for k,v in ipairs(data.response.nomorlDisCard or {}) do table.insert(app.room.roomInfo.disCard,v) end for k,v in ipairs(data.response.firstOutCard or {}) do table.insert(app.room.roomInfo.firstOutCard,v) end if table.nums(app.room.roomInfo.firstOutCard) > 0 then self:lockMyHandCards() else if table.nums(app.room.roomInfo.disCard) > 0 then self:lockYouPai(app.room.roomInfo.disCard) end end self:setGuideView(true) self.bOutCard = true end self:setCircleCardLeftPanelView(true,viewId,self.leftNum) if onEnd then onEnd() end end log("xichongRoomView:onBroadCastUserOutCard", "addCallBack(fnCallack)") self:addCallBack(fnCallack); end --出牌成功 function xichongRoomView:onOutCardSuccess(data) logE("xichongRoomView:onOutCardSuccess(), response = ", table.tostring(data.response)) local function runOnOutCardSuccess(onEnd) log("2000000000-xichongRoomView - runOnOutCardSuccess") --设置出牌动画隐藏 self:setGuideView(false) --只要出了牌就不是起手操作了 local response = data.response local nUserId = response.nOutCardUserId local card = response.byOutCard local operateCode = response.mainOpCode local leftHandCardNum = response.leftHandCardNum local isBiPeng = response.isBiPeng local opCardList = response.opCardList local isBiHu = response.isBiHu local fistOut = response.isBankerFirstOut if isBiPeng == 1 then self.isBingPeng = true else self.isBingPeng = false end local viewId = app.room:getViewIdByUserId(nUserId) if self.moValue and self.moValue > 0 and viewId == self:getMeViewId() then logE("xichongRoomView:onOutCardSuccess(), moVlaue = ", self.moValue) --self:requestFlashHandCard() --self.moValue = 0 end self.moPaiViewId = viewId --隐藏出牌 self.bOutCard = false --记录真实牌值 self.outCard = card --记录操作码 self.EatOperationCode = operateCode self:showDelayTimeTip() self.PlayerView:setLeftCardNum(viewId,true,leftHandCardNum) --self.PlayerView:setNoOpTime(false,viewId) logE("my userid :"..app.room:getMyUserId()) logE("out card response nUserId:"..nUserId) if fistOut ~= 1 then local userInfo=app.room:getUserInfo(nUserId) if userInfo then ZPSound.PlayZPSound(userInfo.sex,card) else ZPSound.PlayZPSound(1,card) end end local chiCardlist = {} for k,v in ipairs(opCardList or {}) do table.insert(chiCardlist,v) end if nUserId ~= app.room:getMyUserId() then if operateCode ~= ZPDef.OpCode.OP_CANCEL and operateCode ~= ZPDef.OpCode.OP_ERROR then self:showOpeation(operateCode,card,chiCardlist, isBiHu) end --其他玩家显示 logE("isFirstOutCard:"..fistOut) if fistOut ~= 1 then logE("is showOutCard:"..fistOut) self:setOutCardVisible(true,viewId,card,false,onEnd) else logE("niot is showOutCard:"..fistOut) if onEnd then --如果是第一次出牌也要结束这个函数 onEnd() end end else if fistOut ~= 1 then self.isGodHand = true local function rankDeletOneCard(card) local isEnd = false --倒叙遍历1-10列 for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 if card == self.handCardRoot[col].imgList[row].value then --判断值是否相等 logE("delete card1 ============= :"..card) table.remove(self.handCardValueLocal[col],row) --单张图片的值归nil self.handCardRoot[col].imgList[row].value = nil self.handCardRoot[col].imgList[row].isKan = false --单个图片隐藏 self.handCardRoot[col].imgList[row]:setOpacity(255) self.handCardRoot[col].imgList[row]:setVisible(false) isEnd = true break end end if isEnd then break end end end local index = self.ui.Items.ImageView_handTempCard.index local lieshu = self.ui.Items.ImageView_handTempCard.lieshu local row = self.ui.Items.ImageView_handTempCard.hangshu --self:getRowByIndex(index) --说明:数据校验:弱网棋牌的通病(麻将出牌等一切可以允许玩家自己插牌的游戏,需要注意弱网情况,出牌会出现删错牌) --判断该列是否有牌 if self.handCardValueLocal[lieshu] ~= nil and table.nums(self.handCardValueLocal[lieshu]) > 0 then --二次校验牌数据是否是出牌数据 local recordValue = self.handCardRoot[lieshu].imgList[row].value if recordValue == card then logE("delete card2 ============= :"..card) table.remove(self.handCardValueLocal[lieshu],row) --数据干掉 self.handCardRoot[lieshu].imgList[row].value = nil self.handCardRoot[lieshu].imgList[row].isKan = false --视图处理 self.handCardRoot[lieshu].imgList[row]:setOpacity(255) self.handCardRoot[lieshu].imgList[row]:setVisible(false) else --随机删掉手里那张牌 rankDeletOneCard(card) end else --随机删掉手里那张牌 rankDeletOneCard(card) end if app.room:getMeIsInAIStatus() then self:setOutCardVisible(true,viewId,card,false, function () end) end self:rankDeletOneBakCard(card) --self:reflashHandCards() self:neatenCard(true) end if onEnd then onEnd() end --检查是否少牌 self:checkCardAndRecover() --设置坨数 --self:setTotalTuoNum(data.response.totoltuoNum) local myViewId = self:getMeViewId() self.PlayerView:setPlayerTuoShu(myViewId,data.response.totoltuoNum) if viewId == self:getMeViewId() then self:reflashHandCards() end app.room.roomInfo.firstOutCard = {} app.room.roomInfo.disCard = {} self:unLockYouPai() end end log("2000000000-xichongRoomView - addCallBack(runOnOutCardSuccess)") self:addCallBack(runOnOutCardSuccess) end -- 广播桌子上所有玩家庄家起手操作 function xichongRoomView:onBankerOutCard(data) local function runOnBankerOutCard(onEnd) log("2000000000-xichongRoomView - (runOnBankerOutCard)") logE("onBankerOutCard :"..table.tostring(data.response)) if data.response.nUserId ~= app.room:getMyUserId() then if data.response.mainOpCode ~= ZPDef.OpCode.OP_CANCEL and data.response.mainOpCode ~= ZPDef.OpCode.OP_ERROR then --操作码 local viewId = app.room:getViewIdByUserId(data.response.nUserId) self.operationLocalCode = data.response.mainOpCode local card = data.response.byOutCard self:showOpeation(data.response.mainOpCode, card, nil, data.response.isBiHu) self:setGuideView(false) self.bOutCard = false end else self:setGuideView(false) self.bOutCard = false local card = data.response.byOutCard local viewId = app.room:getViewIdByUserId(data.response.nUserId) self.isGodHand = true local function rankDeletOneCard(card) local isEnd = false --倒叙遍历1-10列 for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 if card == self.handCardRoot[col].imgList[row].value then --判断值是否相等 logE("delete card1 ============= :"..card) table.remove(self.handCardValueLocal[col],row) --单张图片的值归nil self.handCardRoot[col].imgList[row].value = nil self.handCardRoot[col].imgList[row].isKan = false --单个图片隐藏 self.handCardRoot[col].imgList[row]:setOpacity(255) self.handCardRoot[col].imgList[row]:setVisible(false) isEnd = true break end end if isEnd then break end end end local index = self.ui.Items.ImageView_handTempCard.index local lieshu = self.ui.Items.ImageView_handTempCard.lieshu local row = self.ui.Items.ImageView_handTempCard.hangshu --self:getRowByIndex(index) --说明:数据校验:弱网棋牌的通病(麻将出牌等一切可以允许玩家自己插牌的游戏,需要注意弱网情况,出牌会出现删错牌) --判断该列是否有牌 if self.handCardValueLocal[lieshu] ~= nil and table.nums(self.handCardValueLocal[lieshu]) > 0 then --二次校验牌数据是否是出牌数据 local recordValue = self.handCardRoot[lieshu].imgList[row].value if recordValue == card then logE("delete card2 ============= :"..card) table.remove(self.handCardValueLocal[lieshu],row) --数据干掉 self.handCardRoot[lieshu].imgList[row].value = nil self.handCardRoot[lieshu].imgList[row].isKan = false --视图处理 self.handCardRoot[lieshu].imgList[row]:setOpacity(255) self.handCardRoot[lieshu].imgList[row]:setVisible(false) else --随机删掉手里那张牌 rankDeletOneCard(card) end else --随机删掉手里那张牌 rankDeletOneCard(card) end self:rankDeletOneBakCard(card) --self:reflashHandCards() self:neatenCard(true) if viewId == self:getMeViewId() then self:reflashHandCards() end app.room.roomInfo.firstOutCard = {} app.room.roomInfo.disCard = {} self:unLockYouPai() end local viewId = app.room:getViewIdByUserId(data.response.nUserId) local card = data.response.byOutCard local userInfo=app.room:getUserInfo(data.response.nUserId) if userInfo then ZPSound.PlayZPSound(userInfo.sex,card) else ZPSound.PlayZPSound(1,card) end self:setOutCardVisible(true,viewId,card,false,nil) local operations = {} --操作码 local viewId = app.room:getViewIdByUserId(data.response.nUserId) operations[viewId] = {} operations[viewId].nUserId = data.response.nUserId operations[viewId].isCanOpereate = 1 self:showDelayTimeTip(operations) if onEnd then onEnd() end end log("2000000000-ZPRoomView - addCallBack(runOnBankerOutCard)") self:addCallBack(runOnBankerOutCard); end --多维数组转 一维数组 function xichongRoomView:ChangeDataToVector(data) local tt = {} for i = 1, self.lieShuMax do for j = 1, #data[i] do ---因为理了牌之后本地牌值的数组和保存的数组可能会不一致,保存的数组的一列长度可能会大于行数,所以要判断数组的长度 if data[i][j] then table.insert(tt,data[i][j]) end end end return tt end function xichongRoomView:reflashHandCards() local handCard = self:ChangeDataToVector(self.handCardValueBak) local sendCardResult = app.room:rankHandCard(handCard) local newCardList newCardList = app.room:serverCardToMyCard(sendCardResult) self.ui.Items.LayoutMain_4:removeAllChildren() self.handCardRoot = {} self.handCardItem = {} self.handCardValueLocal = {} self.handCardValueBak = {} local myUserID = app.room:getMyUserId() app.room.cards[myUserID] = newCardList self:createCard(false,myUserID,nil) end -- 操作成功 function xichongRoomView:onOperationCodeSuccess(data) local function runOnOperationSuccess(onEnd) log("2000000000-xichongRoomView - (runOnOperationSuccess)") logE("xichongRoomView:onOperationCodeSuccess :"..table.tostring(data.response)) local response = data.response local nUserID = response.nUserId local card = response.card local tablecard = response.tableCard local bIsOutCard = response.isShouldOutCard > 0 local operateCodes = response.operateCodes local weaveCardList = response.weaveCardList local playerList = response.playerList local maxWeave = table.nums(weaveCardList) local totalHuShu = response.totalHuShu local leftHandCardNum = response.leftHandCardNum --local isMoPaiOrId = -1 --app.room.roomInfo.huType = response.huType --点炮胡时,表示为点炮用户 app.room.roomInfo.dianPaoSeatId = response.dianPaoSeatId --碰胡规则 if maxWeave > 0 then --isMoPaiOrId = weaveCardList[maxWeave].seatId end --记录操作成功 self.operationSuccessCode = operateCodes self.outCard = card self.chiCard = tablecard --视图ID local viewId = app.room:getViewIdByUserId(nUserID) --[[ if self.moValue and self.moValue > 0 and viewId == self:getMeViewId() then logE("changpaiRoomView:onOutCardSuccess(), moVlaue = ", self.moValue) self:requestFlashHandCard() end ]] if nUserID == app.room:getMyUserId() then --self:setTotalTuoNum(totalHuShu) self.PlayerView:setPlayerTuoShu(viewId,totalHuShu) else self.PlayerView:setPlayerTuoShu(viewId,response.otherTuoNum) end self.tableHuXiList[viewId] = totalHuShu self.PlayerView:setPlayerHuXi(viewId,totalHuShu) self.PlayerView:setLeftCardNum(viewId,true,leftHandCardNum) --self.PlayerView:setNoOpTime(false,viewId) if bIsOutCard then for k,v in pairs(app.room.roomInfo.memberList) do local operations = {} operations[viewId] = {} operations[viewId].nUserId = v.nUserId operations[viewId].isCanOpereate = 0 self:showDelayTimeTip(operations) end end local operations = {} operations[viewId] = {} operations[viewId].nUserId = nUserID operations[viewId].isCanOpereate = bIsOutCard and 1 or 0 self:showDelayTimeTip(operations) --隐藏handTemp if viewId == self:getMeViewId() then self.isGodHand = true --出牌动画 setGuideView延迟了0.5 self:runAction(cc.Sequence:create(cc.DelayTime:create(0.5),cc.CallFunc:create(function () self:setColorWhite() if operateCodes == 0 then--点击过的时候设置可以点牌 self.isGodHand = false end end))) self.ui.Items.ImageView_handTempCard:setVisible(false) end --显示指示器 if bIsOutCard and operateCodes ~= 0 then self:setCircleCardLeftPanelView(true,viewId,self.leftNum) end --隐藏操作层 self:setOperatorPanelView(false,nil) --判断自己是否需要出牌 if bIsOutCard and viewId == self:getMeViewId() and operateCodes ~= 0 and operateCodes ~= ZPDef.OpCode.OP_HU then self:runAction(cc.Sequence:create(cc.DelayTime:create(0.5),cc.CallFunc:create(function () self:setGuideView(true) end))) self.bOutCard = true end if self.isTianHu and viewId == self:getMeViewId() then self.isTianHu = false self:setGuideView(true) self.bOutCard = true end --隐藏吃牌层 self.operationView:setEatCardView(false) --执行操作 local code = operateCodes logE("xichongRoomView:onOperationCodeSuccess nOperationCode:"..code) local operations = ZPFuc.getZPOperationType(code,false,false) local operationType = operations[1] if response.isSanGen then if response.isSanGen == 1 then self.PlayerView:playChiChengKan(viewId,tablecard,0) elseif response.isSanGen == 2 then self.PlayerView:playChiChengSiZhang(viewId,tablecard,0) end end if response.isSiGen then if response.isSiGen == 1 then self.PlayerView:playChiChengKan(viewId,card,1) elseif response.isSiGen == 2 then self.PlayerView:playChiChengSiZhang(viewId,card,1) end end --体验:等待0.5秒结束 if operationType ~= ZPDef.OpType.OP_TYPE_WEIGUI and operationType ~= ZPDef.OpType.OP_TYPE_HU and operationType ~= ZPDef.OpType.OP_TYPE_CANCEL and operationType ~= nil then --吃碰操作 --隐藏出牌层 self:setOutCardVisible(false) self:doOperation(operationType,viewId,card,onEnd) elseif operationType == ZPDef.OpType.OP_TYPE_HU then --胡牌操作 --1.隐藏引导出牌动画2.显示胡了哪张牌,3.播放胡牌特效 self:setGuideView(false) local imgName = string.format("ImageView_outCardImg_%d",self.moPaiViewId) local mSprite = self.ui.Items[imgName] if self.outCard ~= 0 then local fileName = ZPFuc.getZPCardImgByValue(self.outCard,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType) mSprite:loadTextureFromPlist(fileName) end if coperateCodes ~= 0 then self:runAction(cc.Sequence:create(cc.DelayTime:create(0),cc.CallFunc:create(function () self:setLayoutScoreTipVisible(true,playerList,false,onEnd,true) app.room.roomInfo.winUserId = nUserID --self:playHuEffect(viewId,onEnd) if self.leftNum and not self.isTianHu and card ~= 0 and app.room.roomInfo.dianPaoSeatId == -1 and viewId == self.moPaiViewId then self:playMoPaiAni(self.leftNum,card,viewId,0,1,nil,true, nil, nil, nil) end if onEnd then onEnd() end end))) end elseif operationType == ZPDef.OpType.OP_TYPE_WEIGUI then ---违规单独处理 self:doOperation(ZPDef.OpType.OP_TYPE_WEIGUI,viewId,card,nil) --播放违规动画 self:runAction(cc.Sequence:create(cc.DelayTime:create(0.5),cc.CallFunc:create(function() if onEnd then onEnd() end end))) else --self:showOperatorTip(viewId,ZPDef.OpType.OP_TYPE_CANCEL) --过 self:doOperation(ZPDef.OpType.OP_TYPE_CANCEL,viewId,card,nil) if onEnd then onEnd() end end --if viewId == self:getMeViewId() then --self:reflashHandCards() --end end log("2000000000-xichongRoomView - addCallBack(runOnOperationSuccess)") self:addCallBack(runOnOperationSuccess) end function xichongRoomView:onGetCard(card) local dstCol1 = 0 local isEnd = false for col = self.lieShuMax,1,-1 do --列数 for row = self.hangShuMax,1,-1 do --行数 if #self.handCardValueLocal[col] < 4 then dstCol1 = col isEnd = true break end end if isEnd then break end end if dstCol1 > 0 then table.insert(self.handCardValueLocal[dstCol1],card) --数据备份 table.insert(self.handCardValueBak[dstCol1],card) end local handCard = self:ChangeDataToVector(self.handCardValueBak) local sendCardResult = app.room:rankHandCard(handCard) local newCardList newCardList = app.room:serverCardToMyCard(sendCardResult) self.ui.Items.LayoutMain_4:removeAllChildren() self.handCardRoot = {} self.handCardItem = {} self.handCardValueLocal = {} self.handCardValueBak = {} local myUserID = app.room:getMyUserId() app.room.cards[myUserID] = newCardList self:createCard(false,myUserID,nil) end --从手牌找与牌值相等的牌,没有再找加起来可以成14的,没有再找点数相同的 function xichongRoomView:findCardPos(card) local secondDstCard logE("xichongRoomView - findCardPos",card) secondDstCard = 14 - tempCardVlue[tonumber(card)] local threeDstCard = tempCardVlue[tonumber(card)] --第一目标 local dstCol1,dstRow1 --第二目标 local dstCol2,dstRow2 --第三目标 local dstCol3,dstRow3 --第四目标 local dstCol4,dstRow4 --第一次找到值时,赋值一次, local firstSet = true local isEnd = false for col = self.lieShuMax, 1, -1 do for row = self.hangShuMax, 1, -1 do --if self.handCardRoot[col].imgList[row].value == card then --牌值相同的 if self.handCardValueLocal[col][row] == card and #self.handCardValueLocal[col] < self.hangShuMax then dstCol1 = col dstRow1 = #self.handCardValueLocal[col]+1 isEnd = true break end --if self.handCardRoot[col].imgList[row].value == secondDstCard then --点数加起来等于十四的 local tempCard = tempCardVlue[tonumber(self.handCardValueLocal[col][row])] if tempCard == secondDstCard and #self.handCardValueLocal[col] < self.hangShuMax then dstCol2 = col dstRow2 = #self.handCardValueLocal[col]+1 end --点数一样的 if tempCard == threeDstCard and #self.handCardValueLocal[col] < self.hangShuMax then dstCol3 = col dstRow3 = #self.handCardValueLocal[col]+1 end if firstSet and self.handCardValueLocal[col][row] then if col == self.lieShuMax then local secondLieshu = self.lieShuMax - 1 local thirdLieshu = self.lieShuMax - 2 if #self.handCardValueLocal[col] < self.hangShuMax then firstSet = false dstCol4 = col dstRow4 = #self.handCardValueLocal[col]+1 elseif #self.handCardValueLocal[secondLieshu] < self.hangShuMax then firstSet = false dstCol4 = secondLieshu dstRow4 = #self.handCardValueLocal[col]+1 elseif #self.handCardValueLocal[thirdLieshu] < self.hangShuMax then firstSet = false dstCol4 = thirdLieshu dstRow4 = #self.handCardValueLocal[col]+1 end else firstSet = false dstCol4 = col + 1 dstRow4 = 1 end end --[[ if firstSet and self.handCardValueLocal[col][row] then firstSet = false dstCol4 = col + 1 dstRow4 = 1 end ]] end if isEnd then break end end if dstCol1 then return dstCol1,dstRow1 end if dstCol2 then return dstCol2,dstRow2 end if dstCol3 then return dstCol3,dstRow3 end if dstCol4 then return dstCol4,dstRow4 end if firstSet then --手里面没有列数了 return 5,1 end end function xichongRoomView:showGetCardAni(leftNum,viewId,card) if self:getMeViewId() == viewId then self:playMoPaiAni(leftNum,card,viewId,0,1,nil,false,nil,true, nil) local seq = cc.Sequence:create(cc.DelayTime:create(self.gameSpeedConfig.MO_PAI_TIME + 0.7),cc.CallFunc:create(function () local name = string.format("Layout_outCardPoint_%d",viewId) local mLayout = self.ui.Items[name] mLayout:setVisible(false) local srcPos = mLayout:getPosition() self.ui.Items.ImageView_handTempCard:setVisible(true) self.ui.Items.ImageView_handTempCard:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType,self.colorType)) self.ui.Items.ImageView_handTempCard:setPosition(srcPos) local firstCol,firstRow = self:findCardPos(card) logD("xichongRoomView showGetCardAni",firstCol,firstRow) local node = self.handCardRoot[firstCol].imgList[firstRow] node.value = card local nodeSize = node:getParent():getContentSize() local nodePos = cc.pAdd(node:getWorldPosition(),cc.p(nodeSize.width/2,nodeSize.height/2)) local seq2 = cc.Sequence:create(cc.MoveTo:create(0.2,nodePos),cc.CallFunc:create(function () local firstCol1,firstRow1 = self:findCardPos(card) --防止在切换版式的时候摸牌,然后牌已经被删掉报错 if not tolua.isnull(node) then node:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType)) node:setVisible(true) end self.ui.Items.ImageView_handTempCard:setVisible(false) self.ui.Items.ImageView_handTempCard:setScale(1.0) self.ui.Items.ImageView_handTempCard:setOpacity(255) --self.handCardValueLocal[firstCol1][firstRow1] = card --table.insert(self.handCardValueBak[firstCol1],card) --self.handCardValueBak[firstCol1][firstRow1] = card if self:getCurrentColIsKan(self.handCardValueLocal[firstCol]) then for i=1,3 do self.handCardRoot[firstCol].imgList[i].isKan = true self.handCardRoot[firstCol].imgList[i]:setColor(cc.c3b(125,125,125)) end end self.isGodHand = false --self:showTiPaiBtn(true) --排序 --self:RankCard(true) self:onGetCard(card) --检测一遍手牌防止进牌的时候玩家在拖动牌导致的少牌问题 self:checkCardAndRecover() if onEnd then onEnd() end end)) self.ui.Items.ImageView_handTempCard:runAction(seq2) end)) self:runAction(seq) else self:playMoPaiAni(leftNum,0,viewId,0,1,nil,false,nil,true, nil) --self.PlayerView:changeLeftCardNum(viewId,1) local name = string.format("Layout_outCardPoint_%d",viewId) --播放动画 self.ui.Items.ImageView_handTempCard:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(0,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType,self.colorType))--card local mSprite = self.ui.Items[name] local srcPos = mSprite:getPosition() self.ui.Items.ImageView_handTempCard:setPosition(srcPos) local tarPos = self.PlayerView:getPlayerPosByViewId(viewId) --self.ui.Items.ImageView_handTempCard:setEulerRotation(cc.vec3(0,0,90)) local time = 0.2 local spawn = cc.Spawn:create(cc.MoveTo:create(time,tarPos),cc.FadeOut:create(time),cc.ScaleTo:create(time,0)) local seq = cc.Sequence:create(cc.DelayTime:create(self.gameSpeedConfig.MO_PAI_TIME + 0.7),cc.CallFunc:create(function () self.ui.Items.ImageView_handTempCard:setVisible(true) local name = string.format("Layout_outCardPoint_%d",viewId) local mLayout = self.ui.Items[name] mLayout:setVisible(false) end),spawn,cc.CallFunc:create(function () self.ui.Items.ImageView_handTempCard:setVisible(false) self.ui.Items.ImageView_handTempCard:setScale(1.0) self.ui.Items.ImageView_handTempCard:setOpacity(255) self.ui.Items.ImageView_handTempCard:setEulerRotation(cc.vec3(0,0,0)) self.isGodHand = false --self:showTiPaiBtn(true) if onEnd then onEnd() end end)) self.ui.Items.ImageView_handTempCard:runAction(seq) end end function xichongRoomView:onBroadCastUserGetCard(data) local function runUserGetCard(onEnd) log("2000000000-xichongRoomView - (runUserGetCard)") logE("runUserGetCard :"..table.tostring(data.response)) self:checkCardAndRecover() local viewId = app.room:getViewIdByUserId(data.response.nUserId) local leftcardNum = data.response.leftCardNum local mocard = data.response.moCard self.moPaiViewId = viewId self.moValue = mocard if data.response.nUserId == app.room:getMyUserId() then --进牌后解锁油牌 --如果报叫了则不能解锁 --先刷新一遍手牌,存在上一轮摸了牌无操作也没出牌的情况 self:unLockYouPai() app.room.roomInfo.disCard = {} --进牌的时候点过发0给服务器 self.outCard = 0 --self:onGetCard(moValue) local myViewId = self:getMeViewId() self.PlayerView:setPlayerTuoShu(myViewId,data.response.totoltuoNum) end local leftCard = data.response.tableCardNum self:setCircleCardLeftPanelView(true,viewId,leftCard) self.PlayerView:setLeftCardNum(viewId,true,leftcardNum) if data.response.baoType > 0 then local baoTypeList = self:getBaoTypeList(data.response.baoType) self.PlayerView:playPaiXingAniList(viewId, baoTypeList, mocard) local userInfo=app.room:getUserInfo(data.response.nUserId) if userInfo then ZPSound.PlayOperateSound(userInfo.sex,-55) end end self.isGodHand = true local seq = cc.Sequence:create(cc.CallFunc:create(function() self:showGetCardAni(leftCard,viewId,mocard) --播放偷音效 local userInfo=app.room:getUserInfo(data.response.nUserId) if userInfo then ZPSound.PlayOperateSound(userInfo.sex,-64) end end),cc.DelayTime:create(1.2),cc.CallFunc:create(function() if onEnd then onEnd() end end)) self:runAction(seq) end log("2000000000-xichongRoomView - addCallBack(runUserGetCard)") self:addCallBack(runUserGetCard); end function xichongRoomView:onUserGetCardOperteResponse(data) local function runonUserGetCardOperte(onEnd) log("2000000000-xichongRoomView - (runonUserGetCardOperte)") logE("runonUserGetCardOperte :"..table.tostring(data.response)) if data.response.nUserId == app.room:getMyUserId() then if data.response.TouoperateCode ~= ZPDef.OpCode.OP_ERROR or data.response.BaoperateCode ~= ZPDef.OpCode.OP_ERROR then local opCard = 0 local opeateCode = data.response.mainOpCode local ishu = data.response.ishu local isBiHu = data.response.isBiHu local hasGuo = true self.outCard = 0 if #data.response.ToucardList > 0 then opCard = data.response.ToucardList[1] end local viewId = app.room:getViewIdByUserId(data.response.nUserId) self.operationLocalCode = opeateCode if self.operationLocalCode > 0 then self:showOpeation(opeateCode,opCard, nil, isBiHu) self:setGuideView(false) self.bOutCard = false end self.PlayerView:setPlayerTuoShu(viewId,data.response.totalTuoNum) end end local operations = {} --操作码 local viewId = app.room:getViewIdByUserId(data.response.nUserId) operations[viewId] = {} operations[viewId].nUserId = data.response.nUserId operations[viewId].isCanOpereate = 1 self:showDelayTimeTip(operations) if onEnd then onEnd() end end log("2000000000-xichongRoomView - addCallBack(runonUserGetCardOperte)") self:addCallBack(runonUserGetCardOperte); end --摸牌 function xichongRoomView:onMoPai(data) local function runOnMoPai(onEnd) local response = data.response local nUserId = response.nUserId local turnOverCard = response.turnOverCard local code = response.mainOpCode local leftCardNum = response.leftCardNum --local operations = response.operations local isBiPeng = response.isBiPeng local chiOpCardlist = response.chiOpCardList local isBiHu = response.isBiHu if isBiPeng == 1 then self.isBingPeng = true end local viewId = app.room:getViewIdByUserId(nUserId) self.EatOperationCode = code self.outCard = turnOverCard self.moPaiViewId = viewId self:showDelayTimeTip() --更新剩余牌数 self:playMoPaiAni(leftCardNum,turnOverCard,viewId,code,1,onEnd,false,chiOpCardlist, nil, isBiHu) if self.bankerBaoPao then self.bankerBaoPao = nil self:showTiPaiBtn(true) --小家不能看牌时,牌堆牌显示剩余张数 if app.room:isLittleFamily() and (not ZPFuc.getLittleIsCanLookCard()) then self:setCircleCardLeftPanelView(true,viewId,19) end end if self:getIsMeUId(nUserId) then --检测是否少牌 self:checkCardAndRecover() end --[[ --结束 if onEnd then onEnd() end--]] end log("2000000000-ZPRoomView - addCallBack(runOnMoPai)") self:addCallBack(runOnMoPai) end --刷新手牌 function xichongRoomView:onReflashHandcardsResponese(event) log("2000000000-xichongRoomView - onReflashHandcardsResponese()" ) logD("onReflashHandcardsResponese self.handCardValueBak---",table.tostring(self.handCardValueBak)); logD("onReflashHandcardsResponese self.handCardValueLocal---",table.tostring(self.handCardValueLocal)); --uploadLogs("reflashhandcard2") self.ui.Items.LayoutMain_4:removeAllChildren() self.handCardRoot = {} self.handCardItem = {} self.handCardValueLocal = {} self.handCardValueBak = {} local myUserID = app.room:getMyUserId() self:createCard(false,myUserID,nil) if table.nums(app.room.roomInfo.firstOutCard) > 0 then self:lockMyHandCards() else if table.nums(app.room.roomInfo.disCard) > 0 then self:lockYouPai(app.room.roomInfo.disCard) end end end --[[function xichongRoomView:setLiangPaiVisible(bVisible) if self.xiaojuView then self.xiaojuView:setVisible(bVisible) end end --]] -- 小局结算 function xichongRoomView:onGameXiaoJuResponse(data) local function runGameXiaoJuResponse(onEnd) self.ui.Items.Button_tipai:setVisible(false) self.PlayerView:stopAndHideBaoAnim() self.PlayerView:hideLeftCard() --显示所有底牌 local response = data.response; --标记单局结束 self.isGameOver = true --禁止出牌 self.bOutCard = false local roomInfo = app.room.roomInfo --结束原因 roomInfo.stopFlag = response.stopFlag --赢家uid, -1则下面6个字段是无用 roomInfo.winUserId = response.winUserId --点炮胡时,表示为点炮用户 roomInfo.dianPaoUserId = response.dianPaoUserId --违规 roomInfo.weiGuiUid = response.weiGuiUid --胡的类型(如天胡、地胡 ,自摸胡等) roomInfo.huType = response.huTypes --多少个玩家 roomInfo.playList = response.playList --底牌信息 roomInfo.dipaiList = response.dipaiList --胡牌牌值 roomInfo.huCard = response.huCard --是否大局结束,结束是1 roomInfo.isGameOver = response.isGameOver --胡牌信息 roomInfo.hupaiInfo = response.hupaiInfo --是否自摸胡 roomInfo.isZiMoHu = response.isZiMoHu local huViewId = 0 local isSomebodyHuPai = false for i,v in pairs(roomInfo.hupaiInfo) do huViewId = app.room:getViewIdByUserId(v.huPaiUid) roomInfo.dianPaoUserId = v.dianPaoUid roomInfo.weiGuiUid = v.weiGuiUid roomInfo.baopeiUserid = app.room:getUserIdBySeatId(v.BaoPeiUid) roomInfo.fourNormolNum = v.fourNormolNum roomInfo.fourHongNum = v.fourHongNum roomInfo.threeHongNum = v.threeHongNum roomInfo.huCard = v.huCard self.PlayerView:setPlayerHuXi(v.huPaiHuShu) roomInfo.huType = v.huTypes isSomebodyHuPai = true end self.PlayerView:setHuCardVisible(huViewId, true, roomInfo.huCard) --所有的暗偎默认亮起一张 --self:showLastAnWeiPai() --完成底牌展示 self.xiaojuChaPaiView:showDiPai() --完成手牌展示 local hasHandCard = true for k,v in pairs(roomInfo.playList) do --三个人的时候要加UId为0的判断 if v.nUserId > 0 and v.handCard and #v.handCard == 0 then hasHandCard = false break end end --如果没有手牌则直接进入大结算 if not hasHandCard then app.room.roomInfo.needJieSuanInfo = 1 end for k,v in pairs(roomInfo.playList) do local cardData = app.room:serverCardToMyCard(v.handCard) if not roomInfo.memberList[v.nUserId] then roomInfo.memberList[v.nUserId] = {} end roomInfo.memberList[v.nUserId].cardList = {} roomInfo.memberList[v.nUserId].cardList = cardData local tuoNum = v.totalTuoNum local viewId = app.room:getViewIdByUserId(v.nUserId) self.PlayerView:setPlayerTuoShu(viewId,tuoNum) --[[logE("XiaoJu nUserID:"..v.nUserId) logE("XiaoJu cardList:"..table.tostring(cardData))--]] end self.xiaojuChaPaiView:liangShouPai(false) --玩家分数 for k,v in pairs(roomInfo.playList) do local viewId = app.room:getViewIdByUserId(k) local nScore = v.nTotalMoney local memberInfo = app.room.roomInfo.memberList[k] --[[roomInfo.memberList[v.nUserId].nPlayerFlag = 0--]] memberInfo.nTotalMoney = nScore self.PlayerView:setPlayerScore(viewId,nScore) end local function nextCallBackFun() self:resetGameData() end local function showAllJieSuan() if self.RoomCountAllViewUI then if not self.RoomCountAllViewUI:isVisible() then self.RoomCountAllViewUI:playAni() end self.RoomCountAllViewUI:setVisible(true) self:showGameOverAward() end end if app.room.roomInfo.isGameOver == 0 then self.xiaojuView = xichongRoomXiaoJuView:new(nextCallBackFun,false) else self.xiaojuView = xichongRoomXiaoJuView:new(showAllJieSuan,false) end self:addChild(self.xiaojuView) self.xiaojuView:setVisible(false) local function showChaPai() runDelay(1, function () self:setLiangPaiVisible(true) if self.xiaojuView then self.xiaojuView:setVisible(true) end end) end if huViewId and huViewId > 0 then --违规的时候没有胡牌id self:playHuEffect(huViewId,showChaPai) end --结束原因表现 if roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_HUANG_ZHUANG or (not isSomebodyHuPai and roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_TUOGUAN_DISMISS) then roomInfo.huType = 0 local viewId = self:getMeViewId() -- self:playHuEffect(viewId,showChaPai) showChaPai() --播放黄庄动画 local userInfo=app.room:getUserInfo(app.user.loginInfo.uid) if userInfo then --ZPSound.PlayHuangZhuang(userInfo.sex) end self.xiaojuChaPaiView:PlayHuangZhuangAni(true) elseif roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_WEIGUI then local userInfo=app.room:getUserInfo(roomInfo.weiGuiUid) if userInfo then ZPSound.PlayWeiGui(userInfo.sex) end showChaPai() elseif roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_DISBAND_GAME then showChaPai() elseif roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_LONG_NOT_END then app.room.roomInfo.needJieSuanInfo = 1 --[[ showConfirmDialog("游戏长久未打完,超过房间存在时间,本局结束",function() logE("超时回到大厅") self:runAction(cc.Sequence:create(cc.DelayTime:create(1.0),cc.CallFunc:create(function () --房间号 local roomid = app.room.roomInfo.nShowTableId --app:gotoView(import("luaScript.Views.Main.MainView"):new(app.gameId, roomid)) gotoMainView(app.gameId,roomid) end))) end,nil)--]] end --结束 if onEnd then onEnd() end end log("2000000000-xichongRoomView - addCallBack(runGameXiaoJuResponse)" ) self:addCallBack(runGameXiaoJuResponse); end --胡牌特效 function xichongRoomView:playHuEffect(viewId,onEnd,isRecontect) --[[ --黄庄了直接return if app.room.roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_HUANG_ZHUANG then return end--]] logE("xichongRoomView playHuEffect",app.room.roomInfo.huType,viewId) local nUserID = app.room:getUserIdByViewId(viewId) if (app.room.roomInfo.huType and app.room.roomInfo.huType >= 0) and (app.room.roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_NORMAL) then local userInfo=app.room:getUserInfo(nUserID) if userInfo then ZPSound.PlayOperateSound(userInfo.sex,4) --if ZPFuc.isZiMo(app.room.roomInfo.huType) then --ZPSound.PlayOperateSound(userInfo.sex,11) --else --ZPSound.PlayOperateSound(userInfo.sex,4) --end end end local name = string.format("Layout_outCardPoint_%d",viewId) local mLayout = self.ui.Items[name] local huEffectUI = loadUI("zp_base/res/ui/ui_fangjian/zipai_ui_effectHu.ui") local pos = mLayout:getPosition() if viewId == self:getMeViewId() then local centerPos = cc.Director:getInstance():getVisibleSize() local pos = cc.p(centerPos.width/2,centerPos.height/2 - 70) huEffectUI:setPosition(pos) elseif viewId == 1 then huEffectUI:setPosition(cc.pAdd(pos,cc.p(90,-30))) elseif viewId == 2 then huEffectUI:setPosition(cc.pAdd(pos,cc.p(0,20))) elseif viewId == 3 then huEffectUI:setPosition(cc.pAdd(pos,cc.p(-70,-30))) end self.ui.Items.Layout_Player_HuEffect:addChild(huEffectUI,2) --模式切换头像位置会变所以要实时获取头像的位置 local headInfos = {} for k,v in pairs(self.PlayerView.allNodes) do if k == 2 then local pos = cc.pAdd(v.player:getPosition(),cc.p(0,30)) table.insert(headInfos,{headPos=pos}) elseif k == 4 then local pos = cc.pAdd(v.player:getPosition(),cc.p(40,40)) table.insert(headInfos,{headPos=pos}) elseif k == 3 then local pos = cc.pAdd(v.player:getPosition(),cc.p(40,40)) table.insert(headInfos,{headPos=pos}) elseif k == 1 then local pos = cc.pAdd(v.player:getPosition(),cc.p(0,40)) table.insert(headInfos,{headPos=pos}) end end local pPos = cc.p(0,0) for k,v in pairs(headInfos) do if k == viewId then --pPos = v.headPos if viewId == 2 then pPos.y = v.headPos.y + 30 pPos.x = v.headPos.x - 5 elseif viewId == 1 then pPos.y = v.headPos.y + 20 pPos.x = v.headPos.x elseif viewId == 3 then pPos.y = v.headPos.y + 20 pPos.x = v.headPos.x elseif viewId == 4 then pPos.y = v.headPos.y + 20 pPos.x = v.headPos.x end end end local mSpawn = cc.Spawn:create(cc.MoveTo:create(0.5,pPos),cc.ScaleTo:create(0.3,0.5)) huEffectUI:runAction(cc.Sequence:create(cc.DelayTime:create(0.5),mSpawn)) local delayTime = 0.8 --动画展现 if app.room.roomInfo.huType and app.room.roomInfo.huType >= 0 then local name = "" local bankerViewId = app.room:getViewIdBySeatId(app.room.roomInfo.nBankSeatId) local nWinerId = app.room.roomInfo.winUserId local winerViewId = app.room:getViewIdByUserId(nWinerId) if app.room.roomInfo.stopFlag == ZPDef.XiaoJuEndType.STOP_FLAG_HUANG_ZHUANG then--app.room.roomInfo.huType == 0 and name = "zp_room_chapai_huangzhuang.png"--显示叫(表示听牌了) local centerPos = cc.Director:getInstance():getVisibleSize() local pos = cc.p(centerPos.width/2,centerPos.height/2 - 70) huEffectUI:setPosition(pos) huEffectUI.Items.ImageView_huType:loadTextureFromPlist(name) huEffectUI:setVisible(false) delayTime = 0 else --name = "zp_room_chapai_hu.png"--string.format(ZPDef.TipFile.HU,app.room.roomInfo.huType) huEffectUI.Items.ImageView_huType:loadTexture(ZPDef.TipFile.HU) end end isRecontect = true--不显示动画 if isRecontect then huEffectUI.Items.ImageView_Light:setVisible(false) huEffectUI.Items.ImageView_Point:setVisible(false) huEffectUI.Items.ImageView_Coin:setVisible(false) self:showPaoImage() self:runAction(cc.Sequence:create(cc.DelayTime:create(delayTime),cc.CallFunc:create(function () if onEnd then onEnd() end end))) return end local mSpawn1 = cc.Spawn:create(cc.ScaleTo:create(0.3,1.0),cc.RotateBy:create(2,-120*6)) huEffectUI.Items.ImageView_Point:runAction(mSpawn1) local mSpawn2 = cc.Spawn:create(cc.ScaleTo:create(0.3,1.0),cc.RotateBy:create(2,120*6)) huEffectUI.Items.ImageView_Light:runAction(mSpawn2) huEffectUI.Items.ImageView_Coin:setScale(0) local mSeq1 = cc.Sequence:create(cc.ScaleTo:create(0.3,1)) huEffectUI.Items.ImageView_Coin:runAction(mSeq1) huEffectUI.Items.ImageView_huType:setScale(2) huEffectUI.Items.ImageView_huType:setOpacity(0) local mSeq2 = cc.Sequence:create(cc.DelayTime:create(0.6),cc.FadeIn:create(0),cc.ScaleTo:create(0.2,1.0)) huEffectUI.Items.ImageView_huType:runAction(mSeq2) huEffectUI:runAction(cc.Sequence:create(cc.DelayTime:create(2.2),cc.CallFunc:create(function() huEffectUI.Items.ImageView_Light:setVisible(false) huEffectUI.Items.ImageView_Point:setVisible(false) huEffectUI.Items.ImageView_Coin:setVisible(false) self:showPaoImage() if onEnd then onEnd() end end))) end --点炮显示 function xichongRoomView:showPaoImage() if app.room.roomInfo.dianPaoUserId and app.room.roomInfo.dianPaoUserId >= 0 then local dianPaoViewId = app.room:getViewIdByUserId(app.room.roomInfo.dianPaoUserId) --点炮精灵 local mSprite = cc.ImageView:createNode() mSprite:loadTexture(ZPDef.TipFile.DIANPAO) --if dianPaoViewId == 2 then --mSprite:setEulerRotation(cc.vec3(0, 0, -90)) --end local name = string.format("Layout_outCardPoint_%d",dianPaoViewId) local mLayout = self.ui.Items[name] local pos = mLayout:getPosition() if dianPaoViewId == self:getMeViewId() then local centerPos = cc.Director:getInstance():getVisibleSize() local pos = cc.p(centerPos.width/2,centerPos.height/2 - 70) mSprite:setPosition(pos) elseif dianPaoViewId == 1 then mSprite:setPosition(cc.pAdd(pos,cc.p(90,-30))) elseif dianPaoViewId == 2 then mSprite:setPosition(cc.pAdd(pos,cc.p(0,20))) elseif dianPaoViewId == 3 then mSprite:setPosition(cc.pAdd(pos,cc.p(90,-30))) end self.ui.Items.Layout_Player_HuEffect:addChild(mSprite,2) --模式切换头像位置会变所以要实时获取头像的位置 local headInfos = {} for k,v in pairs(self.PlayerView.allNodes) do if k == 2 then local pos = cc.pAdd(v.player:getPosition(),cc.p(0,30)) table.insert(headInfos,{headPos=pos}) elseif k == 4 then local pos = cc.pAdd(v.player:getPosition(),cc.p(40,40)) table.insert(headInfos,{headPos=pos}) elseif k == 3 then local pos = cc.pAdd(v.player:getPosition(),cc.p(40,40)) table.insert(headInfos,{headPos=pos}) elseif k == 1 then local pos = cc.pAdd(v.player:getPosition(),cc.p(0,40)) table.insert(headInfos,{headPos=pos}) end end local pPos = cc.p(0,0) for k,v in pairs(headInfos) do if k == dianPaoViewId then --pPos = v.headPos if dianPaoViewId == 2 then pPos.y = v.headPos.y + 5 pPos.x = v.headPos.x - 10 elseif dianPaoViewId == 1 then pPos.y = v.headPos.y + 5 pPos.x = v.headPos.x - 5 elseif dianPaoViewId == 3 then pPos.y = v.headPos.y + 5 pPos.x = v.headPos.x elseif dianPaoViewId == 4 then pPos.y = v.headPos.y + 5 pPos.x = v.headPos.x end end end local mSpawn = cc.Spawn:create(cc.MoveTo:create(0.5,pPos),cc.ScaleTo:create(0.3,0.4)) mSprite:runAction(cc.Sequence:create(cc.DelayTime:create(0.5),mSpawn)) end end --游戏消息 function xichongRoomView:bindGameMessage() xichongRoomView.super.bindGameMessage(self) --下飘 self:bindEvent(app.room , "onBroadCastUserPiao" , handler(self , self.onXiaPiaoTime)) --通知用户暗操作 self:bindEvent(app.room , "onUserOperateResponse", handler(self , self.onUserOperateResponse)); --暗操作成功 self:bindEvent(app.room , "onBroadCastQiShouOperate", handler(self , self.onUserOperateSuccess)); --接收到报操作提示 self:bindEvent(app.room , "onUserCanBaoResponse" , handler(self, self.onUserCanBaoResponse)) --广播用户报操作 self:bindEvent(app.room , "onBroadUserBaoResponse", handler(self, self.onBroadUserBaoResponse)) --通知玩家出牌 self:bindEvent(app.room , "onBroadCastUserOutCard", handler(self, self.onBroadCastUserOutCard)) --广播玩家进牌 self:bindEvent(app.room , "onBroadCastUserGetCard", handler(self , self.onBroadCastUserGetCard)); --刷新手牌 self:bindEvent(app.room , "onReflashHandcardsResponese" , handler(self , self.onReflashHandcardsResponese)); --通知进牌后操作提示 self:bindEvent(app.room , "onUserGetCardOperteResponse", handler(self , self.onUserGetCardOperteResponse)); --切换视图 self:bindEvent(app , ZPDef.ZPEvent.ChangeViewType, handler(self, self.changeViewType)) -- 托管 self:bindEvent(app.room , ZPDef.ZPEvent.HostingRequest, handler(self, self.onHostingRequest)) end function xichongRoomView:changeViewType(event) if event and event.desktopType and self.desktopType~=event.desktopType then self.desktopType=event.desktopType if self.xiaojuChaPaiView then self.xiaojuChaPaiView:setDeskTopType(event.desktopType) end end --[[ if event and event.colorType and self.desktopType~=event.colorType then self.colorType=event.colorType if self.xiaojuChaPaiView then self.xiaojuChaPaiView:setCardColorType(event.colorType) end end--]] self.PlayerView:setPlayerPosByChangeTable(self.desktopType) self:changeOutCardPos() self:initOpOutCardNum() self:initMySelfCardPos() self:loadTextureCache() self.ui:sendMsg(app.room,ZPDef.ZPEvent.GetTableInfo) end --显示提牌按钮 function xichongRoomView:showTiPaiBtn(vis) vis = vis or false self.ui.Items.Button_tipai:setVisible(false) end function xichongRoomView:onXiaPiaoTime(data) local function runXiaPiao(onEnd) log("xichongRoomView onXiaPiaoTime") local nUserId = data.response.nUserId self:showPiao(nUserId) if onEnd then onEnd() end end log("2000000000-xichongRoomView - addCallBack(onXiaPiaoTime)" ) self:addCallBack(runXiaPiao) end function xichongRoomView:resetGameData() xichongRoomView.super.resetGameData(self) for i = 1,ZPDef.GameMaxPlayer do self.PlayerView:setPlayerTuoShu(i, 0) self.PlayerView:setHuCardVisible(i, false, nil) end self.PlayerView:hideDingPiao() if app.room.roomInfo.nGameStartCount == 0 then self.PlayerView:hidePiao() end for i = 1, ZPDef.GameMaxPlayer do local giveupName = string.format("Layout_outCardPos_%d",i) self.ui.Items[giveupName]:removeAllChildren() end self:cleanOpOutCard() self.PlayerView:hidePaiXing() self.PlayerView:hideDang() self.PlayerView:hideTouJia() self.PlayerView:hideXiaoJia() self:initOpOutCardNum() self.isBingPeng = false if self.xiaojuView then self.xiaojuView:removeFromParent() self.xiaojuView = nil end if self.xiaojuChaPaiView then self.xiaojuChaPaiView:setVisible(false) end end --@parm:手牌列表 function xichongRoomView:getLocalHuShu(list) return 0 end --注册点击事件 function xichongRoomView:registerCardTouch() local function getPosOO() local nodeTouch = self.ui.Items.Layout_Touch; local posTouch = nodeTouch:getWorldPosition() local poaAnchor = nodeTouch:getAnchorPoint() local sizeTouch = nodeTouch:getContentSize(); local posOO = { x = posTouch.x - sizeTouch.width * poaAnchor.x , y = posTouch.y - sizeTouch.height * poaAnchor.y} return posOO; end --触摸 for k,v in ipairs(self.handCardItem) do local function onTouchBegan(touch) --[[if app.room:isLittleFamily() then --showTooltip("小家禁止操作") return end--]] if self.isGodHand then --showTooltip("禁止操作") return end local posOO = getPosOO() local localPos = touch:getLocation(); local pos = cc.p(localPos.x - posOO.x, localPos.y - posOO.y); local lieshu = v.lieshu local hangshu = v.hangshu local value = v.value local isKan = v.isKan if isKan then --showTooltip("坎牌不可移动") return end self.handCardRoot[lieshu].ui:setVisible(true) if value == nil then return end --playZiPaiSelectCardVoice() logE("88888888-=============onTouchBegan1================") logE("88888888-isKan:") logE(isKan) logE("88888888-touch lieshu:",lieshu) logE("88888888-touch hangshu:",hangshu) logE("88888888-touch value:",value) if value - 16 > 0 then logE("玩家点了"..lieshu.."列"..hangshu.."行的大"..value - 16) else logE("玩家点了"..lieshu.."列"..hangshu.."行的小"..value) end if isKan then logE("该牌为坎牌") else logE("该牌不是坎牌") end logE("88888888-card :"..table.tostring(self.handCardValueLocal)) logE("88888888-=============onTouchBegan2================") v:setOpacity(0) if self.ui.Items.ImageView_handTempCard.cIdx ~= k then self:setColorWhite() v:setColor(ZPDef.ColorConfig.TOUCH_CARD_COLOR) self.ui.Items.Button_OutCard:setEnabled(true) elseif self.ui.Items.ImageView_handTempCard.cIdx == k then if v:getColor().r == ZPDef.ColorConfig.TOUCH_CARD_COLOR.r and v:getColor().g == ZPDef.ColorConfig.TOUCH_CARD_COLOR.g and v:getColor().b == ZPDef.ColorConfig.TOUCH_CARD_COLOR.b then self:setColorWhite() self.ui.Items.Button_OutCard:setEnabled(false) else v:setColor(ZPDef.ColorConfig.TOUCH_CARD_COLOR) self.ui.Items.Button_OutCard:setEnabled(true) end end self:showTingPaiView(v.value) --出牌线 self:setOutCardLineVisible(true) --临时牌 self.ui.Items.ImageView_handTempCard.cIdx = k self.ui.Items.ImageView_handTempCard.lieshu = lieshu self.ui.Items.ImageView_handTempCard.hangshu = hangshu self.ui.Items.ImageView_handTempCard.value = value self.ui.Items.ImageView_handTempCard.index = k self.ui.Items.ImageView_handTempCard:setVisible(true) self.ui.Items.ImageView_handTempCard:loadTextureFromPlist(ZPFuc.getZPCardImgByValue(value,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType)) self.ui.Items.ImageView_handTempCard:setPosition(pos) end local function onTouchMove(touch) if self.isGodHand then --showTooltip("end 禁止操作") return end local posOO = getPosOO() local localPos = touch:getLocation(); local pos = cc.p(localPos.x - posOO.x, localPos.y - posOO.y); self.ui.Items.ImageView_handTempCard:setPosition(pos) end local function onTouchEnd(touch) if self.isGodHand then --showTooltip("end 禁止操作") return end logE("88888888-=============onTouchEnd1================") if not self.ui.Items.ImageView_handTempCard:isVisible() then --showTooltip("End 临时牌阻止了事件") v:setOpacity(255) self.ui.Items.ImageView_handTempCard:setVisible(false) return end self.ui.Items.ImageView_handTempCard:setVisible(false) --出牌线 self:setOutCardLineVisible(false) if v.isKan then return end if not v.value then return end v:setOpacity(255) --回到原点动画 self:goBackWithAni(v,0.15) logE("88888888-=============onTouchEnd2================") end local function onTouchCancel(touch) if self.isGodHand then --showTooltip("禁止操作") return end self:setColorWhite() logE("88888888-=============onTouchCancel 1================") --出牌线 self:setOutCardLineVisible(false) if not self.ui.Items.ImageView_handTempCard:isVisible() then --showTooltip("cancel 临时牌阻止了事件") v:setOpacity(255) self.ui.Items.ImageView_handTempCard:setVisible(false) return end self.ui.Items.ImageView_handTempCard:setVisible(false) if v.isKan then return end if not v.value then return end v:setOpacity(255) --临时牌 self.ui.Items.ImageView_handTempCard:setVisible(false) local touchPos = touch:getLocation() ------------------------------------------------------- ------------------------------------------------------- local hitCount = 0 local hitItem = {} for i = #self.handCardItem,1,-1 do local mSprite = self.handCardItem[i] local posNode = mSprite:convertToNodeSpace(touchPos); local width = mSprite:getContentSize().width local height = mSprite:getContentSize().height --不可以用getWorldPosition(),因为会出现旋转后,可点区域会停留在原来的地方。 local x = mSprite:getPosition().x local y = mSprite:getPosition().y local mRect = cc.Rectangle:new(x,y,width,height) if mRect:contains(posNode.x,posNode.y) then hitCount = hitCount + 1 hitItem[hitCount] = mSprite break --[[--干掉for循环 if hitCount == 3 then break end--]] end end --处理多层点击穿透:如果是3个,取第三个,如果是2个,取第二个,如果是一个,取第一个 local curItem = hitItem[#hitItem] --不可手动理牌 local curItem = nil if curItem then logE("cancel hitCount :"..hitCount) if curItem.value == nil then logE("88888888-=============curItem.value == nil 1================") logE("88888888-=============执行牌插入,插入位置为空的================") --牌插入逻辑: --数组数据更新 local curLieShu = hitItem[#hitItem].lieshu local curHangShu = hitItem[#hitItem].hangshu local value = hitItem[#hitItem].value logE("88888888-self.handCardValueLocal[v.lieshu]:"..table.tostring(self.handCardValueLocal[v.lieshu])) logE("88888888-self.handCardValueLocal[curLieShu]:"..table.tostring(self.handCardValueLocal[curLieShu])) --行数 local row = v.hangshu local lieshu = v.lieshu logE("88888888-touch row :"..row) logE("88888888-touch lieshu :"..lieshu) --原来的数据删除 --if self.handCardRoot[lieshu].imgList[row].value == v.value then table.remove(self.handCardValueLocal[lieshu],row) --end --在新的数据列里插入新的值 for i = 1,self.hangShuMax do if self.handCardRoot[curLieShu].imgList[i].value == nil then table.insert(self.handCardValueLocal[curLieShu],v.value) break end end --数据交换 local tempValue = nil tempValue = v.value v.value = hitItem[#hitItem].value hitItem[#hitItem].value = tempValue --ui更新 self.ui.Items.ImageView_handTempCard:setVisible(true) v:setVisible(false) local function callback() self.ui.Items.ImageView_handTempCard:setVisible(false) local cardvalue = hitItem[#hitItem].value or tempValue if cardvalue then local fileName = ZPFuc.getZPCardImgByValue(cardvalue,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType) hitItem[#hitItem]:loadTextureFromPlist(fileName) hitItem[#hitItem]:setVisible(true) hitItem[#hitItem]:setOpacity(255) end --听牌标签 if v:getChildren()[1]:isVisible() then v:getChildren()[1]:setVisible(false) hitItem[#hitItem]:getChildren()[1]:setVisible(true) end self.ui.Items.ImageView_handTempCard.lieshu = curLieShu self.ui.Items.ImageView_handTempCard.hangshu = curHangShu self:neatenCard() end --handTemp->tarPos action if self.handCardRoot[curLieShu].imgList[curHangShu - 1] and self.handCardRoot[curLieShu].imgList[curHangShu - 1].value then local node = hitItem[#hitItem] local nodeSize = node:getParent():getContentSize() local nodePos = cc.pAdd(node:getWorldPosition(),cc.p(nodeSize.width/2,nodeSize.height/2)) local seq = cc.Sequence:create(cc.MoveTo:create(0,nodePos),cc.CallFunc:create(callback))--self.gameSpeedConfig.OPCARDTIME self.ui.Items.ImageView_handTempCard:runAction(seq) else callback() end logE("88888888-=============curItem.value == nil 2================") logE("88888888-=============执行牌插入结束================") else logE("88888888-=============cancel curItem.value exist 1================") --数组数据更新 local curLieShu = hitItem[#hitItem].lieshu local curHangShu = hitItem[#hitItem].hangshu local value = hitItem[#hitItem].value local isKan = hitItem[#hitItem].isKan if isKan then showTooltip("坎牌不可拆") return end --如果小于3则插入到空的那个 if self:getRowVisibleCount(curLieShu) < 3 then logE("88888888-=============如果小于3则插入到空的那个================") logE("88888888-=============执行牌插入到空的位置================") --同列有多个牌相同的,找出对应点击的牌 local row = v.hangshu local lieshu = v.lieshu logE("88888888-row :"..row) logE("88888888-lieshu :"..lieshu) --原来的数据删除 table.remove(self.handCardValueLocal[lieshu],row) --在新的数据列里插入新的值 local newRow = 0 for i = 1,self.hangShuMax do if self.handCardRoot[curLieShu].imgList[i].value == nil then newRow = i table.insert(self.handCardValueLocal[curLieShu],v.value) break end end --数据交换 local tempValue = nil tempValue = v.value v.value = nil self.handCardRoot[curLieShu].imgList[newRow].value = tempValue logE("888888888-curLieShu:"..tostring(curLieShu)) logE("888888888-newRow:"..tostring(newRow)) --ui更新 v:setVisible(false) local fileName = ZPFuc.getZPCardImgByValue(self.handCardRoot[curLieShu].imgList[newRow].value,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType) self.handCardRoot[curLieShu].imgList[newRow]:loadTextureFromPlist(fileName) self.handCardRoot[curLieShu].imgList[newRow]:setVisible(true) self.handCardRoot[curLieShu].imgList[newRow]:setOpacity(255) --听牌标签 if v:getChildren()[1]:isVisible() then v:getChildren()[1]:setVisible(false) self.handCardRoot[curLieShu].imgList[newRow]:getChildren()[1]:setVisible(true) end logE("88888888-======================after insert card=========================") logE("88888888-first item lieshu:"..v.lieshu) logE("88888888-first item value:"..0) self:neatenCard() logE("88888888-=============如果小于3则插入到空的那个 结束================") logE("88888888-=============执行牌插入到空的位置 结束================") else logE("88888888-=============该列满3个牌只能交换================") logE("88888888-=============执行牌交换================") if value - 16 > 0 then logE("被交换的牌为大"..value - 16) else logE("被交换的牌为小"..value) end --牌交换: --同列有多个牌相同的,找出对应点击的牌 local rowFirst = v.hangshu local rowSecond = curHangShu logE("88888888-rowFirst 第一个交换的行数:"..rowFirst) logE("88888888-rowSecond 第二个交换的行数:"..rowSecond) logE("88888888-原始列数数据:"..table.tostring(self.handCardValueLocal[v.lieshu])) logE("88888888-交换列数数据:"..table.tostring(self.handCardValueLocal[curLieShu])) --原来的数据删除 if self.handCardRoot[v.lieshu].imgList[rowFirst].value == v.value then table.remove(self.handCardValueLocal[v.lieshu],rowFirst) table.insert(self.handCardValueLocal[v.lieshu],rowFirst,value) end --原来的数据删除 if self.handCardRoot[curLieShu].imgList[rowSecond].value == value then table.remove(self.handCardValueLocal[curLieShu],rowSecond) table.insert(self.handCardValueLocal[curLieShu],rowSecond,v.value) end logE("88888888-删除后的原始列数数据:"..table.tostring(self.handCardValueLocal[v.lieshu])) logE("88888888-删除后的列数数据:"..table.tostring(self.handCardValueLocal[curLieShu])) logE("查看数据:") logE("88888888-first item lieshu:"..v.lieshu) logE("88888888-first item value:"..v.value) logE("88888888-second item lieshu:"..curItem.lieshu) logE("88888888-second item value:"..curItem.value) logE("查看数据完毕") --数据交换 local tempValue = nil tempValue = v.value v.value = hitItem[#hitItem].value hitItem[#hitItem].value = tempValue --ui交换 local fileName = ZPFuc.getZPCardImgByValue(v.value,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType) v:loadTextureFromPlist(fileName) fileName = ZPFuc.getZPCardImgByValue(hitItem[#hitItem].value,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType) hitItem[#hitItem]:loadTextureFromPlist(fileName) local srcVisible = v:getChildren()[1]:isVisible() local changeVisible = hitItem[#hitItem]:getChildren()[1]:isVisible() --听牌标签 hitItem[#hitItem]:getChildren()[1]:setVisible(srcVisible) v:getChildren()[1]:setVisible(changeVisible) logE("交换完毕,查看数据:") logE("88888888-first item lieshu:"..v.lieshu) logE("88888888-first item value:"..v.value) logE("88888888-second item lieshu:"..hitItem[#hitItem].lieshu) logE("88888888-second item value:"..hitItem[#hitItem].value) logE("查看数据完毕") logE("88888888-=============牌交换 结束================") logE("88888888=============cancel curItem.value exist 2================") end end else --@part:牌取消回来,出牌逻辑的实现 --判断是否大于出牌点 if touchPos.y > self.ui.Items.ImageView_line:getPosition().y and self.bOutCard then if app.room:isLittleFamily() then return end --比牌的时候,在比牌间隔点到了牌,拖出去报错 if v.value == nil then showTooltip("牌已经操作过!") return end --send sender v:setOpacity(0) self:sendOutCard(v.value) logE("玩家出牌:"..v.value) self.bOutCard = false self.isGodHand = true; --记录数据 local lieshu = v.lieshu local hangshu = v.hangshu local value = v.value self.ui.Items.ImageView_handTempCard.lieshu = lieshu self.ui.Items.ImageView_handTempCard.hangshu = hangshu self.ui.Items.ImageView_handTempCard.value = value self.ui.Items.ImageView_handTempCard.index = k else logE("牌回到原来的位置") --回到原点动画 self:goBackWithAni(v,0.15) end end ------------------------------------------------------- ------------------------------------------------------- logE("88888888=============onTouchCancel 2================") logE("88888888-onTouchCancel :card :"..table.tostring(self.handCardValueLocal)) end v:setTouchEnabled(true) v:registerTouchEvent(onTouchBegan, onTouchMove, onTouchEnd, onTouchCancel) end end --检测是否少牌,如果少牌则恢复 --目前在抓牌,出牌成功,和显示操作三个地方检测少牌情况 function xichongRoomView:checkCardAndRecover() --当前的手牌数 local curCardNum = 0 --当前显示的手牌数 local curShowNum = 0 --实际手牌数 local factCardNum = 0 --计算当前手牌数 for i,cards in pairs(self.handCardValueLocal) do for j,card in pairs(cards) do if card and card > 0 then curCardNum = curCardNum + 1 end end end --计算当前显示的手牌数 for i = 1,self.lieShuMax do if self.handCardRoot[i].ui:isVisible() then for j = 1,self.hangShuMax do if self.handCardRoot[i].imgList[j]:isVisible() and self.handCardRoot[i].imgList[j]:getOpacity() == 255 and self.handCardRoot[i].imgList[j].value then curShowNum = curShowNum + 1 end end end end --计算备份数据的手牌数(以这个数据为准) for i,cards in pairs(self.handCardValueBak) do for j,card in pairs(cards) do if card and card > 0 then factCardNum = factCardNum + 1 end end end logD("checkCardAndRecover curCardNum="..curCardNum.." curShowNum="..curShowNum.." factCardNum="..factCardNum) if curCardNum ~= factCardNum or curShowNum ~= factCardNum then print("checkCardAndRecover curCardNum="..curCardNum.." curShowNum="..curShowNum.." factCardNum="..factCardNum) logD("checkCardAndRecover self.handCardValueBak---",table.tostring(self.handCardValueBak)); logD("checkCardAndRecover self.handCardValueLocal---",table.tostring(self.handCardValueLocal)); --self:requestFlashHandCard() --刷新手牌 self:setHandTempCardVisible(false) self:reflashHandCards() end end function xichongRoomView:requestFlashHandCard() local request = ZPMessage.ReflashHandCard:new() request.isFflash = 1 logE("reflashHandCard:"..table.tostring(request)) self.ui:sendMsg(app.room, "reflashHandCard", request, function(status, response) logE("xichongRoomView reflashHandCard() response = ", table.tostring(response)) end) end --整理牌 function xichongRoomView:neatenCard(isNotShowAni) --logE("neatenCard -------- ", debug.traceback()) --是否短暂屏蔽点击牌事件 self:downCard() self:RankCard(isNotShowAni) end --判断列数是否是砍牌 function xichongRoomView:getCurrentColIsKan(list) return false end --判断列数是否是龙 function xichongRoomView:getCurrentColIsLong(list) return false end --如果牌正在掉落的时候,不允许操作! --落牌检测 function xichongRoomView:downCard() if app.room:isLittleFamily() and (not ZPFuc.getLittleIsCanLookCard()) then return end --是否需要掉落 local bDown = false for i = 1,self.lieShuMax do if self.handCardRoot[i].ui:isVisible() then for j = 1,3 do for k = j+1,self.hangShuMax do if not self.handCardRoot[i].imgList[j]:isVisible() and self.handCardRoot[i].imgList[k]:isVisible() and j < k then --底部 local firstValue = self.handCardRoot[i].imgList[j].value --顶部 local secondeValue = self.handCardRoot[i].imgList[k].value --插入 --数据交换 local tempValue = nil tempValue = self.handCardRoot[i].imgList[j].value self.handCardRoot[i].imgList[j].value = self.handCardRoot[i].imgList[k].value self.handCardRoot[i].imgList[k].value = tempValue --换底数据 --[[local tempHuanDi = nil tempHuanDi = self.handCardRoot[i].imgList[j].isHuanDi self.handCardRoot[i].imgList[j].isHuanDi = self.handCardRoot[i].imgList[k].isHuanDi self.handCardRoot[i].imgList[k].isHuanDi = tempHuanDi--]] --ui交换 self.handCardRoot[i].imgList[k]:setVisible(false) local fileName = ZPFuc.getZPCardImgByValue(self.handCardRoot[i].imgList[j].value,ZPDef.CardType.CARD_TYPE_HAND,self.desktopType) self.handCardRoot[i].imgList[j]:loadTextureFromPlist(fileName) self.handCardRoot[i].imgList[j]:setVisible(true) --听牌标签 local visibleA = self.handCardRoot[i].imgList[j]:getChildren()[1]:isVisible() local visibleB = self.handCardRoot[i].imgList[k]:getChildren()[1]:isVisible() self.handCardRoot[i].imgList[j]:getChildren()[1]:setVisible(visibleB) self.handCardRoot[i].imgList[k]:getChildren()[1]:setVisible(visibleA) --落牌动画 local lieshu = self.ui.Items.ImageView_handTempCard.lieshu local value = self.ui.Items.ImageView_handTempCard.value --if self.handCardRoot[i].imgList[j].value == value and i == lieshu then -- self:goBackWithAni(self.handCardRoot[i].imgList[j]) --else local recordPos = self.handCardRoot[i].imgList[j]:getParent():getPosition() self.handCardRoot[i].imgList[j]:getParent():setPosition(self.handCardRoot[i].imgList[k]:getParent():getPosition()) local act = cc.MoveTo:create(self.gameSpeedConfig.OPCARDTIME,recordPos) --self.handCardRoot[i].imgList[j]:getParent():stopAllActions() self.handCardRoot[i].imgList[j]:getParent():runAction(act) --end bDown = true end end end end end --判断是否有掉落 if not bDown then self.isGodHand = false else local seq = cc.Sequence:create(cc.DelayTime:create(0.25),cc.CallFunc:create(function () self.isGodHand = false end)) self.ui:runAction(seq) end end --隐藏出牌点 function xichongRoomView:setOutCardVisible(bVisible,viewId,card,isSend,onEnd,isNoShowAni) for i = 1 ,ZPDef.GameMaxPlayer do local name = string.format("Layout_outCardPoint_%d",i) self.ui.Items[name]:setVisible(false) end --重置出牌坐标 self:resetOutCardPoint() --显示出牌 if bVisible then self.isMoPaiOperator = false self:changeOutCardLight(false) local name = string.format("Layout_outCardPoint_%d",viewId) local mLayout = self.ui.Items[name] mLayout:setVisible(true) local imgName = string.format("ImageView_outCardImg_%d",viewId) local fileName = ZPFuc.getZPCardImgByValue(card,ZPDef.CardType.CARD_TYPE_OUTCARD,self.desktopType) local mSprite = self.ui.Items[imgName] local srcPos = mSprite:getPosition() self.ui.Items[imgName]:loadTextureFromPlist(fileName) local beginPos local time = self.gameSpeedConfig.CHU_PAI_TIME if viewId == self:getMeViewId() then beginPos = self.ui.Items.ImageView_handTempCard:getPosition() beginPos = mSprite:getParent():convertToNodeSpace(beginPos) else if viewId == 1 then beginPos = cc.p(srcPos.x + 400,srcPos.y) elseif viewId == 2 then beginPos = cc.p(srcPos.x,srcPos.y + 200) elseif viewId == 3 then beginPos = cc.p(srcPos.x - 400,srcPos.y) end end mSprite:setPosition(beginPos) mSprite:setScale(0) if isNoShowAni then mSprite:setScale(1) mSprite:setPosition(srcPos) if onEnd then onEnd() end return end local spawn = cc.Spawn:create(cc.ScaleTo:create(time,1,1),cc.MoveTo:create(time,srcPos)) local seq = cc.Sequence:create(spawn,cc.CallFunc:create(function () if isSend then local request = ZPMessage.OutCard:new() request.nCard = card logE("ZPRoomView:setOutCardVisible"..table.tostring(request)) self.ui:sendMsg(app.room, "sendOutCard", request, function(status, response) logE("ZPRoomView sendOutCard() response = ", table.tostring(response)) end) end if onEnd then onEnd() end end)) mSprite:runAction(seq) end end function xichongRoomView:createOpOutcard(viewId,valueList,nums) local opLayout = string.format("Layout_groupCard_%d",viewId) local position = self.ui.Items[opLayout]:getPosition() local colMax = 0 local colNum = ZPDef.OpOutCardNum[viewId] local curNum = self.opOutCardNum[viewId] local resultNum = curNum + nums local colMax = math.modf(curNum/colNum) if resultNum > (colMax+1)*colNum then curNum = (colMax+1)*colNum colMax = colMax+1 end for k,v in pairs(valueList) do local groupCard = XiChongCard:new(v,viewId) if self.opOutCard[viewId] and table.nums(self.opOutCard[viewId]) > 0 then --local opcardNum = #self.opOutCard[viewId] local orderX = position.x local orderY = position.y local offsetX = ZPDef.OpOutCardOffset[viewId].x local offsetY = ZPDef.OpOutCardOffset[viewId].y local offsetSpace = ZPDef.opOutCardSpace[viewId] if viewId == 1 then if colMax > 0 then orderX = orderX - offsetSpace*colMax end orderY = orderY + (curNum%colNum)*offsetY elseif viewId == 2 then if colMax > 0 then orderY = orderY - offsetY*colMax end orderX = orderX - (curNum%colNum)*offsetX elseif viewId == 3 then if colMax > 0 then orderX = orderX + offsetSpace*colMax end orderY = orderY - (curNum%colNum)*offsetY elseif viewId == 4 then if colMax > 0 then orderY = orderY + offsetY*colMax end orderX = orderX + (curNum%colNum)*offsetX end groupCard:setPosition(cc.p(orderX,orderY)) else self.opOutCard[viewId] = {} groupCard:setPosition(position) end table.insert(self.opOutCard[viewId],groupCard) curNum = curNum + 1 local Zoreder = 100 if viewId == 3 then Zoreder = 99 else Zoreder = viewId * 100 end self.ui.Items.Layout_HandCard:addChild(groupCard,Zoreder) end self.opOutCardNum[viewId] = curNum end function xichongRoomView:cleanOpOutCard(viewId,card) for i = 1,ZPDef.GameMaxPlayer do if self.opOutCard[i] then for k,v in pairs(self.opOutCard[i]) do v:removeFromParent() end self.opOutCard[i] = {} else self.opOutCard[i] = {} end end end -- 大局结算 function xichongRoomView:onGameDaJuResponse(data) local function runGameDaJuResponse(onEnd) local response = data.response.playList -- 打开结算 local view = ZPRoomCountAllView:new(response,data.response.endTime); view:setAnchorPoint(cc.p(0.5, 0.5)); local visibleSize = getVisibleSize() view:setPosition(cc.p(visibleSize.width/2,visibleSize.height/2)) self:addChild(view); self.RoomCountAllViewUI = view; view:setVisible(false); app.room:dispatchEvent({name = GAME_EVENT.DISSMISS_CLOSE}); if app.room.roomInfo.needJieSuanInfo == 1 then log("2000000000-onGameDaJuResponse --------- yichangjiesu ") --结算直接播放动画 view:setVisible(true); view:playAni() self:showGameOverAward() else log("2000000000-onGameDaJuResponse --------- zhengchangjiesu ") --结算直接播放动画 view:setVisible(false) end if onEnd then onEnd() end app.club_php:dispatchEvent({name = GAME_EVENT.CLUB_BACK_ROOM}) end log("2000000000-ZPRoomView - addCallBack(runGameDaJuResponse)") self:addCallBack(runGameDaJuResponse); end --- -- 托管通知 -- @param data -- @return -- function xichongRoomView:onHostingRequest( data ) local response = data.response if response.nUserId == app.user.loginInfo.uid then if response.status == 1 then --托管状态 self.toolView:showTuoGuan(true) elseif response.status == 0 then--取消托管状态 self.toolView:showTuoGuan(false) end end local isTuoGuan = response.status == 1; local viewId = app.room:getViewIdByUserId(response.nUserId) self.PlayerView:showTuoGuanByViewId(viewId,isTuoGuan) end --弃牌 function xichongRoomView:onQiPai(data) xichongRoomView.super.onQiPai(self, data) local function runOnQiPai(onEnd) self:hideOperation() --结束 if onEnd then onEnd() end end log("2000000000-changpaiRoomView - addCallBack(runOnQiPai)") self:addCallBack(runOnQiPai) end function xichongRoomView:hideOperation() self.operationView:hideSelf() end return xichongRoomView