FightingMediator.ts 13 KB

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