egret地圖縮放與跟隨

	/********************縮放地圖並聚焦跟隨目標***************** */
	private followTarget:egret.DisplayObject; //跟隨對象
	private resizeFocusDur:number = 500;      //縮放聚焦動畫間隔
	private resizeWaitDur:number = 1000;   	  //縮放動畫等待間隔
	private resizeFactor:number = 1.5;        //縮放因子
	private _curTimeStamp:number; 		      //遊戲運行時間戳
	private stageCenterPoint:egret.Point;     //場景中心點
	private mapBorderVertical:egret.Point;    //地圖豎向邊界位置
	private mapBorderHorizonal:egret.Point;   //地圖橫向邊界位置
	private oriMapNodeScale:number;			  //縮放前地圖原始縮放比例
	
	MapResizeFocusFollowTagret(evt:egret.Event){
		var dataArr = evt.data as any[];
		if(dataArr == null || dataArr.length < 1){
			return;
		}
		var target:egret.DisplayObject = dataArr[0];
		//resizeState: 0 不縮放,1,放大,2,縮小
		var resizeState:number = dataArr.length > 1?(dataArr[1] as number):1;
		var isResizeNone = resizeState == 0;
		var isResizeBig = resizeState == 1;
		var isResizeSmall = resizeState == 2;
		var isFollow:boolean = dataArr.length > 2?(dataArr[2] as boolean):true;
		if(target == null){
			return;
		}
		this.followTarget = isFollow ? target:null;
		var nodeMap = this.nodeMap;
		if(isResizeSmall){
			egret.Tween.removeTweens(nodeMap);
			TimeMgr.Instance().CreateTimer(this.resizeWaitDur/1000,()=>{},()=>{
				let NodeMapChangeAniDur = this.NodeMapChangeAniDur;
				this.NodeMapChangeAniDur = this.resizeFocusDur;
				EventMgr.Instance().DispatchEvent(EventName.MapEvent_ChangeMapPointByCurPlayer,[false,new egret.Point(this.oriMapNodeScale,this.oriMapNodeScale)]);
				this.NodeMapChangeAniDur = NodeMapChangeAniDur;
			});
			egret.Tween.get(nodeMap).wait(this.resizeWaitDur).to({scaleX:this.oriMapNodeScale,scaleY:this.oriMapNodeScale},this.resizeFocusDur).call(()=>{
				EventMgr.Instance().DispatchEvent(EventName.UIEvent_MapResizeFin);
			});
		}
		if(isFollow || isResizeBig){
			var resizeFactor = isResizeBig?this.resizeFactor:nodeMap.scaleX;		
			var limitPtArr = this.GetMapNodeBorderLimitPt(resizeFactor,resizeFactor);
			this.mapBorderHorizonal = limitPtArr[0];
			this.mapBorderVertical = limitPtArr[1];
			let resizeWaitDur = isResizeBig ? this.resizeWaitDur:0;
			this.oriMapNodeScale = nodeMap.scaleX;
			egret.Tween.removeTweens(nodeMap);
			let focusPos = this.GetFocusTargetMapPos();
			//先放大獲取聚焦座標後,還原大小
			if(isResizeBig){
				nodeMap.scaleX = nodeMap.scaleY = resizeFactor;
				focusPos = this.GetFocusTargetMapPos();			
				nodeMap.scaleX = nodeMap.scaleY = this.oriMapNodeScale;			
			}
			egret.Tween.get(nodeMap)
			.to({scaleX:resizeFactor,scaleY:resizeFactor,x:focusPos.x,y:focusPos.y},this.resizeFocusDur)
			.wait(resizeWaitDur).call(()=>{
				EventMgr.Instance().DispatchEvent(EventName.UIEvent_FocusFollowTargetFin);			
			});
			if(isFollow){
				TimeMgr.Instance().CreateTimer((this.resizeFocusDur + resizeWaitDur)/1000,()=>{},()=>{
					this._curTimeStamp = egret.getTimer();
					TimeMgr.Instance().StartTick(this.onMapNodeLocUpdate,this);
				});
			}
		}
	}

	//獲取地圖移動邊距限制點
	GetMapNodeBorderLimitPt(resizeFactorX:number,resizeFactorY:number):egret.Point[]{
		var nodeMap = this.nodeMap;
		this.stageCenterPoint = new egret.Point(GameAdapt.GetContextStage.stageWidth/2,GameAdapt.GetContextStage.stageHeight/2);
		let rightBorderMapPos = GameAdapt.GetContextStage.stageWidth - nodeMap.width*resizeFactorX/2;
		let upBorderMapPos = 180;
		let downBorderMapPos = GameAdapt.GetContextStage.stageHeight - (nodeMap.height - upBorderMapPos)*resizeFactorY;
		let mapBorderHorizonal = new egret.Point(rightBorderMapPos,nodeMap.anchorOffsetX*resizeFactorX);
		let mapBorderVertical = new egret.Point(downBorderMapPos,upBorderMapPos*resizeFactorY);
		return [mapBorderHorizonal,mapBorderVertical];
	}

	//根據地圖位置,獲取限制邊距後位置
	GetLimitPtByMapPos(locPt:egret.Point,limitPtHori:egret.Point,limitPtVert:egret.Point):egret.Point{
		let locX = locPt.x;
		let locY = locPt.y;
		locX = Math.max(limitPtHori.x,locX);
		locX = Math.min(limitPtHori.y,locX);
		locY = Math.max(limitPtVert.x,locY);
		locY = Math.min(limitPtVert.y,locY);
		locPt.x = locX;
		locPt.y = locY;
		return locPt;
	}

	//更新地圖跟隨目標位置  lihui 2020/6/30
	private onMapNodeLocUpdate(timeStamp:number):boolean{
		if(this.followTarget == null){
			TimeMgr.Instance().StopTick(this.onMapNodeLocUpdate,this);
			return;
		}
		let timeDelta = (timeStamp - this._curTimeStamp)/1000;
		this._curTimeStamp = timeStamp;
		let speed:number = 20;
		let interpolate = timeDelta * speed;
		//目標座標向中心點座標線性插值偏移位置
		this.SetMapNodePos(interpolate);
		return true;
	}

	//設置地圖位置
	SetMapNodePos(interpolate:number = 1){
		//目標座標向中心點座標線性插值偏移位置
		let mapPos = this.GetFocusTargetMapPos(interpolate);		
		this.nodeMap.x = mapPos.x;
		this.nodeMap.y = mapPos.y;
		//egret.log("mapPos++++++++" + mapPos);		
	}

	//獲取聚焦對象地圖移動位置
	GetFocusTargetMapPos(interpolate:number = 1):egret.Point{
		let mapPos = new egret.Point(this.nodeMap.x,this.nodeMap.y);
		interpolate = Math.max(0,interpolate);
		interpolate = Math.min(1,interpolate);
		if(this.followTarget != null){
			let targetGlobalPos = this.followTarget.localToGlobal();
			let offSetPos = egret.Point.interpolate(this.stageCenterPoint,targetGlobalPos,interpolate);
			var mapMovePt = offSetPos.subtract(targetGlobalPos);
			mapPos = mapPos.add(mapMovePt);
		}
		return this.GetLimitPtByMapPos(mapPos,this.mapBorderHorizonal,this.mapBorderVertical);
	}

	//地圖場景縮放邊距限制 
	ResizeLimitMapBorder(mapPos:egret.Point,scaleX:number,scaleY:number){
		let isResize = scaleX != 1 || scaleY != 1;
		if(isResize){
			var limtPtArr = this.GetMapNodeBorderLimitPt(scaleX,scaleY);
			egret.log("limitArr"+limtPtArr[0]);
			mapPos = this.GetLimitPtByMapPos(mapPos,limtPtArr[0],limtPtArr[1]);
		}
		return mapPos;
	}
	/************************************/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章