You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1840 lines
52 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 MJSound=MJFramework.MJImport("mj.luaScript.MJSound")
  7. local MJHandCardView = class("MJHandCardView",cc.UIView)
  8. local SWAP_CARD_TAG = 999
  9. -- function()
  10. -- local node=cc.Layer:create()--LayerColor:create(cc.c4b(255,255,255,255))
  11. -- -- -- node:setAnchorPoint(cc.p(0.5,0.5))
  12. -- -- -- node:ignoreAnchorPointForPosition(false)
  13. -- return node
  14. -- end)
  15. --左边麻将的高度
  16. -- local MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT=30
  17. --左边麻将的X轴偏移修正
  18. -- local MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X=7
  19. -- local MJDefine.MJ_HAND_CARD_RIGHT_OFFSET_X=7.5
  20. --对家牌的X轴偏远量
  21. -- local MJDefine.MJ_HAND_CARD_TOP_OFFSET_X=3
  22. --触摸牌Y的偏移量
  23. -- local MJDefine.MJ_HAND_CARD_TOUCH_Y=20
  24. --触摸按钮的偏移量
  25. -- local MJDefine.MJ_OPERATE_PADDING=150
  26. -- local MJDefine.MJ_MAX_ZORDER=14
  27. -- local MJDefine.MJ_TOP_SCALE=1
  28. -- local MJDefine.MJ_TOUCH_OUT_CARD_Y=250
  29. --出牌速度
  30. -- local MJDefine.MJ_TIME_OUT_CARD=0
  31. -- local MJDefine.MJ_TIME_OUT_CARD_SCALE=0.1
  32. -- local MJDefine.MJ_TIME_OUT_CARD_WAIT=0.3
  33. -- local MJDefine.MJ_OUT_CARD_SCALE=0.5
  34. function MJHandCardView:ctor(viewId,desktopType)
  35. MJHandCardView.super.ctor(self)
  36. -- self.ui.Items.Layout_Hand_Card:setVisible(false)
  37. -- self.ui.Items.Layout_Operate:ignoreAnchorPointForPosition(true)
  38. self.viewId=viewId or MJDefine.MyViewId
  39. self.desktopType=desktopType or MJDefine.DesktopType.ThreeD
  40. --初始化视图
  41. self:initView()
  42. self.handCards={}
  43. self.handGroupCards={}
  44. self.outCards={}
  45. self.touchMJ=nil
  46. self.isOutCard=false
  47. self.isReplay=false
  48. --self:onEnter()
  49. if self.viewId == MJDefine.PlayerViewType.My then
  50. self:initTouchEvent()
  51. end
  52. end
  53. function MJHandCardView:loadUI()
  54. local ui
  55. if self.desktopType==MJDefine.DesktopType.TwoD or self.desktopType==MJDefine.DesktopType.TwoDGold then
  56. ui = loadUI("mj/res/ui/ui_fangjian/mj_ui_hand_card_2d.ui");
  57. else
  58. ui = loadUI("mj/res/ui/ui_fangjian/mj_ui_hand_card.ui");
  59. end
  60. self.ui = ui;
  61. self:addChild(ui)
  62. end
  63. function MJHandCardView:initView()
  64. if self:isUseNew3D() then
  65. self:initNew3DUI()
  66. else
  67. self:loadUI()
  68. self.ui.Items.Layout_Operate:setVisible(false)
  69. self.ui.Items.Button_Sure:setVisible(false)
  70. self.ui.Items.Button_Sure:registerClick(function()
  71. if not self.touchMJ then
  72. showTooltip("请选择要出的麻将!")
  73. end
  74. self:sendOutCard()
  75. end)
  76. print("MJHandCardView:"..self.viewId)
  77. self.initX=self.ui.Items["ImageView_Start_"..self.viewId]:getPositionX()--MJDefine.MJStartPositions[self.viewId].x
  78. self.initY=self.ui.Items["ImageView_Start_"..self.viewId]:getPositionY()--MJDefine.MJStartPositions[self.viewId].y
  79. print("手牌起始位置self.initX = "..self.initX.."self.initY"..self.initY)
  80. if self.viewId == MJDefine.PlayerViewType.My then
  81. self.initX = self.initX + (CONST_WIDTH*g_radio_x-CONST_WIDTH)/2
  82. print("调整过后我的位置self.initX = "..self.initX.."self.initY"..self.initY)
  83. else
  84. self.initX = self.initX*g_radio_x
  85. self.initY = self.initY*g_radio_y
  86. print("调整过后其他人位置self.initX = "..self.initX.."self.initY"..self.initY)
  87. end
  88. self.outX=self.ui.Items["ImageView_Out_"..self.viewId]:getPositionX()
  89. self.outY=self.ui.Items["ImageView_Out_"..self.viewId]:getPositionY()
  90. print("出牌起始位置self.outX = "..self.outX.."self.outY"..self.outY)
  91. self.outX = self.outX*g_radio_x
  92. self.outY = self.outY*g_radio_y
  93. print("出牌调整后的起始位置self.outX = "..self.outX.."self.outY"..self.outY)
  94. --如果是2人房 调整出牌坐标
  95. if app.room:getMaxPlayerCount()==2 then
  96. if self.viewId == MJDefine.PlayerViewType.My then
  97. self.outX=self.outX-200
  98. elseif self.viewId == MJDefine.PlayerViewType.Top then
  99. self.outX=self.outX+180
  100. end
  101. end
  102. -- if self.viewId~=MJDefine.MyViewId then
  103. self.showCardPostion=self.ui.Items["ImageView_Show_"..self.viewId]:getPosition()
  104. -- end
  105. print("showCard起始位置self.showCardPostion x = "..self.showCardPostion.x.."y = "..self.showCardPostion.y)
  106. self.showCardPostion.x = self.showCardPostion.x*g_radio_x
  107. self.showCardPostion.y = self.showCardPostion.y*g_radio_y
  108. print("showCard调整后起始位置self.showCardPostion x = "..self.showCardPostion.x.."y = "..self.showCardPostion.y)
  109. self.ui.Items.Layout_Hand_Card:removeAllChildren()
  110. end
  111. end
  112. ---
  113. -- 初始化新3d牌
  114. --
  115. function MJHandCardView:initNew3DUI()
  116. self:loadUI()
  117. if self.ui.Items.Layout_Hand_Card then
  118. self.ui.Items.Layout_Hand_Card:setVisible(false)
  119. end
  120. if self.ui.Items.Layout_OperateItem then
  121. self.ui.Items.Layout_OperateItem:setVisible(false)
  122. end
  123. if self.ui.Items.Button_Sure then
  124. self.ui.Items.Button_Sure:setVisible(false)
  125. end
  126. local MJConfig = MJDefine.MJConfig_2d
  127. if self.desktopType == MJDefine.DesktopType.ThreeD then
  128. MJConfig = MJDefine.MJConfig_3d
  129. end
  130. local MahjongHandCard = require(MJConfig.HANDCARD_VIEW)
  131. local MahjongOutCardView = require(MJConfig.OUTCARD_VIEW)
  132. local MahjongHuCardView = require(MJConfig.HU_CARD_VIEW)
  133. self._outCardView = MahjongOutCardView:new(self.viewId)
  134. self:addChild(self._outCardView)
  135. -- 手牌和胡牌互换位置
  136. self._handcard = MahjongHandCard:new(self.viewId, self.desktopType)
  137. self:addChild(self._handcard)
  138. self._huCardView = MahjongHuCardView:new(self.viewId)
  139. self:addChild(self._huCardView)
  140. self.ui:setLocalZOrder(10)
  141. end
  142. --设置是否回放
  143. function MJHandCardView:setReplay(b)
  144. if self:isUseNew3D() then
  145. self._handcard:setReplay(b)
  146. else
  147. self.isReplay=b
  148. end
  149. end
  150. function MJHandCardView:onEnter()
  151. MJHandCardView.super.onEnter(self)
  152. -- local argGroup={
  153. -- -- {opType=MJDefine.MJGroupType.Chi,values={1,2,3}},
  154. -- -- {opType=MJDefine.MJGroupType.Chi,values={11,12,13}},
  155. -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}},
  156. -- -- -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}},
  157. -- {opType=MJDefine.MJOperateType.OPREATE_ZHIGANG,showType=MJDefine.MJGroupType.Gang,values={1,1,1,1}},
  158. -- -- {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}},
  159. -- -- {opType=MJDefine.MJOperateType.OPREATE_BAGANG,showType=MJDefine.MJGroupType.AnGang,values={2,2,2,2}},
  160. -- }
  161. -- self:createGroupCards(argGroup)
  162. -- --
  163. -- -- self:createGroupCards(argGroup)
  164. -- cc.SpriteFrameCache:getInstance():addSpriteFramesWithFile("mj/res/ui/zy_fangjian/mj_2d.plist")
  165. -- local arg={
  166. -- {card=0x25},
  167. -- {card=0x21},
  168. -- {card=0x22},
  169. -- {card=0x23},
  170. -- {card=0x24},
  171. -- {card=0x25},
  172. -- {card=0x26},
  173. -- {card=0x27},
  174. -- {card=0x28},
  175. -- {card=0x29},
  176. -- {card=0x01},
  177. -- {card=0x01},
  178. -- {card=0x01},
  179. -- {card=0x01},
  180. -- {card=0x01},
  181. -- -- -- {card=0x01},
  182. -- -- -- {card=0x01},
  183. -- -- -- {card=0x01},
  184. -- }
  185. -- self:createHandCards(arg)
  186. -- self:createHandCards(arg)
  187. -- self:moveLastCard()
  188. -- self:createOpenHandCards(arg)
  189. -- self:createGroupCards(argGroup)
  190. -- self:resetHandCards()
  191. -- arg={
  192. -- {card=0x25},
  193. -- {card=0x01},
  194. -- {card=0x01},
  195. -- {card=0x01},
  196. -- {card=0x01},
  197. -- {card=0x01},
  198. -- {card=0x01},
  199. -- {card=0x01},
  200. -- {card=0x01},
  201. -- {card=0x01},
  202. -- {card=0x01},
  203. -- {card=0x01},
  204. -- {card=0x01},
  205. -- }
  206. -- self:createOutCards(arg)
  207. --绑定事件
  208. self:bindEvent(app.room , MJDefine.MJEvent.SelectCard , handler(self , self.selectCard))
  209. self:bindEvent(app.room , MJDefine.MJEvent.OutCardFalg , handler(self , self.outCardFalg))
  210. self:bindEvent(app.room , MJDefine.MJEvent.ShowTangView , handler(self , self.showTangView))
  211. self:bindEvent(app.room , MJDefine.MJEvent.BaiError , handler(self , self.BaiError))
  212. self:bindEvent(app.room , MJDefine.MJEvent.ClearBaiView , handler(self , self.ClearBaiView))
  213. end
  214. function MJHandCardView:pushTing()
  215. if self:isUseNew3D() then
  216. self._handcard:pushTing()
  217. else
  218. local tings=app.room.roomInfo.tings
  219. if tings then
  220. for value,v in pairs(tings) do
  221. for _,mj in pairs(self.handCards) do
  222. if mj.value==value then
  223. mj:setTing(true)
  224. end
  225. end
  226. -- local mj=self:getMjByValue(value)
  227. end
  228. end
  229. end
  230. end
  231. --最后一张牌显示箭头
  232. function MJHandCardView:pushLastCardTing()
  233. if self:isUseNew3D() then
  234. self._handcard:pushLastCardTing()
  235. else
  236. --爆牌状态只给最后一张牌加听标志
  237. self:setTing(false)
  238. local mj = self.handCards[#self.handCards]
  239. mj:setTing(true)
  240. end
  241. end
  242. function MJHandCardView:setTing(b)
  243. local handCarsNum = self:getHandCardsNum()
  244. if not (handCarsNum%3 == 2) then--如果不是出牌阶段,不显示箭头
  245. b = false
  246. end
  247. if self:isUseNew3D() then
  248. self._handcard:setTing(b)
  249. else
  250. for k,mj in pairs(self.handCards) do
  251. mj:setTing(b)
  252. end
  253. end
  254. end
  255. function MJHandCardView:selectCard(event)
  256. --if not self.touchMJ then return end
  257. if event.value then
  258. for k,v in pairs(self.outCards) do
  259. if not tolua.isnull(v) then
  260. if v.value==event.value then
  261. v:setStatus(MJDefine.MJStatus.Select)
  262. else
  263. v:setStatus(MJDefine.MJStatus.Normal)
  264. end
  265. end
  266. end
  267. else
  268. --self:setTing(false)
  269. for k,v in pairs(self.outCards) do
  270. if v.status~=MJDefine.MJStatus.Disable and (not tolua.isnull(v)) then
  271. v:setStatus(MJDefine.MJStatus.Normal)
  272. end
  273. end
  274. end
  275. -- app.room:dispatchEvent({name = "showProp",response = response});
  276. end
  277. function MJHandCardView:outCardFalg(event)
  278. if self:isUseNew3D() then
  279. self._outCardView:outCardFalg(event)
  280. else
  281. for k,v in pairs(self.outCards) do
  282. for i,child in pairs(v:getChildren()) do
  283. local tag = child:getTag()
  284. if tag ~= MJ.MJ_HAND_CARD_FLAG_LAIZI then
  285. child:removeFromParent()
  286. end
  287. end
  288. end
  289. local mj=self.outCards[#self.outCards]
  290. if event.value and mj and mj.value==event.value and event.viewId==self.viewId then
  291. local falg=cc.Sprite:createWithSpriteFrameName("mj_room_out_falg.png")
  292. -- falg:setScale(0.8)
  293. mj:addChild(falg)
  294. falg:setPosition(mj:getContentSize().width/2,mj:getContentSize().height+10)
  295. local moveBy=cc.MoveBy:create(0.5,cc.p(0,5))
  296. falg:runAction(cc.RepeatForever:create(cc.Sequence:create(moveBy,moveBy:reverse())))
  297. end
  298. end
  299. end
  300. --显示躺界面
  301. function MJHandCardView:showTangView(event)
  302. end
  303. --摆牌错误
  304. function MJHandCardView:BaiError(event)
  305. end
  306. --清除摆牌界面
  307. function MJHandCardView:ClearBaiView(event)
  308. end
  309. --躺成功了
  310. function MJHandCardView:setTangSuccess(is)
  311. if is and self.tangView and (not tolua.isnull(self.tangView)) then
  312. self.tangView:removeFromParent()
  313. self.tangView = nil
  314. end
  315. self:tangCardEnabled(false)
  316. if self:isUseNew3D() then
  317. self._handcard:setTangSuccess(is)
  318. else
  319. self.isTangCard = is
  320. end
  321. end
  322. function MJHandCardView:isCanOutCard()
  323. if self:isUseNew3D() then
  324. return self._handcard:isCanOutCard(true)
  325. else
  326. return self.isOutCard
  327. end
  328. end
  329. function MJHandCardView:setOutCardEnable(b)
  330. logD("MJHandCardView:setOutCardEnable", b)
  331. if self:isUseNew3D() then
  332. self._handcard:setOutCardEnable(b)
  333. else
  334. self.isOutCard=b
  335. if b then
  336. self:moveLastCard()
  337. end
  338. if self.viewId==MJDefine.MyViewId and self.ui.Items.Button_Sure then
  339. self.ui.Items.Button_Sure:setVisible(b)
  340. end
  341. end
  342. end
  343. function MJHandCardView:moveLastCard()
  344. local count=#self.handCards
  345. if count>=2 then
  346. local frontMj=self.handCards[count-1]
  347. local lastMj=self.handCards[count]
  348. local margin=0
  349. local frontX=frontMj:getPositionX()
  350. local frontY=frontMj:getPositionY()
  351. local lastX=lastMj:getPositionX()
  352. local lastY=lastMj:getPositionY()
  353. local MJLastHandCardOffset=MJDefine.MJLastHandCardOffset[self.desktopType]
  354. local MJ_HAND_CARD_LEFT_PADDING_HEIGHT = MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT[self.desktopType]
  355. --根据视图ID 计算坐标
  356. if self.viewId==MJDefine.PlayerViewType.My then
  357. margin=lastMj:getContentSize().width
  358. local space = math.ceil(math.abs(lastX-frontX))
  359. if space == margin then
  360. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  361. end
  362. elseif self.viewId==MJDefine.PlayerViewType.Left then
  363. margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT
  364. if math.abs(lastY-frontY)==margin then
  365. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  366. lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y)
  367. end
  368. elseif self.viewId==MJDefine.PlayerViewType.Right then
  369. margin=MJ_HAND_CARD_LEFT_PADDING_HEIGHT
  370. if math.abs(lastY-frontY)==margin then
  371. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  372. lastMj:setPositionY(lastY+MJLastHandCardOffset[self.viewId].y)
  373. end
  374. elseif self.viewId==MJDefine.PlayerViewType.Top then
  375. margin=lastMj:getContentSize().width-MJDefine.MJ_HAND_CARD_TOP_OFFSET_X
  376. -- print("width:"..lastMj:getContentSize().width)
  377. if math.abs(lastX-frontX)==margin then
  378. lastMj:setPositionX(lastX+MJLastHandCardOffset[self.viewId].x)
  379. end
  380. end
  381. end
  382. end
  383. function MJHandCardView:createGroupCards(arg,fromViewId)
  384. if self:isUseNew3D() then
  385. self._handcard:createGroupCards(arg, fromViewId)
  386. else
  387. --[[arg={
  388. -- {opType=MJDefine.MJGroupType.Chi,values={1,2,3}},
  389. -- {opType=MJDefine.MJGroupType.Chi,values={11,12,13}},
  390. {opType=MJDefine.MJOperateType.OPREATE_PENG,showType=MJDefine.MJGroupType.Peng,values={1,1,1}},
  391. {opType=MJDefine.MJOperateType.OPREATE_ZHIGANG,showType=MJDefine.MJGroupType.Gang,values={1,1,1,1}},
  392. {opType=MJDefine.MJOperateType.OPREATE_BAGANG,showType=MJDefine.MJGroupType.AnGang,values={2,2,2,2}},
  393. }--]]
  394. local x=self.initX
  395. local y=self.initY
  396. local MJGroupStartOffSet = MJDefine.MJGroupStartOffSet[self.desktopType]
  397. for k,v in pairs(arg) do
  398. if not fromViewId then
  399. fromViewId = v.fromViewId
  400. end
  401. local group=MJGroupFactory.CreateGroup(v.values,v.showType,self.viewId,self.desktopType,fromViewId)
  402. if group then
  403. group.opType=v.opType
  404. self.ui.Items.Layout_Hand_Card:addChild(group,-4+#self.handGroupCards)
  405. group:setPosition(cc.p(x+MJGroupStartOffSet[self.viewId].x,y+MJGroupStartOffSet[self.viewId].y))
  406. if group and (v.opType == MJDefine.MJOperateType.OPREATE_PENG
  407. or v.opType == MJDefine.MJOperateType.OPREATE_ZHIGANG
  408. or v.opType == MJDefine.MJOperateType.OPREATE_BAGANG) then
  409. --设置吃碰杠来源
  410. group:setDirection(self.viewId,fromViewId)
  411. end
  412. -- --根据视图ID 计算坐标
  413. -- if self.viewId==MJDefine.PlayerViewType.My then
  414. -- x=x+group:getContentSize().width
  415. -- elseif self.viewId==MJDefine.PlayerViewType.Left then
  416. -- x=x-MJDefine.MJGroupMarginOffSet[self.viewId].x
  417. -- y=y-group:getContentSize().height-MJDefine.MJGroupMarginOffSet[self.viewId].y
  418. -- elseif self.viewId==MJDefine.PlayerViewType.Right then
  419. -- x=x-MJDefine.MJGroupMarginOffSet[self.viewId].x
  420. -- y=y+group:getContentSize().height+MJDefine.MJGroupMarginOffSet[self.viewId].y
  421. -- elseif self.viewId==MJDefine.PlayerViewType.Top then
  422. -- x=x-group:getContentSize().width
  423. -- end
  424. x,y=MJPositionCompnent.getGroupPosition(self.viewId,x,y,group,self.desktopType)
  425. table.insert(self.handGroupCards,group)
  426. end
  427. end
  428. --更新起始位置
  429. self.initX=x
  430. self.initY=y
  431. -- self:updateInitPostion(x,y)
  432. end
  433. end
  434. --更新初始坐标
  435. function MJHandCardView:getInitHandCardPostion()
  436. local initX=self.initX
  437. local initY=self.initY
  438. local MJGroupWithMJMargin=MJDefine.MJGroupWithMJMargin[self.desktopType]
  439. --如果有麻将组重新定位手牌位置
  440. if #self.handGroupCards>0 then
  441. local lastGroup=self.handGroupCards[#self.handGroupCards]
  442. if self.viewId==MJDefine.PlayerViewType.My then
  443. -- initX=initX--+MJGroupWithMJMargin[self.viewId].x
  444. elseif self.viewId==MJDefine.PlayerViewType.Left then
  445. initX=initX+MJGroupWithMJMargin[self.viewId].x
  446. initY=lastGroup:getPositionY()-lastGroup:getContentSize().height/2-MJGroupWithMJMargin[self.viewId].y
  447. elseif self.viewId==MJDefine.PlayerViewType.Right then
  448. initX=initX+MJGroupWithMJMargin[self.viewId].x
  449. initY=lastGroup:getPositionY()+lastGroup:getContentSize().height/2+MJGroupWithMJMargin[self.viewId].y
  450. elseif self.viewId==MJDefine.PlayerViewType.Top then
  451. -- initX=initX--+MJGroupWithMJMargin[self.viewId].x
  452. end
  453. end
  454. return initX,initY
  455. end
  456. function MJHandCardView:getGroup(card,opType)
  457. if self:isUseNew3D() then
  458. self._handcard:getGroup(card, opType)
  459. else
  460. for k,v in pairs(self.handGroupCards) do
  461. if v.opType==opType and v.mjs[1].value==card then
  462. return v
  463. end
  464. end
  465. end
  466. end
  467. function MJHandCardView:buGang(card)
  468. if self:isUseNew3D() then
  469. self._handcard:buGang(card)
  470. else
  471. local oldGroup=self:getGroup(card,MJDefine.MJOperateType.OPREATE_PENG)
  472. if not oldGroup then return end
  473. local newGroup=MJGroupFactory.CreateGroup({card,card,card,card},MJDefine.MJGroupType.Gang,self.viewId,self.desktopType)
  474. newGroup.opType=MJDefine.MJOperateType.OPREATE_BAGANG
  475. newGroup:setPosition(oldGroup:getPosition())
  476. self.ui.Items.Layout_Hand_Card:addChild(newGroup)
  477. local index=table.indexOf(self.handGroupCards,oldGroup)
  478. table.remove(self.handGroupCards,index)
  479. table.insert(self.handGroupCards,index,newGroup)
  480. oldGroup:removeFromParent()
  481. end
  482. end
  483. function MJHandCardView:retoreBuGang(card)
  484. if self:isUseNew3D() then
  485. self._handcard:restoreBuGang(card)
  486. else
  487. local oldGroup=self:getGroup(card,MJDefine.MJOperateType.OPREATE_BAGANG)
  488. if not oldGroup then return end
  489. local newGroup=MJGroupFactory.CreateGroup({card,card,card},MJDefine.MJGroupType.Peng,self.viewId,self.desktopType)
  490. newGroup.opType=MJDefine.MJOperateType.OPREATE_PENG
  491. newGroup:setPosition(oldGroup:getPosition())
  492. self.ui.Items.Layout_Hand_Card:addChild(newGroup)
  493. local index=table.indexOf(self.handGroupCards,oldGroup)
  494. table.remove(self.handGroupCards,index)
  495. table.insert(self.handGroupCards,index,newGroup)
  496. oldGroup:removeFromParent()
  497. end
  498. end
  499. -- function MJHandCardView:get( ... )
  500. -- -- body
  501. -- end
  502. function MJHandCardView:createHandCards(arg)
  503. if self:isUseNew3D() then
  504. self._handcard:createHandCards(arg)
  505. else
  506. if not arg then return end
  507. if type(arg)=="number" then
  508. arg={
  509. {card=arg}
  510. }
  511. end
  512. local initX,initY=self:getInitHandCardPostion()--=self.initX
  513. -- local initY=self.initY
  514. for k,v in pairs(arg) do
  515. local mj--=MJ:new(v.card,MJDefine.MJType.Stand,self.viewId)
  516. if v and v.card then
  517. if self.isReplay and self.viewId~=MJDefine.MyViewId then
  518. mj=MJ:new(v.card,MJDefine.MJType.Operate,self.viewId,self.desktopType)
  519. else
  520. mj=MJ:new(v.card,MJDefine.MJType.Stand,self.viewId,self.desktopType)
  521. end
  522. self.ui.Items.Layout_Hand_Card:addChild(mj)
  523. -- local x=initX
  524. -- local y=initY
  525. -- --根据视图ID 计算坐标
  526. -- if self.viewId==MJDefine.PlayerViewType.My then
  527. -- x=initX+#self.handCards*mj:getContentSize().width
  528. -- elseif self.viewId==MJDefine.PlayerViewType.Left then
  529. -- x=initX-MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X*#self.handCards
  530. -- y=initY-MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT*#self.handCards
  531. -- mj:setLocalZOrder(#self.handCards)
  532. -- elseif self.viewId==MJDefine.PlayerViewType.Right then
  533. -- x=initX-MJDefine.MJ_HAND_CARD_RIGHT_OFFSET_X*#self.handCards
  534. -- y=initY+MJDefine.MJ_HAND_CARD_LEFT_PADDING_HEIGHT*#self.handCards
  535. -- mj:setLocalZOrder(MJDefine.MJ_MAX_ZORDER-#self.handCards)
  536. -- elseif self.viewId==MJDefine.PlayerViewType.Top then
  537. -- x=initX-mj:getContentSize().width*#self.handCards+MJDefine.MJ_HAND_CARD_TOP_OFFSET_X*#self.handCards
  538. -- end
  539. local x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,#self.handCards,self.desktopType)
  540. mj:setPosition(x,y)
  541. table.insert(self.handCards,mj)
  542. end
  543. end
  544. -- for k,v in pairs(self.handCards) do
  545. -- logD(v.newValue.."->zorder:"..v:getLocalZOrder())
  546. --
  547. end
  548. end
  549. function MJHandCardView:resetHandCards(insertMj,isAnimation)
  550. if self:isUseNew3D() then
  551. self._handcard:resetHandCards()
  552. else
  553. -- local initX=self.initX
  554. -- local initY=self.initY
  555. local initX,initY=self:getInitHandCardPostion()
  556. local x=initX
  557. local y=initY
  558. local insertX=0
  559. local insertY=0
  560. self:sortHandCards()
  561. for k,mj in pairs(self.handCards) do
  562. mj:setStatus(MJDefine.MJStatus.Normal)
  563. if insertMj==mj then --记录插入麻将的坐标 动画需要
  564. insertX=x
  565. insertY=y
  566. else
  567. if isAnimation then
  568. mj:runAction(cc.MoveTo:create(0.1,cc.p(x,y)))
  569. else
  570. mj:setPosition(x,y)
  571. end
  572. end
  573. x,y=MJPositionCompnent.getHandCardPosition(self.viewId,initX,initY,mj,k,self.desktopType)
  574. end
  575. return insertX,insertY
  576. end
  577. end
  578. function MJHandCardView:sortHandCards()
  579. --if self.viewId~=MJDefine.MyViewId then
  580. -- return
  581. --end
  582. local function sortMj(mjA,mjB)
  583. if mjA.sortValue<mjB.sortValue then
  584. return true
  585. elseif mjA.sortValue==mjB.sortValue then
  586. if mjA:getPositionX()<mjB:getPositionX() then
  587. return true
  588. end
  589. end
  590. return false
  591. end
  592. table.sort(self.handCards,sortMj)
  593. end
  594. -- 血流
  595. function MJHandCardView:createXueliuHuCards(arg)
  596. if self:isUseNew3D() then
  597. self._huCardView:createXueliuHuCards(arg)
  598. else
  599. if type(arg)=="number" then
  600. arg={
  601. {card=arg}
  602. }
  603. end
  604. -- local x=self.outX
  605. -- local y=self.outY
  606. for k,v in pairs(arg) do
  607. print("测试:"..v.card)
  608. local mj=MJ:new(v.card,MJDefine.MJType.Out,self.viewId,self.desktopType)
  609. self.ui.Items.Layout_Hand_Card:addChild(mj)
  610. table.insert(self.outCards,mj)
  611. local x,y=MJPositionCompnent.getOutCardPosition(self.viewId,self.outX,self.outY,mj,#self.outCards,self.desktopType,app.room:getMaxPlayerCount())
  612. mj:setPosition(x,y)
  613. end
  614. end
  615. end
  616. function MJHandCardView:createOutCards(arg)
  617. if self:isUseNew3D() then
  618. self._outCardView:createOutCards(arg)
  619. else
  620. if type(arg)=="number" then
  621. arg={
  622. {card=arg}
  623. }
  624. end
  625. -- local x=self.outX
  626. -- local y=self.outY
  627. for k,v in pairs(arg) do
  628. print("测试:"..v.card)
  629. local mj=MJ:new(v.card,MJDefine.MJType.Out,self.viewId,self.desktopType)
  630. self.ui.Items.Layout_Hand_Card:addChild(mj)
  631. table.insert(self.outCards,mj)
  632. -- --取余计算X坐标 从起始位置开始 默认应该为0 所以要减去1
  633. -- local n=#self.outCards%MJDefine.MJChangeLinCount[self.viewId]-1
  634. -- --向下取整判断是否换行
  635. -- local m=math.floor(#self.outCards/MJDefine.MJChangeLinCount[self.viewId])
  636. -- --如果刚好等于0则设置为换行的数
  637. -- if #self.outCards%MJDefine.MJChangeLinCount[self.viewId]==0 then
  638. -- n=MJDefine.MJChangeLinCount[self.viewId]-1
  639. -- m=m-1
  640. -- end
  641. -- --根据视图ID 计算坐标
  642. -- if self.viewId==MJDefine.PlayerViewType.My then
  643. -- x=self.outX+(mj:getContentSize().width-MJDefine.MJOutChangeOffSet[self.viewId].x)*n
  644. -- y=self.outY-m*(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)
  645. -- elseif self.viewId==MJDefine.PlayerViewType.Left then
  646. -- x=self.outX-m*(mj:getContentSize().width-MJDefine.MJOutChangeOffSet[self.viewId].x)-n*MJDefine.MJOutOffSet[self.viewId].x
  647. -- y=self.outY-(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)*n
  648. -- mj:setLocalZOrder(n-m)
  649. -- elseif self.viewId==MJDefine.PlayerViewType.Right then
  650. -- x=self.outX+m*(mj:getContentSize().width-MJDefine.MJOutChangeOffSet[self.viewId].x)-n*MJDefine.MJOutOffSet[self.viewId].x
  651. -- y=self.outY+(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)*n
  652. -- mj:setLocalZOrder(-m-n)
  653. -- elseif self.viewId==MJDefine.PlayerViewType.Top then
  654. -- -- local scale=0.8 --上面的麻将要缩小
  655. -- mj:setScale(MJDefine.MJ_TOP_SCALE)
  656. -- x=self.outX-(mj:getContentSize().width*MJDefine.MJ_TOP_SCALE-MJDefine.MJOutChangeOffSet[self.viewId].x)*n
  657. -- y=self.outY+m*(mj:getContentSize().height*MJDefine.MJ_TOP_SCALE-MJDefine.MJOutChangeOffSet[self.viewId].y)
  658. -- mj:setLocalZOrder(self:getContentSize().height-y)
  659. -- end
  660. local x,y=MJPositionCompnent.getOutCardPosition(self.viewId,self.outX,self.outY,mj,#self.outCards,self.desktopType,app.room:getMaxPlayerCount())
  661. mj:setPosition(x,y)
  662. end
  663. end
  664. end
  665. function MJHandCardView:removeAllHandCards()
  666. if self:isUseNew3D() then
  667. self._handcard:removeAllHandCards()
  668. else
  669. for k,v in pairs(self.handCards) do
  670. v:removeFromParent()
  671. end
  672. self.handCards={}
  673. end
  674. end
  675. function MJHandCardView:createOpenHandCards(arg)
  676. if self:isUseNew3D() then
  677. self._handcard:createOpenHandCards(arg)
  678. else
  679. if not arg then return end
  680. -- arg={
  681. -- {card=0x25},
  682. -- {card=0x01},
  683. -- {card=0x01},
  684. -- {card=0x01},
  685. -- {card=0x01},
  686. -- {card=0x01},
  687. -- {card=0x01},
  688. -- {card=0x01},
  689. -- {card=0x01},
  690. -- {card=0x01},
  691. -- {card=0x01},
  692. -- {card=0x01},
  693. -- {card=0x01},
  694. -- {card=0x01},
  695. -- }
  696. if type(arg)=="number" then
  697. arg={
  698. {card=arg}
  699. }
  700. end
  701. local initX,initY=self:getInitHandCardPostion()
  702. -- local y=self.initY
  703. -- local x,y=self:getInitHandCardPostion()
  704. for k,v in pairs(arg) do
  705. local mj=MJ:new(v.card,MJDefine.MJType.Operate,self.viewId,self.desktopType)
  706. self.ui.Items.Layout_Hand_Card:addChild(mj)
  707. -- local x=initX
  708. -- local y=initY
  709. -- --根据视图ID 计算坐标
  710. -- if self.viewId==MJDefine.PlayerViewType.My then
  711. -- x=x+(mj:getContentSize().width-MJDefine.MJOutChangeOffSet[self.viewId].x)*#self.handCards
  712. -- -- y=self.initY-m*(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)
  713. -- elseif self.viewId==MJDefine.PlayerViewType.Left then
  714. -- x=x-MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X*#self.handCards
  715. -- y=y-(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)*#self.handCards
  716. -- -- mj:setLocalZOrder(x)
  717. -- elseif self.viewId==MJDefine.PlayerViewType.Right then
  718. -- x=x-MJDefine.MJ_HAND_CARD_LEFT_OFFSET_X*#self.handCards
  719. -- y=y+(mj:getContentSize().height-MJDefine.MJOutChangeOffSet[self.viewId].y)*#self.handCards
  720. -- mj:setLocalZOrder(self:getContentSize().height-y)
  721. -- elseif self.viewId==MJDefine.PlayerViewType.Top then
  722. -- -- local scale=0.8 --上面的麻将要缩小
  723. -- mj:setScale(MJDefine.MJ_TOP_SCALE)
  724. -- x=x-(mj:getContentSize().width*MJDefine.MJ_TOP_SCALE-MJDefine.MJOutChangeOffSet[self.viewId].x)*#self.handCards
  725. -- -- y=self.initY+m*(mj:getContentSize().height*scale-MJDefine.MJOutChangeOffSet[self.viewId].y)
  726. -- -- mj:setLocalZOrder(self:getContentSize().height-y)
  727. -- end
  728. local x,y=MJPositionCompnent.getOpenCardPosition(self.viewId,initX,initY,mj,#self.handCards,self.desktopType)
  729. mj:setPosition(x,y)
  730. table.insert(self.handCards,mj)
  731. end
  732. end
  733. end
  734. --删除触摸事件only
  735. function MJHandCardView:removeTouchEventOnly()
  736. self:getEventDispatcher():removeEventListenersForTarget(self)
  737. end
  738. --初始化换牌触摸事件
  739. function MJHandCardView:initSwapCardTouchEvent()
  740. if self._isReplay then--回放不需要触摸事件
  741. self:getEventDispatcher():removeEventListenersForTarget(self)
  742. return
  743. end
  744. if self:isUseNew3D() then
  745. self._handcard:initSwapCardTouchEvent()
  746. else
  747. self._selectCards = nil
  748. self:getEventDispatcher():removeEventListenersForTarget(self)
  749. --注册交换牌时的触摸事件
  750. self:registerTouch(handler(self,self.onSwapTouchBegan))
  751. end
  752. end
  753. --初始化摆牌触摸事件
  754. function MJHandCardView:initBaiCardTouchEvent()
  755. if self._isReplay then--回放不需要触摸事件
  756. self:getEventDispatcher():removeEventListenersForTarget(self)
  757. return
  758. end
  759. if self:isUseNew3D() then
  760. self._handcard:initBaiCardTouchEvent()
  761. end
  762. end
  763. function MJHandCardView:initTouchEvent()
  764. -- self:setTouchEnabled(true)
  765. -- local function onTouchEvent(sender, eventType, touch)
  766. -- -- 点击开始的回调
  767. -- if eventType == cc.TouchEventType.began then
  768. -- self:onTouchBegan(touch)
  769. -- -- 点击结束的回调
  770. -- elseif eventType == cc.TouchEventType.ended then
  771. -- self:onTouchEnd(touch)
  772. -- -- 点击取消的回调
  773. -- elseif eventType == cc.TouchEventType.canceled then
  774. -- self:onTouchCancel(touch)
  775. -- elseif eventType == cc.TouchEventType.moved then
  776. -- self:onTouchMove(touch)
  777. -- end
  778. -- return true;
  779. -- end
  780. -- self:addTouchEventListener(onTouchEvent)
  781. if self._isReplay then--回放不需要触摸事件
  782. self:getEventDispatcher():removeEventListenersForTarget(self)
  783. return
  784. end
  785. if self:isUseNew3D() then
  786. self._handcard:initTouchEvent()
  787. else
  788. self:getEventDispatcher():removeEventListenersForTarget(self)
  789. self:registerTouch(handler(self,self.onTouchBegan), handler(self,self.onTouchMove), handler(self,self.onTouchEnd), handler(self,self.onTouchCancel))
  790. end
  791. end
  792. function MJHandCardView:removeTouchEvent()
  793. self:getEventDispatcher():removeEventListenersForTarget(self)
  794. if self.ui.Items.Button_Sure then
  795. self.ui.Items.Button_Sure:setVisible(false)
  796. self.ui.Items.Button_Sure:removeFromParent()
  797. self.ui.Items.Button_Sure=nil
  798. end
  799. self:setTing(false)
  800. end
  801. --换三张时的触摸事件
  802. function MJHandCardView:onSwapTouchBegan(touch)
  803. self._selectCards = self._selectCards or {}
  804. local touchPos=self:convertToNodeSpace(touch:getLocation())
  805. for k,v in pairs(self.handCards) do
  806. local width = v:getContentSize().width
  807. local height = v:getContentSize().height
  808. local x = v:getPosition().x-width/2
  809. local y = v:getPosition().y-height/2
  810. local rect = cc.Rectangle:new(x,y,width,height)
  811. if rect:contains(touchPos.x,touchPos.y) then
  812. self.touchMJ=v
  813. if self.touchMJ:getSelected()==MJDefine.MJStatus.Select then
  814. self.touchMJ:runDeSelectAnimationWithTime(0.1)
  815. self.touchMJ:setSelected(MJDefine.MJStatus.Normal)
  816. table.removeItem(self._selectCards,self.touchMJ)
  817. else
  818. self.touchMJ:recordPostion(cc.p(self.touchMJ:getPositionX(),self.initY))
  819. self.touchMJ:runSelectAnimation()
  820. self.touchMJ:setSelected(MJDefine.MJStatus.Select)
  821. table.insert(self._selectCards,self.touchMJ)
  822. end
  823. if self:checkIsInSwapRule() then
  824. app.room:dispatchEvent({name = MJDefine.MJEvent.CheckIsInSwapRule,canCommit=true})
  825. else
  826. app.room:dispatchEvent({name = MJDefine.MJEvent.CheckIsInSwapRule,canCommit=false})
  827. end
  828. break
  829. end
  830. end
  831. end
  832. --判断是否符合换三张规则
  833. function MJHandCardView:checkIsInSwapRule()
  834. if self:isUseNew3D() then
  835. return self._handcard:checkIsInSwapRule()
  836. else
  837. local selectNums = #self._selectCards
  838. logD("MJHandCardView:checkIsInSwapRule1 "..selectNums)
  839. if selectNums ~= 3 then
  840. return false
  841. end
  842. local huase = self._selectCards[1]:getMJColorType()
  843. logD("MJHandCardView:checkIsInSwapRule2 "..huase)
  844. for i,v in pairs(self._selectCards) do
  845. local tHuase = v:getMJColorType()
  846. logD("MJHandCardView:checkIsInSwapRule3 "..tHuase)
  847. if tHuase ~= huase then
  848. return false
  849. end
  850. end
  851. logD("MJHandCardView:checkIsInSwapRule4 ")
  852. return true
  853. end
  854. end
  855. --获取选择的牌
  856. function MJHandCardView:getSelectedCards()
  857. if self:isUseNew3D() then
  858. return self._handcard:getSelectedCards()
  859. else
  860. local tselCards = {}
  861. for i,v in pairs(self._selectCards) do
  862. table.insert(tselCards,v.value)
  863. end
  864. return tselCards
  865. end
  866. end
  867. --通过传进来的参数cards来选出手牌里的cards,服务器推荐选牌用
  868. function MJHandCardView:selectCardsByCards(cards)
  869. if self:isUseNew3D() then
  870. self._handcard:selectCardsByCards(cards)
  871. else
  872. self._selectCards = self._selectCards or {}
  873. for i,v in pairs(cards) do
  874. for j,k in pairs(self.handCards) do
  875. if k.value == v.card and (k:getSelected() ~= MJDefine.MJStatus.Select) then
  876. k:recordPostion(cc.p(k:getPositionX(),self.initY))
  877. k:runSelectAnimation()
  878. k:setSelected(MJDefine.MJStatus.Select)
  879. table.insert(self._selectCards,k)
  880. break
  881. end
  882. end
  883. end
  884. end
  885. end
  886. --删除选中的牌
  887. function MJHandCardView:deleteSelectedCards()
  888. if self:isUseNew3D() then
  889. self._handcard:deleteSelectedCards()
  890. else
  891. if not self._selectCards or #self._selectCards == 0 then
  892. return
  893. end
  894. local tselCards = {}
  895. for i,v in pairs(self._selectCards) do
  896. table.insert(tselCards,{card = v.value})
  897. end
  898. self:removeHandCard(tselCards)
  899. self:resetHandCards()
  900. end
  901. end
  902. --设置定缺类型 0万,1同,2条
  903. function MJHandCardView:setQueType(que)
  904. if self:isUseNew3D() then
  905. self._handcard:setQueType(que)
  906. else
  907. self.queType = que
  908. end
  909. end
  910. --检查手牌是否有定缺牌
  911. function MJHandCardView:checkHandCardHaveQue(que)
  912. if self:isUseNew3D() then
  913. return self._handcard:checkHandCardHaveQue(que)
  914. else
  915. for k,v in pairs(self.handCards) do
  916. if v:getMJColorType() == self.queType then
  917. return true
  918. end
  919. end
  920. return false
  921. end
  922. end
  923. --检测定缺牌,屏蔽缺牌以外的牌(定缺牌打完钱不能打别的牌)
  924. function MJHandCardView:checkQueAndDisableOtherCard()
  925. if self:isUseNew3D() then
  926. self._handcard:checkQueAndDisableOtherCard()
  927. else
  928. if not self.queType or self.queType > 2 or self.queType < 0 then
  929. return
  930. end
  931. local handcardNum = #self.handCards
  932. local isMyGetCard = (handcardNum%3 == 2)--是否是自己摸牌阶段
  933. if isMyGetCard and self:checkHandCardHaveQue() then
  934. for k,v in pairs(self.handCards) do
  935. if v:getMJColorType() ~= self.queType then
  936. v:setStatus(MJDefine.MJStatus.Disable)
  937. else
  938. v:setStatus(MJDefine.MJStatus.Normal)
  939. end
  940. end
  941. else
  942. for k,v in pairs(self.handCards) do
  943. v:setStatus(MJDefine.MJStatus.Normal)
  944. end
  945. end
  946. self.touchMJ = nil
  947. end
  948. end
  949. --设置所有手牌状态为Disable
  950. function MJHandCardView:setHandCardsDidable()
  951. if self:isUseNew3D() then
  952. self._handcard:setHandCardsDidable()
  953. else
  954. for k,v in pairs(self.handCards) do
  955. v:setStatus(MJDefine.MJStatus.Disable)
  956. end
  957. end
  958. end
  959. --设置非打出去能听的牌Disable
  960. function MJHandCardView:setNotTingCardDidable(is)
  961. if self:isUseNew3D() then
  962. self._handcard:setNotTingCardDidable(is)
  963. else
  964. if is then
  965. for _,mjNode in pairs(self.handCards) do
  966. if not mjNode:getTing() then
  967. mjNode:setStatus(MJDefine.MJStatus.Disable)
  968. else
  969. mjNode:setStatus(MJDefine.MJStatus.Normal)
  970. end
  971. end
  972. else
  973. for _,mjNode in pairs(self.handCards) do
  974. mjNode:setStatus(MJDefine.MJStatus.Normal)
  975. end
  976. end
  977. end
  978. end
  979. --创建换三张的牌
  980. function MJHandCardView:createSwapCards(cards)
  981. if self:isUseNew3D() then
  982. local group = self._handcard:createSwapCards(cards)
  983. if group then
  984. self.ui.Items.Layout_Animation:addChild(group,1,SWAP_CARD_TAG)
  985. local pos = self:getAnimationPostion()
  986. if self.viewId==MJDefine.MyViewId then
  987. pos.x = pos.x - 50
  988. elseif self.viewId==MJDefine.PlayerViewType.Top then
  989. pos.y = pos.y - 20
  990. end
  991. group:setPosition(pos)
  992. end
  993. else
  994. local group = MJGroupFactory.CreateGroup(cards,MJDefine.MJGroupType.Chi,self.viewId,self.desktopType,0)
  995. if group then
  996. self.ui.Items.Layout_Animation:addChild(group,1,SWAP_CARD_TAG)
  997. local pos = self:getAnimationPostion()--cc.p(x+MJGroupStartOffSet[self.viewId].x,y+MJGroupStartOffSet[self.viewId].y)
  998. group:setPosition(pos)
  999. end
  1000. end
  1001. end
  1002. --删除换三张的牌
  1003. function MJHandCardView:deleteSwapCards()
  1004. local swapCardsUI = self.ui.Items.Layout_Animation:getChildByTag(SWAP_CARD_TAG)
  1005. if swapCardsUI and (not tolua.isnull(swapCardsUI)) then
  1006. swapCardsUI:removeFromParent()
  1007. swapCardsUI = nil
  1008. end
  1009. end
  1010. function MJHandCardView:onTouchBegan(touch)
  1011. logD("onTouchBegan : ------------1")
  1012. ----躺牌状态,自动出牌,屏蔽触摸时间
  1013. if self.isTangCard and self.isTangCard == true then
  1014. return false
  1015. end
  1016. if self.touchMJ and self.isTouchMove then
  1017. logD("onTouchBegan : ------------2")
  1018. self:touchOutCard()
  1019. return false
  1020. end
  1021. logD("onTouchBegan : ------------3")
  1022. local lastMj=self.touchMJ
  1023. self.touchMJ=nil
  1024. self.isTouchMove=false
  1025. -- if self.touchMJ then
  1026. -- self.touchMJ:setPositionY(self.initY)
  1027. -- self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  1028. -- self.touchMJ=nil
  1029. -- end
  1030. local touchPos=self:convertToNodeSpace(touch:getLocation())
  1031. for k,v in pairs(self.handCards) do
  1032. local width = v:getContentSize().width
  1033. local height = v:getContentSize().height
  1034. local x = v:getPosition().x-width/2
  1035. local y = v:getPosition().y-height/2
  1036. local rect = cc.Rectangle:new(x,y,width,height)
  1037. if rect:contains(touchPos.x,touchPos.y) then
  1038. if v:getStatus() == MJDefine.MJStatus.Disable then
  1039. return
  1040. end
  1041. self.touchMJ=v
  1042. if self.touchMJ.status==MJDefine.MJStatus.Select then --双击出牌
  1043. self:sendOutCard()
  1044. return false
  1045. else
  1046. self.touchMJ:recordPostion(cc.p(self.touchMJ:getPositionX(),self.initY))
  1047. self.touchMJ:runSelectAnimation()
  1048. self.touchMJ:setStatus(MJDefine.MJStatus.Select)
  1049. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing,card=self.touchMJ.value})
  1050. end
  1051. break
  1052. end
  1053. end
  1054. --lastMj 有可能被移除 必须 tolua.isnull 判断一次
  1055. if lastMj and not tolua.isnull(lastMj) and lastMj~=self.touchMJ then
  1056. lastMj:runDeSelectAnimation(true)
  1057. lastMj:setStatus(MJDefine.MJStatus.Normal)
  1058. end
  1059. if self.touchMJ then
  1060. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard,value = self.touchMJ.value})
  1061. else
  1062. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  1063. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  1064. return false
  1065. end
  1066. return true
  1067. end
  1068. function MJHandCardView:onTouchMove(touch)
  1069. -- if not self.isOutCard then return end
  1070. local touchPos=self:convertToNodeSpace(touch:getLocation())
  1071. local prePos=self:convertToNodeSpace(touch:getPreviousLocation())
  1072. local x=math.abs(prePos.x-touchPos.x)
  1073. local y=math.abs(prePos.y-touchPos.y)
  1074. if x>5 or y>5 then
  1075. logD("onTouchMove : ------------2")
  1076. self.isTouchMove=true
  1077. end
  1078. if self.touchMJ and self.isTouchMove==true then
  1079. -- self.isTouchMove=true
  1080. self.touchMJ:setPosition(touchPos)
  1081. self.touchMJ:setLocalZOrder(1)
  1082. --return true
  1083. end
  1084. --return false
  1085. end
  1086. function MJHandCardView:onTouchEnd(touch)
  1087. logD("onTouchEnd : ------------1")
  1088. self:touchOutCard()
  1089. end
  1090. function MJHandCardView:onTouchCancel(touch)
  1091. logD("onTouchCancel : ------------1")
  1092. self:touchOutCard()
  1093. end
  1094. function MJHandCardView:touchOutCard()
  1095. logD("touchOutCard : ------------1")
  1096. if self.touchMJ and self.isTouchMove then
  1097. logD("touchOutCard : ------------2")
  1098. if self.touchMJ:getPositionY()>MJDefine.MJ_TOUCH_OUT_CARD_Y and self.isOutCard then
  1099. logD("touchOutCard : ------------3")
  1100. self:sendOutCard()
  1101. else
  1102. logD("touchOutCard : ------------4")
  1103. self.touchMJ:restorePostion()
  1104. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  1105. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  1106. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  1107. -- if self.isOutCard then
  1108. -- self:moveLastCard()
  1109. -- end
  1110. end
  1111. end
  1112. logD("touchOutCard : ------------5")
  1113. self.isTouchMove=false
  1114. end
  1115. --发送出牌消息
  1116. function MJHandCardView:sendOutCard()
  1117. if self:isUseNew3D() then
  1118. if not self.isOutCard or not self.touchMJ then return end
  1119. local card = self.touchMJ:getValue()
  1120. self._outCardView:onOutCard(card, nil)
  1121. self._handcard:sendOutCard()
  1122. else
  1123. if not self.isOutCard or not self.touchMJ then return end
  1124. if self.touchMJ:getIsPaoPai() and (not self:getHandCardsIsAllPaoCard()) then
  1125. self.touchMJ:restorePostion()
  1126. self.touchMJ:setStatus(MJDefine.MJStatus.Normal)
  1127. showTooltip("不能打出别人要胡的牌!");
  1128. return
  1129. end
  1130. local request = MJMessage.Card:new()
  1131. request.card = self.touchMJ.value
  1132. -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  1133. self.ui:sendMsg(app.room, MJDefine.MJEvent.OutCard, request, function(status, response)
  1134. logE("MJHandCardView sendOutCard() response = ", table.tostring(response))
  1135. end)
  1136. --音效
  1137. local userInfo=app.room:getUserInfoByViewId(self.viewId)
  1138. if userInfo then
  1139. MJSound.PlayMJSound(userInfo.sex,request.card)
  1140. end
  1141. self:runOutCardAction(self.touchMJ.value)
  1142. app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg,value=self.touchMJ.value,viewId=self.viewId})
  1143. self:setOutCardEnable(false)
  1144. --插牌
  1145. if self.touchMJ==self.handCards[#self.handCards] then
  1146. table.removeItem(self.handCards,self.touchMJ)
  1147. self:resetHandCards()
  1148. else
  1149. table.removeItem(self.handCards,self.touchMJ)
  1150. self:runInsertCardAction()
  1151. end
  1152. self.touchMJ:removeFromParent()
  1153. self.touchMJ=nil
  1154. app.room:dispatchEvent({name = MJDefine.MJEvent.SelectCard})
  1155. app.room:dispatchEvent({name = MJDefine.MJEvent.ShowTing})
  1156. self:setTing(false)
  1157. app.room:resetTings()
  1158. end
  1159. end
  1160. --插牌动画
  1161. function MJHandCardView:runInsertCardAction()
  1162. self:getEventDispatcher():removeEventListenersForTarget(self)
  1163. local insertMj=self.handCards[#self.handCards]
  1164. local iX=insertMj:getPositionX()
  1165. local iY=insertMj:getPositionY()
  1166. local height=insertMj:getContentSize().height
  1167. local x,y=self:resetHandCards(insertMj,true)
  1168. local actions={
  1169. cc.MoveTo:create(0.1,cc.p(insertMj:getPositionX(),insertMj:getPositionY()+height)),
  1170. cc.MoveTo:create(0.1,cc.p(x,insertMj:getPositionY()+height)),
  1171. cc.MoveTo:create(0.1,cc.p(x,self.initY)),
  1172. cc.CallFunc:create(function()
  1173. self:initTouchEvent()
  1174. if self.touchMJ and not tolua.isnull(self.touchMJ) then
  1175. self:resetHandCards()
  1176. end
  1177. end)
  1178. }
  1179. insertMj:runAction(cc.Sequence:create(actions))
  1180. end
  1181. --出牌动画
  1182. function MJHandCardView:runOutCardAction(value,callback)
  1183. MJSound.PlayOutCard()
  1184. self:createOutCards(value)
  1185. local outCard=self.outCards[#self.outCards]
  1186. local showCard=MJ:new(value,MJDefine.MJType.Stand,MJDefine.MyViewId,self.desktopType)
  1187. self:addChild(showCard)
  1188. if self.viewId==MJDefine.MyViewId then
  1189. outCard:setVisible(false)
  1190. local mj=nil
  1191. if self.touchMJ and not tolua.isnull(self.touchMJ) then
  1192. mj = self.touchMJ
  1193. else
  1194. mj = self:getMjByValueReverseOrder(value)
  1195. end
  1196. if mj and (not tolua.isnull(mj)) then
  1197. showCard:setPosition(mj:getPosition())
  1198. end
  1199. local actions={
  1200. cc.MoveTo:create(MJDefine.MJ_TIME_OUT_CARD,outCard:getPosition()),
  1201. cc.CallFunc:create(function()
  1202. -- MJSound.PlayOutCard()
  1203. if outCard and not tolua.isnull(outCard) then
  1204. outCard:setVisible(true)
  1205. end
  1206. if callback then callback() end
  1207. end),
  1208. cc.RemoveSelf:create(),
  1209. }
  1210. showCard:runAction(cc.Sequence:create(actions))
  1211. else
  1212. showCard:setScale(MJDefine.MJ_OUT_CARD_SCALE)
  1213. showCard:setPosition(self.showCardPostion)
  1214. local rotate=0
  1215. if self.viewId==MJDefine.PlayerViewType.Left then
  1216. rotate=-45
  1217. elseif self.viewId==MJDefine.PlayerViewType.Right then
  1218. rotate=45
  1219. end
  1220. local actions={
  1221. cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD_SCALE,1),
  1222. cc.DelayTime:create(MJDefine.MJ_TIME_OUT_CARD_WAIT),
  1223. cc.Spawn:create(
  1224. cc.Spawn:create(
  1225. cc.MoveTo:create(MJDefine.MJ_TIME_OUT_CARD,outCard:getPosition()),
  1226. cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD,MJDefine.MJ_OUT_CARD_SCALE)
  1227. ),
  1228. cc.RotateBy:create(MJDefine.MJ_TIME_OUT_CARD,rotate)
  1229. ),
  1230. cc.CallFunc:create(function()
  1231. -- MJSound.PlayOutCard()
  1232. if outCard and not tolua.isnull(outCard) then
  1233. outCard:setVisible(true)
  1234. end
  1235. if callback then callback() end
  1236. end),
  1237. cc.RemoveSelf:create(),
  1238. }
  1239. showCard:runAction(cc.Sequence:create(actions))
  1240. -- showCard:runAction(cc.ScaleTo:create(MJDefine.MJ_TIME_OUT_CARD,MJDefine.MJ_TOP_SCALE))
  1241. end
  1242. -- showCard:runAction()
  1243. end
  1244. function MJHandCardView:getMjByValue(value)
  1245. if self:isUseNew3D() then
  1246. return self._handcard:getMjByValue(value)
  1247. else
  1248. for k,v in pairs(self.handCards) do
  1249. if v.value==value then
  1250. return v
  1251. end
  1252. end
  1253. end
  1254. end
  1255. --倒序遍历手牌
  1256. function MJHandCardView:getMjByValueReverseOrder(value)
  1257. for i = #self.handCards,1,-1 do
  1258. local v = self.handCards[i]
  1259. if v.value==value then
  1260. return v
  1261. end
  1262. end
  1263. end
  1264. function MJHandCardView:removeHandCard(arg)
  1265. if self:isUseNew3D() then
  1266. self._handcard:removeHandCard(arg)
  1267. else
  1268. if type(arg)=="number" then
  1269. arg={
  1270. {card=arg}
  1271. }
  1272. end
  1273. if self.viewId==MJDefine.MyViewId or self.isReplay then
  1274. for k,v in pairs(arg) do
  1275. local mj=self:getMjByValue(v.card)
  1276. if mj then
  1277. table.removeItem(self.handCards,mj)
  1278. mj:removeFromParent()
  1279. end
  1280. end
  1281. else
  1282. -- local num=#self.handCards-#arg
  1283. -- print(num)
  1284. for i=#self.handCards,#self.handCards-#arg+1,-1 do
  1285. if self.handCards[i] then
  1286. self.handCards[i]:removeFromParent()
  1287. table.remove(self.handCards,i)
  1288. end
  1289. end
  1290. end
  1291. end
  1292. end
  1293. function MJHandCardView:removeHandCardByNum(value,num)
  1294. if self:isUseNew3D() then
  1295. self._handcard:removeHandCardByNum(value,num)
  1296. else
  1297. if self.viewId==MJDefine.MyViewId or self.isReplay then
  1298. for i=1,num do
  1299. local mj=self:getMjByValue(value)
  1300. if mj then
  1301. table.removeItem(self.handCards,mj)
  1302. mj:removeFromParent()
  1303. end
  1304. end
  1305. else
  1306. -- local num=#self.handCards-#arg
  1307. -- print(num)
  1308. for i=#self.handCards,#self.handCards-num+1,-1 do
  1309. if self.handCards[i] then
  1310. self.handCards[i]:removeFromParent()
  1311. table.remove(self.handCards,i)
  1312. end
  1313. end
  1314. end
  1315. end
  1316. end
  1317. function MJHandCardView:removeOutCard(arg)
  1318. if self:isUseNew3D() then
  1319. self._outCardView:removeOutCard(arg)
  1320. else
  1321. if type(arg)=="number" then
  1322. arg={
  1323. {card=arg}
  1324. }
  1325. end
  1326. local function getMjByValue(value)
  1327. for i=#self.outCards,1,-1 do
  1328. if self.outCards[i] then
  1329. if self.outCards[i].value==value then
  1330. return self.outCards[i]
  1331. end
  1332. end
  1333. end
  1334. -- for k,v in pairs(self.outCards) do
  1335. -- if v.value==value then
  1336. -- return v
  1337. -- end
  1338. -- end
  1339. end
  1340. for k,v in pairs(arg) do
  1341. local mj=getMjByValue(v.card)
  1342. if mj then
  1343. table.removeItem(self.outCards,mj)
  1344. mj:removeFromParent()
  1345. end
  1346. end
  1347. end
  1348. end
  1349. --玩家出牌
  1350. function MJHandCardView:onOutCard(card,callback)
  1351. -- self:createOutCards(card)
  1352. if self:isUseNew3D() then
  1353. self._handcard:onOutCard(card, callback)
  1354. self._outCardView:onOutCard(card, callback)
  1355. else
  1356. self:runOutCardAction(card,callback)
  1357. if self.viewId~=MJDefine.MyViewId then --其他玩家删除最后一个牌
  1358. local mj=self:getMjByValue(card)
  1359. if mj then
  1360. self:removeHandCard(card)
  1361. self:resetHandCards()
  1362. -- mj:removeFromParent()
  1363. else
  1364. local last=#self.handCards
  1365. if last and self.handCards[last] then
  1366. self.handCards[last]:removeFromParent()
  1367. table.remove(self.handCards,last)
  1368. end
  1369. end
  1370. else
  1371. -- self:runOutCardAction(self.touchMJ.value)
  1372. -- app.room:dispatchEvent({name = MJDefine.MJEvent.OutCardFalg,value=self.touchMJ.value,viewId=self.viewId})
  1373. self:setOutCardEnable(false)
  1374. local mj=self:getMjByValueReverseOrder(card)
  1375. --插牌
  1376. if mj==self.handCards[#self.handCards] then
  1377. table.removeItem(self.handCards,mj)
  1378. self:resetHandCards()
  1379. else
  1380. table.removeItem(self.handCards,mj)
  1381. self:runInsertCardAction()
  1382. end
  1383. -- self:removeHandCard(card)
  1384. -- self:resetHandCards()
  1385. if mj then
  1386. mj:removeFromParent()
  1387. mj=nil
  1388. end
  1389. end
  1390. -- local memberInfo=app.room.roomInfo.memberList[data.response.nUserId]
  1391. local userInfo=app.room:getUserInfoByViewId(self.viewId)
  1392. if userInfo and (self.viewId~=MJDefine.MyViewId or self.isReplay) then
  1393. MJSound.PlayMJSound(userInfo.sex,card)
  1394. end
  1395. end
  1396. end
  1397. --摸牌
  1398. function MJHandCardView:onGetCard(operates,card)
  1399. self:createHandCards(card)
  1400. if self.viewId==MJDefine.PlayerViewType.Right and not self.isReplay then
  1401. self:resetHandCards()
  1402. end
  1403. if not operates or table.nums(operates)==0 then
  1404. self:setOutCardEnable(true)
  1405. else
  1406. self:setOutCardEnable(false)
  1407. self:moveLastCard()
  1408. end
  1409. if self.viewId==MJDefine.MyViewId then
  1410. MJSound.PlayGetCard()
  1411. end
  1412. -- self:moveLastCard()
  1413. end
  1414. --显示操作
  1415. function MJHandCardView:showOperate(operates,card)
  1416. if not operates or table.nums(operates)==0 then return end
  1417. print(table.tostring(operates))
  1418. --有操作默认添加过的操作
  1419. -- if operates[1] and operates[1].opType~=MJDefine.MJOperateType.OPREATE_CANCEL then
  1420. local operate=MJMessage.OperateCard:new()
  1421. operate.opType=MJDefine.MJOperateType.OPREATE_CANCEL
  1422. operate.opCard=card
  1423. table.insert(operates.Datas,1,operate)
  1424. -- end
  1425. self.ui.Items.Layout_Operate:removeAllChildren()
  1426. self.ui.Items.Layout_Operate:setVisible(true)
  1427. local x=self.ui.Items.Layout_Operate:getContentSize().width
  1428. local y=self.ui.Items.Layout_Operate:getContentSize().height/2
  1429. for k,v in pairs(operates) do
  1430. if MJDefine.MJOperateImage[v.opType] then
  1431. local btnOperate=cc.Button:createNode()
  1432. btnOperate:setDefaults()
  1433. btnOperate:setText("")
  1434. btnOperate:loadTextureNormal(MJDefine.MJOperateImage[v.opType])
  1435. btnOperate:ignoreAnchorPointForPosition(false)
  1436. btnOperate:setPosition(cc.p(x-MJDefine.MJ_OPERATE_PADDING*(k-1), y))
  1437. self.ui.Items.Layout_Operate:addChild(btnOperate)
  1438. btnOperate:registerClick(function()
  1439. playBtnEffect()
  1440. local request = MJMessage.OperateCard:new()
  1441. request.opType = v.opType
  1442. request.opCard = v.opCard
  1443. -- logE("LHQRecordView:setOutCardVisible"..table.tostring(request))
  1444. self.ui:sendMsg(app.room, MJDefine.MJEvent.Operate, request, function(status, response)
  1445. logE("MJHandCardView showOperate() response = ", table.tostring(response))
  1446. end)
  1447. -- MJDefine.MJEvent.Operate
  1448. self:hideOperate()
  1449. self:setTing(false)
  1450. app.room:resetTings()
  1451. --TODO:点过后判断能否出牌 (出牌是否该为服务器控制)
  1452. -- if #self.handCards%2==0 and v.opType==MJDefine.MJOperateType.OPREATE_CANCEL and self.isOutCard==false then
  1453. -- self:setOutCardEnable(true)
  1454. -- end
  1455. end)
  1456. end
  1457. end
  1458. end
  1459. function MJHandCardView:hideOperate()
  1460. self.ui.Items.Layout_Operate:removeAllChildren()
  1461. self.ui.Items.Layout_Operate:setVisible(false)
  1462. end
  1463. function MJHandCardView:getAnimationPostion()
  1464. return self.ui.Items["Layout_Aniamtion_"..self.viewId]:getPosition()
  1465. end
  1466. function MJHandCardView:isUseNew3D()
  1467. return self.desktopType == MJDefine.DesktopType.ThreeD and MJDefine.IS_NEW_3D
  1468. end
  1469. --获取手牌数量
  1470. function MJHandCardView:getHandCardsNum()
  1471. if self:isUseNew3D() then
  1472. return self._handcard:getHandCardsLength()
  1473. else
  1474. if self.handCards and type(self.handCards) == 'table' then
  1475. return #self.handCards
  1476. end
  1477. return 0
  1478. end
  1479. end
  1480. function MJHandCardView:tangCardEnabled(is)
  1481. if self:isUseNew3D() then
  1482. return self._handcard:tangCardEnabled(is)
  1483. else
  1484. if is then
  1485. for _,mjNode in pairs(self.handCards) do
  1486. if not mjNode:getTing() then
  1487. mjNode:setStatus(MJDefine.MJStatus.Disable)
  1488. else
  1489. mjNode:setStatus(MJDefine.MJStatus.Normal)
  1490. end
  1491. end
  1492. else
  1493. for _,mjNode in pairs(self.handCards) do
  1494. --mjNode:restorePostion()
  1495. mjNode:setStatus(MJDefine.MJStatus.Normal)
  1496. end
  1497. end
  1498. end
  1499. end
  1500. --设置躺状态
  1501. function MJHandCardView:setIsTanging(is)
  1502. if self:isUseNew3D() then
  1503. return self._handcard:setIsTanging(is)
  1504. else
  1505. self.isTangOp = is or false
  1506. end
  1507. end
  1508. --设置躺牌
  1509. function MJHandCardView:setTangCard(is,cards)
  1510. if self:isUseNew3D() then
  1511. return self._handcard:setTangCard(is,cards)
  1512. else
  1513. if is then
  1514. for _,card in pairs(cards) do
  1515. for _,mjNode in pairs(self.handCards) do
  1516. if mjNode:getValue() == card.card and (not mjNode.tang) then
  1517. local color = cc.c3b(218, 218, 128)
  1518. mjNode:setColor(color)
  1519. mjNode.tang = true
  1520. end
  1521. end
  1522. end
  1523. else
  1524. for _,mjNode in pairs(self.handCards) do
  1525. mjNode:setNormalColor()
  1526. mjNode.tang = false
  1527. end
  1528. end
  1529. end
  1530. end
  1531. --设置炮牌
  1532. function MJHandCardView:setPaoCard(is,cards)
  1533. if self:isUseNew3D() then
  1534. return self._handcard:setPaoCard(is,cards)
  1535. else
  1536. if is then
  1537. self.paoCards = self.paoCards or {}
  1538. if cards and type(cards) == 'table' and #cards > 0 then
  1539. for _,card in pairs(cards) do
  1540. table.insert(self.paoCards,card.card)
  1541. end
  1542. end
  1543. for _,card in pairs(self.paoCards) do
  1544. for _,mjNode in pairs(self.handCards) do
  1545. if mjNode:getValue() == card then
  1546. mjNode:setPaoFlag(true)
  1547. end
  1548. end
  1549. end
  1550. else
  1551. self.paoCards = {}
  1552. for _,mjNode in pairs(self.handCards) do
  1553. mjNode:setPaoFlag(false)
  1554. end
  1555. end
  1556. end
  1557. end
  1558. --显示别人的躺牌
  1559. function MJHandCardView:showTangCard(is,cards)
  1560. if self:isUseNew3D() then
  1561. return self._handcard:showTangCard(is,cards)
  1562. else
  1563. --[[if is then
  1564. local index = 1
  1565. for _,card in pairs(cards) do
  1566. local mjNode = self._handCardNodes[index]
  1567. mjNode:setValue(card.card)
  1568. mjNode:setMJType(MJDefine.MJConfig_2d.MJType.Open)
  1569. mjNode:initMahjongImage()
  1570. index = index + 1
  1571. end
  1572. else
  1573. for _,mjNode in pairs(self._handCardNodes) do
  1574. mjNode:setPaoFlag(false)
  1575. end
  1576. end--]]
  1577. end
  1578. end
  1579. function MJHandCardView:setBaoPai(flag)
  1580. if self:isUseNew3D() then
  1581. self._handcard:setBaoPai(flag)
  1582. else
  1583. self.baopai = flag
  1584. end
  1585. self.baopai = flag
  1586. end
  1587. function MJHandCardView:checkBaoAndDisableCard()
  1588. if self:isUseNew3D() then
  1589. self._handcard:checkBaoAndDisableCard(flag)
  1590. else
  1591. if self.baopai and self.baopai == 1 then
  1592. self:setHandCardsDidable()
  1593. else
  1594. self:setNotTingCardDidable(false)
  1595. end
  1596. end
  1597. end
  1598. -- 获取手牌是否全是炮牌,全手炮牌可以出任意牌
  1599. function MJHandCardView:getHandCardsIsAllPaoCard()
  1600. if self:isUseNew3D() then
  1601. return self._handcard:getHandCardsIsAllPaoCard()
  1602. else
  1603. --如果爆牌了,则只能出摸上来的牌
  1604. if self.baopai and self.baopai == 1 then
  1605. return true
  1606. end
  1607. for _,mjNode in pairs(self.handCards) do
  1608. if mjNode:getIsPaoPai() == false then
  1609. return false
  1610. end
  1611. end
  1612. return true
  1613. end
  1614. end
  1615. -- 获得麻将的initY坐标
  1616. function MJHandCardView:getHandCardPosInitY()
  1617. if self:isUseNew3D() then
  1618. local lastCard = self._handcard:getLastCard()
  1619. if not lastCard then
  1620. return 0
  1621. end
  1622. local x, y = self._handcard:getCardPosition(lastCard, self._handcard:getViewId(), self._handcard:getHandCardsLength())
  1623. return y or 0
  1624. else
  1625. return self.initY or 0
  1626. end
  1627. end
  1628. return MJHandCardView