import { AnimationComponent, ButtonComponent, director, EventTouch, GraphicsComponent, instantiate, LabelComponent, loader, Node, Prefab, ProgressBarComponent, SpriteComponent, SpriteFrame, _decorator } from 'cc'; import { GUIManager } from '../../../engines/gui/GUIManager'; import { GUIMediator } from '../../../engines/gui/GUIMediator'; import { LoadingView } from '../../../engines/loadingView/LoadingView'; import { DataModelEventType } from '../../../engines/models/DataModelEventType'; import { SceneManager } from '../../../engines/scenes/SceneManager'; import { SoundManager } from '../../../engines/sounds/SoundManager'; import GameConfigManager from '../../models/GameConfigManager'; import { GameModel } from '../../models/GameModel'; import { GamePropertys } from '../../models/GamePropertys'; import { UIConst } from '../UIConst'; import { GameController } from './GameController'; import { WeaponBase } from './weapons/WeaponBase'; const { ccclass, property } = _decorator; @ccclass('FightingMediator') export class FightingMediator extends GUIMediator { @property({ type:GraphicsComponent }) DrawingBoard:GraphicsComponent=null; @property({ type:SpriteComponent }) SkillIcon:SpriteComponent=null; @property({ type:LabelComponent }) SkillLabel:LabelComponent=null; @property({ type:Prefab }) BulletUIPrefab:Prefab=null; @property({ type:Node }) BulletClip:Node=null; /** * 子弹数量 */ @property({ type:LabelComponent }) BulletCount:LabelComponent=null; @property({ type:ButtonComponent }) leftFireButton:ButtonComponent=null; @property({ type:ButtonComponent }) middleFireButton:ButtonComponent=null; @property({ type:ButtonComponent }) rightFireButton:ButtonComponent=null; @property({ type:Node }) killCountGroup:Node=null; @property({ type:LabelComponent }) killCountText:LabelComponent=null; /** * 怪物数量 */ @property({ type:LabelComponent }) monsterCountText:LabelComponent=null; /** * 积分 */ @property({ type:LabelComponent }) integralLabel:LabelComponent=null; /** * 怒气值进度条 */ @property({ type:ProgressBarComponent }) angerCountProgrssBar:ProgressBarComponent=null; /** * 怒气值技能按钮 */ @property({ type:ButtonComponent }) angerSkillButton:ButtonComponent=null; /** * 栅栏血量进度条 */ @property({ type:ProgressBarComponent }) fenceHpProgrssBar:ProgressBarComponent=null; /** * 栅栏血量文字 */ @property({ type:LabelComponent }) fenceHpLabel:LabelComponent=null; /** * 换弹动画 */ @property({ type:ProgressBarComponent }) reloadProgrssBar:ProgressBarComponent=null; /** * 怪物血条层 */ @property({ type:Node }) monsterHPUILayer:Node=null; /** * 第几天 */ @property({ type:LabelComponent }) levelLabel:LabelComponent=null; @property({ type:Node }) BowLeft:Node=null; @property({ type:Node }) BowMid:Node=null; @property({ type:Node }) BowRight:Node=null; @property({ type:AnimationComponent }) DropBoxAnimation:AnimationComponent=null; /** * 弹夹子弹池 */ bulletPool:Node[]=[]; /** * 资源引用 */ private assetsRef:Prefab[]; /** * 显示状态 */ private onShowed:boolean=false; start () { // Your initialization goes here. } constructor(){ super(); console.log("创建!"); } OnShow():void{ this.onShowed=false; this.BowLeft.active=false; this.BowMid.active=false; this.BowRight.active=false; this.LoadAssets(); } private __OnShow():void{ GameController.single.monsterHPUILayer=this.monsterHPUILayer; GameController.single.Init(this); this.AddEvents(); this.RefreshView(); SoundManager.single.PlayMusic("sounds/combat"); SoundManager.single.PlaySound("zombie","sounds/zombie",true); this.InitSkillIcon(); this.onShowed=true; } private LoadAssets():void{ //先清理老资源 if(this.assetsRef){ let deps:string[]; this.assetsRef.forEach(element => { deps=loader.getDependsRecursively(element); loader.release(deps); }); this.assetsRef.length=0; this.assetsRef=null; } let urls:string[]=[]; //武器 let weaponConfig:any=GameConfigManager.GetWeaponConfig(GameModel.single.currentWeaponId); urls.push(weaponConfig.prefab); //栅栏 // let fenceConfig:any=GameConfigManager.GetFenceConfig(GameModel.single.fenceId); // urls.push(fenceConfig.prefab); //本关用到的怪物资源 let levelConfig:any=GameConfigManager.GetLevelConfig(GameModel.single.currentLevel); let monsterConfig:any; levelConfig.monsters.forEach(element => { monsterConfig=GameConfigManager.GetMonsterConfig(element.monsterId); if(urls.indexOf(monsterConfig.prefab)<0){ urls.push(monsterConfig.prefab); urls.push(monsterConfig.damageParticle); } }); //枪口火焰 urls.push(weaponConfig.fireSpark); //怪物血条 urls.push("ui/components/MonsterHPUI"); //加载 loader.loadResArray(urls,Prefab,this.LoadAssetsProgress.bind(this),this.LoadAssetsComplete.bind(this)); } private LoadAssetsProgress(index:number,total:number,item):void{ LoadingView.single.UpdateProgress(index/total); } private LoadAssetsComplete(error:Error,assets):void{ if(error){ console.error(error); } this.assetsRef=assets; this.__OnShow(); } OnHide():void{ this.onShowed=false; this.RemoveEvents(); SoundManager.single.PlayMusic("sounds/main"); SoundManager.single.StopSound("Weapon"); SoundManager.single.StopSound("WeaponLeft"); SoundManager.single.StopSound("WeaponRight"); SoundManager.single.StopSound("zombie"); } private AddEvents():void{ this.leftFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.middleFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.rightFireButton.node.on(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.leftFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); this.middleFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); this.rightFireButton.node.on(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); GameController.single.weapon.AddEvent(WeaponBase.EVENT_BULLET_CHANGE,this,this.bulletCountChanged,0); GameModel.single.AddEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyEventHandler,0); } private RemoveEvents():void{ this.leftFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.middleFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.rightFireButton.node.off(Node.EventType.TOUCH_START,this.FireButtonTouchStart,this); this.leftFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); this.middleFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); this.rightFireButton.node.off(Node.EventType.TOUCH_END,this.FireButtonTouchEnd,this); GameController.single.weapon.RemoveEvent(WeaponBase.EVENT_BULLET_CHANGE,this,this.bulletCountChanged); GameModel.single.RemoveEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyEventHandler); } private GameModelPropertyEventHandler(key:string):void{ switch (key) { case GamePropertys.killCount://杀死怪物 this.CallNextFrame(this.KillCountChangedHandler.bind(this)); break; case GamePropertys.angerCount://怒气值变化 this.CallNextFrame(this.AngerCountChangedHandler.bind(this)); break; case GamePropertys.integral://积分变化 this.CallNextFrame(this.RefreshIntegral.bind(this)); break; default: break; } } private KillCountChangedHandler():void{ this.RefreshKillCount(); this.RefreshMonsterCount(); } private AngerCountChangedHandler():void{ this.RefreshAngerCount(); } private InitSkillIcon():void{ let skillConfig:any=GameConfigManager.GetSkillConfig(GameController.single.weapon.weaponConfig.skill); loader.loadRes(skillConfig.icon+"/spriteFrame",SpriteFrame,(err,asset:SpriteFrame)=>{ if(err!=null){ console.log("技能图标加载失败") return; } this.SkillIcon.spriteFrame=asset; }); this.SkillLabel.string=skillConfig.name.toString(); } /** * 刷新弹夹 */ RefreshBulletClip():void{ let max:number=Math.min(10,GameController.single.weapon.bulletCount); while(this.BulletClip.children.length!=max){ let bullet:Node; //增加 if(this.BulletClip.children.length30000){ this.DropBoxAnimation.node.active=true; this.DropBoxAnimation.play("KongtouTip"); GameModel.single.lastDropBoxTime=currentTime; } if(GameController.single.fence!=null&&GameController.single.fence.node!=null){ this.RefreshFenceHp(); this.fenceHp=GameController.single.fence.hp; } if(GameController.single.weapon.reloadProgress<0||GameController.single.weapon.reloadProgress>=1){ this.reloadProgrssBar.node.active=false; }else{ this.reloadProgrssBar.node.active=true; this.reloadProgrssBar.progress=GameController.single.weapon.reloadProgress; } //射击提示 this.BowLeft.active=GameController.single.FireTip(1); this.BowMid.active=GameController.single.FireTip(2); this.BowRight.active=GameController.single.FireTip(3); } private currentFireButtonNode:Node; FireButtonTouchStart(e:EventTouch):void{ this.currentFireButtonNode=e.target as Node; if(e.target==this.leftFireButton.node){ GameController.single.TryFire(1); }else if(e.target==this.middleFireButton.node){ GameController.single.TryFire(2); }else{ GameController.single.TryFire(3); } } FireButtonTouchEnd(e:EventTouch):void{ if(e.target!=this.currentFireButtonNode){ return; } GameController.single.TryFire(0); } /** * 使用技能 */ UseSkill():void{ if(GameModel.single.angerCount0){ return this.bulletPool.shift(); } return instantiate(this.BulletUIPrefab); } private DisposeBullet(bullet:Node){ if(this.bulletPool.indexOf(bullet)<0){ this.bulletPool.push(bullet); }else{ console.error("重复回收弹夹子弹"); } } /** * 获取空投 */ GetDropBox():void{ GameController.single.PauseGame(); this.DropBoxAnimation.node.active=false; GUIManager.single.Show(UIConst.DROP_BOX_UI,true); } ChangeFence():void{ GameController.single.PauseGame(); GUIManager.single.Show(UIConst.FREE_FENCE_UI,true); } /** * 跳过教学 */ SkipTeaching():void{ } }