Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

573 linhas
17 KiB

  1. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  2. local MJMessage = MJFramework.MJImport("mj.luaScript.Protocol.MJMessage")
  3. local MJSound = MJFramework.MJImport("mj.luaScript.MJSound")
  4. local MJHandCardView = MJFramework.MJFrameworkClassImprot("mj.luaScript.Views.Game.MJHandCardView")
  5. local yibinmajiangHandCardView = class("yibinmajiangHandCardView", MJHandCardView)
  6. local Operate_Offset_Y = -12 -- 操作面板的偏移值
  7. function yibinmajiangHandCardView:ctor(viewId,desktopType)
  8. yibinmajiangHandCardView.super.ctor(self,viewId,desktopType)
  9. end
  10. function yibinmajiangHandCardView:loadUI()
  11. local ui = nil
  12. if self.desktopType == MJDefine.DesktopType.TwoD or self.desktopType == MJDefine.DesktopType.TwoDGold then
  13. ui = loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_hand_card_2d.ui")
  14. else
  15. ui = loadUI("mj_yibinmajiang/res/ui_fangjian/mj_yibinmajiang_hand_card.ui")
  16. end
  17. self.ui = ui
  18. self:addChild(ui)
  19. end
  20. -- 听箭头
  21. function yibinmajiangHandCardView:pushTing()
  22. self._handcard:pushTing()
  23. end
  24. --摸牌
  25. function yibinmajiangHandCardView:onGetCard(operates,card)
  26. self.touchMJ = nil
  27. self:createHandCards(card)
  28. if not operates or table.nums(operates) == 0 then
  29. self._handcard:setOutCardEnable(true)
  30. MJDefine.outCardSendGuo = false
  31. else
  32. self._handcard:setOutCardEnable(true)
  33. MJDefine.outCardSendGuo = true
  34. -- self:canOutCard(true)
  35. end
  36. if self.viewId==MJDefine.MyViewId then
  37. MJSound.PlayGetCard()
  38. end
  39. end
  40. -- 显示胡的牌
  41. function yibinmajiangHandCardView:onGetHuCard (huCard, isClean)
  42. self._huCardView:getHuCards(huCard, isClean)
  43. end
  44. -- 设置出牌
  45. function yibinmajiangHandCardView:setOutCardEnable(b)
  46. self._handcard:setOutCardEnable(b)
  47. end
  48. -- 移除手牌的某张牌
  49. function yibinmajiangHandCardView:removeHandCard(arg)
  50. self._handcard:removeHandCard(arg)
  51. end
  52. -- 移除手牌(根据数量)
  53. function yibinmajiangHandCardView:removeHandCardByNum(value,num)
  54. self._handcard:removeHandCardByNum(value, num)
  55. end
  56. -- 根据牌和类型获取操作牌组
  57. function yibinmajiangHandCardView:getGroup(card,opTypes)
  58. return self._handcard:getGroup(card, opTypes)
  59. end
  60. -- 创建牌组
  61. function yibinmajiangHandCardView:createGroupCards(arg,fromViewId)
  62. self._handcard:createGroupCards(arg, fromViewId)
  63. end
  64. -- 添加飞操作(这里待处理当有多个听用牌的时候,是否让用户选择不同的听用牌做飞操作)
  65. function yibinmajiangHandCardView:addOperateBtn_Fei(operateData)
  66. local x = self.ui.Items.Layout_Operate:getContentSize().width
  67. local y = self.ui.Items.Layout_Operate:getContentSize().height/2 + Operate_Offset_Y
  68. local btnOperate=cc.Button:createNode()
  69. btnOperate:setDefaults()
  70. btnOperate:setText("")
  71. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[operateData.opType])
  72. btnOperate:ignoreAnchorPointForPosition(false)
  73. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  74. btnOperate:setPosition(cc.p(self.btnPosX, y))
  75. self.ui.Items.Layout_Operate:addChild(btnOperate,2)
  76. btnOperate:registerClick(function()
  77. -- playBtnEffect()
  78. -- if operateData.useRedNum and operateData.useRedNum < 2 then
  79. -- self:sendOp(operateData)
  80. -- else
  81. -- self:showTingItem(operateData)
  82. -- end
  83. self:sendOp(operateData)
  84. end)
  85. end
  86. -- 添加杠操作
  87. function yibinmajiangHandCardView:addOperateBtn_Gang(operateData)
  88. local x = self.ui.Items.Layout_Operate:getContentSize().width
  89. local y = self.ui.Items.Layout_Operate:getContentSize().height/2 + Operate_Offset_Y
  90. local btnOperate=cc.Button:createNode()
  91. btnOperate:setDefaults()
  92. btnOperate:setText("")
  93. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[operateData[1].Datas.opType])
  94. btnOperate:ignoreAnchorPointForPosition(false)
  95. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  96. btnOperate:setPosition(cc.p(self.btnPosX, y))
  97. self.ui.Items.Layout_Operate:addChild(btnOperate,2)
  98. btnOperate:registerClick(function()
  99. -- playBtnEffect()
  100. if operateData and table.nums(operateData) <=1 then
  101. self:sendOp(operateData[1])
  102. else
  103. self:showMoreItem(operateData)
  104. end
  105. end)
  106. end
  107. -- 添加提操作
  108. function yibinmajiangHandCardView:addOperateBtn_Ti(operateData)
  109. local x = self.ui.Items.Layout_Operate:getContentSize().width
  110. local y = self.ui.Items.Layout_Operate:getContentSize().height/2 + Operate_Offset_Y
  111. local btnOperate=cc.Button:createNode()
  112. btnOperate:setDefaults()
  113. btnOperate:setText("")
  114. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[operateData[1].Datas.opType])
  115. btnOperate:ignoreAnchorPointForPosition(false)
  116. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  117. btnOperate:setPosition(cc.p(self.btnPosX, y))
  118. self.ui.Items.Layout_Operate:addChild(btnOperate,2)
  119. btnOperate:registerClick(function()
  120. -- playBtnEffect()
  121. if operateData and table.nums(operateData) <=1 then
  122. self:sendOp(operateData[1])
  123. else
  124. self:showMoreItem(operateData)
  125. end
  126. end)
  127. end
  128. -- 显示多种听牌 jxtd
  129. function yibinmajiangHandCardView:showTingItem(operateData)
  130. end
  131. -- 显示多种牌(处理如果手上有多种牌选择的时候供玩家选择)
  132. function yibinmajiangHandCardView:showMoreItem(operateData)
  133. self.ui.Items.Layout_OperateItem:setVisible(true)
  134. self.ui.Items.Layout_Operate_Content:removeAllChildren()
  135. local col = 0
  136. local count = 6
  137. local history = {};
  138. local CardClass = require(MJDefine.MJConfig_2d.MAHJONG_CARD)
  139. for k,v in pairs(operateData) do
  140. if not history[v.opCard] then
  141. history[v.opCard] = true;
  142. local item = self.ui.Items.Layout_MJ_Item:getCopied()
  143. local mj = CardClass:new(v.opCard, self.viewId, MJDefine.MJType.Stand, -1)
  144. item:addChild(mj)
  145. local size = item:getContentSize()
  146. mj:setPosition(cc.p(size.width/2,size.height/2))
  147. self.ui.Items.Layout_Operate_Content:addChild(item)
  148. mj:registerClick(function()
  149. self:sendOp(v)
  150. end)
  151. local row = math.ceil(k/count)
  152. local x = self.ui.Items.Layout_Operate_Content:getContentSize().width-col*133
  153. local y = (row-1)*size.height
  154. item:setPositionX(x)
  155. item:setPositionY(y)
  156. col = col+1
  157. if k%count==0 then
  158. col = 0
  159. end
  160. end
  161. end
  162. end
  163. -- 隐藏操作按钮面板
  164. function yibinmajiangHandCardView:hideOperateItem()
  165. if self.ui.Items.Layout_OperateItem then
  166. self.ui.Items.Layout_Operate_Content:removeAllChildren()
  167. self.ui.Items.Layout_OperateItem:setVisible(false)
  168. end
  169. end
  170. -- 显示操作
  171. function yibinmajiangHandCardView:showOperate(operates,card,isMyGetCard)
  172. if not operates or table.nums(operates)==0 then return end
  173. print(table.tostring(operates))
  174. local card = card or 0
  175. -- 先隐藏面板
  176. self:hideOperateItem()
  177. self:hideOperate()
  178. if operates and table.nums(operates) > 0 then
  179. self.ui.Items.Button_Sure:setVisible(false)
  180. end
  181. local newOperates = {}
  182. -- 如果都是听用牌并且是我抓牌,则不添加过操作(避免全是听用牌而且不胡情况下出不了牌)
  183. if not (self:getIsAllTingYongCard() and isMyGetCard) then
  184. local operate=MJMessage.OperateCard_Data:new()
  185. operate.opType=MJDefine.MJOperateType.OPREATE_CANCEL
  186. operate.opCard=card
  187. operate.useRedNum = 0
  188. table.insert(newOperates,1,operate) -- 添加过操作
  189. end
  190. -- 显示面板
  191. self.ui.Items.Layout_Operate:setVisible(true)
  192. local x = self.ui.Items.Layout_Operate:getContentSize().width
  193. local y = self.ui.Items.Layout_Operate:getContentSize().height/2 + Operate_Offset_Y
  194. self.btnPosX = x
  195. -- operates.Datas包含所有碰杠组合
  196. -- 将杠牌提取出来,为了如果有多个杠的时候可以做选择处理,提同理
  197. local gangCards = {}
  198. local tiCards = {}
  199. local oneGang = true
  200. local oneTi = true
  201. local isCanHu = false
  202. for k,v in pairs(operates.Datas) do
  203. if v.opType ~= MJDefine.MJOperateType.OPREATE_CANCEL then
  204. if v.opType == MJDefine.MJOperateType.OPREATE_ZHIGANG
  205. or v.opType == MJDefine.MJOperateType.OPREATE_BAGANG
  206. or v.opType == MJDefine.MJOperateType.OPREATE_ANGANG
  207. or v.opType == MJDefine.MJOperateType.OPREATE_MINGGANG then
  208. table.insert(gangCards, v)
  209. -- 仅添加一次杠到newOperate表里面做排序处理
  210. if oneGang then
  211. oneGang = false
  212. table.insert(newOperates,v)
  213. end
  214. elseif v.opType == MJDefine.MJOperateType.OPREATE_TI then
  215. table.insert(tiCards, v)
  216. -- 仅添加一次提到newOperate表里面做排序处理
  217. if oneTi then
  218. oneTi = false
  219. table.insert(newOperates,v)
  220. end
  221. elseif (v.opType == MJDefine.MJOperateType.OPREATE_DIANPAOHU)
  222. or (v.opType == MJDefine.MJOperateType.OPREATE_ZIMOHU)
  223. or (v.opType == MJDefine.MJOperateType.OPREATE_QIANG_GANG_HU) then
  224. isCanHu = true
  225. table.insert(newOperates,v)
  226. else
  227. table.insert(newOperates,v)
  228. end
  229. end
  230. end
  231. -- 排序
  232. local num = table.nums(newOperates)
  233. if table.nums(newOperates) >= 2 then
  234. local function sortOperate(opA,opB)
  235. if opA.opType<opB.opType then
  236. return true
  237. elseif opA.opType==opB.opType then
  238. if opA.opCard<opB.opCard then
  239. return true
  240. end
  241. end
  242. return false
  243. end
  244. table.sort(newOperates,sortOperate)
  245. end
  246. -- 添加点击事件
  247. for k,v in pairs(newOperates) do
  248. if MJDefine.MJOperateImage[v.opType] then
  249. if v.opType == MJDefine.MJOperateType.OPREATE_FEI then
  250. self:addOperateBtn_Fei(v)
  251. elseif v.opType == MJDefine.MJOperateType.OPREATE_ZHIGANG
  252. or v.opType == MJDefine.MJOperateType.OPREATE_BAGANG
  253. or v.opType == MJDefine.MJOperateType.OPREATE_ANGANG
  254. or v.opType == MJDefine.MJOperateType.OPREATE_MINGGANG then
  255. self:addOperateBtn_Gang(gangCards)
  256. elseif v.opType == MJDefine.MJOperateType.OPREATE_TI then
  257. self:addOperateBtn_Ti(tiCards)
  258. else
  259. local btnOperate = cc.Button:createNode()
  260. btnOperate:setDefaults()
  261. btnOperate:setText("")
  262. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[v.opType])
  263. btnOperate:ignoreAnchorPointForPosition(false)
  264. self.btnPosX = self.btnPosX-MJDefine.MJ_OPERATE_PADDING
  265. btnOperate:setPosition(cc.p(self.btnPosX, y))
  266. self.ui.Items.Layout_Operate:addChild(btnOperate)
  267. -- 过操作添加弃胡添加
  268. if isCanHu and v.opType == MJDefine.MJOperateType.OPREATE_CANCEL then
  269. local function qiHuConfirm()
  270. local content = string.format("确定放弃胡牌吗?")
  271. local okCallBack = function ()
  272. self:sendOp(v)
  273. end
  274. local cancelCallBack = function ()
  275. end
  276. showConfirmDialog(content,okCallBack,cancelCallBack)
  277. end
  278. btnOperate:registerClick(qiHuConfirm)
  279. else
  280. btnOperate:registerClick(function()
  281. self:sendOp(v)
  282. end)
  283. end
  284. end
  285. end
  286. end
  287. end
  288. -- 发送操作
  289. function yibinmajiangHandCardView:sendOp(value)
  290. if not value.useRedNum then
  291. value.useRedNum = 0
  292. end
  293. local request = MJMessage.OperateCard:new()
  294. request.opType = value.opType
  295. request.opCard = value.opCard
  296. for i = 1, value.useRedNum do
  297. local temp = MJMessage.tingyongCard:new()
  298. temp.card = value.lziCard
  299. table.insert(request.tingyongCard.Datas, temp)
  300. end
  301. logE("yibinmajiangHandCardView:sendOp"..table.tostring(request))
  302. self.ui:sendMsg(app.room, MJDefine.MJEvent.Operate, request, function(status, response)
  303. logE("MJHandCardView showOperate() response = ", table.tostring(response))
  304. end)
  305. self:hideOperateItem()
  306. self:hideOperate()
  307. if value.opType == MJDefine.MJOperateType.OPREATE_CANCEL then
  308. app.room:dispatchEvent({name = MJDefine.MJEvent.SendGuo})
  309. end
  310. --self:setTing(false)
  311. --app.room:resetTings()
  312. end
  313. --发送出牌消息
  314. function yibinmajiangHandCardView:sendOutCard()
  315. if not self.isOutCard or not self.touchMJ then return end
  316. self:hideOperate()
  317. yibinmajiangHandCardView.super.sendOutCard(self)
  318. app.room.roomInfo:setLastOutViewId(MJDefine.MyViewId)
  319. end
  320. -- 重新排序整理手牌
  321. function yibinmajiangHandCardView:resetHandCards(insertMj,isAnimation)
  322. self._handcard:resetHandCards(insertMj,isAnimation)
  323. end
  324. -- 补杠操作
  325. function yibinmajiangHandCardView:buGang(card, cardNum)
  326. self._handcard:buGang(card, cardNum)
  327. end
  328. -- 提操作
  329. function yibinmajiangHandCardView:ti(card, lziCard)
  330. self._handcard:ti(card, lziCard)
  331. end
  332. -- 还原补杠
  333. function yibinmajiangHandCardView:retoreBuGang(card,cardNum)
  334. self._handcard:restoreBuGang(card, cardNum)
  335. end
  336. -- 锁定手牌
  337. function yibinmajiangHandCardView:lockHandCard(isForbidTouch)
  338. self._handcard:lockHandCard(isForbidTouch)
  339. end
  340. -- 点击事件(貌似弃用了)
  341. function yibinmajiangHandCardView:onTouchBegan(touch)
  342. local lastMj=self.touchMJ
  343. self.touchMJ=nil
  344. self.isTouchMove=false
  345. -- if self.touchMJ then
  346. -- self.touchMJ:setPositionY(self.initY)
  347. -- self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  348. -- self.touchMJ=nil
  349. -- end
  350. local index = -1;
  351. local touchPos=self:convertToNodeSpace(touch:getLocation())
  352. for k,v in pairs(self.handCards) do
  353. local width = v:getContentSize().width
  354. local height = v:getContentSize().height
  355. local x = v:getPosition().x-width/2
  356. local y = v:getPosition().y-height/2
  357. local rect = cc.Rectangle:new(x,y,width,height)
  358. if rect:contains(touchPos.x,touchPos.y) then
  359. if #self.handCards + #self.handGroupCards * 3 ~= 14 then
  360. -- 非抓牌状态
  361. self.touchMJ = nil;
  362. break
  363. else
  364. -- 抓牌状态
  365. if self._isLock and k ~= #self.handCards then
  366. self.touchMJ = nil;
  367. break
  368. end
  369. end
  370. self.touchMJ=v
  371. if self.touchMJ.status==MJDefine.MJStatus.Select then --双击出牌
  372. self:sendOutCard()
  373. return false
  374. else
  375. self.touchMJ:recordPostion(cc.p(self.touchMJ:getPositionX(),self.initY))
  376. self.touchMJ:runSelectAnimation()
  377. self.touchMJ:setStatus(MJDefine.MJStatus.Select)
  378. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing,card=self.touchMJ.value})
  379. end
  380. index = k;
  381. break
  382. end
  383. end
  384. --lastMj 有可能被移除 必须 tolua.isnull 判断一次
  385. if lastMj and not tolua.isnull(lastMj) and lastMj~=self.touchMJ then
  386. lastMj:runDeSelectAnimation(true)
  387. lastMj:setStatus(MJDefine.MJStatus.Normal)
  388. end
  389. if self.touchMJ then
  390. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard,value = self.touchMJ.value})
  391. else
  392. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  393. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  394. return false
  395. end
  396. return true
  397. end
  398. -- 滑动事件(貌似弃用了)
  399. function yibinmajiangHandCardView:onTouchMove(touch)
  400. local touchPos=self:convertToNodeSpace(touch:getLocation())
  401. local prePos=self:convertToNodeSpace(touch:getPreviousLocation())
  402. local x=math.abs(prePos.x-touchPos.x)
  403. local y=math.abs(prePos.y-touchPos.y)
  404. if x>5 or y>5 then
  405. logD("onTouchMove : ------------2")
  406. self.isTouchMove=true
  407. end
  408. if not tolua.isnull(self.touchMJ) and self.isTouchMove==true then
  409. self.touchMJ:setPosition(touchPos)
  410. self.touchMJ:setLocalZOrder(1)
  411. end
  412. end
  413. -- 点击结束事件(貌似弃用了)
  414. function yibinmajiangHandCardView:onTouchEnd( ... )
  415. yibinmajiangHandCardView.super.onTouchEnd(self, ...)
  416. MJSound.PlayClickCard()
  417. end
  418. -- 点击出牌(貌似弃用了)
  419. function yibinmajiangHandCardView:touchOutCard()
  420. if self.touchMJ and self.isTouchMove then
  421. if self.touchMJ:getPositionY()>MJDefine.MJ_TOUCH_OUT_CARD_Y and self.isOutCard then
  422. self:sendOutCard()
  423. else
  424. self.touchMJ:restorePostion()
  425. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  426. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  427. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  428. if self.isOutCard then
  429. self:moveLastCard()
  430. end
  431. end
  432. end
  433. self.isTouchMove=false
  434. end
  435. -- 移除最后一张手牌
  436. function yibinmajiangHandCardView:removeLastHandCard ()
  437. return self._handcard:removeLastHandCard()
  438. end
  439. -- 创建手牌 isHu 是否是胡牌,如果是胡牌,则会翻出来
  440. function yibinmajiangHandCardView:createHandCards (arg, isHu)
  441. self._handcard:createHandCards(arg, isHu)
  442. end
  443. -- 获得最后一张手牌
  444. function yibinmajiangHandCardView:getLastCard( )
  445. return self._handcard:getLastCard()
  446. end
  447. -- 获取手牌是否是锁定状态
  448. function yibinmajiangHandCardView:isLock ()
  449. return self._handcard:isLock()
  450. end
  451. -- 创建出牌手牌
  452. function yibinmajiangHandCardView:createOutCards(arg)
  453. self._outCardView:createOutCards(arg)
  454. end
  455. -- 出牌角标(就是那个上下动来动去的标记)
  456. function yibinmajiangHandCardView:outCardFalg(event)
  457. if event.viewId == MJDefine.MyViewId then
  458. self:hideOperateItem()
  459. self:hideOperate()
  460. end
  461. event.pointerPath = "mj_yibinmajiang/res/zy_fangjian/room/yibinmajiang_pointer.png"
  462. self._outCardView:outCardFalg(event)
  463. end
  464. -- 播放出牌动画
  465. function yibinmajiangHandCardView:runOutCardAction(value,callback)
  466. self._handcard:runOutCardAction(value, callback)
  467. end
  468. -- 获得手牌节点
  469. function yibinmajiangHandCardView:getHandCardNodes()
  470. return self._handcard:getHandCardNodes()
  471. end
  472. -- 根据牌值获取牌
  473. function yibinmajiangHandCardView:getMjByValue(value)
  474. return self._handcard:getMjByValue(value)
  475. end
  476. -- 判断手牌是否全是听用牌(针对胡操作,如果全是听用则不显示过操作)
  477. function yibinmajiangHandCardView:getIsAllTingYongCard()
  478. if self._handcard then
  479. return self._handcard:getIsAllTingYongCard()
  480. end
  481. return false
  482. end
  483. -- 使用新框架
  484. function yibinmajiangHandCardView:isUseNew3D()
  485. return true
  486. end
  487. -- 置空touchmj
  488. function yibinmajiangHandCardView:cleanTouchMJ()
  489. self._handcard:cleanTouchMJ()
  490. end
  491. return yibinmajiangHandCardView