FightingMediator.ts 9.5 KB

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