FightingMediator.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. import { AnimationComponent, ButtonComponent, director, EventTouch, GraphicsComponent, instantiate, LabelComponent, loader, Node, Prefab, ProgressBarComponent, SpriteComponent, SpriteFrame, _decorator } from 'cc';
  2. import { GUIManager } from '../../../engines/gui/GUIManager';
  3. import { GUIMediator } from '../../../engines/gui/GUIMediator';
  4. import { LoadingView } from '../../../engines/loadingView/LoadingView';
  5. import { DataModelEventType } from '../../../engines/models/DataModelEventType';
  6. import { SceneManager } from '../../../engines/scenes/SceneManager';
  7. import { SoundManager } from '../../../engines/sounds/SoundManager';
  8. import { LiangLiangSDK } from '../../../libs/liangliangSDK';
  9. import GameConfigManager from '../../models/GameConfigManager';
  10. import { GameModel } from '../../models/GameModel';
  11. import { GamePropertys } from '../../models/GamePropertys';
  12. import { UIConst } from '../UIConst';
  13. import { GameController } from './GameController';
  14. import { WeaponBase } from './weapons/WeaponBase';
  15. const { ccclass, property } = _decorator;
  16. @ccclass('FightingMediator')
  17. export class FightingMediator extends GUIMediator {
  18. @property({
  19. type:GraphicsComponent
  20. })
  21. DrawingBoard:GraphicsComponent=null;
  22. @property({
  23. type:SpriteComponent
  24. })
  25. SkillIcon:SpriteComponent=null;
  26. @property({
  27. type:LabelComponent
  28. })
  29. SkillLabel:LabelComponent=null;
  30. @property({
  31. type:Prefab
  32. })
  33. BulletUIPrefab:Prefab=null;
  34. @property({
  35. type:Node
  36. })
  37. BulletClip:Node=null;
  38. /**
  39. * 子弹数量
  40. */
  41. @property({
  42. type:LabelComponent
  43. })
  44. BulletCount:LabelComponent=null;
  45. @property({
  46. type:ButtonComponent
  47. })
  48. leftFireButton:ButtonComponent=null;
  49. @property({
  50. type:ButtonComponent
  51. })
  52. middleFireButton:ButtonComponent=null;
  53. @property({
  54. type:ButtonComponent
  55. })
  56. rightFireButton:ButtonComponent=null;
  57. @property({
  58. type:Node
  59. })
  60. killCountGroup:Node=null;
  61. @property({
  62. type:LabelComponent
  63. })
  64. killCountText:LabelComponent=null;
  65. /**
  66. * 怪物数量
  67. */
  68. @property({
  69. type:LabelComponent
  70. })
  71. monsterCountText:LabelComponent=null;
  72. /**
  73. * 积分
  74. */
  75. @property({
  76. type:LabelComponent
  77. })
  78. integralLabel:LabelComponent=null;
  79. /**
  80. * 怒气值进度条
  81. */
  82. @property({
  83. type:ProgressBarComponent
  84. })
  85. angerCountProgrssBar:ProgressBarComponent=null;
  86. /**
  87. * 怒气值技能按钮
  88. */
  89. @property({
  90. type:ButtonComponent
  91. })
  92. angerSkillButton:ButtonComponent=null;
  93. /**
  94. * 栅栏血量进度条
  95. */
  96. @property({
  97. type:ProgressBarComponent
  98. })
  99. fenceHpProgrssBar:ProgressBarComponent=null;
  100. /**
  101. * 栅栏血量文字
  102. */
  103. @property({
  104. type:LabelComponent
  105. })
  106. fenceHpLabel:LabelComponent=null;
  107. /**
  108. * 换弹动画
  109. */
  110. @property({
  111. type:ProgressBarComponent
  112. })
  113. reloadProgrssBar:ProgressBarComponent=null;
  114. /**
  115. * 怪物血条层
  116. */
  117. @property({
  118. type:Node
  119. })
  120. monsterHPUILayer:Node=null;
  121. /**
  122. * 第几天
  123. */
  124. @property({
  125. type:LabelComponent
  126. })
  127. levelLabel:LabelComponent=null;
  128. @property({
  129. type:Node
  130. })
  131. BowLeft:Node=null;
  132. @property({
  133. type:Node
  134. })
  135. BowMid:Node=null;
  136. @property({
  137. type:Node
  138. })
  139. BowRight:Node=null;
  140. @property({
  141. type:AnimationComponent
  142. })
  143. DropBoxAnimation:AnimationComponent=null;
  144. /**
  145. * 弹夹子弹池
  146. */
  147. bulletPool:Node[]=[];
  148. /**
  149. * 资源引用
  150. */
  151. private assetsRef:Prefab[];
  152. /**
  153. * 显示状态
  154. */
  155. private onShowed:boolean=false;
  156. start () {
  157. // Your initialization goes here.
  158. }
  159. constructor(){
  160. super();
  161. console.log("创建!");
  162. }
  163. OnShow():void{
  164. this.onShowed=false;
  165. this.BowLeft.active=false;
  166. this.BowMid.active=false;
  167. this.BowRight.active=false;
  168. this.LoadAssets();
  169. }
  170. private __OnShow():void{
  171. GameController.single.monsterHPUILayer=this.monsterHPUILayer;
  172. GameController.single.Init(this);
  173. this.AddEvents();
  174. this.RefreshView();
  175. SoundManager.single.PlayMusic("sounds/combat");
  176. SoundManager.single.PlaySound("zombie","sounds/zombie",true);
  177. this.InitSkillIcon();
  178. this.onShowed=true;
  179. }
  180. private LoadAssets():void{
  181. //先清理老资源
  182. if(this.assetsRef){
  183. let deps:string[];
  184. this.assetsRef.forEach(element => {
  185. deps=loader.getDependsRecursively(element);
  186. loader.release(deps);
  187. });
  188. this.assetsRef.length=0;
  189. this.assetsRef=null;
  190. }
  191. let urls:string[]=[];
  192. //武器
  193. let weaponConfig:any=GameConfigManager.GetWeaponConfig(GameModel.single.currentWeaponId);
  194. urls.push(weaponConfig.prefab);
  195. //栅栏
  196. // let fenceConfig:any=GameConfigManager.GetFenceConfig(GameModel.single.fenceId);
  197. // urls.push(fenceConfig.prefab);
  198. //本关用到的怪物资源
  199. let levelConfig:any=GameConfigManager.GetLevelConfig(GameModel.single.currentLevel);
  200. let monsterConfig:any;
  201. levelConfig.monsters.forEach(element => {
  202. monsterConfig=GameConfigManager.GetMonsterConfig(element.monsterId);
  203. if(urls.indexOf(monsterConfig.prefab)<0){
  204. urls.push(monsterConfig.prefab);
  205. urls.push(monsterConfig.damageParticle);
  206. }
  207. });
  208. //枪口火焰
  209. urls.push(weaponConfig.fireSpark);
  210. //怪物血条
  211. urls.push("ui/components/MonsterHPUI");
  212. //加载
  213. loader.loadResArray(urls,Prefab,this.LoadAssetsProgress.bind(this),this.LoadAssetsComplete.bind(this));
  214. }
  215. private LoadAssetsProgress(index:number,total:number,item):void{
  216. LoadingView.single.UpdateProgress(index/total);
  217. }
  218. private LoadAssetsComplete(error:Error,assets):void{
  219. if(error){
  220. console.error(error);
  221. }
  222. this.assetsRef=assets;
  223. this.__OnShow();
  224. }
  225. OnHide():void{
  226. this.onShowed=false;
  227. this.RemoveEvents();
  228. SoundManager.single.PlayMusic("sounds/main");
  229. SoundManager.single.StopSound("Weapon");
  230. SoundManager.single.StopSound("WeaponLeft");
  231. SoundManager.single.StopSound("WeaponRight");
  232. SoundManager.single.StopSound("zombie");
  233. }
  234. private AddEvents():void{
  235. this.leftFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  236. this.middleFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  237. this.rightFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  238. this.leftFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  239. this.middleFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  240. this.rightFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  241. GameController.single.weapon.AddEvent(WeaponBase.EVENT_BULLET_CHANGE,this,this.bulletCountChanged,0);
  242. GameModel.single.AddEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyEventHandler,0);
  243. }
  244. private RemoveEvents():void{
  245. this.leftFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  246. this.middleFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  247. this.rightFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this);
  248. this.leftFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  249. this.middleFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  250. this.rightFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this);
  251. GameController.single.weapon.RemoveEvent(WeaponBase.EVENT_BULLET_CHANGE,this,this.bulletCountChanged);
  252. GameModel.single.RemoveEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyEventHandler);
  253. }
  254. private GameModelPropertyEventHandler(key:string):void{
  255. switch (key) {
  256. case GamePropertys.killCount://杀死怪物
  257. this.CallNextFrame(this.KillCountChangedHandler.bind(this));
  258. break;
  259. case GamePropertys.angerCount://怒气值变化
  260. this.CallNextFrame(this.AngerCountChangedHandler.bind(this));
  261. break;
  262. case GamePropertys.integral://积分变化
  263. this.CallNextFrame(this.RefreshIntegral.bind(this));
  264. break;
  265. default:
  266. break;
  267. }
  268. }
  269. private KillCountChangedHandler():void{
  270. this.RefreshKillCount();
  271. this.RefreshMonsterCount();
  272. }
  273. private AngerCountChangedHandler():void{
  274. this.RefreshAngerCount();
  275. }
  276. private InitSkillIcon():void{
  277. let skillConfig:any=GameConfigManager.GetSkillConfig(GameController.single.weapon.weaponConfig.skill);
  278. loader.loadRes(skillConfig.icon+"/spriteFrame",SpriteFrame,(err,asset:SpriteFrame)=>{
  279. if(err!=null){
  280. console.log("技能图标加载失败")
  281. return;
  282. }
  283. this.SkillIcon.spriteFrame=asset;
  284. });
  285. this.SkillLabel.string=skillConfig.name.toString();
  286. }
  287. /**
  288. * 刷新弹夹
  289. */
  290. RefreshBulletClip():void{
  291. let max:number=Math.min(10,GameController.single.weapon.bulletCount);
  292. while(this.BulletClip.children.length!=max){
  293. let bullet:Node;
  294. //增加
  295. if(this.BulletClip.children.length<max){
  296. bullet=this.CreateBullet();
  297. this.BulletClip.addChild(bullet);
  298. }else{//删除
  299. bullet=this.BulletClip.children[0];
  300. this.BulletClip.removeChild(bullet);
  301. this.DisposeBullet(bullet);
  302. }
  303. }
  304. if(GameController.single.currentSkill!=null&&GameController.single.currentSkill.infiniteAmmo){
  305. this.BulletCount.string="∞";
  306. }else{
  307. this.BulletCount.string=GameController.single.weapon.bulletCount.toString();
  308. }
  309. }
  310. RefreshView():void{
  311. this.RefreshBulletClip();
  312. this.RefreshKillCount();
  313. this.RefreshAngerCount();
  314. this.RefreshFenceHp();
  315. this.RefreshMonsterCount();
  316. this.RefreshIntegral();
  317. this.levelLabel.string="第"+GameModel.single.currentLevel+"天";
  318. }
  319. /**
  320. * 连杀
  321. */
  322. RefreshKillCount():void{
  323. this.killCountText.string=GameModel.single.killCount.toString();
  324. }
  325. /**
  326. * 怒气值
  327. */
  328. RefreshAngerCount():void{
  329. if(GameModel.single.angerCount<GameController.single.weapon.weaponConfig.maxAnger){
  330. this.angerSkillButton.node.active=false;
  331. }else{
  332. this.angerSkillButton.node.active=true;
  333. }
  334. this.angerCountProgrssBar.progress=GameModel.single.angerCount/GameController.single.weapon.weaponConfig.maxAnger;
  335. }
  336. /**
  337. * 栅栏HP
  338. */
  339. RefreshFenceHp():void{
  340. if(GameController.single.GameOver||GameController.single.paused){
  341. return;
  342. }
  343. this.fenceHpProgrssBar.progress=GameController.single.fence.hp/GameController.single.fence.maxHp;
  344. this.fenceHpLabel.string=GameConfigManager.GetFenceConfig(GameModel.single.currentFenceId).name+" "+GameController.single.fence.hp+"/"+GameController.single.fence.maxHp;
  345. }
  346. /**
  347. * 怪物数量
  348. */
  349. RefreshMonsterCount():void{
  350. this.monsterCountText.string=GameModel.single.killCount+"/"+GameController.single.monsterTotalCount;
  351. }
  352. /**
  353. * 积分
  354. */
  355. RefreshIntegral():void{
  356. this.integralLabel.string=GameModel.single.integral.toString();
  357. }
  358. private fenceHp:number=0;
  359. update (deltaTime: number) {
  360. if(this.onShowed==false){
  361. return;
  362. }
  363. super.update(deltaTime);
  364. //空投
  365. let currentTime:number=director.getCurrentTime();
  366. if(currentTime-GameModel.single.lastDropBoxTime>30000){
  367. this.DropBoxAnimation.node.active=true;
  368. this.DropBoxAnimation.play("KongtouTip");
  369. GameModel.single.lastDropBoxTime=currentTime;
  370. }
  371. if(GameController.single.fence!=null&&GameController.single.fence.node!=null){
  372. this.RefreshFenceHp();
  373. this.fenceHp=GameController.single.fence.hp;
  374. }
  375. if(GameController.single.weapon.reloadProgress<0||GameController.single.weapon.reloadProgress>=1){
  376. this.reloadProgrssBar.node.active=false;
  377. }else{
  378. this.reloadProgrssBar.node.active=true;
  379. this.reloadProgrssBar.progress=GameController.single.weapon.reloadProgress;
  380. }
  381. //射击提示
  382. this.BowLeft.active=GameController.single.FireTip(1);
  383. this.BowMid.active=GameController.single.FireTip(2);
  384. this.BowRight.active=GameController.single.FireTip(3);
  385. }
  386. private currentFireButtonNode:Node;
  387. FireButtonTouchStart(e:EventTouch):void{
  388. this.currentFireButtonNode=e.target as Node;
  389. if(e.target==this.leftFireButton.node){
  390. GameController.single.TryFire(1);
  391. }else if(e.target==this.middleFireButton.node){
  392. GameController.single.TryFire(2);
  393. }else{
  394. GameController.single.TryFire(3);
  395. }
  396. }
  397. FireButtonTouchEnd(e:EventTouch):void{
  398. if(e.target!=this.currentFireButtonNode){
  399. return;
  400. }
  401. GameController.single.TryFire(0);
  402. }
  403. /**
  404. * 使用技能
  405. */
  406. UseSkill():void{
  407. if(GameModel.single.angerCount<GameController.single.weapon.weaponConfig.maxAnger){
  408. return;
  409. }
  410. GameController.single.UseSkill();
  411. }
  412. /**
  413. * 返回主界面
  414. */
  415. BackToPrepareScene():void{
  416. GameController.single.OnGameOver(2);
  417. SceneManager.single.Swicth("PrepareScene");
  418. this.HideSelf();
  419. if(LiangLiangSDK.CanWuChu() == true){
  420. GUIManager.single.Show(UIConst.FULL_OUTPUT_UI);
  421. }
  422. }
  423. private bulletCountChanged():void{
  424. this.RefreshBulletClip();
  425. }
  426. /**
  427. * 从池中创建子弹
  428. */
  429. private CreateBullet():Node{
  430. if(this.bulletPool.length>0){
  431. return this.bulletPool.shift();
  432. }
  433. return instantiate(this.BulletUIPrefab);
  434. }
  435. private DisposeBullet(bullet:Node){
  436. if(this.bulletPool.indexOf(bullet)<0){
  437. this.bulletPool.push(bullet);
  438. }else{
  439. console.error("重复回收弹夹子弹");
  440. }
  441. }
  442. /**
  443. * 获取空投
  444. */
  445. GetDropBox():void{
  446. GameController.single.PauseGame();
  447. this.DropBoxAnimation.node.active=false;
  448. GUIManager.single.Show(UIConst.DROP_BOX_UI,true);
  449. }
  450. ChangeFence():void{
  451. GameController.single.PauseGame();
  452. GUIManager.single.Show(UIConst.FREE_FENCE_UI,true);
  453. }
  454. /**
  455. * 跳过教学
  456. */
  457. SkipTeaching():void{
  458. }
  459. }