TurnTableLayer.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. import { Color, find, instantiate, Label, Node, Quat, v3, _decorator } from 'cc';
  2. import { BaseLayer } from '../../common/BaseLayer';
  3. import { utilTools } from '../../utils/utilTools';
  4. import { constants } from '../data/constants';
  5. import { designManager } from '../manager/designManager';
  6. import { iconManager } from '../manager/iconManager';
  7. import { sdkManager } from '../manager/sdkManager';
  8. import { playerModel } from '../model/playerModel';
  9. const { ccclass, property } = _decorator;
  10. @ccclass('TurnTableLayer')
  11. export class TurnTableLayer extends BaseLayer {
  12. turnTable: Node;
  13. idAwardObj: any = {};
  14. // 奖励物品存放在圆盘上的半径点
  15. radius: number;
  16. // 快速转动的角度
  17. angleSpeed: number = 0;
  18. // 此次抽奖转动的角度
  19. angle: number = 0;
  20. // 前半段每秒转动的角度
  21. speed: number = 360;
  22. // 转盘结果奖励
  23. awardRow: any;
  24. speedCount: number = 0;
  25. angleCount: number = 0;
  26. btnFree: Node;
  27. btnAd: Node;
  28. textColor2: Color = new Color();
  29. onLoad() {
  30. super.onLoad();
  31. this.btnFree = this.getNodeByPath("info/btnFree");
  32. this.btnAd = this.getNodeByPath("info/btnAd");
  33. // this.textColor1 = "644a34";
  34. Color.fromHEX(this.textColor2, "#644a34");
  35. this.turnTable = this.getNodeByPath("info/turnTable");
  36. let awardNode = find("award", this.turnTable);
  37. this.radius = awardNode.getPosition().y;
  38. for (let i = 1; i < 6; i++) {
  39. awardNode = instantiate(awardNode);
  40. awardNode.parent = this.turnTable;
  41. }
  42. this.loadTurnTableAward();
  43. this.initUI();
  44. }
  45. loadTurnTableAward() {
  46. let tb = designManager.instance.getTable(constants.tableName.turn_table);
  47. let coinArr = [];
  48. let skillArr = [];
  49. for (let i in tb) {
  50. let row = tb[i];
  51. if (row.type == constants.turnTableAwardTypes.coin) {
  52. coinArr.push(row);
  53. } else if (row.type == constants.turnTableAwardTypes.skill) {
  54. skillArr.push(row);
  55. }
  56. }
  57. coinArr = utilTools.getRowsByWeightAndNum(coinArr, 4);
  58. skillArr = utilTools.getRowsByWeightAndNum(skillArr, 2);
  59. let arr = utilTools.randomArr(coinArr.concat(skillArr));
  60. for (let i = 0; i < arr.length; i++) {
  61. let row = arr[i];
  62. row.angle1 = i * 60;
  63. row.angle2 = (i + 1) * 60;
  64. }
  65. let chs = this.turnTable.children;
  66. for (let i = 0, len = chs.length; i < len; i++) {
  67. let awardNode = chs[i];
  68. let row = arr[i];
  69. awardNode["row"] = row;
  70. this.idAwardObj[row.id] = awardNode;
  71. // 每个奖励物品获得的权重是一样的
  72. row.weight = 1;
  73. let label = find("text", awardNode).getComponent(Label);
  74. if (i % 2 == 0) {
  75. label.color = this.textColor2;
  76. } else {
  77. label.color = Color.WHITE;
  78. }
  79. }
  80. }
  81. initUI() {
  82. this.initTurnTable();
  83. this.initBtns();
  84. }
  85. initBtns() {
  86. if (utilTools.overDay(playerModel.instance.getTurnTableFreeTime())) {
  87. this.btnFree.active = true;
  88. this.btnAd.active = false;
  89. } else {
  90. this.btnFree.active = false;
  91. this.btnAd.active = true;
  92. }
  93. }
  94. initTurnTable() {
  95. for (let i in this.idAwardObj) {
  96. let awardNode = this.idAwardObj[i];
  97. this.refreshAwardNode(awardNode);
  98. }
  99. }
  100. refreshAwardNode(awardNode: Node) {
  101. let row = awardNode["row"];
  102. let textNode = find("text", awardNode);
  103. let iconNode = find("icon", awardNode);
  104. let getNode = find("get", iconNode);
  105. switch (row.type) {
  106. case constants.turnTableAwardTypes.coin:
  107. // 金币奖励
  108. textNode.active = true;
  109. this.setString(textNode, row.p1);
  110. break;
  111. case constants.turnTableAwardTypes.skill:
  112. // 技能奖励
  113. textNode.active = false;
  114. // let skillRow = designManager.instance.getRowById(constants.tableName.skill, row.p1);
  115. // this.setString(textNode, skillRow.name);
  116. break;
  117. default:
  118. break;
  119. }
  120. iconManager.instance.setSprite(iconNode, row.icon);
  121. if (this.hasGetAward(row)) {
  122. getNode.active = true;
  123. } else {
  124. getNode.active = false;
  125. }
  126. // 计算位置和旋转
  127. let angle1 = row.angle1;
  128. let angle2 = row.angle2;
  129. let angle = (angle1 + angle2) * 0.5;
  130. // 角度转换为弧度制
  131. let rad = angle / 180 * Math.PI;
  132. let x = this.radius * Math.sin(rad);
  133. let y = this.radius * Math.cos(rad);
  134. awardNode.setPosition(x, y);
  135. let quat = new Quat();
  136. Quat.fromEuler(quat, 0, 0, -angle);
  137. awardNode.setRotation(quat);
  138. }
  139. hasGetAward(row: any) {
  140. switch (row.type) {
  141. case constants.turnTableAwardTypes.coin:
  142. case constants.turnTableAwardTypes.skill:
  143. if (playerModel.instance.getTurnTableAwardIdArr().indexOf(row.id) != -1) {
  144. return true;
  145. }
  146. break;
  147. case constants.turnTableAwardTypes.skin:
  148. break;
  149. default:
  150. break;
  151. }
  152. return false;
  153. }
  154. getAwardRowArr() {
  155. let arr = [];
  156. for (let i in this.idAwardObj) {
  157. let awardNode = this.idAwardObj[i];
  158. let row = awardNode["row"];
  159. if (this.hasGetAward(row)) {
  160. continue;
  161. }
  162. arr.push(row);
  163. }
  164. return arr;
  165. }
  166. // 开始转动圆盘
  167. startTurnTable() {
  168. if (this.angleCount > 0) {
  169. return;
  170. }
  171. // 根据权重,计算获得的奖励
  172. let row = utilTools.getRowByWeight(this.getAwardRowArr());
  173. this.awardRow = row;
  174. // 额外再需要转的角度
  175. let targetAngle = (row.angle2 + row.angle1) * 0.5;
  176. this.angle = 360 * 2 + targetAngle;
  177. this.angleSpeed = this.angle - 360;
  178. // console.log(this.angleSpeed, this.angle);
  179. this.speedCount = this.speed;
  180. this.angleCount = 1;
  181. }
  182. // 发放转盘奖励
  183. getAward() {
  184. let awardRow = this.awardRow;
  185. playerModel.instance.addTurnTableAwardId(awardRow.id);
  186. let obj: any = {};
  187. switch (awardRow.type) {
  188. case constants.turnTableAwardTypes.coin:
  189. obj.coin = awardRow.p1;
  190. break;
  191. case constants.turnTableAwardTypes.skill:
  192. obj.skillId = awardRow.p1;
  193. break;
  194. default:
  195. break;
  196. }
  197. this.openLayer(constants.layers.AwardGetLayer, obj, () => {
  198. this.refreshAwardNode(this.idAwardObj[awardRow.id]);
  199. this.checkAwardAllGet();
  200. });
  201. }
  202. checkAwardAllGet() {
  203. for (let i in this.idAwardObj) {
  204. let awardNode = this.idAwardObj[i];
  205. let row = awardNode["row"];
  206. if (!this.hasGetAward(row)) {
  207. return;
  208. }
  209. }
  210. // 已全部领取,自动重置奖励
  211. this.onClickBtnRefresh();
  212. }
  213. onButtonClick(node: Node, name: string) {
  214. switch (name) {
  215. case "btnAd":
  216. this.onClickBtnAd(node);
  217. break;
  218. case "btnRefresh":
  219. this.onClickBtnRefresh(node);
  220. break;
  221. case "btnFree":
  222. this.onClickBtnFree(node);
  223. break;
  224. case "btnClose":
  225. this.onClickBtnClose(node);
  226. break;
  227. default:
  228. break;
  229. }
  230. }
  231. onClickBtnAd(node: Node) {
  232. sdkManager.instance.sendEvent("观看激励视频-幸运转盘再抽一次");
  233. sdkManager.instance.openAd((st: number) => {
  234. if (st != 1) {
  235. return;
  236. }
  237. this.startTurnTable();
  238. sdkManager.instance.sendEvent("观看完激励视频-幸运转盘再抽一次");
  239. });
  240. }
  241. onClickBtnRefresh(node?: Node) {
  242. playerModel.instance.resetTurnTableAward();
  243. this.loadTurnTableAward();
  244. this.initTurnTable();
  245. };
  246. onClickBtnFree(node: Node) {
  247. this.startTurnTable();
  248. playerModel.instance.setTurnTableFreeTime(new Date());
  249. this.initBtns();
  250. }
  251. onClickBtnClose(node: Node) {
  252. this.closeLayer();
  253. }
  254. update(dt: number) {
  255. if (this.angleCount <= 0) {
  256. return;
  257. }
  258. let speed = 0;
  259. if (this.angleCount < this.angleSpeed) {
  260. speed = this.speed;
  261. } else {
  262. this.speedCount -= 3;
  263. speed = this.speedCount;
  264. }
  265. if (speed < 30) {
  266. speed = 30;
  267. }
  268. this.angleCount += dt * speed;
  269. if (this.angleCount > this.angle) {
  270. this.angleCount = this.angle;
  271. }
  272. this.turnTable.setRotationFromEuler(v3(0, 0, this.angleCount));
  273. if (this.angleCount >= this.angle) {
  274. this.angleCount = 0;
  275. this.getAward();
  276. }
  277. }
  278. }