122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:MapCamera.nut | ||
|  | 路径:User/Object/Map/MapCamera.nut | ||
|  | 创建日期:2024-12-22	21:56 | ||
|  | 文件用途: | ||
|  | */ | ||
|  | class MapCamera { | ||
|  |     //摄像机坐标 | ||
|  |     X = 0; | ||
|  |     Y = 0; | ||
|  |     Z = 0; | ||
|  | 
 | ||
|  |     NextX = 0; | ||
|  | 
 | ||
|  |     //镜头可行坐标 | ||
|  |     MovableAreaX = 0; | ||
|  |     MovableAreaY = 0; | ||
|  | 
 | ||
|  | 
 | ||
|  |     //背景偏移量 | ||
|  |     BackgroundOffset = 0; | ||
|  |     //背景层移动速率 | ||
|  |     BackgroundMoveSpeed = 1.0; | ||
|  |     //人物中线长度 | ||
|  |     CharacterLineLength = 0; | ||
|  | 
 | ||
|  |     //地图对象 | ||
|  |     MyMapParent = null; | ||
|  |     //跟随对象 | ||
|  |     MyFromParent = null; | ||
|  |     //摄像机朝向 | ||
|  |     Direction = 1; | ||
|  |     //摄像机朝向时间 | ||
|  |     DirectionTime = 1; | ||
|  | 
 | ||
|  |     //缩放比率 | ||
|  |     CameraRate = 1.0; | ||
|  | 
 | ||
|  |     constructor(gMap) { | ||
|  |         MyMapParent = gMap.weakref(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用:设置跟随对象 | ||
|  |      */ | ||
|  |     function SetFromParent(FromParent) { | ||
|  |         MyFromParent = FromParent.weakref(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: | ||
|  |      */ | ||
|  |     function SetPosition(gx, gy, gz) { | ||
|  |         X = gx * CameraRate; | ||
|  |         Y = gy * CameraRate; | ||
|  |         Z = gz * CameraRate; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 增加坐标偏移 | ||
|  |      */ | ||
|  |     function AddPosition(Type, Value) { | ||
|  |         switch (Type) { | ||
|  |             case 0: //X | ||
|  |                 X += Value; | ||
|  |                 break; | ||
|  |             case 1: //Y | ||
|  |                 Y += Value; | ||
|  |                 break; | ||
|  |             case 2: //Z | ||
|  |                 Z += Value; | ||
|  |                 break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 通过父对象同步自身坐标 | ||
|  |      */ | ||
|  |     function SyncPosByFromParent(MillisecondsDuration) { | ||
|  |         if (MyFromParent) { | ||
|  |             local R_X, R_Y, R_Z; | ||
|  | 
 | ||
|  |             // //X轴移动特殊判断 | ||
|  |             // R_X = MyFromParent.X; | ||
|  |             // //为超出中线长度时摄像机不会改变位置 | ||
|  |             // if (R_X <= (X + CharacterLineLength) && R_X >= (X - CharacterLineLength)) R_X = X; | ||
|  |             // //超出以后 补足位置 | ||
|  |             // else if (R_X > (X + CharacterLineLength)) R_X = R_X - CharacterLineLength; | ||
|  |             // else if (R_X<(X - CharacterLineLength)) R_X = R_X + CharacterLineLength; | ||
|  | 
 | ||
|  | 
 | ||
|  |             //判断是否超出可行区域 | ||
|  |             R_X = Math.Min(Math.Max(MyFromParent.X, 533), MovableAreaX - 533); | ||
|  |             R_Y = Math.Min(Math.Max(MyFromParent.Y, 300), MovableAreaY - 300); | ||
|  |             R_Z = MyFromParent.Z; | ||
|  | 
 | ||
|  |             SetPosition(R_X, R_Y, R_Z); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用:Update | ||
|  |      */ | ||
|  |     function OnUpdate(Dt) { | ||
|  |         //同步自身与跟随对象的坐标 | ||
|  |         SyncPosByFromParent(Dt); | ||
|  | 
 | ||
|  |         //刷新地图图层的坐标 | ||
|  |         foreach(Name, Layer in MyMapParent.LayerObject) { | ||
|  |             //X屏幕宽度一般 Y屏幕宽度一半 +Z轴运算  在加统一120的偏移 在家background的偏移 | ||
|  |             if (Name == "distantback") { | ||
|  |                 Layer.SetPosition((-X + 533) * BackgroundMoveSpeed, -Y + Z + 300 + 120 + BackgroundOffset); | ||
|  |             } else { | ||
|  |                 Layer.SetPosition((-X + 533), -Y + Z + 300 + 120 + BackgroundOffset); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } |