259 lines
7.1 KiB
Plaintext
259 lines
7.1 KiB
Plaintext
/*
|
|
文件名:CharacterObjectClass.nut
|
|
路径:User/GameClass/ObjectClass/CharacterObjectClass.nut
|
|
创建日期:2024-05-11 21:03
|
|
文件用途:角色类
|
|
*/
|
|
class GameObject.Character extends GameObject.ActiveObject {
|
|
|
|
hair = null; //头部
|
|
hat = null; //帽子
|
|
face = null; //脸部
|
|
breast = null; //胸部
|
|
coat = null; //上衣
|
|
skin = null; //皮肤
|
|
waist = null; //腰部
|
|
pants = null; //下装
|
|
shoes = null; //鞋子
|
|
weapon = null; //武器
|
|
aurora = null; //光环
|
|
|
|
//动画对象管理器
|
|
AnimationManager = null;
|
|
|
|
//传送阵Flag
|
|
TransmitFlag = false;
|
|
|
|
//属性对象
|
|
Attribute = null;
|
|
|
|
//名字
|
|
Name = "无名字";
|
|
|
|
//职业编号
|
|
Job = 0;
|
|
//cid
|
|
Cid = -1;
|
|
|
|
//控制器
|
|
Controller = null;
|
|
|
|
function _typeof() {
|
|
return "character";
|
|
}
|
|
|
|
|
|
function Init(Idx) {
|
|
//初始化动画组
|
|
CurrentAni = [];
|
|
//设置职业编号
|
|
this.Job = Idx;
|
|
//获取角色职业信息
|
|
Info = sq_DeepCopy(AssetManager.CharacterInfoList[Idx]);
|
|
base.Init(Info);
|
|
|
|
//构造角色动画对象
|
|
AnimationManager = Character_Animation();
|
|
Addchild(AnimationManager);
|
|
AnimationManager.Init();
|
|
|
|
foreach(EquId in Info.default_avatar) {
|
|
local EquObj = GameItem.Equipment(EquId);
|
|
ChangeEquipment(EquObj);
|
|
}
|
|
//构造属性对象
|
|
// Attribute = AttributeClass();
|
|
|
|
}
|
|
|
|
//开启控制
|
|
function OpenControl() {
|
|
//分配控制器
|
|
Controller = Object_Controller(this);
|
|
}
|
|
|
|
|
|
function SyncObjectBox() {
|
|
//同步受击框 和 攻击框
|
|
DamageBox = null;
|
|
AttackBox = null;
|
|
//皮肤同步受击框 武器同步攻击框
|
|
foreach(AniObj in CurrentAni) {
|
|
if (AniObj.Type == "skin") {
|
|
local Info = AniObj.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);
|
|
}
|
|
}
|
|
} else if (AniObj.Type == "weapon") {
|
|
local Info = AniObj.GetCurrentFrameInfo();
|
|
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 OnUpdate(dt) {
|
|
// //原始逻辑
|
|
// base.OnUpdate(dt);
|
|
// }
|
|
|
|
|
|
//设置Ani
|
|
function SetAnimation(Ani) {
|
|
//如果存在动画管理器则设置
|
|
if (AnimationManager) AnimationManager.SetAnimation(Ani);
|
|
}
|
|
|
|
//切换装备
|
|
function ChangeEquipment(Equ) {
|
|
//如果当前装备槽已经有装备则移除
|
|
if (this[Equ.SlotType]) {
|
|
this[Equ.SlotType].OnWearEnd();
|
|
this[Equ.SlotType] = null;
|
|
}
|
|
//将装备对象赋值给对应装备槽
|
|
this[Equ.SlotType] = Equ;
|
|
this[Equ.SlotType].OnWearStart();
|
|
|
|
//如果是武器或者时装则同步动画
|
|
if (Equ.SlotType == "weapon" || Equ.Type == "avatar") {
|
|
AnimationManager.Init(Equ.SlotType);
|
|
} else if (Equ.Type == "aurora") {
|
|
AnimationManager.InitAuroa();
|
|
}
|
|
}
|
|
//切换装备列表
|
|
function ChangeEquipmentList(EquList) {
|
|
foreach(Equ in EquList) {
|
|
ChangeEquipment(Equ);
|
|
}
|
|
}
|
|
|
|
//设置名字
|
|
function SetName(Name) {
|
|
this.Name = Name;
|
|
AnimationManager.SetName(Name);
|
|
base.SetName(Name);
|
|
}
|
|
|
|
//是否为客户端玩家
|
|
function IsClientPlayer() {
|
|
if (ClientCharacter && this.Cid == ClientCharacter.Cid)
|
|
return true;
|
|
return false;
|
|
}
|
|
|
|
//移动速度
|
|
Move_Speed = 500;
|
|
//移动Flag
|
|
MoveFlag = DIRECTION.NONE;
|
|
//设置移动状态
|
|
function SetMoveFlag(Flag) {
|
|
//状态有更改
|
|
if (Flag != this.MoveFlag) {
|
|
this.MoveFlag = Flag;
|
|
//站立状态
|
|
if (this.MoveFlag == DIRECTION.NONE) {
|
|
AnimationManager.SetAnimation("RestAni");
|
|
}
|
|
//移动状态
|
|
else {
|
|
AnimationManager.SetAnimation("MoveAni");
|
|
}
|
|
}
|
|
}
|
|
//移动逻辑
|
|
function MoveLogic(Dt) {
|
|
if (!Parent) return;
|
|
//没有移动状态
|
|
if (MoveFlag == DIRECTION.NONE) return;
|
|
//在城镇里
|
|
if (typeof Parent == "townmap") {
|
|
// 根据 MoveFlag 解出 X 和 Y
|
|
local MX, MY;
|
|
if (MoveFlag == DIRECTION.UP) {
|
|
MX = 0;
|
|
MY = -1;
|
|
} else if (MoveFlag == DIRECTION.DOWN) {
|
|
MX = 0;
|
|
MY = 1;
|
|
} else if (MoveFlag == DIRECTION.LEFT) {
|
|
MX = -1;
|
|
MY = 0;
|
|
} else if (MoveFlag == DIRECTION.RIGHT) {
|
|
MX = 1;
|
|
MY = 0;
|
|
} else if (MoveFlag == DIRECTION.UP_LEFT) {
|
|
MX = -1;
|
|
MY = -1;
|
|
} else if (MoveFlag == DIRECTION.UP_RIGHT) {
|
|
MX = 1;
|
|
MY = -1;
|
|
} else if (MoveFlag == DIRECTION.DOWN_LEFT) {
|
|
MX = -1;
|
|
MY = 1;
|
|
} else if (MoveFlag == DIRECTION.DOWN_RIGHT) {
|
|
MX = 1;
|
|
MY = 1;
|
|
}
|
|
|
|
//设置人物朝向
|
|
if (MX > 0) SetDirection(DIRECTION.RIGHT);
|
|
else if (MX< 0) SetDirection(DIRECTION.LEFT);
|
|
|
|
MoveBy(Dt * MX * Move_Speed * 0.001, Dt * MY * Move_Speed * 0.001 * 0.71, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//更新
|
|
function OnUpdate(Dt) {
|
|
base.OnUpdate(Dt);
|
|
//控制器逻辑更新
|
|
if (Controller) Controller.OnUpdate(Dt);
|
|
//移动逻辑更新
|
|
MoveLogic(Dt);
|
|
}
|
|
}
|
|
|
|
//通过职业和装备列表来构造一个角色
|
|
GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false) {
|
|
//构造角色
|
|
local Character = GameObject.Character();
|
|
Character.Init(Job);
|
|
foreach(EquId in EquIdList) {
|
|
if (EquId > 0) {
|
|
local EquObj = GameItem.Equipment(EquId);
|
|
Character.ChangeEquipment(EquObj);
|
|
}
|
|
}
|
|
//如果是玩家开启控制器
|
|
if (IsPlayer) Character.OpenControl();
|
|
//设置站立模式Ani
|
|
Character.SetAnimation("RestAni");
|
|
return Character;
|
|
}
|
|
|
|
//通过Cid获取当前地图的角色
|
|
GameObject.GetCharacterByCid <- function(cid) {
|
|
//从全局地图中找到城镇并设置角色移动状态
|
|
if (GlobalTownManager.CurrentMap) {
|
|
//遍历所有角色
|
|
foreach(obj in GlobalTownManager.CurrentMap.PlayerList) {
|
|
//角色对象
|
|
if (typeof obj == "character" && obj.Cid == cid) {
|
|
return obj;
|
|
}
|
|
}
|
|
}
|
|
} |