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);
 | |
|     }
 | |
| } |