198 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
/*
 | 
						|
文件名:ActiveObjectClass.nut
 | 
						|
路径:User/Object/ActiveObject/ActiveObjectClass.nut
 | 
						|
创建日期:2024-11-29	23:05
 | 
						|
文件用途:动态Obj对象
 | 
						|
*/
 | 
						|
 | 
						|
class GameObject.ActiveObject extends GameObject.BaseClass {
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    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);
 | 
						|
    }
 | 
						|
} |