角色添加城镇 和移除的 网络通信逻辑完成

This commit is contained in:
Lenheart 2025-01-05 00:48:35 +08:00
parent 9e7cce285a
commit ddf3166eae
10 changed files with 106 additions and 33 deletions

View File

@ -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

View File

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

View File

@ -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方法

View File

@ -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");

View File

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

View File

@ -82,7 +82,7 @@ class Packet {
//获取字符串
function Get_String(len) {
return stream_myreadstring(len);
return stream_myreadstring.pcall(this.Data, len);
}
//获取字节数组

View File

@ -7,6 +7,9 @@
function InitGame() {
//初始化Socekt连接
MySocket("192.168.200.15", 19003);
//注册功能包
RegisterFunctionalPack();
// MySocket("127.0.0.1", 19666);
//设定全局默认音量

View File

@ -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));

View File

@ -43,4 +43,6 @@ enum PACKET_ID {
CHANGE_TOWN_AREA_CALLBACK = 10001
//城镇添加角色回包
TOWN_ADD_CHARACTER_CALLBACK = 10002
//城镇中移除角色的回包
TOWN_REMOVE_CHARACTER_CALLBACK = 10003
}

View File

@ -250,5 +250,8 @@
},
"User/Socket/Packet.nut": {
"description": "数据包类"
},
"User/Socket/FunctionalPack.nut": {
"description": "功能数据包"
}
}