FightingMediator.ts 14 KB

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