From ddf3166eaec4140c3141ef71acf802a1d26e161a Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Sun, 5 Jan 2025 00:48:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=B7=BB=E5=8A=A0=E5=9F=8E?= =?UTF-8?q?=E9=95=87=20=E5=92=8C=E7=A7=BB=E9=99=A4=E7=9A=84=20=20=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E9=80=9A=E4=BF=A1=E9=80=BB=E8=BE=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sqr/SquirrelFileConfig.cfg | 1 + .../ActiveObject/CharacterObjectClass.nut | 14 +++-- sqr/User/Object/Map/MapObject.nut | 46 +++++++-------- sqr/User/Object/Map/TownObject.nut | 9 +-- sqr/User/Socket/FunctionalPack.nut | 57 +++++++++++++++++++ sqr/User/Socket/Packet.nut | 2 +- sqr/User/Stage/LodingStage.nut | 3 + sqr/User/UI/Window/1_Select_Character.nut | 2 +- sqr/User/_ENUM/enum_packet.nut | 2 + sqr/folder-alias.json | 3 + 10 files changed, 106 insertions(+), 33 deletions(-) create mode 100644 sqr/User/Socket/FunctionalPack.nut diff --git a/sqr/SquirrelFileConfig.cfg b/sqr/SquirrelFileConfig.cfg index 66c9ae3..f146be2 100644 --- a/sqr/SquirrelFileConfig.cfg +++ b/sqr/SquirrelFileConfig.cfg @@ -70,6 +70,7 @@ l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Object\ActiveObject\CharacterObjectCla l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Socket\Socket.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Socket\Packet.nut +l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Socket\FunctionalPack.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Stage\LodingStage.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\User\Stage\TestStage.nut diff --git a/sqr/User/Object/ActiveObject/CharacterObjectClass.nut b/sqr/User/Object/ActiveObject/CharacterObjectClass.nut index b6876f2..6d210c3 100644 --- a/sqr/User/Object/ActiveObject/CharacterObjectClass.nut +++ b/sqr/User/Object/ActiveObject/CharacterObjectClass.nut @@ -64,9 +64,12 @@ class GameObject.Character extends GameObject.ActiveObject { //构造属性对象 // Attribute = AttributeClass(); + } + + //开启控制 + function OpenControl() { //分配控制器 Controller = Object_Controller(this); - } @@ -175,13 +178,12 @@ class GameObject.Character extends GameObject.ActiveObject { function OnUpdate(Dt) { base.OnUpdate(Dt); //控制器逻辑更新 - Controller.OnUpdate(Dt); + if (Controller) Controller.OnUpdate(Dt); } } //通过职业和装备列表来构造一个角色 -GameObject.CreateCharacter <- function(Job = 0, EquIdList = []) { - +GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false) { //构造角色 local Character = GameObject.Character(); Character.Init(Job); @@ -191,5 +193,9 @@ GameObject.CreateCharacter <- function(Job = 0, EquIdList = []) { Character.ChangeEquipment(EquObj); } } + //如果是玩家开启控制器 + if (IsPlayer) Character.OpenControl(); + //设置站立模式Ani + Character.SetAnimation("RestAni"); return Character; } \ No newline at end of file diff --git a/sqr/User/Object/Map/MapObject.nut b/sqr/User/Object/Map/MapObject.nut index c7c680b..51d9784 100644 --- a/sqr/User/Object/Map/MapObject.nut +++ b/sqr/User/Object/Map/MapObject.nut @@ -281,18 +281,6 @@ class Map extends Actor { m_data.npc = Arr; } - //添加角色的回包 - function AddCharacterCallBack(Binary) { - local Pack = Packet(Binary); - - /* - local Charc = GameObject.CreateCharacter(Info.job, Info.equ); - local NPCobj = GameObject.NPC(info.id); - NPCobj.SetDirection(info.direction); - NPCobj.SetPosition(info.xpos, info.ypos, info.zpos); - - */ - } //添加对象 function AddObject(obj, IsPlayer = false) { @@ -319,11 +307,24 @@ class Map extends Actor { } } - //移动城镇的回包 - function MoveTownCallBack(Jso) { - //我自己的移动城镇添加角色对象 - local MapObj = GlobalTownManager.TownList[Jso.town].map[Jso.region]; - MapObj.AddObjectByChangeTown(ClientCharacter, Jso.pos); + //移除对象 + function RemoveObject(obj) { + LayerObject.normal.Removechild(obj); + //角色对象 + if (typeof obj == "character") { + //将地图信息写入角色中 + obj.MySelfMap = null; + } + } + + //移除地图中所有的角色对象 + function RemoveAllCharacterObject() { + foreach(obj in LayerObject.normal.Children) { + //角色对象 + if (typeof obj == "character") { + RemoveObject(obj); + } + } } //移动城镇的添加对象 @@ -332,6 +333,8 @@ class Map extends Actor { if (typeof obj == "character") { //角色原城镇 local FromMapobj = obj.MySelfMap; + //清除原城镇里的玩家 + FromMapobj.RemoveAllCharacterObject(); //背景音乐处理 BackGroundMusic = {}; if (FromMapobj.BackGroundMusic != null) { @@ -359,12 +362,12 @@ class Map extends Actor { m_camera.SetFromParent(obj); //获取当前场景 local Stage = sq_GetCurrentStage(); - if (GlobalTownManager.CurrentTown) { - Stage.Removechild(GlobalTownManager.CurrentTown); + if (GlobalTownManager.CurrentMap) { + Stage.Removechild(GlobalTownManager.CurrentMap); } Stage.Addchild(this); //添加全局 - GlobalTownManager.CurrentTown = this.weakref(); + GlobalTownManager.CurrentMap = this.weakref(); //如果已经处于某个地图中 则先移除 @@ -414,9 +417,6 @@ class Map extends Actor { // OpenMovableAreaBorder(); - - MySocket.RegisterHandler(PACKET_ID.CHANGE_TOWN_AREA_CALLBACK, MoveTownCallBack.bindenv(this)); - MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_ADD_CHARACTER_CALLBACK, AddCharacterCallBack.bindenv(this)); } //DEBUG方法 diff --git a/sqr/User/Object/Map/TownObject.nut b/sqr/User/Object/Map/TownObject.nut index 8c6ebad..3d48273 100644 --- a/sqr/User/Object/Map/TownObject.nut +++ b/sqr/User/Object/Map/TownObject.nut @@ -7,7 +7,8 @@ if (!getroottable().rawin("GlobalTownManager")) { GlobalTownManager <- {}; GlobalTownManager.TownList <- {}; - GlobalTownManager.CurrentTown <- null; + //全局当前所在城镇地图 + GlobalTownManager.CurrentMap <- null; } class Town { //城镇编号 @@ -92,13 +93,13 @@ class Town { function AddObject(obj, IsPlayer = false) { //获取当前场景 local Stage = sq_GetCurrentStage(); - if (GlobalTownManager.CurrentTown) { - Stage.Removechild(GlobalTownManager.CurrentTown); + if (GlobalTownManager.CurrentMap) { + Stage.Removechild(GlobalTownManager.CurrentMap); } local SariaRoomMap = map[SariaRoomID]; Stage.Addchild(SariaRoomMap); //添加全局 - GlobalTownManager.CurrentTown = SariaRoomMap.weakref(); + GlobalTownManager.CurrentMap = SariaRoomMap.weakref(); SariaRoomMap.AddObject(obj, IsPlayer); obj.SetPosition(SariaRoomPos); obj.SetAnimation("RestAni"); diff --git a/sqr/User/Socket/FunctionalPack.nut b/sqr/User/Socket/FunctionalPack.nut new file mode 100644 index 0000000..062a48f --- /dev/null +++ b/sqr/User/Socket/FunctionalPack.nut @@ -0,0 +1,57 @@ +/* +文件名:FunctionalPack.nut +路径:User/Socket/FunctionalPack.nut +创建日期:2025-01-05 00:07 +文件用途:功能数据包 +*/ + +//注册功能包 +function RegisterFunctionalPack() { + //城镇中添加角色的回包 + MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_ADD_CHARACTER_CALLBACK, function(Binary) { + local Pack = Packet(Binary); + local op = Pack.Get_Int(); + local cid = Pack.Get_Int(); + local namelen = Pack.Get_Byte(); + local name = Pack.Get_String(namelen); + local job = Pack.Get_Byte(); + local lv = Pack.Get_Byte(); + local posx = Pack.Get_Int(); + local posy = Pack.Get_Int(); + local posz = 0; + local equcount = Pack.Get_Byte(); + local equ = []; + for (local i = 0; i< equcount; i++) { + equ.push(Pack.Get_Int()); + } + //构造角色 + local Charc = GameObject.CreateCharacter(job, equ); + Charc.Cid = cid; + Charc.SetPosition(posx, posy, posz); + //从全局地图中找到城镇并添加角色 + if (GlobalTownManager.CurrentMap) { + GlobalTownManager.CurrentMap.AddObject(Charc); + } + }); + + //城镇中移除角色的回包 + MySocket.RegisterHandler(PACKET_ID.TOWN_REMOVE_CHARACTER_CALLBACK, function(Jso) { + //从全局地图中找到城镇并移除角色 + if (GlobalTownManager.CurrentMap) { + //遍历所有角色 + foreach(obj in GlobalTownManager.CurrentMap.LayerObject.normal.Children) { + //角色对象 + if (typeof obj == "character" && obj.Cid == Jso.cid) { + GlobalTownManager.CurrentMap.RemoveObject(obj); + } + } + } + }); + + //移动城镇的回包 + MySocket.RegisterHandler(PACKET_ID.CHANGE_TOWN_AREA_CALLBACK, function(Jso) { + //我自己的移动城镇添加角色对象 + local MapObj = GlobalTownManager.TownList[Jso.town].map[Jso.region]; + MapObj.AddObjectByChangeTown(ClientCharacter, Jso.pos); + }); +} \ No newline at end of file diff --git a/sqr/User/Socket/Packet.nut b/sqr/User/Socket/Packet.nut index 0750c94..a3c6782 100644 --- a/sqr/User/Socket/Packet.nut +++ b/sqr/User/Socket/Packet.nut @@ -82,7 +82,7 @@ class Packet { //获取字符串 function Get_String(len) { - return stream_myreadstring(len); + return stream_myreadstring.pcall(this.Data, len); } //获取字节数组 diff --git a/sqr/User/Stage/LodingStage.nut b/sqr/User/Stage/LodingStage.nut index 0a15920..1ba3ff7 100644 --- a/sqr/User/Stage/LodingStage.nut +++ b/sqr/User/Stage/LodingStage.nut @@ -7,6 +7,9 @@ function InitGame() { //初始化Socekt连接 MySocket("192.168.200.15", 19003); + //注册功能包 + RegisterFunctionalPack(); + // MySocket("127.0.0.1", 19666); //设定全局默认音量 diff --git a/sqr/User/UI/Window/1_Select_Character.nut b/sqr/User/UI/Window/1_Select_Character.nut index db6c384..90e6e18 100644 --- a/sqr/User/UI/Window/1_Select_Character.nut +++ b/sqr/User/UI/Window/1_Select_Character.nut @@ -360,7 +360,7 @@ class _Select_Character_Window extends Yosin_Window { MySocket.RegisterHandler(PACKET_ID.SELECT_CHARACTER_ENTER_GAME_CALLBACK, function(Jso) { local Info = Jso.charac; local TownObj = Town(Info.town); - local Charc = GameObject.CreateCharacter(Info.job, Info.equ); + local Charc = GameObject.CreateCharacter(Info.job, Info.equ, true); TownObj.AddObject(Charc, true); ClientCharacter = Charc; }.bindenv(this)); diff --git a/sqr/User/_ENUM/enum_packet.nut b/sqr/User/_ENUM/enum_packet.nut index 8e611a0..52647c1 100644 --- a/sqr/User/_ENUM/enum_packet.nut +++ b/sqr/User/_ENUM/enum_packet.nut @@ -43,4 +43,6 @@ enum PACKET_ID { CHANGE_TOWN_AREA_CALLBACK = 10001 //城镇添加角色回包 TOWN_ADD_CHARACTER_CALLBACK = 10002 + //城镇中移除角色的回包 + TOWN_REMOVE_CHARACTER_CALLBACK = 10003 } \ No newline at end of file diff --git a/sqr/folder-alias.json b/sqr/folder-alias.json index 2591afd..6a1d1df 100644 --- a/sqr/folder-alias.json +++ b/sqr/folder-alias.json @@ -250,5 +250,8 @@ }, "User/Socket/Packet.nut": { "description": "数据包类" + }, + "User/Socket/FunctionalPack.nut": { + "description": "功能数据包" } } \ No newline at end of file