197 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			197 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:ActiveObjectClass.nut | ||
|  | 路径:User/Object/ActiveObject/ActiveObjectClass.nut | ||
|  | 创建日期:2024-11-29	23:05 | ||
|  | 文件用途:动态Obj对象 | ||
|  | */ | ||
|  | class ActiveObject extends BaseObject { | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     Info = null; | ||
|  |     //动画组 | ||
|  |     AnimationArr = null; | ||
|  |     //攻击信息组 | ||
|  |     AttackinfoArr = null; | ||
|  |     //当前动画 | ||
|  |     CurrentAni = null; | ||
|  |     //当前攻击信息 | ||
|  |     Attackinfo = null; | ||
|  |     //图层信息 | ||
|  |     Layer = null; | ||
|  |     //状态机 | ||
|  |     StateMachine = null; | ||
|  |     //状态信息包 | ||
|  |     StateVar = null; | ||
|  |     //受击框 | ||
|  |     DamageBox = null; | ||
|  |     //攻击框 | ||
|  |     AttackBox = null; | ||
|  | 
 | ||
|  |     //队伍 | ||
|  |     Team = 0; | ||
|  | 
 | ||
|  |     //各方向加速度 | ||
|  |     XSpeed = 0; | ||
|  |     YSpeed = 0; | ||
|  |     ZSpeed = 0; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     function Init(Info) { | ||
|  |         //如果存在Ani 初始化所有Ani | ||
|  |         if ("animotion" in Info) { | ||
|  |             AnimationArr = []; | ||
|  |             foreach(_index, path in Info.animotion) { | ||
|  |                 local AniBuf = Animation(path); | ||
|  |                 // AniBuf.ShowBorder(true); | ||
|  |                 AnimationArr.append(AniBuf); | ||
|  |             } | ||
|  |         } | ||
|  |         //如果存在Atk 初始化所有Atk | ||
|  |         if ("attackinfo" in Info) { | ||
|  |             AttackinfoArr = []; | ||
|  |             foreach(_index, path in Info.attackinfo) { | ||
|  |                 local AtkBuf = AttackInfo(path); | ||
|  |                 AttackinfoArr.append(AtkBuf); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         //动态对象 绑定状态机 | ||
|  |         StateMachine = FiniteStateMachineClass(); | ||
|  |         //增加状态信息包 | ||
|  |         StateVar = {}; | ||
|  |     } | ||
|  | 
 | ||
|  |     //设置Ani | ||
|  |     function SetAnimation(Ani) { | ||
|  |         //如果已经有Ani了 | ||
|  |         if (CurrentAni) { | ||
|  |             Removechild(CurrentAni); | ||
|  |         } | ||
|  |         if (type(Ani) == "integer") { | ||
|  |             CurrentAni = AnimationArr[Ani]; | ||
|  |         } else { | ||
|  |             CurrentAni = Ani; | ||
|  |         } | ||
|  |         //重置Ani | ||
|  |         CurrentAni.Reset(); | ||
|  |         //绑定状态机 | ||
|  |         CurrentAni.BindenvStateMachine(StateMachine); | ||
|  |         Addchild(CurrentAni); | ||
|  |     } | ||
|  | 
 | ||
|  |     //设置Atk | ||
|  |     function SetAttackinfo(Idx) { | ||
|  |         Attackinfo = AttackinfoArr[Idx]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 设置状态 | ||
|  |      * @参数 gState 将要设置的状态 | ||
|  |      */ | ||
|  |     function SetState(gState) { | ||
|  |         //调用状态机设定状态 | ||
|  |         return StateMachine.ChangeState(gState); | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 获取状态 | ||
|  |      */ | ||
|  |     function GetState() { | ||
|  |         //调用状态机设定状态 | ||
|  |         return StateMachine.State; | ||
|  |     } | ||
|  | 
 | ||
|  |     //同步碰撞框 | ||
|  |     function SyncObjectBox() { | ||
|  |         //同步受击框 和 攻击框 | ||
|  |         DamageBox = null; | ||
|  |         AttackBox = null; | ||
|  |         //当前有Ani存在则同步 此处为怪物和被动对象的碰撞框同步逻辑 角色类override | ||
|  |         if (CurrentAni) { | ||
|  |             local Info = CurrentAni.GetCurrentFrameInfo(); | ||
|  |             if (Info.DamageBox.len() > 0) { | ||
|  |                 DamageBox = []; | ||
|  |                 foreach(Box in Info.DamageBox) { | ||
|  |                     local NewBox = [Box[0] + X, Box[1] + Y, Box[2] + Z, Box[3] + X, Box[4] + Y, Box[5] + Z]; | ||
|  |                     DamageBox.append(NewBox); | ||
|  |                 } | ||
|  |             } | ||
|  |             if (Info.AttackBox.len() > 0) { | ||
|  |                 AttackBox = []; | ||
|  |                 foreach(Box in Info.AttackBox) { | ||
|  |                     local NewBox = [Box[0] + X, Box[1] + Y, Box[2] + Z, Box[3] + X, Box[4] + Y, Box[5] + Z]; | ||
|  |                     AttackBox.append(NewBox); | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 设置附着速度 | ||
|  |      */ | ||
|  |     function SetSpeed(Type, Value) { | ||
|  |         switch (Type) { | ||
|  |             case 0: | ||
|  |                 XSpeed = Value; | ||
|  |                 break; | ||
|  |             case 1: | ||
|  |                 YSpeed = Value; | ||
|  |                 break; | ||
|  |             case 2: | ||
|  |                 ZSpeed = Value; | ||
|  |                 break; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /* | ||
|  |      * @函数作用: 设置附着速度 | ||
|  |      */ | ||
|  |     function SetXSpeedWithDirection(gSpeed) { | ||
|  |         if (Direction == 0) | ||
|  |             SetSpeed(0, -gSpeed); | ||
|  |         else | ||
|  |             SetSpeed(0, gSpeed); | ||
|  |     } | ||
|  | 
 | ||
|  |     //计算自身加速度 | ||
|  |     function CalculateAcceleration(dt) { | ||
|  |         if (XSpeed != 0 || YSpeed != 0 || ZSpeed != 0) { | ||
|  |             MoveBy(XSpeed * dt * 0.001, YSpeed * dt * 0.001, ZSpeed * dt * 0.001); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function OnUpdate(dt) { | ||
|  |         //同步碰撞框 | ||
|  |         SyncObjectBox(); | ||
|  |         //状态机 | ||
|  |         StateMachine.OnUpdate(dt); | ||
|  |         //计算自身加速度 | ||
|  |         CalculateAcceleration(dt); | ||
|  | 
 | ||
|  |         base.OnUpdate(dt); | ||
|  |     } | ||
|  | 
 | ||
|  |     //攻击到其他对象时 | ||
|  |     function OnAttack(Damager) { | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     //销毁自身 | ||
|  |     function DestroySelf() { | ||
|  |         getroottable().CurrentMap.RemoveObject(this); | ||
|  |         base.DestroySelf(); | ||
|  |     } | ||
|  | 
 | ||
|  |     //基于自身召唤Obj | ||
|  |     function CreatePassiveObject(Id, Offset_X, Offset_Y, Offset_Z, Pack) { | ||
|  |         local objbuf = PassiveObject(); | ||
|  |         objbuf.Init(Id); | ||
|  |         objbuf.SetPosition(X + Offset_X, Y + Offset_Y, Z + Offset_Z); | ||
|  |         objbuf.StateVar = Pack; | ||
|  |         objbuf.Team = Team; | ||
|  |         getroottable().CurrentMap.AddObject(objbuf); | ||
|  |     } | ||
|  | } |