Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

1011 righe
32 KiB

  1. local MJ=MJFramework.MJImport("mj.luaScript.Views.Game.MJ")
  2. local MJDefine=MJFramework.MJImport("mj.luaScript.MJDefine")
  3. local MJGroupFactory=MJFramework.MJImport("mj.luaScript.Views.Game.MJGroupFactory")
  4. local MJPositionCompnent = MJFramework.MJImport("mj.luaScript.Views.Compnent.MJPositionCompnent")
  5. local MJMessage=MJFramework.MJImport("mj.luaScript.Protocol.MJMessage")
  6. local MJHandCardView=MJFramework.MJFrameworkClassImprot("mj.luaScript.Views.Game.MJHandCardView")
  7. local MJSound = MJFramework.MJImport("mj.luaScript.MJSound")
  8. local dazhouHandCardView = class("dazhouHandCardView", MJHandCardView)
  9. function dazhouHandCardView:ctor(viewId,desktopType)
  10. dazhouHandCardView.super.ctor(self,viewId,desktopType)
  11. end
  12. function dazhouHandCardView:onEnter()
  13. dazhouHandCardView.super.onEnter(self)
  14. --绑定事件
  15. self:bindEvent(app.room , MJDefine.MJEvent.checkIsNeedSendGuo , handler(self , self.checkIsNeedSendGuo))
  16. end
  17. function dazhouHandCardView:loadUI()
  18. local ui
  19. if self.desktopType==MJDefine.DesktopType.TwoD or self.desktopType==MJDefine.DesktopType.TwoDGold or self.desktopType==MJDefine.DesktopType.TwoDL then
  20. ui = loadUI("mj_dazhou/res/ui_fangjian/mj_xzdd_hand_card_2d.ui");
  21. else
  22. ui = loadUI("mj_dazhou/res/ui_fangjian/mj_xzdd_hand_card.ui");
  23. end
  24. self.ui = ui;
  25. self:addChild(ui)
  26. end
  27. function dazhouHandCardView:initView()
  28. if self:isUseNew3D() then
  29. self:initNew3DUI()
  30. else
  31. dazhouHandCardView.super.initView(self)
  32. self:hideOperateItem()
  33. if app.room:getMaxPlayerCount()~= 2 then
  34. if self.viewId == MJDefine.PlayerViewType.My then
  35. self.outX=self.outX-30
  36. end
  37. end
  38. local roomInfo = app.room.roomInfo or {}
  39. local strGameInfo = roomInfo.strGameInfo
  40. local gameInfo = json.decode(strGameInfo) or {}
  41. local cardNum = tonumber(gameInfo.handcard or 13)
  42. if MJDefine.HandCardStartPosOfCardNum[cardNum][self.viewId] then
  43. self.initX = MJDefine.HandCardStartPosOfCardNum[cardNum][self.viewId].x
  44. self.initY = MJDefine.HandCardStartPosOfCardNum[cardNum][self.viewId].y
  45. end
  46. end
  47. end
  48. function dazhouHandCardView:pushTing()
  49. if self:isUseNew3D() then
  50. self._handcard:pushTing()
  51. else
  52. local tings=app.room.roomInfo.tings
  53. if tings then
  54. for k,v in pairs(tings) do
  55. for _,mj in pairs(self.handCards) do
  56. if mj.value==v.outCard then
  57. mj:setTing(true)
  58. end
  59. end
  60. end
  61. end
  62. end
  63. end
  64. --摸牌
  65. function dazhouHandCardView:onGetCard(operates,card,isSwap)
  66. if self:isUseNew3D() then
  67. self.touchMJ = nil
  68. self:createHandCards(card)
  69. if not operates or table.nums(operates) == 0 then
  70. self._handcard:setOutCardEnable(true)
  71. MJDefine.outCardSendGuo = false
  72. else
  73. self._handcard:setOutCardEnable(true)
  74. MJDefine.outCardSendGuo = true
  75. -- self:canOutCard(true)
  76. end
  77. if self.viewId==MJDefine.MyViewId then
  78. MJSound.PlayGetCard()
  79. end
  80. else
  81. if self.viewId==MJDefine.MyViewId then
  82. self:resetHandCardsPosAndOpacity()
  83. end
  84. self:createHandCards(card)
  85. self:resetCardsSortValue()--为了给刚摸上的牌重新赋值排序值
  86. if self.viewId==MJDefine.PlayerViewType.Right and not self.isReplay then
  87. self:resetHandCards()
  88. end
  89. if isSwap and isSwap == true then return end --如果是换牌阶段,返回
  90. if not operates or table.nums(operates)==0 then
  91. self:setOutCardEnable(true)
  92. MJDefine.outCardSendGuo = false
  93. else
  94. self:setOutCardEnable(true)
  95. MJDefine.outCardSendGuo = true
  96. -- self:canOutCard(true)
  97. end
  98. if self.viewId==MJDefine.MyViewId then
  99. MJSound.PlayGetCard()
  100. end
  101. end
  102. end
  103. function dazhouHandCardView:setOutCardEnable(b)
  104. if self:isUseNew3D() then
  105. self._handcard:setOutCardEnable(b)
  106. else
  107. self.isOutCard=b
  108. if b then
  109. self:moveLastCard()
  110. end
  111. if self.viewId==MJDefine.MyViewId and self.ui.Items.Button_Sure then
  112. -- self.ui.Items.Button_Sure:setVisible(b)
  113. end
  114. end
  115. end
  116. --不管是否自动对齐,红中始终保持放在最左边
  117. function dazhouHandCardView:sortRedMahjong()
  118. local redNum = 0
  119. for k,mj in pairs(self.handCards) do
  120. if mj.value == 65 then
  121. redNum = redNum + 1
  122. table.remove(self.handCards,k)
  123. table.insert(self.handCards,redNum,mj)
  124. end
  125. end
  126. end
  127. function dazhouHandCardView:removeHandCardByNum(value,num,redNum)
  128. redNum = redNum or 0
  129. if self:isUseNew3D() then
  130. self._handcard:removeHandCardByNum(value, num,redNum)
  131. else
  132. if self.viewId==MJDefine.MyViewId or self.isReplay then
  133. for i=1,num do
  134. local mj
  135. if redNum > 0 and i <= redNum then
  136. mj=self:getMjByValue(65) --红中值
  137. else
  138. mj=self:getMjByValue(value)
  139. end
  140. if mj then
  141. table.removeItem(self.handCards,mj)
  142. mj:removeFromParent()
  143. end
  144. end
  145. else
  146. -- local num=#self.handCards-#arg
  147. -- print(num)
  148. for i=#self.handCards,#self.handCards-num+1,-1 do
  149. if self.handCards[i] then
  150. self.handCards[i]:removeFromParent()
  151. table.remove(self.handCards,i)
  152. end
  153. end
  154. end
  155. end
  156. end
  157. function dazhouHandCardView:getGroup(card,opType)
  158. if self:isUseNew3D() then
  159. return self._handcard:getGroup(card, opTypes)
  160. else
  161. for k,v in pairs(self.handGroupCards) do
  162. if v.opType==opType and (v.mjs[1].value==card or v.mjs[2].value == card or v.mjs[3].value == card) then
  163. local redNum = 0
  164. for i,mj in pairs(v.mjs) do
  165. --先取出原组合的红中个数
  166. if mj.value == 65 then
  167. redNum = redNum + 1
  168. end
  169. end
  170. return v,redNum
  171. end
  172. end
  173. end
  174. end
  175. function dazhouHandCardView:createGroupCards(arg,fromViewId)
  176. if self:isUseNew3D() then
  177. self._handcard:createGroupCards(arg, fromViewId)
  178. else
  179. local x=self.initX
  180. local y=self.initY
  181. local MJGroupStartOffSet = MJDefine.MJGroupStartOffSet[self.desktopType]
  182. for k,v in pairs(arg) do
  183. if not fromViewId then
  184. fromViewId = v.fromViewId
  185. end
  186. local group=MJGroupFactory.CreateGroup(v.values,v.showType,self.viewId,self.desktopType,v.redNum)
  187. if group then
  188. --设置碰杠来源
  189. --group:setDirection(self.viewId,v.fromViewId1)
  190. if group.setAnColor and (v.opType == MJDefine.MJOperateType.OPREATE_PENG
  191. or v.opType == MJDefine.MJOperateType.OPREATE_ZHIGANG
  192. or v.opType == MJDefine.MJOperateType.OPREATE_BAGANG) then
  193. --牌的阴影显示刚好和视图id相反
  194. if v.fromViewId == 1 then v.fromViewId = 3
  195. elseif v.fromViewId==3 then v.fromViewId = 1 end
  196. -- 杠牌对家,换成第四张
  197. if v.opType ~= MJDefine.MJOperateType.OPREATE_PENG then
  198. if v.fromViewId==2 then v.fromViewId = 4 end
  199. end
  200. group:setAnColor(v.opCard, v.fromViewId)
  201. end
  202. if v.opType == MJDefine.MJOperateType.OPREATE_BAGANG and group.mjs and group.mjs[4] then
  203. --group.mjs[4]:setOutBlackImage(0,self.viewId)
  204. end
  205. group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要
  206. group.opType=v.opType
  207. self.ui.Items.Layout_Hand_Card:addChild(group,-4+#self.handGroupCards)
  208. group:setPosition(cc.p(x+MJGroupStartOffSet[self.viewId].x,y+MJGroupStartOffSet[self.viewId].y))
  209. x,y=MJPositionCompnent.getGroupPosition(self.viewId,x,y,group,self.desktopType)
  210. table.insert(self.handGroupCards,group)
  211. end
  212. end
  213. --更新起始位置
  214. self.initX=x
  215. self.initY=y
  216. end
  217. end
  218. --添加杠操作按钮
  219. function dazhouHandCardView:addOperateBtn(operates)
  220. local x=self.ui.Items.Layout_Operate:getContentSize().width
  221. local y=self.ui.Items.Layout_Operate:getContentSize().height/2
  222. local btnOperate=cc.Button:createNode()
  223. btnOperate:setDefaults()
  224. btnOperate:setText("")
  225. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[operates[1].opType])
  226. btnOperate:ignoreAnchorPointForPosition(false)
  227. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  228. btnOperate:setPosition(cc.p(self.btnPosX, y))
  229. self.ui.Items.Layout_Operate:addChild(btnOperate,2)
  230. if operates and table.nums(operates) <=1 then
  231. self.btnPosX = self.btnPosX-50
  232. btnOperate:setPosition(cc.p(self.btnPosX, y))
  233. local gangBg = cc.Layout:create()
  234. gangBg:setBackGroundImageScale9Enabled(true)
  235. gangBg:setBackGroundImage("mj_dazhou/res/zy_fangjian/xzddadd/xzdd_room_gangBg.png",0)
  236. gangBg:setPosition(cc.p(btnOperate:getPositionX()+30, y-40))
  237. gangBg:setSize(cc.size(80,80))
  238. self.ui.Items.Layout_Operate:addChild(gangBg)
  239. gangBg:registerClick(function(sender)
  240. self:sendOp({opType = operates[1].opType,opCard = operates[1].opCard,redNum = operates[1].redNum})
  241. end)
  242. local mj=MJ:new(operates[1].opCard,MJDefine.MJType.Stand,MJDefine.MyViewId,self.desktopType)
  243. mj:setScale(0.5)
  244. mj:setAnchorPoint(cc.p(0.5,0.5))
  245. gangBg:addChild(mj)
  246. mj:setPosition(cc.p(gangBg:getContentSize().width/2+10, gangBg:getContentSize().height/2))
  247. end
  248. btnOperate:registerClick(function()
  249. -- playBtnEffect()
  250. if operates and table.nums(operates) <=1 then
  251. self:sendOp({opType = operates[1].opType,opCard = operates[1].opCard,redNum = operates[1].redNum})
  252. else
  253. self:showGangItem(operates)
  254. end
  255. end)
  256. end
  257. function dazhouHandCardView:showGangItem(operates)
  258. self.ui.Items.Layout_OperateItem:setVisible(true)
  259. self.ui.Items.Layout_Operate_Content:removeAllChildren()
  260. local col = 0
  261. local count = 6
  262. for k,v in pairs(operates) do
  263. local item = self.ui.Items.Layout_MJ_Item:getCopied()
  264. local mj=MJ:new(v.opCard,MJDefine.MJType.Stand,self.viewId,self.desktopType)
  265. item:addChild(mj)
  266. local size = item:getContentSize()
  267. mj:setPosition(cc.p(size.width/2,size.height/2))
  268. self.ui.Items.Layout_Operate_Content:addChild(item)
  269. mj:registerClick(function()
  270. self:sendOp({opType = v.opType,opCard = v.opCard,redNum = v.redNum})
  271. end)
  272. -- local col = k
  273. local row = math.ceil(k/count)
  274. -- logD(k.." :".. (k%count))
  275. -- local isChangeRow = k%count==0
  276. local x = self.ui.Items.Layout_Operate_Content:getContentSize().width-col*133
  277. local y = (row-1)*size.height
  278. item:setPositionX(x)
  279. item:setPositionY(y)
  280. col = col+1
  281. if k%count==0 then
  282. col = 0
  283. end
  284. end
  285. -- local count = table.nums(operates)
  286. -- local padding=10
  287. -- local width=self.ui.Items.Layout_OperateItem:getContentSize().width
  288. -- local height=self.ui.Items.Layout_OperateItem:getContentSize().height
  289. -- local layoutItem = cc.Layout:create()
  290. -- layoutItem:setBackGroundImageScale9Enabled(true)
  291. -- --layoutItem:setBackGroundImage("mj/res/ui/zy_fangjian/mj_gang_bg.png")
  292. -- layoutItem:setAnchorPoint(cc.p(0.5,1))
  293. -- self.ui.Items.Layout_OperateItem:addChild(layoutItem)
  294. -- if count <= 3 then
  295. -- layoutItem:setSize(cc.size(230*count+padding*count,height+padding))
  296. -- else
  297. -- layoutItem:setSize(cc.size(230*3+padding*3,height*(math.floor(count/3)+1)+(math.floor(count/3)+1)*padding))
  298. -- --self.ui.Items.Layout_OperateItem:setSize(cc.size(230*3+padding*3,height*(math.floor(count/3)+1)+(math.floor(count/3)+1)*padding))
  299. -- end
  300. -- layoutItem:setPosition(cc.p(width/2,height))
  301. -- local layoutHeight = layoutItem:getContentSize().height
  302. -- local y = 0
  303. -- for k,v in ipairs(operates) do
  304. -- local layout=cc.Layout:create()
  305. -- layout:setBackGroundImageScale9Enabled(true)
  306. -- layout:setBackGroundImage("mj/res/ui/zy_fangjian/mj_gang_bg.png")
  307. -- self.ui.Items.Layout_OperateItem:addChild(layout)
  308. -- layout:setSize(cc.size(230,height))
  309. -- layout:setAnchorPoint(cc.p(0,1))
  310. -- if k%3 == 1 then
  311. -- y = layoutHeight -15- height*(math.floor(k/3)+1)-10*(math.floor(k/3)+1)
  312. -- end
  313. -- if count < 3 then
  314. -- layout:setPosition(cc.p(-145+padding*(k-1)+230*(k-1),layoutHeight-15))
  315. -- elseif count == 3 then
  316. -- layout:setPosition(cc.p(-260+padding*(k-1)+230*(k-1),layoutHeight-15))
  317. -- else
  318. -- layout:setPosition(cc.p(-260+padding*(k%3-1)+230*(k%3-1),y))
  319. -- if k%3 == 0 then
  320. -- layout:setPosition(cc.p(-260+padding*2+230*2,y))
  321. -- end
  322. -- end
  323. -- for i=1,4 do
  324. -- local mj
  325. -- if v.redNum > 0 and i<=v.redNum then
  326. -- mj=MJ:new(65,MJDefine.MJType.Stand,self.viewId,self.desktopType)
  327. -- else
  328. -- mj=MJ:new(v.opCard,MJDefine.MJType.Stand,self.viewId,self.desktopType)
  329. -- end
  330. -- mj:setScale(0.6)
  331. -- layout:addChild(mj)
  332. -- local mjWidth = mj:getContentSize().width*0.6
  333. -- mj:setAnchorPoint(cc.p(0.5,0.5))
  334. -- mj:setPosition(32+3*(i-1)+mjWidth*(i-1),layout:getContentSize().height/2)
  335. -- end
  336. -- layout:registerClick(function ( sender )
  337. -- self:sendOp({opType = v.opType,opCard = v.opCard,redNum = v.redNum})
  338. -- end)
  339. -- end
  340. end
  341. function dazhouHandCardView:hideOperateItem()
  342. if self.ui.Items.Layout_OperateItem then
  343. self.ui.Items.Layout_Operate_Content:removeAllChildren()
  344. self.ui.Items.Layout_OperateItem:setVisible(false)
  345. end
  346. end
  347. --显示操作
  348. function dazhouHandCardView:showOperate(operates,card,isMyGetCard)
  349. if not operates or table.nums(operates)==0 then return end
  350. print(table.tostring(operates))
  351. local card = card or 0
  352. self:hideOperateItem()
  353. self:hideOperate()
  354. if operates and table.nums(operates) > 0 then
  355. self.ui.Items.Button_Sure:setVisible(false)
  356. end
  357. self.operates = operates
  358. local newOperates = {}
  359. --有操作默认添加过的操作
  360. local operate=MJMessage.OperateRequest:new()
  361. operate.opType=MJDefine.MJOperateType.OPREATE_CANCEL
  362. operate.opCard=card
  363. operate.redNum = 0
  364. --table.insert(operates.Datas,1,operate)
  365. table.insert(newOperates,1,operate)
  366. self.ui.Items.Layout_Operate:removeAllChildren()
  367. self.ui.Items.Layout_Operate:setVisible(true)
  368. local x=self.ui.Items.Layout_Operate:getContentSize().width
  369. local y=self.ui.Items.Layout_Operate:getContentSize().height/2
  370. self.btnPosX = x
  371. local gangCards ={} --所有杠組合
  372. local onceGang = false
  373. local isCanHu = false
  374. --operates.Datas包含所有碰杠组合,服务器不管是否贴鬼碰/杠,需客户端自己分离贴鬼碰和无贴鬼碰
  375. for k,v in pairs(operates.Datas) do
  376. if v.opType ~= MJDefine.MJOperateType.OPREATE_CANCEL then
  377. if MJDefine.isTieGui == true then --选择贴鬼碰/杠
  378. if (v.opType == MJDefine.MJOperateType.OPREATE_DIANPAOHU) or (v.opType == MJDefine.MJOperateType.OPREATE_ZIMOHU) or onceGang == false then
  379. if (v.opType == MJDefine.MJOperateType.OPREATE_DIANPAOHU) or (v.opType == MJDefine.MJOperateType.OPREATE_ZIMOHU) then
  380. isCanHu = true
  381. end
  382. table.insert(newOperates,v)
  383. end
  384. if (v.opType==MJDefine.MJOperateType.OPREATE_ZHIGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_BAGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_ANGANG) then
  385. onceGang = true
  386. table.insert(gangCards,v)
  387. end
  388. else
  389. if (v.opType == MJDefine.MJOperateType.OPREATE_DIANPAOHU) or (v.opType == MJDefine.MJOperateType.OPREATE_ZIMOHU) then
  390. isCanHu = true
  391. table.insert(newOperates,v)
  392. end
  393. --不勾选贴鬼碰/杠时,过滤掉带红中的碰杠
  394. if v.redNum == 0 and v.opType ~= MJDefine.MJOperateType.OPREATE_DIANPAOHU and (v.opType ~= MJDefine.MJOperateType.OPREATE_ZIMOHU) then
  395. if onceGang == false then
  396. table.insert(newOperates,v)
  397. end
  398. if (v.opType==MJDefine.MJOperateType.OPREATE_ZHIGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_BAGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_ANGANG) then
  399. onceGang = true
  400. table.insert(gangCards,v)
  401. end
  402. end
  403. end
  404. end
  405. end
  406. print(table.tostring(newOperates))
  407. if table.nums(newOperates) >= 2 then
  408. local function sortOperate(opA,opB)
  409. if opA.opType<opB.opType then
  410. return true
  411. elseif opA.opType==opB.opType then
  412. if opA.opCard<opB.opCard then
  413. return true
  414. end
  415. end
  416. return false
  417. end
  418. table.sort(newOperates,sortOperate)
  419. --没有碰杠操作,此条件只有不勾选贴鬼碰/杠才可能会执行
  420. else
  421. --如果不是自己摸牌的情况下
  422. if not isMyGetCard then --app.room.roomInfo.outCardUserId~=app.room:getMyUserId() then --
  423. print("not isMyGetCard")
  424. self:sendOp({opType = MJDefine.MJOperateType.OPREATE_CANCEL,opCard=card,redNum=0})
  425. MJDefine.isSendGuo = true
  426. return;
  427. end
  428. --是自己摸牌
  429. self:hideOperate()
  430. self:setOutCardEnable(true)
  431. logD("dazhouHandCardView:showOperate setOutCardEnable true")
  432. end
  433. local pengCard = {}
  434. for k,v in pairs(newOperates) do
  435. if MJDefine.MJOperateImage[v.opType] then
  436. if(v.opType==MJDefine.MJOperateType.OPREATE_ZHIGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_BAGANG) or (v.opType==MJDefine.MJOperateType.OPREATE_ANGANG) then
  437. self:addOperateBtn(gangCards)
  438. elseif v.opType==MJDefine.MJOperateType.OPREATE_PENG then
  439. table.insert(pengCard,v)
  440. self:addOperateBtn(pengCard)
  441. elseif (v.opType~=MJDefine.MJOperateType.OPREATE_ZHIGANG) or (v.opType~=MJDefine.MJOperateType.OPREATE_BAGANG) or (v.opType~=MJDefine.MJOperateType.OPREATE_ANGANG) or (v.opType~=MJDefine.MJOperateType.OPREATE_PENG) then
  442. local btnOperate=cc.Button:createNode()
  443. btnOperate:setDefaults()
  444. btnOperate:setText("")
  445. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[v.opType])
  446. btnOperate:ignoreAnchorPointForPosition(false)
  447. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  448. btnOperate:setPosition(cc.p(self.btnPosX, y))
  449. self.ui.Items.Layout_Operate:addChild(btnOperate)
  450. if isCanHu and isCanHu == true and v.opType == MJDefine.MJOperateType.OPREATE_CANCEL then
  451. local function qiHuConfirm()
  452. local content = string.format("确定放弃胡牌吗?")
  453. local okCallBack = function ()
  454. self:sendOp(v)
  455. end
  456. local cancelCallBack = function ()
  457. end
  458. showConfirmDialog(content,okCallBack,cancelCallBack)
  459. end
  460. btnOperate:registerClick(qiHuConfirm)
  461. else
  462. btnOperate:registerClick(function()
  463. -- playBtnEffect()
  464. self:sendOp(v)
  465. end)
  466. end
  467. end
  468. end
  469. end
  470. end
  471. function dazhouHandCardView:sendOp(value)
  472. local request = MJMessage.OperateRequest:new()
  473. request.opType = value.opType
  474. request.opCard = value.opCard
  475. self.operates = self.operates or {}
  476. local opNum = 2--table.nums(self.operates)
  477. --[[if opNum and opNum > 0 then
  478. for _,v in ipairs(self.operates.Datas or {}) do
  479. table.insert(request.operates.Datas, v)
  480. end
  481. end--]]
  482. --request.opNum = opNum
  483. --request.operates = self.operates
  484. logE("dazhouHandCardView:sendOp"..table.tostring(request))
  485. --[[self.ui:sendMsg(app.room, MJDefine.MJEvent.Operate, request, function(status, response)
  486. logE("MJHandCardView showOperate() response = ", table.tostring(response))
  487. end)--]]
  488. app.room:sendOperateCard(value,self.operates)
  489. self:hideOperateItem()
  490. self:hideOperate()
  491. self.operates = nil
  492. if value.opType == MJDefine.MJOperateType.OPREATE_CANCEL then
  493. app.room:dispatchEvent({name = MJDefine.MJEvent.SendGuo})
  494. end
  495. --self:setTing(false)
  496. --app.room:resetTings()
  497. end
  498. --检测是否需要先发过(有操作出牌的情况下要先发过)
  499. function dazhouHandCardView:checkIsNeedSendGuo()
  500. if self.ui.Items.Layout_Operate and self.ui.Items.Layout_Operate:isVisible() and self.viewId == MJDefine.MyViewId and not self.isNotSendIng then
  501. self.isNotSendIng = true
  502. self:sendOp({opType = MJDefine.MJOperateType.OPREATE_CANCEL,opCard=card,redNum=0})
  503. self.ui:runAction(cc.Sequence:create(cc.DelayTime:create(1.0),cc.CallFunc:create(function()
  504. self.isNotSendIng = false
  505. end)))
  506. end
  507. end
  508. --发送出牌消息
  509. function dazhouHandCardView:sendOutCard()
  510. if not self.isOutCard or not self.touchMJ then return end
  511. if not self.touchMJ.value or self.touchMJ.value == 0 then return end
  512. self:checkIsNeedSendGuo()
  513. self:hideOperate()
  514. -- if MJDefine.outCardSendGuo == true then
  515. -- self:sendOp({opType = MJDefine.MJOperateType.OPREATE_CANCEL,opCard=0,redNum=0})
  516. -- -- self:runDelay(0.1,function()
  517. -- dazhouHandCardView.super.sendOutCard(self)
  518. -- -- end)
  519. -- else
  520. dazhouHandCardView.super.sendOutCard(self)
  521. -- end
  522. app.room.roomInfo.lastOutViewId = MJDefine.MyViewId
  523. self:checkQueAndDisableOtherCard()
  524. -- local request = MJMessage.Card:new()
  525. -- request.card = self.touchMJ.value
  526. -- -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  527. -- self.ui:sendMsg(app.room, MJDefine.MJEvent.OutCard, request, function(status, response)
  528. -- logE("MJHandCardView sendOutCard() response = ", table.tostring(response))
  529. -- end)
  530. -- --音效
  531. -- local userInfo=app.room:getUserInfoByViewId(self.viewId)
  532. -- if userInfo then
  533. -- MJSound.PlayMJSound(userInfo.sex,request.card)
  534. -- end
  535. -- app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg,value=self.touchMJ.value,viewId=self.viewId})
  536. -- self:setOutCardEnable(false)
  537. -- app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  538. -- app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  539. -- self:setTing(false)
  540. -- app.room:resetTings()
  541. -- self.touchMJ=nil
  542. end
  543. --恢复麻将位置和透明度
  544. function dazhouHandCardView:resetHandCardsPosAndOpacity()
  545. local initX,initY=self:getInitHandCardPostion()
  546. local x=initX
  547. local y=initY
  548. local insertX=0
  549. local insertY=0
  550. if MJDefine.isAutomatic == true then
  551. self:sortHandCards()
  552. else
  553. end
  554. for k,mj in pairs(self.handCards) do
  555. mj:setPosition(x,y)
  556. mj:setOpacity(255)
  557. x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,k,self.desktopType)
  558. end
  559. return insertX,insertY
  560. end
  561. function dazhouHandCardView:resetHandCards(insertMj,isAnimation)
  562. if self:isUseNew3D() then
  563. self._handcard:resetHandCards(insertMj,isAnimation)
  564. else
  565. -- local initX=self.initX
  566. -- local initY=self.initY
  567. local initX,initY=self:getInitHandCardPostion()
  568. local x=initX
  569. local y=initY
  570. local insertX=0
  571. local insertY=0
  572. if MJDefine.isAutomatic == true then
  573. self:sortHandCards()
  574. else
  575. -- self:sortRedMahjong()
  576. end
  577. for k,mj in pairs(self.handCards) do
  578. if mj.status ~= MJDefine.MJStatus.Disable then
  579. mj:setStatus(MJDefine.MJStatus.Normal)
  580. mj:stopAllActions()
  581. end
  582. logD("k:"..k.." value:"..mj.value)
  583. if insertMj==mj then --记录插入麻将的坐标 动画需要
  584. insertX=x
  585. insertY=y
  586. else
  587. if isAnimation then
  588. mj:runAction(cc.MoveTo:create(0.1,cc.p(x,y)))
  589. else
  590. mj:setPosition(x,y)
  591. end
  592. end
  593. x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,k,self.desktopType)
  594. end
  595. return insertX,insertY
  596. end
  597. end
  598. function dazhouHandCardView:moveRestHandCards(insertMj,isAnimation)
  599. local initX,initY=self:getInitHandCardPostion()
  600. local x=initX
  601. local y=initY
  602. local insertX=0
  603. local insertY=0
  604. for k,mj in pairs(self.handCards) do
  605. --如果可以出牌 最后的麻将不重置位置
  606. -- local isLastCard = self.isOutCard and k==#self.handCards
  607. -- if isLastCard then
  608. -- break
  609. -- end
  610. if mj.status ~= MJDefine.MJStatus.Disable then
  611. mj:setStatus(MJDefine.MJStatus.Normal)
  612. mj:stopAllActions()
  613. end
  614. logD("k:"..k.." value:"..mj.value)
  615. if insertMj==mj then --记录插入麻将的坐标 动画需要
  616. insertX=x
  617. insertY=y
  618. else
  619. if isAnimation then
  620. mj:runAction(cc.MoveTo:create(0.1,cc.p(x,y)))
  621. else
  622. mj:setPosition(x,y)
  623. end
  624. end
  625. x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,k,self.desktopType)
  626. end
  627. return insertX,insertY
  628. end
  629. --[[function dazhouHandCardView:onTouchEnd(touch)
  630. if MJDefine.isAutomatic == false then
  631. local touchPos=self:convertToNodeSpace(touch:getLocation())
  632. local newHandCards = {}
  633. for k,mj in pairs(self.handCards) do
  634. table.insert(newHandCards,k,mj)
  635. local width = mj:getContentSize().width
  636. local height = mj:getContentSize().height
  637. local x = mj:getPosition().x-width/2
  638. local y = mj:getPosition().y-height/2
  639. local rect = cc.Rectangle:new(x,y,width,height)
  640. if rect:contains(touchPos.x,touchPos.y) then
  641. if self.handCards[k] then
  642. table.remove(newHandCards,k)
  643. end
  644. if self.touchMJ and not tolua.isnull(self.touchMJ) then
  645. table.insert(newHandCards,k,self.touchMJ)
  646. end
  647. end
  648. end
  649. self.handCards = nil
  650. self.handCards = DeepCopy(newHandCards)
  651. end
  652. self:touchOutCard()
  653. end
  654. --]]
  655. function dazhouHandCardView:buGang(card,newRedNum)
  656. newRedNum = newRedNum or 0
  657. if self:isUseNew3D() then
  658. self._handcard:buGang(card, newRedNum)
  659. else
  660. local oldGroup,oldRedNum=self:getGroup(card,MJDefine.MJOperateType.OPREATE_PENG)
  661. if not oldGroup then return end
  662. local fromViewId = oldGroup.fromViewId
  663. -- 杠牌对家,换成第四张
  664. if app.room:getMaxPlayerCount()==2 and fromViewId~=0 then
  665. fromViewId = 4
  666. end
  667. if app.room:getMaxPlayerCount()==4 and fromViewId == 2 then
  668. fromViewId = 4
  669. end
  670. local redNum = newRedNum + oldRedNum
  671. local newGroup=MJGroupFactory.CreateGroup({card,card,card,card},MJDefine.MJGroupType.Gang,self.viewId,self.desktopType,redNum)
  672. if newGroup.setAnColor then
  673. newGroup:setAnColor(card, fromViewId)
  674. end
  675. newGroup.fromViewId = fromViewId
  676. newGroup.opType=MJDefine.MJOperateType.OPREATE_BAGANG
  677. newGroup:setPosition(oldGroup:getPosition())
  678. if newGroup.mjs and newGroup.mjs[4] then
  679. newGroup.mjs[4]:setOutBlackImage(0,self.viewId)
  680. end
  681. self.ui.Items.Layout_Hand_Card:addChild(newGroup)
  682. local index=table.indexOf(self.handGroupCards,oldGroup)
  683. table.remove(self.handGroupCards,index)
  684. table.insert(self.handGroupCards,index,newGroup)
  685. oldGroup:removeFromParent()
  686. end
  687. end
  688. function dazhouHandCardView:retoreBuGang(card,newRedNum)
  689. newRedNum = newRedNum or 0
  690. if self:isUseNew3D() then
  691. self._handcard:restoreBuGang(card, cardNum)
  692. else
  693. local oldGroup,oldRedNum=self:getGroup(card,MJDefine.MJOperateType.OPREATE_BAGANG)
  694. if not oldGroup then return end
  695. local fromViewId = oldGroup.fromViewId
  696. -- 杠牌对家,换成第四张
  697. if app.room:getMaxPlayerCount()==2 and fromViewId~=0 then
  698. fromViewId = 4
  699. end
  700. if app.room:getMaxPlayerCount()==4 and fromViewId == 2 then
  701. fromViewId = 4
  702. end
  703. --local redNum = newRedNum + oldRedNum
  704. local redNum = oldRedNum
  705. local newGroup=MJGroupFactory.CreateGroup({card,card,card},MJDefine.MJGroupType.Peng,self.viewId,self.desktopType,redNum)
  706. if newGroup.setAnColor then
  707. newGroup:setAnColor(card, fromViewId)
  708. end
  709. newGroup.fromViewId = fromViewId
  710. newGroup.opType=MJDefine.MJOperateType.OPREATE_PENG
  711. newGroup:setPosition(oldGroup:getPosition())
  712. self.ui.Items.Layout_Hand_Card:addChild(newGroup)
  713. local index=table.indexOf(self.handGroupCards,oldGroup)
  714. table.remove(self.handGroupCards,index)
  715. table.insert(self.handGroupCards,index,newGroup)
  716. oldGroup:removeFromParent()
  717. end
  718. end
  719. function dazhouHandCardView:lockHandCard(isForbidTouch)
  720. if self:isUseNew3D() then
  721. self._handcard:lockHandCard(isForbidTouch)
  722. else
  723. for k,v in pairs(self.handCards) do
  724. v:setStatus(MJDefine.MJStatus.Disable)
  725. end
  726. self:getEventDispatcher():removeEventListenersForTarget(self)
  727. end
  728. end
  729. function dazhouHandCardView:moveLastOpenCard()
  730. local count=#self.handCards
  731. if count>=2 then
  732. local frontMj=self.handCards[count-1]
  733. local lastMj=self.handCards[count]
  734. local margin=0
  735. local frontX=frontMj:getPositionX()
  736. local frontY=frontMj:getPositionY()
  737. local lastX=lastMj:getPositionX()
  738. local lastY=lastMj:getPositionY()
  739. local MJLastHandCardOffset=MJDefine.MJLastHandCardOffset[self.desktopType]
  740. local MJ_HAND_CARD_LEFT_PADDING_HEIGHT = MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT[self.desktopType]
  741. --根据视图ID 计算坐标
  742. if self.viewId==MJDefine.PlayerViewType.My then
  743. margin=lastMj:getContentSize().width
  744. -- if math.abs(lastX-frontX)==margin then
  745. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  746. -- end
  747. elseif self.viewId==MJDefine.PlayerViewType.Left then
  748. margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT
  749. -- if math.abs(lastY-frontY)==margin then
  750. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  751. lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y)
  752. -- end
  753. elseif self.viewId==MJDefine.PlayerViewType.Right then
  754. margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT
  755. -- if math.abs(lastY-frontY)==margin then
  756. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  757. lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y)
  758. -- end
  759. elseif self.viewId==MJDefine.PlayerViewType.Top then
  760. margin=lastMj:getContentSize().width-MJDefine.MJ_HAND_CARD_TOP_OFFSET_X
  761. -- print("width:"..lastMj:getContentSize().width)
  762. -- if math.abs(lastX-frontX)==margin then
  763. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  764. -- end
  765. end
  766. end
  767. end
  768. function dazhouHandCardView:onTouchMove(touch)
  769. dazhouHandCardView.super.onTouchMove(self,touch)
  770. if self.touchMJ and self.isTouchMove==true then
  771. local pos = self.touchMJ:getPosition()
  772. local index = nil
  773. for k,v in pairs(self.handCards) do
  774. local width = v:getContentSize().width
  775. local height = v:getContentSize().height
  776. local x = v:getPosition().x-width/2
  777. local y = v:getPosition().y-height/2
  778. local rect = cc.Rectangle:new(x,y,width*0.8,height*0.8)
  779. --如果可以出牌 最后的麻将不参与移动操作
  780. -- local isLastCard = self.isOutCard and k==#self.handCards
  781. if rect:contains(pos.x,pos.y) and v ~=self.touchMJ and not isLastCard then
  782. index = k
  783. break
  784. end
  785. end
  786. if index then
  787. local touchMJIndex = table.indexOf(self.handCards,self.touchMJ)
  788. local offsetIndex = touchMJIndex-index
  789. local num = math.abs(offsetIndex)-1
  790. --大于0则往左移动 3-1:3-2 2-1 小于0右 5-8:5-6 6-7 7-8
  791. local reduce = offsetIndex>0 and -1 or 1
  792. for i = touchMJIndex,index-reduce,reduce do
  793. self.handCards[i],self.handCards[i+reduce] = self.handCards[i+reduce],self.handCards[i]
  794. end
  795. local x,y = self:moveRestHandCards(self.touchMJ)
  796. self.touchMJ:recordPostion(cc.p(x,y))
  797. end
  798. end
  799. end
  800. function dazhouHandCardView:touchOutCard()
  801. if self.touchMJ and self.isTouchMove then
  802. if self.touchMJ:getPositionY()>MJDefine.MJ_TOUCH_OUT_CARD_Y and self.isOutCard then
  803. self:sendOutCard()
  804. else
  805. self.touchMJ:restorePostion()
  806. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  807. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  808. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  809. if self.isOutCard then
  810. self:moveLastCard()
  811. end
  812. end
  813. end
  814. self.isTouchMove=false
  815. end
  816. function dazhouHandCardView:outCardFalg(event)
  817. if event.viewId == MJDefine.MyViewId then
  818. self:hideOperateItem()
  819. self:hideOperate()
  820. end
  821. if self:isUseNew3D() then
  822. self._outCardView:outCardFalg(event)
  823. else
  824. for k,v in pairs(self.outCards) do
  825. for i,child in pairs(v:getChildren()) do
  826. local tag = child:getTag()
  827. if tag ~= MJ.MJ_HAND_CARD_FLAG_LAIZI then
  828. child:removeFromParent()
  829. end
  830. end
  831. end
  832. local mj=self.outCards[#self.outCards]
  833. if event.value and mj and mj.value==event.value and event.viewId==self.viewId then
  834. local flag = cc.Sprite:create()
  835. flag:setTexture("mj_dazhou/res/zy_fangjian/xzdd_pointer.png");
  836. -- flag:setScale(0.8)
  837. mj:addChild(flag)
  838. flag:setPosition(mj:getContentSize().width/2,mj:getContentSize().height)
  839. local moveBy=cc.MoveBy:create(0.5,cc.p(0, 30))
  840. flag:runAction(cc.RepeatForever:create(cc.Sequence:create(moveBy,moveBy:reverse())))
  841. end
  842. end
  843. end
  844. function dazhouHandCardView:getHandCardNodes()
  845. if self:isUseNew3D() then
  846. return self._handcard:getHandCardNodes()
  847. else
  848. return self.handCards
  849. end
  850. end
  851. function dazhouHandCardView:isUseNew3D()
  852. --return true
  853. if self.desktopType == MJDefine.DesktopType.TwoDL then
  854. return false
  855. else
  856. return true
  857. end
  858. end
  859. --[[function dazhouHandCardView:sortHandCards()
  860. if self:isUseNew3D() then
  861. self._handcard:sortHandCards()
  862. else
  863. dazhouHandCardView.super.sortHandCards(self)
  864. end
  865. end--]]
  866. --创建换三张的牌
  867. function dazhouHandCardView:createSwapCards(cards, idx)
  868. local group = nil
  869. if self:isUseNew3D() then
  870. local data = {
  871. huCard = cards,
  872. huType = -1,
  873. }
  874. group = self._huCardView:createCard(data, idx)
  875. else
  876. group = MJ:new(cards, MJDefine.MJType.Out, self.viewId, self.desktopType) -- 这个没调位置,判断认为现在的麻将都会走userNew3d
  877. end
  878. return group
  879. end
  880. --设置定缺类型 0万,1同,2条
  881. function dazhouHandCardView:setQueType(que)
  882. if self:isUseNew3D() then
  883. self._handcard:setQueType(que)
  884. else
  885. self.queType = que
  886. --设置完定缺牌后,重新设置一下麻将的排序值,目标为了把定缺牌放到右边
  887. self:resetCardsSortValue()
  888. end
  889. end
  890. function dazhouHandCardView:resetCardsSortValue()
  891. for k,v in pairs(self.handCards) do
  892. if v:getMJColorType() == self.queType then
  893. v.sortValue = v.value + 100
  894. end
  895. end
  896. end
  897. return dazhouHandCardView