FightingMediator.ts 13 KB

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