FightingMediator.ts 15 KB

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