123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- import { _decorator, Component, Node, EventTouch, LayoutComponent, Vec2, Rect, Size, Vec3, loader, instantiate, assert } from 'cc';
- import { BaseView } from '../../../engines/gui/BaseView';
- 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 GameConfigManager from '../../models/GameConfigManager';
- import { GameModel } from '../../models/GameModel';
- import { GamePropertys } from '../../models/GamePropertys';
- import { WeaponCell } from '../../models/weapons/WeaponCell';
- import { UIConst } from '../UIConst';
- import { PrepareMediator } from './PrepareMediator';
- import { WeaponCellScript } from './WeaponCellScript';
- const { ccclass, property } = _decorator;
- export class WeaponCellListView extends BaseView{
- private currentSelect:WeaponCell;
- constructor(mediator:GUIMediator){
- super(mediator);
- }
- OnShow():void{
- this.mediator.weaponDragIcon.node.active=false;
- this.RefreshWeaponList();
- this.AddEvent();
- }
- onHide():void{
- this.RemoveEvent();
- }
- private AddEvent():void{
- this.mediator.node.on(Node.EventType.TOUCH_START,this.WeaponListTouchStartHandler,this);
- GameModel.single.AddEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyChanged,0);
- }
- private RemoveEvent():void{
- this.mediator.node.off(Node.EventType.TOUCH_START,this.WeaponListTouchStartHandler,this);
- this.mediator.node.off(Node.EventType.TOUCH_MOVE,this.WeaponListTouchMoveHandler,this);
- this.mediator.node.off(Node.EventType.TOUCH_END,this.WeaponListTouchEndHandler,this);
- GameModel.single.RemoveEvent(DataModelEventType.PROPERTY_CHANGED,this,this.GameModelPropertyChanged);
- }
- private GameModelPropertyChanged(key:string):void{
- switch (key) {
- case GamePropertys.WeaponCell:
- this.RefreshWeaponList();
- break;
- }
- }
- /**
- * 刷新武器列表
- */
- private RefreshWeaponList():void{
- let weaponCell:WeaponCell;
- let weaponCellView:Node;
- let weaponCellScript:WeaponCellScript;
- if(this.weaponList.node.children.length!=12){
- for (let index = 0; index < 12; index++) {
- weaponCellView=instantiate(this.mediator.WeaponCellPrefab);
- this.weaponList.node.addChild(weaponCellView);
- }
- }
- let list:WeaponCell[]=GameModel.single.weaponCells;
- for (let index = 0; index < list.length; index++) {
- weaponCell = list[index];
- weaponCellView=this.weaponList.node.children[index];
- weaponCellScript=weaponCellView.getComponent(WeaponCellScript);
- weaponCellScript.UpdateWeaponCell(weaponCell);
- }
- }
- private CheckSelected(weaponCellData:WeaponCell):void{
- this.currentSelect=weaponCellData;
- let weaponCellScript:WeaponCellScript;
- let list:WeaponCell[]=GameModel.single.weaponCells;
- let weaponCell:WeaponCell;
- let weaponCellView:Node;
- for (let index = 0; index < list.length; index++) {
- weaponCell = list[index];
- weaponCellView=this.weaponList.node.children[index];
- weaponCellScript=weaponCellView.getComponent(WeaponCellScript);
- weaponCellScript.ChangeSelected(weaponCellData);
- }
- }
- private CheckMark():void{
- let weaponCellScript:WeaponCellScript;
- let list:WeaponCell[]=GameModel.single.weaponCells;
- let weaponCell:WeaponCell;
- let weaponCellView:Node;
- for (let index = 0; index < list.length; index++) {
- weaponCell = list[index];
- weaponCellView=this.weaponList.node.children[index];
- weaponCellScript=weaponCellView.getComponent(WeaponCellScript);
- if(this.currentSelect==null){
- weaponCellScript.Mark(false);
- }else{
- if(this.currentSelect==weaponCellScript.weaponCell){
- continue;
- }
- if(this.currentSelect.weaponId==weaponCellScript.weaponCell.weaponId){
- weaponCellScript.Mark(true);
- }else{
- weaponCellScript.Mark(false);
- }
- }
- }
- }
-
- private startNode:Node;
- private startPos:Vec2=new Vec2();
- private tempPos:Vec2=new Vec2();
- private isDrag:boolean;
- private WeaponListTouchStartHandler(touch:EventTouch):void{
- touch.getUILocation(this.tempPos);
- this.startPos.x=this.tempPos.x;
- this.startPos.y=this.tempPos.y;
- this.startNode=this.FindTouchNode(this.weaponList.node,this.tempPos);
- if(this.startNode!=null){
- let weaponCellScript:WeaponCellScript=this.startNode.getComponent(WeaponCellScript);
- if(weaponCellScript==null){
- console.error("武器槽未挂载WeaponCellScript脚本");
- return;
- }
- if(weaponCellScript.weaponCell.weaponId<0){
- console.log("没有武器的武器槽不让选中也不让拖拽");
- return;
- }
- this.isDrag=false;
- this.mediator.node.on(Node.EventType.TOUCH_MOVE,this.WeaponListTouchMoveHandler,this);
- this.mediator.node.on(Node.EventType.TOUCH_END,this.WeaponListTouchEndHandler,this);
- this.CheckSelected(weaponCellScript.weaponCell);
- }
- }
- private FindTouchNode(root:Node,touchPos:Vec2):Node{
- for (let index = 0; index < root.children.length; index++) {
- const element = root.children[index];
- if(this.HitNode(element,touchPos)){
- return element;
- }
- }
- return null;
- }
- /**
- * 判断是否击中该节点
- * @param node
- * @param touchPos
- */
- private HitNode(node:Node,touchPos:Vec2):boolean{
- let childSize:Size;
- let childPos:Vec2=new Vec2();
- let childRect:Rect=new Rect();
- this.getNodePos(node,childPos);
- childSize=node.getContentSize();
- childRect.x=childPos.x
- childRect.y=childPos.y;
- childRect.width=childSize.x;
- childRect.height=childSize.y;
- if(childRect.contains(touchPos)){
- return true;
- }
- return false;
- }
- private WeaponListTouchMoveHandler(touch:EventTouch):void{
- touch.getUILocation(this.tempPos);
- let dis:number=Vec2.distance(this.startPos,this.tempPos);
- if(dis>5){
- if(this.isDrag==false){
- this.isDrag=true;
- this.CheckMark();
- //拖拽图标
- this.mediator.weaponDragIcon.node.active=true;
- let weaponCellScript:WeaponCellScript=this.startNode.getComponent(WeaponCellScript);
- this.mediator.weaponDragIcon.spriteFrame=weaponCellScript.iconLoader.spriteFrame;
- }
- this.mediator.weaponDragIcon.node.setPosition(this.tempPos.x,this.tempPos.y,0);
- // console.log("拖拽移动到:"+target.name);
- }
- }
- private WeaponListTouchEndHandler(touch:EventTouch):void{
- touch.getUILocation(this.tempPos);
- this.mediator.node.off(Node.EventType.TOUCH_MOVE,this.WeaponListTouchMoveHandler,this);
- this.mediator.node.off(Node.EventType.TOUCH_END,this.WeaponListTouchEndHandler,this);
-
- if(this.isDrag){
- this.mediator.weaponDragIcon.node.active=false;
-
- //优先判断武器槽
- let target:Node=this.FindTouchNode(this.weaponList.node,this.tempPos);
- if(target==null){
- //删除
- if(this.HitNode(this.mediator.deleteWeaponNode,this.tempPos)){
- if(this.currentSelect==GameModel.single.currentWeaponCell){
- NoticeManager.ShowPrompt("不能销毁当前使用的武器!");
- }else{
- GameModel.single.RemoveWeapon(this.currentSelect.cellId);
- }
- }else if(this.HitNode(this.mediator.equipWeaponNode,this.tempPos))
- {//装配武器
- GameModel.single.EquipWeapon(this.currentSelect);
- }
- }else{
- if(this.startNode!=target){
- if(GameConfigManager.WeaponIsMaxLevel(this.currentSelect.weaponId)){
- console.log("武器已到达最高等级")
- return;
- }
- let weaponCellScript:WeaponCellScript=target.getComponent(WeaponCellScript);
- if(weaponCellScript!=null){
- let value:number=Math.random();
- if(value<0.5){
- GameModel.single.SynthesisWeapon(this.currentSelect.cellId,weaponCellScript.weaponCell.cellId);
- }else{
- if(this.currentSelect.weaponId!=weaponCellScript.weaponCell.weaponId){
- NoticeManager.ShowPrompt("不同的武器无法合成!");
- }else{
- GUIManager.single.Show(UIConst.FREE_UPGRADE_UI,{a:this.currentSelect,b:weaponCellScript.weaponCell});
- }
- }
- }
- }
- }
- this.currentSelect=null;
- this.CheckMark();
- }else{
- console.log("点击");
- }
- }
- OnDestory():void{
- }
- private getNodePos(node:Node,out:Vec2):void{
- let nodePos:Vec3=new Vec3();
- let parentPos:Vec3=new Vec3();
- let anchorPoint:Vec2=new Vec2();
- node.getAnchorPoint(anchorPoint);
- let nodeSize:Size=node.getContentSize();
- while(node){
- node.getPosition(parentPos);
- nodePos.x+=parentPos.x;
- nodePos.y+=parentPos.y;
- node=node.parent;
- }
- out.x=nodePos.x-anchorPoint.x*nodeSize.width;
- out.y=nodePos.y-anchorPoint.y*nodeSize.height;
- }
- private get weaponList():LayoutComponent{
- return this.mediator.weaponList;
- }
- private get mediator():PrepareMediator{
- return this.__mediator as PrepareMediator;
- }
- }
|