import { AnimationComponent, ButtonComponent, director, EventTouch, find, instantiate, LabelComponent, LayoutComponent, loader, ModelComponent, Node, Prefab, Quat, SpriteComponent, SpriteFrame, SystemEventType, Touch, Vec2, view, _decorator } from 'cc'; import BufferManager from '../../../engines/buffers/BufferManager'; import IBuffer from '../../../engines/buffers/IBuffer'; import { GUIManager } from '../../../engines/gui/GUIManager'; import { GUIMediator } from '../../../engines/gui/GUIMediator'; import { DataModelEventType } from '../../../engines/models/DataModelEventType'; import { NoticeManager } from '../../../engines/notices/NoticeManager'; import { SoundManager } from '../../../engines/sounds/SoundManager'; import StringUtils from '../../../engines/utils/StringUtils'; import { LiangLiangSDK } from '../../../libs/liangliangSDK'; import { PlatformManager } from '../../../Platform/PlatformManager'; import { QQPlatform } from '../../../Platform/QQ/QQPlatform'; import { branchIdType } from '../../../Platform/WeChat/branchIdType'; import { WeChatPlatforms } from '../../../Platform/WeChat/WeChatPlatforms'; import GameConfigManager from '../../models/GameConfigManager'; import { GameModel } from '../../models/GameModel'; import { GamePropertys } from '../../models/GamePropertys'; import { UIConst } from '../UIConst'; import { WeaponCellListView } from './WeaponCellListView'; const { ccclass, property } = _decorator; @ccclass('PrepareMediator') export class PrepareMediator extends GUIMediator { @property({ type: AnimationComponent }) DropBoxAnimation: AnimationComponent = null; @property({ type: Node }) HandTip: Node = null; @property({ type: Node }) bufferNode: Node = null; @property({ type: LabelComponent }) glodLabel: LabelComponent = null; @property({ type: LabelComponent }) glodLabel1: LabelComponent = null; @property({ type: LabelComponent }) diamondLabel: LabelComponent = null; @property({ type: LabelComponent }) gunNameLabel: LabelComponent = null; @property({ type: LabelComponent }) levelLabel: LabelComponent = null; @property({ type: LabelComponent }) weaponInfoLabel: LabelComponent = null; /** * 商城按钮 */ @property({ type: ButtonComponent }) shopButton: ButtonComponent = null; /** * 自动合成文本 */ @property({ type: LabelComponent }) autoSynthesisLabel: LabelComponent = null; /** * 快捷购买武器按钮 */ @property({ type: ButtonComponent }) quickBuyButton: ButtonComponent = null; /** * 快捷购买武器ICON */ @property({ type: SpriteComponent }) quickBuyWeaponIcon: SpriteComponent = null; /** * 快捷购买武器价格 */ @property({ type: LabelComponent }) quickBuyWeaponPriceLabel: LabelComponent = null; /** * 武器拖拽Icon */ @property({ type: SpriteComponent }) weaponDragIcon: SpriteComponent = null; /** * 删除按钮节点(用于拖拽判断) */ @property({ type: Node }) deleteWeaponNode: Node = null; /** * 装配武器节点(用于拖拽判断) */ @property({ type: Node }) equipWeaponNode: Node = null; /** * 装配格子预制体 */ @property({ type: Prefab }) WeaponCellPrefab: Prefab = null; /** * 武器列表 */ @property({ type: LayoutComponent }) weaponList: LayoutComponent = null; private modelView: ModelComponent; private modelPrefab: Prefab; private prefabInstance: Node; private prefabModelComponent: ModelComponent; private weaponCellListView: WeaponCellListView; private isNew: boolean = true; private get isNewPlayer(): boolean { return this.isNew && GameModel.single.isNewPlayer; } onLoad(): void { this.weaponCellListView = new WeaponCellListView(this); } OnShow(data?: any): void { //清空试用栅栏 GameModel.single.trialFenceId = -1; GameModel.single.trialWeaponId = -1; GameModel.single.useSuperWeapon = false; super.OnShow(data); this.RefreshGunModel(); this.RefreshGlod(); this.RefreshDiamond(); this.RefreshLevel(); this.RefreshQuickBuy(); this.AddEvents(); this.weaponCellListView.OnShow(); SoundManager.single.PlayMusic("sounds/main"); if (this.isNewPlayer) { this.HandTip.active = true; } else { this.HandTip.active = false; } if (LiangLiangSDK.CanWuChu() == true) { // GUIManager.single.Show(UIConst.ADVERTISING_UI) // PlatformManager.showBanner(); } else { PlatformManager.showBanner(); } //签到如果有奖励的话 if (GameModel.single.GetSignAwardIndex() >= 0) { GUIManager.single.Show(UIConst.SIGN_UI); // this.HideSelf(); } } /** * 初始化枪的模型 */ private RefreshGunModel(): void { if (this.modelView == null) { let modelNode: Node = find("ModelView", this.node); this.modelView = modelNode.getComponent(ModelComponent); } if (this.modelPrefab) { this.modelView.mesh = null; let target = this.modelView.materials[0]; target.setProperty("mainTexture", null); this.prefabInstance.destroy(); this.prefabInstance = null; let deps: string[] = loader.getDependsRecursively(this.modelPrefab); loader.release(deps); this.modelPrefab = null; } //武器为空 if (GameModel.single.currentWeaponId < 0) { this.modelView.node.active = false; this.gunNameLabel.string = ""; this.weaponInfoLabel.string = ""; return; } else { this.modelView.node.active = true; let weaponConfig: any = GameConfigManager.GetWeaponConfig(GameModel.single.currentWeaponId); loader.loadRes(weaponConfig.prefab, Prefab, (err, prefab) => { if (err) { console.error("加载武器出错"); } this.modelPrefab = prefab; this.prefabInstance = instantiate(prefab); this.prefabModelComponent = this.prefabInstance.getComponentInChildren(ModelComponent); //更换贴图 let source = this.prefabModelComponent.materials[0]; let target = this.modelView.materials[0]; let texture = source.getProperty("mainTexture"); target.setProperty("mainTexture", texture); //更换模型 this.modelView.mesh = this.prefabModelComponent.mesh; }); if (this.gunNameLabel != null) { this.gunNameLabel.string = weaponConfig.name; } //描述 this.weaponInfoLabel.string = weaponConfig.desc; } } OnHide(): void { this.RemoveEvents(); this.modelView.mesh = null; let target = this.modelView.materials[0]; target.setProperty("mainTexture", null); if (this.prefabInstance) { this.prefabInstance.destroy(); } if (this.modelPrefab != null) { var deps = loader.getDependsRecursively(this.modelPrefab); loader.release(deps); } this.modelView.node.active = false; this.weaponCellListView.onHide(); } private AddEvents(): void { this.equipWeaponNode.on(Node.EventType.TOUCH_START, this.TouchStartHandler, this); this.equipWeaponNode.on(Node.EventType.TOUCH_MOVE, this.TouchMoveHandler, this); this.equipWeaponNode.on(Node.EventType.TOUCH_END, this.TouchEndHandler, this); GameModel.single.AddEvent(DataModelEventType.PROPERTY_CHANGED, this, this.GameModelPropertyChanged, 0); this.quickBuyButton.node.on(ButtonComponent.EventType.CLICK, this.QickBuyButtonClickHandler, this); this.shopButton.node.on(ButtonComponent.EventType.CLICK, this.ShopButtonClickHandler, this); } private RemoveEvents(): void { this.equipWeaponNode.off(SystemEventType.TOUCH_START, this.TouchStartHandler, this); this.equipWeaponNode.off(SystemEventType.TOUCH_MOVE, this.TouchMoveHandler, this); this.equipWeaponNode.off(SystemEventType.TOUCH_END, this.TouchEndHandler, this); GameModel.single.RemoveEvent(DataModelEventType.PROPERTY_CHANGED, this, this.GameModelPropertyChanged); this.quickBuyButton.node.on(ButtonComponent.EventType.CLICK, this.QickBuyButtonClickHandler, this); } private GameModelPropertyChanged(key: string): void { switch (key) { case GamePropertys.gold: this.CallNextFrame(this.RefreshGlod.bind(this)); this.CallNextFrame(this.RefreshQuickBuy.bind(this)); break; case GamePropertys.diamond: this.CallNextFrame(this.RefreshDiamond.bind(this)); break; case GamePropertys.currentWeaponCellId: this.CallNextFrame(this.RefreshGunModel.bind(this)); break; case GamePropertys.currentLevel: this.CallNextFrame(this.RefreshLevel.bind(this)); break; case GamePropertys.synthesisMaxWeaponId: this.CallNextFrame(this.RefreshQuickBuy.bind(this)); break; case GamePropertys.WeaponCell: this.HandTip.active = false; this.isNew = false; break; } } private RefreshLevel(): void { this.levelLabel.string = "第" + GameModel.single.currentLevel.toString() + "关"; } private RefreshGlod(): void { if (this.glodLabel != null) { this.glodLabel.string = StringUtils.numberUtilsEn(GameModel.single.gold); } this.glodLabel1.string = StringUtils.numberUtilsEn(GameModel.single.fullEarnings) + "/秒"; } private RefreshDiamond(): void { if (this.diamondLabel != null) { this.diamondLabel.string = GameModel.single.diamond.toString(); } } private weaponIcon: SpriteFrame; /** * 刷新快速购买按钮 */ private RefreshQuickBuy(): void { this.quickBuyWeaponIcon.spriteFrame = this.weaponIcon; //价格 let price: number = GameModel.single.GetQuickBuyPrice(); // if(GameModel.single.gold { if (err != null) { console.error("加载武器ICON出错!"); } this.quickBuyWeaponIcon.spriteFrame = this.weaponIcon = asset; }) } /** * 购买武器 */ private QickBuyButtonClickHandler(): void { if (GameModel.single.FindWeaponEmptyCell() == null) { NoticeManager.ShowPrompt("没有武器槽位了!"); return; } //价格 let price: number = GameModel.single.GetQuickBuyPrice(); //钱不够 if (GameModel.single.gold < price) { NoticeManager.ShowPrompt("金币不足"); return; } GameModel.single.BuyWeapon(0, GameModel.single.CurrentQuickBuyWeaponId); } private ShopButtonClickHandler(): void { GUIManager.single.Show(UIConst.SHOP_UI); this.HideSelf(); } /** * 自动合成按钮点击 */ AutoSynthesisButtonClickHandler(): void { GUIManager.single.Show(UIConst.AUTO_SYNTHETIC_UI); this.HideSelf(); } /** * 加速Buffer; */ AccelerateButtonClickHandler(): void { GUIManager.single.Show(UIConst.ACCELERATE_UI); this.HideSelf(); } /** * 兑换界面 */ ExchangeButtonClickHandler(): void { GUIManager.single.Show(UIConst.EXCHANGE_UI); this.HideSelf(); } /** * 签到 */ SignButtonClickHandler(): void { GUIManager.single.Show(UIConst.SIGN_UI); } private startRotation: Quat = new Quat(); private currentRotation: Quat = new Quat(); private startPoint: Vec2 = new Vec2(); private currentPoint: Vec2 = new Vec2(); private TouchStartHandler(touch: Touch, touchEvent): void { let pos: Vec2 = touch.getUILocation(); console.log(pos); this.startPoint.set(pos.x, pos.y); this.startRotation.x = this.modelView.node.rotation.x; this.startRotation.set(this.modelView.node.rotation.x, this.modelView.node.rotation.y, this.modelView.node.rotation.z, this.modelView.node.rotation.w); } private TouchMoveHandler(touch: EventTouch, touchEvent): void { let pos: Vec2 = touch.getUILocation(); this.currentPoint.set(pos.x, pos.y); let dis: number = Vec2.distance(this.currentPoint, this.startPoint); let value: number = dis / view.getCanvasSize().width; if (this.currentPoint.x < this.startPoint.x) { value = -value; } Quat.rotateY(this.currentRotation, this.startRotation, value); Quat.normalize(this.currentRotation, this.currentRotation); this.modelView.node.setRotation(this.currentRotation); } private TouchEndHandler(...arg): void { console.log("拖拽模型结束"); } StartGame(): void { if (GameModel.single.currentWeaponCell == null || GameModel.single.currentWeaponId < 0) { NoticeManager.ShowPrompt("请装配武器后再试!"); return; } if (LiangLiangSDK.CanWuChu()) { GUIManager.single.Show(UIConst.FREE_USE_GUN_UI); } else { GUIManager.single.Show(UIConst.FREE_FENCE_UI); } } /** * 免费金币 */ getAdGold(): void { PlatformManager.showRewardedVideo(() => { GameModel.single.gold += GameModel.single.fullEarnings * 600; NoticeManager.ShowPrompt(`获得${StringUtils.numberUtilsEn(GameModel.single.fullEarnings * 600)}金币`); let weChat = PlatformManager.impl as WeChatPlatforms; if (weChat instanceof WeChatPlatforms) { weChat.branchAnalytics(branchIdType.FreeGold) } }, () => { NoticeManager.ShowPrompt(`未看完广告,无奖励`); }) } /** * 心跳 * @param dt */ update(dt: number): void { super.update(dt); //空投 let currentTime: number = director.getCurrentTime(); if (currentTime - GameModel.single.lastDropBoxTime > 30000) { this.DropBoxAnimation.node.active = true; this.DropBoxAnimation.play("KongtouTip2"); GameModel.single.lastDropBoxTime = currentTime; } //自动合成Buffer剩余时间 let buffers: IBuffer[] = BufferManager.GetBufferGroup("AutoSynthesis"); if (buffers != null && buffers.length > 0) { let buffer: IBuffer = buffers[0]; let endTime: number = buffer.GetTimeRemaining(); this.autoSynthesisLabel.string = StringUtils.TimeFormatting(endTime, ":", ":", ":", ":", ":", ""); } else { this.autoSynthesisLabel.string = "自动合成"; } //加速Buffer buffers = BufferManager.GetBufferGroup("Accelerate"); if (buffers != null && buffers.length > 0) { this.bufferNode.active = true; } else { this.bufferNode.active = false; } } /** * 获取空投 */ GetDropBox(): void { this.DropBoxAnimation.node.active = false; GUIManager.single.Show(UIConst.DROP_BOX_UI, false); this.HideSelf(); } /** * 更多游戏 */ onClickMoreButton(): void { let qq = PlatformManager.impl as QQPlatform; if (qq instanceof QQPlatform) { qq.showAppBox(); } } }