DOF/sqr/User/Object/ActiveObject/ActiveObjectClass.nut

206 lines
5.1 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;
//属性包
Attr = 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 = {};
}
//初始化属性包
function InitAttr() {
//属性包初始化
Attr = Attribute(this);
}
//设置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);
}
}