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