/* 文件名: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; } } } }