/********************縮放地圖並聚焦跟隨目標***************** */
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;
}
/************************************/