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.

529 regels
16 KiB

  1. local PdkCardNode = require("pk_paodekuai.luaScript.Views.Room.Node.PdkCardNode")
  2. local PdkRoomViewConfig = require("pk_paodekuai.luaScript.Views.Room.PdkRoomViewConfig")
  3. local ETS = PdkRoomViewConfig.EffectType
  4. local PdkEffectHelper = require("pk_paodekuai.luaScript.Views.Room.PdkEffectHelper"):new()
  5. local PdkSoundHelper = require("pk_paodekuai.luaScript.Views.Room.PdkSoundHelper"):new()
  6. local PlayerNode = class("PlayerNode", function ()
  7. return cc.Node:create()
  8. end)
  9. local PdkSoundHelper = require("pk_paodekuai.luaScript.Views.Room.PdkSoundHelper"):new()
  10. function PlayerNode:ctor()
  11. local ui = loadUI("pk_paodekuai/res/ui/ui_room/ui_pdk_playernode.ui")
  12. self.ui = ui
  13. self:addChild(ui)
  14. self.txtNickname = self.ui.Items.name
  15. self.imgHead = self.ui.Items.headImg
  16. self.imgBanker = self.ui.Items.banker
  17. self.imgOffline = self.ui.Items.offLine
  18. self.imgReady = self.ui.Items.readyState
  19. self.txtCurScore = self.ui.Items.score
  20. self.txtCurScore.score = 0
  21. self.imgHost = self.ui.Items.imgHost
  22. self.imgTurn = self.ui.Items.ImageView_turn
  23. self.imgOfflineTime = self.ui.Items.ImageView_txkYY
  24. self.ui.Items.ImageView_alarm:setVisible(false)
  25. -- self.txtTotalScore = self.ui.Items.totalScore
  26. self.ui:setLocalZOrder(10000)
  27. self.clockTimer = nil
  28. self.nGameInfo = ""
  29. self.imgTuoGuan = self.ui.Items.ImageView_tuoguan
  30. end
  31. function PlayerNode:setGameInfo(str)
  32. self.nGameInfo = str
  33. end
  34. function PlayerNode:setPlayMode( mode )
  35. self._PlayMode = mode
  36. end
  37. -- 房间最大玩家数
  38. function PlayerNode:setMaxPlayerCount( count )
  39. self.nMaxPlayCount = count
  40. end
  41. -- 是否显示牌张数
  42. function PlayerNode:setShowNum( is )
  43. self.ruleIsShowNum = is
  44. end
  45. -- 设置玩家信息
  46. function PlayerNode:setInfo( info )
  47. self._info = info
  48. local nickname = info.nickname or ""
  49. self.txtNickname:setString(getSubStringNickname(nickname))
  50. setPlayerHeadImage(info.userId, info.headimgurl, self.imgHead)
  51. --
  52. self:setScore(0)
  53. self:setOffline(false)
  54. self:setBanker(false)
  55. self:setReady(false)
  56. self:setHost(false)
  57. self:setTurn(false)
  58. self:setOfflineTime(false)
  59. self:setTuoGuan(false)
  60. self:hideLeft()
  61. if info.viewPos == 2 then --and self.nMaxPlayCount==3
  62. self.imgReady:setPosition(cc.p(-54, 78))
  63. self.imgTurn:setPosition(cc.p(-55, 169))
  64. self.ui.Items.ImageView_alarm:setPosition(0, 137)
  65. self.ui.Items.imgLeft:setPosition(cc.p(68, 168))
  66. self.ui.Items.txtLeftNum:setPosition(cc.p(68, 168))
  67. elseif info.viewPos == 1 then
  68. -- local ps = self.imgReady:getPosition()
  69. -- local dlt = 1270/2
  70. -- ps.x = dlt
  71. -- ps.y = 180
  72. -- self.imgReady:setPosition(ps)
  73. local ruleInfo = json.decode(self.nGameInfo or "") or {}
  74. if ruleInfo.allowPass and ruleInfo.allowPass > 0 then
  75. self.imgTurn:setPosition(cc.p(260, 265))
  76. else
  77. self.imgTurn:setPosition(cc.p(360, 265))
  78. end
  79. self.imgTurn:setScale(1)
  80. end
  81. end
  82. -- 获取玩家信息
  83. function PlayerNode:getInfo()
  84. return self._info
  85. end
  86. -- 设置最后一组操作牌
  87. function PlayerNode:setLastOp( tp, cards, isContinue )
  88. self._lastOp = {}
  89. self._lastOp.tp = tp
  90. self._lastOp.cards = cards
  91. if tp~=ETS.PASS then
  92. self:showLastCards(self._lastOp.cards, self._lastOp.tp, isContinue)
  93. else
  94. self:showPass()
  95. end
  96. end
  97. function PlayerNode:isShowPass()
  98. if self._lastOp then
  99. return self._lastOp.tp==ETS.PASS
  100. end
  101. return false
  102. end
  103. -- 显示牌背
  104. function PlayerNode:showCardbg(is)
  105. end
  106. -- 显示Pass
  107. function PlayerNode:showPass()
  108. self:cleanLastCards()
  109. local ruleInfo = json.decode(self.nGameInfo)
  110. local fileName = ""
  111. --开房参数1:可不要时,0:必须要
  112. if ruleInfo.allowPass and ruleInfo.allowPass == 1 then
  113. --可不要时显示不出,必须要时显示要不起
  114. fileName = "pdk_zi_buchu.png"
  115. else
  116. fileName = "pdk_zi_yaobuqi.png"
  117. end
  118. local node = cc.ImageView:create()
  119. node:loadTexture(fileName, 1)
  120. node:setTag(2000)
  121. local pos = self._info.viewPos
  122. local pt = clone(PdkRoomViewConfig.PASS_SHOW_POS[self._PlayMode][pos])
  123. node:setPosition(pt)
  124. node:setLocalZOrder(1000)
  125. node:setScale(0)
  126. self:addChild(node)
  127. node:runAction(cc.ScaleTo:create(0.1, 1))
  128. local pInfo = self:getInfo()
  129. local sex = pInfo.sex
  130. local idx = math.random(4)
  131. PdkSoundHelper:effectPass( sex, idx )
  132. end
  133. -- 显示出牌
  134. function PlayerNode:showLastCards(cards, tp, isContinue)
  135. self:cleanLastCards()
  136. local root = cc.Node:create()
  137. local scale = PdkRoomViewConfig.CARD_SCALE[2]
  138. local allCount = #cards
  139. local pos = self._info.viewPos
  140. local firstPos = cc.p(0, 0)
  141. for i,card in ipairs(cards) do
  142. local node = self:genCard(card)
  143. local pt = cc.p(0, 0)
  144. if pos == 1 then
  145. local midIdx = allCount/2
  146. if i<midIdx then--左边
  147. pt.x = 0 - (midIdx-i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  148. else--右边
  149. pt.x = 0 + (i-midIdx+1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  150. end
  151. pt.x = pt.x - PdkRoomViewConfig.CARD_WIDTH/2*scale
  152. pt.x = pt.x + PdkRoomViewConfig.NEW_SHOW_CARD_POS[self._PlayMode][pos].x - PdkRoomViewConfig.PLAYER_POS[self._PlayMode][pos].x
  153. pt.y = PdkRoomViewConfig.NEW_SHOW_CARD_POS[self._PlayMode][pos].y - PdkRoomViewConfig.PLAYER_POS[self._PlayMode][pos].y
  154. if i==1 then firstPos = pt end
  155. else
  156. if pos == 2 then --self._PlayMode == 1 and
  157. node:setLocalZOrder(16-i)
  158. pt.x = pt.x - (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  159. pt.x = pt.x + PdkRoomViewConfig.NEW_SHOW_CARD_POS[self._PlayMode][pos].x
  160. if i==1 then firstPos = pt end
  161. else
  162. pt.x = pt.x + (i-1)*PdkRoomViewConfig.CARD_DLT_WIDTH*scale
  163. pt.x = pt.x + PdkRoomViewConfig.NEW_SHOW_CARD_POS[self._PlayMode][pos].x - self.imgHead:getContentSize().width - 10
  164. if i==1 then firstPos = pt end
  165. end
  166. end
  167. node:setScale(scale)
  168. node:setPosition(pt)
  169. root:addChild(node)
  170. end
  171. root:setTag(1001)
  172. self:addChild(root)
  173. local dltWidth = ((#cards-1)*PdkRoomViewConfig.CARD_DLT_WIDTH + PdkRoomViewConfig.CARD_WIDTH) * PdkRoomViewConfig.CARD_SCALE[2]
  174. local pt = cc.p(firstPos.x,firstPos.y-30)
  175. if pos==2 then
  176. pt.x = pt.x - dltWidth/2 + PdkRoomViewConfig.CARD_WIDTH * PdkRoomViewConfig.CARD_SCALE[2]/2
  177. else
  178. pt.x = pt.x + dltWidth/2 - PdkRoomViewConfig.CARD_WIDTH * PdkRoomViewConfig.CARD_SCALE[2]/2
  179. end
  180. self:showEffect(root, cards, tp, pt, isContinue, dltWidth )
  181. end
  182. -- 清除出牌
  183. function PlayerNode:cleanLastCards()
  184. do
  185. local node = self:getChildByTag(1001)
  186. if node then node:removeFromParent() end
  187. end
  188. self:cleanPass()
  189. end
  190. function PlayerNode:cleanPass()
  191. do
  192. local node = self:getChildByTag(2000)
  193. if node then node:removeFromParent() end
  194. end
  195. end
  196. -- 显示剩余牌数量
  197. function PlayerNode:showLeft( num )
  198. self.ui.Items.ImageView_alarm:setVisible(num == 1)
  199. if num == 1 then--报单
  200. self.ui.Items.imgLeft:setVisible(true)
  201. self.ui.Items.txtLeftNum:setVisible(true)
  202. self.ui.Items.txtLeftNum:setString(string.format("%d", num or 0))
  203. self.ui.Items.imgLeft:loadTexture("pdk_game_img_warn.png", 1)
  204. self.ui.Items.ImageView_alarm:stopAllActions()
  205. self.ui.Items.ImageView_alarm:setRotation(0)
  206. local ac = cc.Sequence:create(cc.RotateBy:create(0.1, 30/180), cc.RotateBy:create(0.2, -60/180), cc.RotateBy:create(0.1, 30/180))
  207. self.ui.Items.ImageView_alarm:runAction(cc.RepeatForever:create(cc.Sequence:create(ac, ac:clone(), cc.DelayTime:create(1))))
  208. else
  209. self.ui.Items.imgLeft:setVisible(true)
  210. self.ui.Items.txtLeftNum:setVisible(true)
  211. self.ui.Items.imgLeft:loadTexture("pdk_game_img_leftbg.png", 1)
  212. end
  213. if not self.ruleIsShowNum then
  214. self.ui.Items.imgLeft:setVisible(false)
  215. self.ui.Items.txtLeftNum:setVisible(false)
  216. else
  217. local show = true
  218. if self._info.viewPos == 1 then show = false end
  219. self.ui.Items.imgLeft:setVisible(show)
  220. self.ui.Items.txtLeftNum:setVisible(show)
  221. self.ui.Items.txtLeftNum:setString(string.format("%d", num or 0))
  222. end
  223. end
  224. -- 是否报单
  225. function PlayerNode:isAlarm()
  226. return self.ui.Items.ImageView_alarm:isVisible()
  227. end
  228. -- 隐藏剩余拍数量
  229. function PlayerNode:hideLeft()
  230. self.ui.Items.imgLeft:setVisible(false)
  231. self.ui.Items.txtLeftNum:setVisible(false)
  232. self.ui.Items.ImageView_alarm:setVisible(false)
  233. end
  234. -- 设置分数 remove飘的分数是否移除
  235. function PlayerNode:setScore( scol, remove ,turnScore)
  236. if remove == nil then remove = true end
  237. --local dlt = scol - self.txtCurScore.score
  238. local dlt = (scol - self.txtCurScore.score)
  239. local curScol = tonumber(self.txtCurScore:getString())
  240. if curScol and curScol ~= self.txtCurScore.score then
  241. logD("PlayerNode:setScore ================curScol = "..curScol)
  242. dlt = scol - curScol
  243. --uploadLogs("lzpdkfenshucuowu")
  244. end
  245. logD("PlayerNode:setScore ================scol = "..scol.."self.txtCurScore.score = "..self.txtCurScore.score)
  246. if turnScore then
  247. logD("PlayerNode:setScore ================turnScore = "..turnScore)
  248. dlt = turnScore
  249. end
  250. if math.abs(dlt) > 0 then
  251. local txt = cc.TextBMFont:createNode()
  252. if dlt > 0 then
  253. txt:setFntFile("res/fonts/dt_jia_num.fnt")
  254. txt:setString(string.format("+%0.1f", dlt))
  255. else
  256. txt:setFntFile("res/fonts/dt_jian_num.fnt")
  257. txt:setString(string.format("%0.1f", dlt))
  258. end
  259. txt:setScale(0.7)
  260. txt:setTag(166)
  261. txt:setLocalZOrder(10001)
  262. self:addChild(txt)
  263. local ac = cc.Sequence:create(cc.Spawn:create(cc.MoveBy:create(1, cc.p(0, 100))), cc.CallFunc:create(function ()
  264. self.txtCurScore:setString(string.format("%0.1f", scol or 0))
  265. self.txtCurScore.score = scol
  266. if remove then txt:removeFromParent() end
  267. end))
  268. txt:runAction(ac)
  269. else
  270. self.txtCurScore:setString(string.format("%0.1f", scol or 0))
  271. self.txtCurScore.score = scol
  272. end
  273. end
  274. function PlayerNode:setScoreNoAnim( scol)
  275. self.txtCurScore:setString(string.format("%0.1f", scol or 0))
  276. self.txtCurScore.score = scol
  277. end
  278. -- 移除飘的分数
  279. function PlayerNode:cleanScore()
  280. local node = self:getChildByTag(166)
  281. if node then node:removeFromParent() end
  282. end
  283. -- 设置总分数
  284. function PlayerNode:setTotalScore( scol )
  285. -- self.txtTotalScore:setString(string.format("%d", scol or 0))
  286. end
  287. -- 设置是否离线
  288. function PlayerNode:setOffline( is )
  289. self.imgOffline:setVisible(is==true)
  290. end
  291. -- 设置离线时间
  292. function PlayerNode:setOfflineTime(is,ptime)
  293. self.imgOfflineTime:setVisible(is == true)
  294. if is == true and ptime then
  295. local ttime = os.date("%M:%S",ptime)
  296. self.ui.Items.Text_offLineTime:setText(ttime)
  297. --关闭定时器
  298. if self.Time then
  299. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.Time)
  300. self.Time = nil
  301. end
  302. --当前已离线多长时间
  303. self.curOfftime = ptime
  304. self.Time = cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
  305. self.curOfftime = self.curOfftime + 1
  306. if self.curOfftime > 300 then--大于5分钟,恒定显示5分钟
  307. self.curOfftime = 300
  308. end
  309. if not tolua.isnull(self.ui.Items.Text_offLineTime) then
  310. local time = os.date("%M:%S",self.curOfftime)
  311. self.ui.Items.Text_offLineTime:setText(time)
  312. else
  313. if self.Time then
  314. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.Time)
  315. self.Time = nil
  316. end
  317. end
  318. end,1.0,false)
  319. else
  320. if self.Time then
  321. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.Time)
  322. self.Time = nil
  323. end
  324. end
  325. end
  326. -- 设置是否是房主
  327. -- 头像不显示房主图标,edit @ 2019-08-26
  328. function PlayerNode:setHost( is )
  329. -- self.imgHost:setVisible(is==true)
  330. self.imgHost:setVisible(false)
  331. end
  332. -- 设置是否是庄家
  333. function PlayerNode:setBanker( is )
  334. self.imgBanker:setVisible(is==true)
  335. end
  336. -- 设置是否准备
  337. function PlayerNode:setReady( is )
  338. self.imgReady:setVisible(is==true)
  339. end
  340. -- 设置轮次时钟
  341. function PlayerNode:setTurn( is, time )
  342. if is then
  343. if self.clockTimer then
  344. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.clockTimer)
  345. self.clockTimer = nil
  346. end
  347. self.imgTurn:setVisible(true)
  348. if self.clockTimer==nil then
  349. self.ui.Items.txtLimitTime.time = time or 10
  350. self.ui.Items.txtLimitTime:setString(string.format("%d", self.ui.Items.txtLimitTime.time))
  351. self.clockTimer = cc.Director:getInstance():getScheduler():scheduleScriptFunc(function()
  352. if self.ui.Items.txtLimitTime.time > 0 then
  353. self.ui.Items.txtLimitTime.time = self.ui.Items.txtLimitTime.time - 1
  354. if self.ui.Items.txtLimitTime.time<=5 and self._info.viewPos==1 then
  355. PdkSoundHelper:alarm()
  356. end
  357. else
  358. if self.clockTimer then
  359. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.clockTimer)
  360. self.clockTimer = nil
  361. end
  362. end
  363. self.ui.Items.txtLimitTime:setString(string.format("%d", self.ui.Items.txtLimitTime.time))
  364. end,1.0,false)
  365. end
  366. else
  367. if self.clockTimer then
  368. self.ui.Items.txtLimitTime.time = self.ui.Items.txtLimitTime.time - 1
  369. self.ui.Items.txtLimitTime:setString(string.format("%d", self.ui.Items.txtLimitTime.time))
  370. cc.Director:getInstance():getScheduler():unscheduleScriptEntry(self.clockTimer)
  371. self.clockTimer = nil
  372. end
  373. self.imgTurn:setVisible(false)
  374. end
  375. end
  376. -- 创建一张牌
  377. function PlayerNode:genCard( card )
  378. local node = PdkCardNode:new()
  379. node:setCard(card)
  380. node:setSelectedHeight(PdkRoomViewConfig.SELECTED_HEIGHT)
  381. node:setNormalHeight(PdkRoomViewConfig.NORMAL_HEIGHT)
  382. return node
  383. end
  384. function PlayerNode:showEffectExt( effectType )
  385. local function __show()
  386. local node = nil
  387. local pInfo = self:getInfo()
  388. local sex = pInfo.sex
  389. local pos = self._info.viewPos
  390. local pt = clone(PdkRoomViewConfig.PASS_SHOW_POS[self._PlayMode][pos])
  391. if effectType == ETS.PASS then
  392. local cb = function ()
  393. self:setTurn(false)
  394. end
  395. node = PdkEffectHelper:getPass(cb)
  396. local idx = math.random(4)
  397. PdkSoundHelper:effectPass( sex, idx )
  398. end
  399. if node then
  400. node:setPosition(pt)
  401. node:setLocalZOrder(1000)
  402. self:addChild(node)
  403. if node.onEnter and type(node.onEnter)=='function' then
  404. node:onEnter()
  405. end
  406. end
  407. end
  408. self.ui:runAction(cc.Sequence:create(cc.DelayTime:create(1), cc.CallFunc:create(__show)))
  409. end
  410. -- 显示牌型
  411. function PlayerNode:showEffect(root, cards, effectType, pt, isContinue, dltWidth )
  412. local rate = math.random(100)
  413. local stdRate = 70
  414. isContinue = isContinue or false
  415. local viewPos = self._info.viewPos
  416. local pInfo = self:getInfo()
  417. local sex = pInfo.sex
  418. local node = nil
  419. local clintTp = PokerUtil:checkType(cards)
  420. if effectType == ETS.PASS then
  421. local cb = function ()
  422. self:setTurn(false)
  423. end
  424. node = PdkEffectHelper:getPass(cb)
  425. local idx = math.random(4)
  426. PdkSoundHelper:effectPass( sex, idx )
  427. elseif effectType == ETS.SINGLE_CARD then
  428. local _, val = pokerParse(cards[1])
  429. PdkSoundHelper:effectSingle( sex ,val )
  430. elseif effectType == ETS.DUI_ZI then
  431. local _, val = pokerParse(cards[1])
  432. if isContinue and rate >= stdRate then
  433. PdkSoundHelper:daNi( sex )
  434. else
  435. PdkSoundHelper:effectDouble( sex, val )
  436. end
  437. elseif effectType == ETS.SHUN_ZI then
  438. node = PdkEffectHelper:getShunzi()
  439. -- if viewPos==1 and node then
  440. -- node:setScale(1.2)
  441. -- end
  442. if isContinue and rate>=stdRate then
  443. PdkSoundHelper:daNi( sex )
  444. else
  445. PdkSoundHelper:effectShunzi( sex )
  446. end
  447. elseif effectType == ETS.LIAN_DUI then
  448. node = PdkEffectHelper:getLiandui()
  449. if isContinue and rate>=stdRate then
  450. PdkSoundHelper:daNi( sex )
  451. else
  452. PdkSoundHelper:effectLiandui( sex )
  453. end
  454. elseif effectType == ETS.THREE_AND_TWO then
  455. --根据牌获取是否是三带一或三个
  456. local tp = PokerUtil:checkType(cards)
  457. if tp == ETS.THREE_AND_ONE then
  458. node = PdkEffectHelper:getSandaiyi()
  459. PdkSoundHelper:effect3And1( sex )
  460. elseif tp == ETS.THREE_AND_TWO then
  461. node = PdkEffectHelper:getSandaier()
  462. if isContinue and rate>=stdRate then
  463. PdkSoundHelper:daNi( sex )
  464. else
  465. PdkSoundHelper:effect3And2( sex )
  466. end
  467. elseif tp == ETS.THREE then
  468. local _, val = pokerParse(cards[1])
  469. PdkSoundHelper:effectThree( sex, val )
  470. end
  471. elseif effectType == ETS.FOUR_AND_THREE then
  472. node = PdkEffectHelper:getSidaisan()
  473. PdkSoundHelper:effect4And3( sex )
  474. elseif effectType == ETS.FOUR_AND_TWO or clintTp == ETS.FOUR_AND_TWO then
  475. node = PdkEffectHelper:getSidaier()
  476. PdkSoundHelper:effect4And2( sex )
  477. elseif effectType == ETS.BOMB then
  478. node = PdkEffectHelper:getBomb()
  479. pt.y = pt.y + 100
  480. PdkSoundHelper:effectBomb( sex )
  481. elseif effectType == ETS.AIRPLANE then
  482. node = PdkEffectHelper:getPlan()
  483. PdkSoundHelper:effectPlane( sex )
  484. elseif effectType == ETS.FOUR_AND_ONE then --四带一
  485. node = PdkEffectHelper:getSidaiyi()
  486. PdkSoundHelper:effect4And1( sex )
  487. elseif effectType == ETS.SPRING_HUA then
  488. node = PdkEffectHelper:getSpring()
  489. end
  490. if node then
  491. if effectType == ETS.SHUN_ZI then
  492. pt.x = pt.x - (dltWidth/2+100)
  493. end
  494. node:setPosition(pt)
  495. node:setLocalZOrder(1000)
  496. root:addChild(node)
  497. if node.onEnter and type(node.onEnter)=='function' then
  498. node:onEnter()
  499. end
  500. end
  501. end
  502. -- 设置是否是托管
  503. function PlayerNode:setTuoGuan( is )
  504. self.imgTuoGuan:setVisible(is==true)
  505. end
  506. return PlayerNode