您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

335 行
12 KiB

  1. local MJDefine = MJFramework.MJImport("mj.luaScript.MJDefine")
  2. local CommonHandCard = require("mj.luaScript.Common.2d.CommonHandCard")
  3. local Mahjong3DHandCard = class("Mahjong3DHandCard", CommonHandCard)
  4. function Mahjong3DHandCard:ctor(viewId)
  5. Mahjong3DHandCard.super.ctor(self, viewId)
  6. end
  7. function Mahjong3DHandCard:createHandCards(arg)
  8. Mahjong3DHandCard.super.createHandCards(self, arg)
  9. end
  10. --- Mahjong3DHandCard:onAfterCreateHandcards 创建手牌之后的处理
  11. function Mahjong3DHandCard:onAfterCreateHandcards()
  12. Mahjong3DHandCard.super.onAfterCreateHandcards(self)
  13. end
  14. function Mahjong3DHandCard:createCard(value, viewId, mahjongIndex)
  15. local mjType = MJDefine.MJConfig_3d.MJType.Stand
  16. local Mahjong3DCard = require(MJDefine.MJConfig_3d.MAHJONG_CARD)
  17. local card = Mahjong3DCard:new(value, viewId, mjType, mahjongIndex)
  18. local x, y = self:getCardPosition(card, viewId, mahjongIndex)
  19. card:setPosition(cc.p(x, y))
  20. return card
  21. end
  22. function Mahjong3DHandCard:getCardPosition(mjCard, viewId, mjIndex)
  23. local defaulOffsetX = 0
  24. if viewId == 1 then
  25. defaulOffsetX = 0
  26. defaulOffsetY = 40
  27. elseif viewId == 2 then
  28. defaulOffsetX = -40
  29. defaulOffsetY = 0
  30. elseif viewId == 3 then
  31. defaulOffsetX = 0
  32. defaulOffsetY = -40
  33. else
  34. defaulOffsetX = 85
  35. defaulOffsetY = 0
  36. end
  37. logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId)
  38. local startPos = self:getHandCardStartPos(self._viewId)
  39. local offsetPos = self:getHandCardOffestPos(self._viewId)
  40. if not startPos then
  41. logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId)
  42. startPos = cc.p(0, 0)
  43. end
  44. if not offsetPos then
  45. logD("Mahjong3DHandCard:getCardPosition", "viewId:", self._viewId)
  46. offsetPos = cc.p(0, 0)
  47. end
  48. local x = startPos.x + (mjIndex - 1) * defaulOffsetX + offsetPos[mjIndex].x
  49. local y = startPos.y + (mjIndex - 1) * defaulOffsetY + offsetPos[mjIndex].y
  50. local dealCardNum = self:getDealHandCardNum()
  51. local isGrabCard = mjIndex == (dealCardNum + 1) -- 是否抓的那张牌
  52. if viewId == MJDefine.MyViewId then
  53. local groupCount = table.nums(self._groupNodes)
  54. if groupCount == 1 then
  55. x = x + 30
  56. elseif groupCount == 2 then
  57. x = x - 80
  58. elseif groupCount == 3 then
  59. x = x - 180
  60. elseif groupCount == 4 then
  61. x = x - 280
  62. end
  63. x = isGrabCard and (x + 10) or x
  64. elseif viewId == MJDefine.PlayerViewType.Right then
  65. y = isGrabCard and (y + 10) or y
  66. elseif viewId == MJDefine.PlayerViewType.Left then
  67. y = isGrabCard and (y - 10) or y
  68. elseif viewId == MJDefine.PlayerViewType.Top then
  69. x = isGrabCard and (x - 10) or x
  70. end
  71. return x, y
  72. end
  73. function Mahjong3DHandCard:refreshHandCardZOrder()
  74. local viewId = self:getViewId()
  75. local handCardNodes = self:getHandCardNodes() or {}
  76. for k, card in ipairs(handCardNodes) do
  77. local mjIndex = table.nums(self._groupNodes) * 3 + k
  78. local zorder = mjIndex
  79. if viewId == 1 then
  80. zorder = 14 - mjIndex
  81. elseif viewId == 2 then
  82. zorder = 7 - mjIndex
  83. zorder = zorder > 0 and -zorder or zorder
  84. else
  85. end
  86. card:setLocalZOrder(zorder)
  87. end
  88. end
  89. function Mahjong3DHandCard:createMahongOpenCard()
  90. end
  91. function Mahjong3DHandCard:createGroupCards(arg, fromViewId)
  92. for _, v in pairs(arg) do
  93. if not fromViewId then
  94. fromViewId = v.fromViewId
  95. end
  96. local startPos = self:getHandCardStartPos(self._viewId)
  97. local group = self:createGroup(v.values, v.showType, self._viewId, table.nums(self._groupNodes) + 1)
  98. if group then
  99. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].x
  100. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][#self._groupNodes + 1].y
  101. group.fromViewId = v.fromViewId ---保留触发操作的玩家位置,补杠需要
  102. group.opType = v.opType
  103. group:setPosition(cc.p(x, y))
  104. group:customRefresh(v)
  105. self:addChild(group)
  106. table.insert(self._groupNodes, group)
  107. end
  108. end
  109. self:refreshGroupZOrder()
  110. end
  111. function Mahjong3DHandCard:createGroup(values, showType, viewId, groupIndex)
  112. local group = nil
  113. if showType == MJDefine.MJGroupType.Chi then
  114. group = require(MJDefine.MJConfig_3d.GROUP_CHI):new(values, viewId, groupIndex)
  115. elseif showType == MJDefine.MJGroupType.Peng then
  116. group = require(MJDefine.MJConfig_3d.GROUP_PENG):new(values, viewId, groupIndex)
  117. elseif showType == MJDefine.MJGroupType.Gang then
  118. group = require(MJDefine.MJConfig_3d.GROUP_GANG):new(values, viewId, groupIndex)
  119. elseif showType == MJDefine.MJGroupType.AnGang then
  120. group = require(MJDefine.MJConfig_3d.GROUP_ANGANG):new(values, viewId, groupIndex)
  121. elseif showType == MJDefine.MJGroupType.BaGang then
  122. group = require(MJDefine.MJConfig_3d.GROUP_BAGANG):new(values, viewId, groupIndex)
  123. end
  124. if group and viewId == MJDefine.MyViewId then
  125. group:setLocalZOrder(4 - groupIndex)
  126. end
  127. return group
  128. end
  129. function Mahjong3DHandCard:createOpenCard(value, viewId, mjIndex)
  130. local mjType = MJDefine.MJConfig_3d.MJType.Open
  131. local mjCard = require(MJDefine.MJConfig_3d.MAHJONG_CARD):new(value, viewId, mjType, mjIndex)
  132. return mjCard
  133. end
  134. function Mahjong3DHandCard:getOpenCardPosition(mjCard, viewId, mjIndex)
  135. local offsetConfig = MJDefine.MJConfig_3d.OpenCardOffsetConfig
  136. if mjCard:getType() == MJDefine.MJConfig_3d.MJType.OpenBlack then
  137. offsetConfig = MJDefine.MJConfig_3d.OpenBlackCardOffsetConfig
  138. end
  139. local startPos = self:getHandCardStartPos(self._viewId)
  140. local x = 0
  141. local y = 0
  142. if viewId == 1 then
  143. -- 78*55
  144. local offset = offsetConfig[viewId][mjIndex]
  145. x = startPos.x + offset.x
  146. y = startPos.y + (mjIndex - 1) * 55 + offset.y
  147. elseif viewId == 2 then
  148. -- 46*53
  149. local offset = offsetConfig[viewId][mjIndex]
  150. x = startPos.x - (mjIndex - 1) * 46 + offset.x
  151. y = startPos.y + offset.y
  152. elseif viewId == 3 then
  153. -- 80*57
  154. local offset = offsetConfig[viewId][mjIndex]
  155. x = startPos.x + offset.x
  156. y = startPos.y - (mjIndex - 1) * 57 + offset.y
  157. end
  158. return x, y
  159. end
  160. function Mahjong3DHandCard:buGang(card, cardNum)
  161. local oldGroup = self:getGroup(card, {MJDefine.MJOperateType.OPREATE_BAGANG, MJDefine.MJOperateType.OPREATE_ZHIGANG, MJDefine.MJOperateType.OPREATE_ANGANG});
  162. if oldGroup then
  163. local cards = oldGroup:getCards();
  164. if cards and cards[4] then
  165. oldGroup:setCardNum(cardNum)
  166. oldGroup:customRefresh()
  167. end
  168. return ;
  169. else
  170. oldGroup=self:getGroup(card,{MJDefine.MJOperateType.OPREATE_PENG})
  171. end
  172. if not oldGroup then
  173. return
  174. end
  175. local fromViewId = oldGroup.fromViewId
  176. -- 杠牌对家,换成第四张
  177. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  178. fromViewId = 4
  179. end
  180. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  181. fromViewId = 4
  182. end
  183. local index = table.indexOf(self._groupNodes, oldGroup)
  184. table.remove(self._groupNodes, index)
  185. oldGroup:removeFromParent()
  186. local newGroup = self:createGroup({card, card, card, card}, MJDefine.MJGroupType.BaGang, self._viewId,index)
  187. if not newGroup then
  188. return
  189. end
  190. newGroup.fromViewId = fromViewId
  191. newGroup.opType = MJDefine.MJOperateType.OPREATE_BAGANG
  192. table.insert(self._groupNodes, index, newGroup)
  193. local startPos = self:getHandCardStartPos(self._viewId)
  194. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  195. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  196. newGroup:setPosition(cc.p(x, y))
  197. newGroup:customRefresh(newGroup)
  198. self:addChild(newGroup)
  199. self:refreshGroupZOrder()
  200. end
  201. --- Mahjong3DHandCard:retoreBuGang 还原补杠
  202. -- @param card 牌值
  203. -- @param cardNum 牌张数
  204. function Mahjong3DHandCard:restoreBuGang(card)
  205. local oldGroup =
  206. self:getGroup(
  207. card,
  208. {
  209. MJDefine.MJOperateType.OPREATE_BAGANG,
  210. MJDefine.MJOperateType.OPREATE_ANGANG,
  211. MJDefine.MJOperateType.OPREATE_ZHIGANG
  212. }
  213. )
  214. if not oldGroup then
  215. return
  216. end
  217. local fromViewId = oldGroup.fromViewId
  218. -- 杠牌对家,换成第四张
  219. if app.room:getMaxPlayerCount() == 2 and fromViewId ~= 0 then
  220. fromViewId = 4
  221. end
  222. if app.room:getMaxPlayerCount() == 4 and fromViewId == 2 then
  223. fromViewId = 4
  224. end
  225. local index = table.indexOf(self._groupNodes, oldGroup)
  226. table.remove(self._groupNodes, index)
  227. oldGroup:removeFromParent()
  228. local newGroup = self:createGroup({card, card, card}, MJDefine.MJGroupType.Peng, self._viewId, index)
  229. if not newGroup then
  230. return
  231. end
  232. newGroup.fromViewId = fromViewId
  233. newGroup.opType = MJDefine.MJOperateType.OPREATE_PENG
  234. local startPos = self:getHandCardStartPos(self._viewId)
  235. local x = startPos.x + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].x
  236. local y = startPos.y + MJDefine.MJConfig_3d.GroupOffsetConfig[self._viewId][index].y
  237. newGroup:setPosition(cc.p(x, y))
  238. self:addChild(newGroup)
  239. table.insert(self._groupNodes, index, newGroup)
  240. self:refreshGroupZOrder()
  241. end
  242. function Mahjong3DHandCard:refreshGroupZOrder()
  243. for k, v in ipairs(self._groupNodes) do
  244. if self:getViewId() == MJDefine.PlayerViewType.Right then
  245. v:setLocalZOrder(table.nums(self._groupNodes) - k)
  246. else
  247. v:setLocalZOrder(k)
  248. end
  249. end
  250. end
  251. ---
  252. -- 获取手牌起始位置,3d必须重写
  253. -- @param viewId 玩家本地座位
  254. --
  255. function Mahjong3DHandCard:getHandCardStartPos(viewId)
  256. local pos = MJDefine.MJConfig_3d.HandCardStartPos[viewId]
  257. if MJDefine.MJConfig_3d.HandCardStartPosOfCardNum then
  258. local cardNum = self:getDealHandCardNum()
  259. pos = MJDefine.MJConfig_3d.HandCardStartPosOfCardNum[cardNum][viewId]
  260. end
  261. return pos
  262. end
  263. ---
  264. -- 获取手牌偏移位置,3d必须重写
  265. -- @param viewId 玩家本地座位
  266. --
  267. function Mahjong3DHandCard:getHandCardOffestPos(viewId)
  268. return MJDefine.MJConfig_3d.HandCardOffsetPos[viewId]
  269. end
  270. ---
  271. -- 获取组合牌偏移位置,3d必须重写
  272. -- @param viewId 玩家本地座位
  273. --
  274. function Mahjong3DHandCard:getGroupOffsetConfig(viewId)
  275. return MJDefine.MJConfig_3d.GroupOffsetConfig[viewId]
  276. end
  277. -- 刷新手牌,3d重写,刷新手牌时候还要刷新它的旋转位置
  278. function Mahjong3DHandCard:resetHandCards()
  279. self:sortHandCards()
  280. local startIndex = table.nums(self._groupNodes) * 3
  281. for cardIndex, card in ipairs(self._handCardNodes) do
  282. local newCardIndex = startIndex + cardIndex
  283. local x, y = self:getCardPosition(card, self._viewId, newCardIndex)
  284. if self._viewId ~= MJDefine.MyViewId and self._isReplay then
  285. x, y = self:getOpenCardPosition(card, self._viewId, newCardIndex)
  286. end
  287. card:setPosition(cc.p(x, y))
  288. card:setMJIndex(newCardIndex)
  289. card:updateOpenCardFacePosition()
  290. if self._viewId ~= 4 then
  291. -- 重新排序,手牌可能乱了,需要重新设置一下手牌的背景
  292. card:initBackImage()
  293. end
  294. end
  295. self:refreshHandCardZOrder()
  296. end
  297. return Mahjong3DHandCard