LevelLayer.ts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. import { find, instantiate, macro, Node, ScrollView, sp, Sprite, tween, Tween, UITransform, v2, _decorator } from 'cc';
  2. import { BaseLayer } from '../../common/BaseLayer';
  3. import { cocosUtil } from '../../utils/cocosUtil';
  4. import { utilTools } from '../../utils/utilTools';
  5. import { constants } from '../data/constants';
  6. import { msgac } from '../data/msgac';
  7. import { ItemLayer } from '../item/ItemLayer';
  8. import { designManager } from '../manager/designManager';
  9. import { eventManager } from '../manager/eventManager';
  10. import { iconManager } from '../manager/iconManager';
  11. import { levelManager } from '../manager/levelManager';
  12. import { sdkManager } from '../manager/sdkManager';
  13. import { playerModel } from '../model/playerModel';
  14. import { FlutterEffect } from './effect/FlutterEffect';
  15. import { ReelEffect } from './effect/ReelEffect';
  16. import { FightLayer } from './FightLayer';
  17. const { ccclass, property } = _decorator;
  18. @ccclass('LevelLayer')
  19. export class LevelLayer extends BaseLayer {
  20. listScrollView: ScrollView;
  21. listContentLayer: Node;
  22. levelLayer: Node;
  23. playerLayer: Node;
  24. skillEffectLayer: Node;
  25. hitEffectLayer: Node;
  26. btnAdAtk: Node;
  27. btnSkip: Node;
  28. levelNode: Node;
  29. level: number;
  30. handNode: Node;
  31. skillLayer: Node;
  32. fightLayer: Node;
  33. cloundLayer1: Node;
  34. cloundLayer2: Node;
  35. onLoad() {
  36. super.onLoad();
  37. this.getNodeByPath("cloundLayer").addComponent(FlutterEffect);
  38. this.getNodeByPath("moutainLayer").addComponent(ReelEffect);
  39. this.cloundLayer1 = this.getNodeByPath("list/view/content/cloundLayer1");
  40. this.cloundLayer1.addComponent(FlutterEffect).speed = 70;
  41. this.cloundLayer2 = this.getNodeByPath("list/view/content/cloundLayer2");
  42. this.cloundLayer2.addComponent(FlutterEffect).speed = 80;
  43. this.levelNode = this.getNodeByPath("level/level");
  44. this.btnAdAtk = this.getNodeByPath("btnAdAtk");
  45. this.btnSkip = this.getNodeByPath("btns/btnSkip");
  46. this.listScrollView = this.getNodeByPath("list").getComponent(ScrollView);
  47. this.listContentLayer = this.getNodeByPath("list/view/content");
  48. this.levelLayer = this.getNodeByPath("list/view/content/levelLayer");
  49. this.playerLayer = this.getNodeByPath("list/view/content/playerLayer");
  50. this.skillEffectLayer = this.getNodeByPath("list/view/content/skillEffectLayer");
  51. this.hitEffectLayer = this.getNodeByPath("hitEffectLayer");
  52. this.hitEffectLayer.addComponent(ItemLayer);
  53. this.skillLayer = this.getNodeByPath("skillLayer");
  54. this.skillLayer.addComponent(ItemLayer);
  55. this.fightLayer = this.getNodeByPath("fightLayer");
  56. this.fightLayer.addComponent(FightLayer);
  57. this.fightLayer.active = false;
  58. this.level = this.obj.level;
  59. this.initUI();
  60. }
  61. onEnable() {
  62. this.addEventArr([
  63. msgac.levelRestart,
  64. msgac.lifeBack,
  65. msgac.adjustPlayerInCenter,
  66. msgac.levelNext,
  67. msgac.levelEspSuccess,
  68. msgac.skillLayerRefresh,
  69. msgac.judgeLevelSuccess,
  70. msgac.showHitEffect,
  71. msgac.startFight,
  72. msgac.fightEnd,
  73. msgac.skillAdd,
  74. msgac.LevelLayerClose,
  75. ]);
  76. }
  77. onDisable() {
  78. this.removeEventArr([
  79. msgac.levelRestart,
  80. msgac.lifeBack,
  81. msgac.adjustPlayerInCenter,
  82. msgac.levelNext,
  83. msgac.levelEspSuccess,
  84. msgac.skillLayerRefresh,
  85. msgac.judgeLevelSuccess,
  86. msgac.showHitEffect,
  87. msgac.startFight,
  88. msgac.fightEnd,
  89. msgac.skillAdd,
  90. msgac.LevelLayerClose,
  91. ]);
  92. }
  93. initUI() {
  94. this.initEffect();
  95. this.initSkillLayer();
  96. this.schedule(() => {
  97. let arr = this.skillLayer.children;
  98. for (let i in arr) {
  99. let node = arr[i];
  100. Tween.stopAllByTarget(node);
  101. node.setRotationFromEuler(0, 0, 0);
  102. }
  103. let pNode = utilTools.getRandomItemByArr(arr);
  104. cocosUtil.tweenShake(pNode, 0.1, 0, 0);
  105. }, 0.4 * 5, macro.REPEAT_FOREVER, 0);
  106. this.loadLevelLayer();
  107. }
  108. initSkillLayer() {
  109. let arr = designManager.instance.getTable(constants.tableName.skill);
  110. let tmpArr = [];
  111. for (let i in arr) {
  112. let row = arr[i];
  113. if (this.level % 2 == 0) {
  114. if (row.id == 1 || row.id == 3) {
  115. tmpArr.push(row);
  116. }
  117. continue;
  118. }
  119. if (row.id == 2 || row.id == 4) {
  120. tmpArr.push(row);
  121. }
  122. }
  123. arr = tmpArr;
  124. this.skillLayer.getComponent(ItemLayer).initUI(this, arr, this.refreshSkillItem.bind(this));
  125. }
  126. refreshSkillItem(itemUI: Node, row: any) {
  127. let numNode = find("num", itemUI);
  128. let adNode = find("ad", itemUI);
  129. let iconNode = find("icon", itemUI);
  130. let skill = playerModel.instance.getSkillById(row.id);
  131. iconManager.instance.setSprite(iconNode, row.icon);
  132. if (skill.num > 0) {
  133. numNode.active = true;
  134. adNode.active = false;
  135. this.setString(numNode, "x" + skill.num);
  136. } else {
  137. numNode.active = false;
  138. adNode.active = true;
  139. }
  140. }
  141. initLocaltext() {
  142. this.setString(this.levelNode, this.level);
  143. }
  144. initEffect() {
  145. cocosUtil.tweenShake(this.btnAdAtk);
  146. cocosUtil.tweenShake(this.btnSkip);
  147. }
  148. loadLevelLayer() {
  149. this.initLocaltext();
  150. this.cloundLayer1.active = false;
  151. this.cloundLayer2.active = false;
  152. sdkManager.instance.sendEventLevelStart(this.level);
  153. levelManager.instance.loadLevel(this.level, () => { }, (err, prefab) => {
  154. // 关卡UI生成
  155. for (let i in this.levelLayer.children) {
  156. this.levelLayer.children[i].destroy();
  157. }
  158. let node = instantiate(prefab);
  159. node.parent = this.levelLayer;
  160. cocosUtil.setPositionY(node, 0);
  161. // 设置视图滚动高度
  162. let listContentTf = this.listContentLayer.getComponent(UITransform);
  163. let levelTf = node.getComponent(UITransform);
  164. listContentTf.height = levelTf.height;
  165. // 从UI中初始化关卡数据
  166. levelManager.instance.initLevelLayer(this.level, node, this);
  167. // 初始化玩家
  168. for (let i in this.playerLayer.children) {
  169. this.playerLayer.children[i].destroy();
  170. }
  171. levelManager.instance.initRolePlayer(this.playerLayer);
  172. this.listScrollView.scrollToBottom(1);
  173. // 新手引导
  174. this.refreshHandLayer();
  175. // 随机云位置
  176. this.initCloundLayer();
  177. this.initSkillLayer();
  178. });
  179. if (this.level >= levelManager.instance.shopSecretLevelMin) {
  180. // 弹出神秘商店
  181. let obj: any = {};
  182. obj.type = constants.shopTypes.secret;
  183. this.openLayer(constants.layers.ShopLayer, obj);
  184. }
  185. }
  186. initCloundLayer() {
  187. this.cloundLayer1.active = true;
  188. this.cloundLayer2.active = true;
  189. let height = this.listContentLayer.getComponent(UITransform).height;
  190. let gap = 200;
  191. let maxY = height - gap;
  192. let minY = gap;
  193. let midY = (minY + maxY) * 0.5;
  194. let posY = utilTools.getFloatValue(midY, maxY);
  195. let clound = this.cloundLayer1.children[0];
  196. let pos = clound.getPosition();
  197. pos.y = -posY;
  198. clound.setPosition(pos);
  199. posY = utilTools.getFloatValue(minY, midY);
  200. clound = this.cloundLayer2.children[0];
  201. pos = clound.getPosition();
  202. pos.y = -posY;
  203. clound.setPosition(pos);
  204. }
  205. refreshHandLayer() {
  206. if (this.level != 1 || playerModel.instance.getHandShow()) {
  207. return;
  208. }
  209. if (this.handNode) {
  210. this.removeHandLayer();
  211. }
  212. let floorLayer = levelManager.instance.floorLayerObj[1];
  213. let firstMonster = floorLayer.children[0].children[0];
  214. cocosUtil.addHand(firstMonster, this.node, (handNode) => {
  215. // 根据实际情况再进行微调
  216. let pos = handNode.getPosition();
  217. pos.x += 40;
  218. pos.y -= 10;
  219. handNode.setPosition(pos);
  220. handNode["attachNode"] = firstMonster;
  221. this.handNode = handNode;
  222. });
  223. }
  224. removeHandLayer() {
  225. this.handNode.destroy();
  226. this.handNode = null;
  227. }
  228. levelRestartRet(data: any) {
  229. this.loadLevelLayer();
  230. }
  231. lifeBackRet(data: any) {
  232. levelManager.instance.playerBackLife();
  233. }
  234. adjustPlayerInCenterRet(data: any) {
  235. let playerNode = levelManager.instance.playerRoleItem.node;
  236. let pos = cocosUtil.convertToWorldSpace(playerNode);
  237. pos = cocosUtil.convertToNodeSpace(this.playerLayer, pos);
  238. let maxOffset = this.listScrollView.getMaxScrollOffset();
  239. let playerNodeTf = playerNode.getComponent(UITransform);
  240. let dy = Math.abs(pos.y) - playerNodeTf.height * (1 - playerNodeTf.anchorY);
  241. let offsetY = dy - this.listScrollView.node.getComponent(UITransform).height * 0.5;
  242. if (offsetY < 0) {
  243. offsetY = 0;
  244. }
  245. if (offsetY > maxOffset.y) {
  246. offsetY = maxOffset.y;
  247. }
  248. let offset = this.listScrollView.getScrollOffset();
  249. if (Math.abs(offset.y - offsetY) <= 50) {
  250. // 微量移动位置,就不跟随了
  251. return;
  252. }
  253. this.listScrollView.scrollToOffset(v2(0, offsetY), 0.6);
  254. }
  255. levelNextRet(data) {
  256. this.level = playerModel.instance.getLevel();
  257. this.loadLevelLayer();
  258. }
  259. levelEspSuccessRet(data) {
  260. this.closeLayer();
  261. let obj: any = {};
  262. obj.openLevelEspSelectLayer = true;
  263. this.openLayer(constants.layers.StartLayer, obj);
  264. };
  265. skillLayerRefreshRet(data) {
  266. this.skillLayer.getComponent(ItemLayer).refreshUI();
  267. }
  268. judgeLevelSuccessRet(data) {
  269. levelManager.instance.judgeLevelSuccess();
  270. }
  271. showHitEffectRet(data: any) {
  272. this.hitEffectLayer.getComponent(ItemLayer).addItem(data, this.refreshEffectItem.bind(this));
  273. }
  274. refreshEffectItem(itemUI: Node, data: any) {
  275. let skeleton = itemUI.getComponent(sp.Skeleton);
  276. skeleton.setAnimation(0, "hit1", false);
  277. itemUI.setPosition(cocosUtil.convertToNodeSpace(itemUI, data.pos));
  278. skeleton.setEndListener(() => {
  279. this.hitEffectLayer.getComponent(ItemLayer).removeItemUIByItemUI(itemUI);
  280. });
  281. }
  282. startFightRet(data: any) {
  283. this.fightLayer.active = true;
  284. this.fightLayer.getComponent(FightLayer).loadFightData(data);
  285. if (this.handNode) {
  286. this.handNode.active = false;
  287. }
  288. }
  289. fightEndRet(data: any) {
  290. if (this.handNode) {
  291. this.handNode.active = true;
  292. }
  293. if (!data.isWin) {
  294. data.name = constants.layers.GameContinueLayer.name;
  295. data.nextLayerName = constants.layers.FightFailLayer.name;
  296. eventManager.instance.send(msgac.openLayer, data);
  297. }
  298. }
  299. skillAddRet(data: any) {
  300. let node = new Node();
  301. node.addComponent(Sprite);
  302. let row = designManager.instance.getRowById(constants.tableName.skill, data.skillId);
  303. iconManager.instance.setSprite(node, row.icon);
  304. node.parent = this.node;
  305. let pos = cocosUtil.convertToNodeSpace(node, data.pos);
  306. node.setPosition(pos);
  307. node.getComponent(UITransform).width = 100;
  308. node.getComponent(UITransform).height = 100;
  309. let itemnUI = this.skillLayer.getComponent(ItemLayer).idItemUIObj[row.id];
  310. let posTarget = cocosUtil.convertToWorldSpace(itemnUI);
  311. posTarget = cocosUtil.convertToNodeSpace(node, posTarget);
  312. tween(node).to(0.5, {
  313. position: posTarget
  314. }).call(() => {
  315. node.destroy();
  316. this.skillLayer.getComponent(ItemLayer).refreshItemUIById(row.id);
  317. }).start();
  318. }
  319. LevelLayerCloseRet(data: any) {
  320. this.closeLayer();
  321. }
  322. process_event(event: any) {
  323. let ac = event.ac;
  324. let data = event.data;
  325. switch (ac) {
  326. case msgac.LevelLayerClose:
  327. this.LevelLayerCloseRet(data);
  328. break;
  329. case msgac.skillAdd:
  330. this.skillAddRet(data);
  331. break;
  332. case msgac.fightEnd:
  333. this.fightEndRet(data);
  334. break;
  335. case msgac.startFight:
  336. this.startFightRet(data);
  337. break;
  338. case msgac.showHitEffect:
  339. this.showHitEffectRet(data);
  340. break;
  341. case msgac.judgeLevelSuccess:
  342. this.judgeLevelSuccessRet(data);
  343. break;
  344. case msgac.skillLayerRefresh:
  345. this.skillLayerRefreshRet(data);
  346. break;
  347. case msgac.levelEspSuccess:
  348. this.levelEspSuccessRet(data);
  349. break;
  350. case msgac.levelNext:
  351. this.levelNextRet(data);
  352. break;
  353. case msgac.adjustPlayerInCenter:
  354. this.adjustPlayerInCenterRet(data);
  355. break;
  356. case msgac.lifeBack:
  357. this.lifeBackRet(data);
  358. break;
  359. case msgac.levelRestart:
  360. this.levelRestartRet(data);
  361. break;
  362. default:
  363. break;
  364. }
  365. }
  366. onButtonClick(node: Node, name: string) {
  367. if (name.length > 5 && name.substring(0, 5) == "role_") {
  368. this.onClickRoleItem(node);
  369. return;
  370. }
  371. switch (name) {
  372. case "skillItem":
  373. this.onClickSkillItem(node);
  374. break;
  375. case "btnAdAtk":
  376. this.onClickBtnAdAtk(node);
  377. break;
  378. case "btnReset":
  379. this.onClickBtnReset(node);
  380. break;
  381. case "btnBack":
  382. this.onClickBtnBack(node);
  383. break;
  384. case "btnSkip":
  385. this.onClickBtnSkip(node);
  386. break;
  387. default:
  388. break;
  389. }
  390. }
  391. onClickSkillItem(node) {
  392. if (this["skilling"]) {
  393. return;
  394. }
  395. let skill = playerModel.instance.getSkillById(node.item.id);
  396. if (skill.num <= 0) {
  397. let row = designManager.instance.getRowById(constants.tableName.skill, skill.id);
  398. sdkManager.instance.sendEvent("观看激励视频-获取" + row.name);
  399. sdkManager.instance.openAd((st: number) => {
  400. if (st != 1) {
  401. return;
  402. }
  403. playerModel.instance.addSkillNumById(skill.id);
  404. this.skillLayer.getComponent(ItemLayer).refreshItemUIByItem(node.item);
  405. sdkManager.instance.sendEvent("观看完激励视频-获取" + row.name);
  406. });
  407. return;
  408. }
  409. this["skilling"] = true;
  410. levelManager.instance.useSkillId(skill.id, this.skillEffectLayer, () => {
  411. delete this["skilling"];
  412. });
  413. this.skillLayer.getComponent(ItemLayer).refreshItemUIByItem(node.item);
  414. }
  415. onClickBtnAdAtk(node: Node) {
  416. sdkManager.instance.sendEvent("观看激励视频-增加10点攻击");
  417. sdkManager.instance.openAd((st: number) => {
  418. if (st != 1) {
  419. return;
  420. }
  421. levelManager.instance.addAtk(levelManager.instance.levelAdAtkAddVal);
  422. sdkManager.instance.sendEvent("观看完激励视频-增加10点攻击");
  423. });
  424. }
  425. onClickBtnSkip(node: Node) {
  426. sdkManager.instance.sendEvent("观看激励视频-跳关");
  427. sdkManager.instance.openAd((st: number) => {
  428. if (st != 1) {
  429. return;
  430. }
  431. levelManager.instance.levelSkip();
  432. sdkManager.instance.sendEvent("观看完激励视频-跳关");
  433. });
  434. }
  435. onClickBtnReset(node: Node) {
  436. this.loadLevelLayer();
  437. sdkManager.instance.addLevelCount();
  438. }
  439. onClickRoleItem(node: Node) {
  440. if (this.handNode && this.handNode["attachNode"] == node) {
  441. playerModel.instance.setHandShow(1);
  442. this.removeHandLayer();
  443. }
  444. levelManager.instance.onClickRoleItem(node);
  445. }
  446. onClickBtnBack(node: Node) {
  447. this.openLayer(constants.layers.StartLayer);
  448. this.closeLayer();
  449. }
  450. }