FightingMediator.ts 11 KB

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