diff --git a/Yosin_Engine.exe b/Yosin_Engine.exe index 65fa57d..e7b8d56 100644 Binary files a/Yosin_Engine.exe and b/Yosin_Engine.exe differ diff --git a/sqr/Core/BaseClass/CanvasObject.nut b/sqr/Core/BaseClass/CanvasObject.nut new file mode 100644 index 0000000..15b2639 --- /dev/null +++ b/sqr/Core/BaseClass/CanvasObject.nut @@ -0,0 +1,106 @@ +/* +文件名:CanvasObject.nut +路径:Core/BaseClass/CanvasObject.nut +创建日期:2025-01-05 21:43 +文件用途:画布类 +*/ +class CL_CanvasObject extends CL_BaseObject { + + //宽 + CanvasWidth = 0; + //高 + CanvasHeight = 0; + //上下文 + Context = null; + + function _typeof() { + return "canvas"; + } + + constructor(...) { + local C_Object; + //创建空精灵 + if (vargv.len() == 0) { + C_Object = Canvas_Create(); + base.constructor(C_Object); + } + //通过精灵指针创建 + else if (vargv.len() == 1) { + C_Object = vargv[0]; + base.constructor(C_Object, true); + } + } + + //重设大小并清空 + function ResizeAndClear(W, H) { + CanvasWidth = W; + CanvasHeight = H; + Canvas_ResizeAndClear(this.C_Object, W, H); + RefreshContext(); + } + + //清空画布 + function Clear() { + Canvas_ResizeAndClear(this.C_Object, CanvasWidth, CanvasHeight); + RefreshContext(); + } + + //刷新上下文 + function RefreshContext() { + Context = Canvas_GetContext2D(this.C_Object); + } + + //开始绘制 + function BeginDraw() { + if (!Context) error("请先刷新上下文"); + Canvas_BeginDraw(Context); + } + + //结束绘制 + function EndDraw() { + if (!Context) error("请先刷新上下文"); + Canvas_EndDraw(Context); + } + + //绘制演员 + function DrawActor(Actor, XPos, YPos) { + if (!Context) error("请先刷新上下文"); + Canvas_DrawActor(this.C_Object, Context, Actor.C_Object, XPos, YPos); + } + + //绘制精灵帧 + function DrawSpriteFrame(SpriteFrame, XPos, YPos) { + if (!Context) error("请先刷新上下文"); + Canvas_DrawSpriteFrame(Context, SpriteFrame.C_Object, XPos, YPos); + } + + //设置填充画刷 + function SetFillBrush(Color) { + if (!Context) error("请先刷新上下文"); + Canvas_SetFillBrush(Context, Color); + } + + //设置轮廓画刷 + function SetStrokeBrush(Color) { + if (!Context) error("请先刷新上下文"); + Canvas_SetStrokeBrush(Context, Color); + } + + //画线段 + function DrawLine(X1, Y1, X2, Y2) { + if (!Context) error("请先刷新上下文"); + Canvas_DrawLine(Context, X1, Y1, X2, Y2); + } + + //画圆 + function DrawCircle(X, Y, R) { + if (!Context) error("请先刷新上下文"); + Canvas_DrawCircle(Context, X, Y, R); + } + + //画矩形 + function DrawRect(X, Y, W, H) { + if (!Context) error("请先刷新上下文"); + Canvas_DrawRect(Context, X, Y, W, H); + } +} \ No newline at end of file diff --git a/sqr/Core/BaseClass/ScriptManager/ScriptManager.nut b/sqr/Core/BaseClass/ScriptManager/ScriptManager.nut index 6fd069a..8e6402c 100644 --- a/sqr/Core/BaseClass/ScriptManager/ScriptManager.nut +++ b/sqr/Core/BaseClass/ScriptManager/ScriptManager.nut @@ -157,14 +157,22 @@ class GlobaData { } function UnpackData(IO, i) { - local out = ""; IO.seek(i); //内容指示位 local currentByte = IO.readn('c'); //内容指示位 local after = IO.GetInt(); switch (currentByte) { + case 9: { + local NewcurrentByte = IO.readn('c'); //内容指示位 + local Newafter = IO.GetInt(); + local Buf = getroottable()._Script_Data_.GetBinString(Newafter); + if (!Buf) { + Buf = ""; + } else { + Buf = getroottable()._Script_Data_.GetLoadString(Buf); + } + return Buf; + } case 10: { - IO.seek(i - 4); - local Before = IO.GetInt(); local Buf = getroottable()._Script_Data_.GetBinString(after); if (!Buf) { Buf = ""; @@ -179,12 +187,12 @@ class GlobaData { return ret; } case 4: { - local Bbuf = blob(4); - Bbuf.writen(after, 'i'); - Bbuf.seek(0); - local Buf = Bbuf.readn('f'); - out += after + '\t'; - break; + // local Bbuf = blob(4); + // Bbuf.writen(after, 'i'); + // Bbuf.seek(0); + // local Buf = Bbuf.readn('f'); + // out += after + '\t'; + return after; } case 6: case 8: @@ -195,11 +203,9 @@ class GlobaData { return Buf; } default: - out += ""; - break; + return ""; } - return out; } } diff --git a/sqr/Core/UI_Class/UI_Widget.nut b/sqr/Core/UI_Class/UI_Widget.nut index 380fce2..0a87770 100644 --- a/sqr/Core/UI_Class/UI_Widget.nut +++ b/sqr/Core/UI_Class/UI_Widget.nut @@ -161,21 +161,18 @@ class Yosin_EmeStretch extends Yosin_CommonUi { //横向 if (Direction) { - //获取中间部分的宽度 local ScaleW = (W - SpriteList[0].GetSize().w - SpriteList[2].GetSize().w); - //计算缩放比例 local ScaleRate = ScaleW / SpriteList[1].GetSize().w; - //设置位置和缩放 - SpriteList[1].SetPosition(SpriteList[0].GetSize().w, 0); - + SpriteList[1].SetPosition(SpriteList[0].GetSize().w, 0.0); SpriteList[1].SetScale(ScaleRate, 1.0); - SpriteList[2].SetPosition(SpriteList[0].GetSize().w + ScaleW, 0); + SpriteList[2].SetPosition(SpriteList[0].GetSize().w + ScaleW, 0.0); } //纵向 else { local ScaleH = (H - SpriteList[0].GetSize().h - SpriteList[2].GetSize().h); local ScaleRate = ScaleH / SpriteList[1].GetSize().h; + SpriteList[1].SetPosition(0, SpriteList[0].GetSize().h); SpriteList[1].SetScale(1.0, ScaleRate); SpriteList[2].SetPosition(0, SpriteList[0].GetSize().h + ScaleH); @@ -383,6 +380,7 @@ class Yosin_TopTitle extends Yosin_CommonUi { local BackgroundBright = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 483); local scaleW = (W / BackgroundBright.GetSize().w).tofloat(); BackgroundBright.SetScale(scaleW, 1); + BackgroundBright.SetPosition(0, 1); Addchild(BackgroundBright); @@ -499,18 +497,43 @@ class titleButton extends Yosin_BaseButton { // 拉伸标题按钮 -class Yosin_StretchTitleButton extends Yosin_SplicingButton { +class Yosin_StretchTitleButton extends Yosin_CommonUi { index = null; - select = false; - cacheSelect = false; - LBDownOnClick = null; + //按钮状态 + State = 0; + //ui的当前状态 + uiState = 0; + + cecheY = null; titleText = null; - constructor(X, Y, W, H, Path, Idx, title, ) { - base.constructor(X, Y, W, H, Path, Idx, true, false) + SpriteList = null; + // 鼠标左键按下时的回调 + LBDownOnClick = null; + + constructor(X, Y, W, H, Path, Idx, title) { + base.constructor(X, Y, W, H) + + cecheY = Y; + SpriteList = array(3); + + //普通态 + SpriteList[0] = Yosin_EmeStretch(0, 0, W, H, Path, Idx); + AddUIChild(SpriteList[0]); + + //悬停态 + SpriteList[1] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + 3); + SpriteList[1].SetVisible(false) + AddUIChild(SpriteList[1]); + //按下态 + SpriteList[2] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + 6); + SpriteList[2].SetVisible(false) + AddUIChild(SpriteList[2]); + + // 文字 titleText = FontAssetManager.GenerateNormal(title, true, { color = sq_RGBA(130, 114, 84, 255) }); @@ -524,30 +547,58 @@ class Yosin_StretchTitleButton extends Yosin_SplicingButton { cacheSelect = select; }) - titleText.SetPosition(9, 2); + titleText.SetPosition(W / 2 - titleText.GetSize().w / 2, 2); Addchild(titleText); } - function Proc(Dt) { - if (select) return; - - if (State != 3 && isLBDown) { + // 设置为选中状态 + function SetSelect(select) { + if (select) { State = 2; - select = true; + ChangeFrame(); + } else { + State = 0; + ChangeFrame(); + } + } + + + function ChangeFrame() { + //状态更改 刷新精灵帧 + if (State != uiState) { + if (State == 2) { + SyncPos(X, cecheY - 1); + } else { + SyncPos(X, cecheY); + } + uiState = State; + + for (local i = 0; i< SpriteList.len(); i++) { + SpriteList[i].SetVisible(i == uiState); + } + } + } + + function Proc(Dt) { + if (State == 2) return; + + //按下 + if (isLBDown) { if (LBDownOnClick != null) { LBDownOnClick(this); } + State = 2; } - if (State == 2) { - Y -= 1; - SyncPos(X, Y); - } else if (SpriteState == 2) { - Y += 1; - SyncPos(X, Y); + //悬停 + else if (isInRect) { + State = 1; } - - base.Proc(Dt); + //普通 + else { + State = 0; + } + ChangeFrame(); } } @@ -557,16 +608,17 @@ class Yosin_StretchTitleButton extends Yosin_SplicingButton { class Yosin_RowMoreTitleBtn extends Yosin_CommonUi { LBDownOnClick = null; - btns = []; - tests = []; + btns = null; + tests = null; - constructor(X, Y, titles, baseWidth = 44, path = "sprite/interface/lenheartwindowcommon.img", idx = 160) { + constructor(X, Y, titles, selectIndex = 0, baseWidth = 34, path = "sprite/interface/lenheartwindowcommon.img", idx = 160) { this.tests = titles; + btns = []; local btnX = 0; for (local i = 0; i< titles.len(); i++) { - local textW = FontAssetManager.GenerateNormal(titles[i], true).GetSize().w + 20; - local btnW = baseWidth + 20; + local textW = FontAssetManager.GenerateNormal(titles[i], true).GetSize().w + 10; + local btnW = baseWidth + 10; btnW = textW > btnW ? textW : btnW; local titleBtn = Yosin_StretchTitleButton(btnX, 1, btnW, 19, path, idx, titles[i]); @@ -576,11 +628,11 @@ class Yosin_RowMoreTitleBtn extends Yosin_CommonUi { btn.Parent.LBDownOnClick(this, btn.index); for (local i = 0; i< btn.Parent.btns.len(); i++) { - btn.Parent.btns[i].select = false; + btn.Parent.btns[i].SetSelect(false); btn.Parent.btns[i].titleText.SetFillColor(sq_RGBA(130, 114, 84, 255)); } - btn.select = true; + btn.SetSelect(true); btn.Parent.btns[btn.index].titleText.SetFillColor(sq_RGBA(187, 176, 149, 255)); }; @@ -595,6 +647,8 @@ class Yosin_RowMoreTitleBtn extends Yosin_CommonUi { AddUIChild(btns[i]); } + btns[0].SetSelect(true); + } } \ No newline at end of file diff --git a/sqr/SquirrelFileConfig.cfg b/sqr/SquirrelFileConfig.cfg index f146be2..eff823f 100644 --- a/sqr/SquirrelFileConfig.cfg +++ b/sqr/SquirrelFileConfig.cfg @@ -15,6 +15,7 @@ l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\StageClass.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\ActorObject.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\LayerObject.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\UserStorage.nut +l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\CanvasObject.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\SpriteObject\SpriteFrameClass.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\SpriteObject\SpriteClass.nut l:\Yosin_Engine\Yosin&Kiwano_DOF\sqr\Core\BaseClass\TextObject\Font.nut diff --git a/sqr/User/Asset/AssetManager.nut b/sqr/User/Asset/AssetManager.nut index e66f57e..ebfa4f9 100644 --- a/sqr/User/Asset/AssetManager.nut +++ b/sqr/User/Asset/AssetManager.nut @@ -197,7 +197,7 @@ class _AssetManager_ { while (!Data.Eof()) { local Pack = Data.Get(); //名称 grade 套装Id - if (Pack == "[name]" || Pack == "[part set index]" || Pack == "[grade]" || Pack == "[minimum level]") { + if (Pack == "[name]" || Pack == "[part set index]" || Pack == "[grade]" || Pack == "[rarity]" || Pack == "[minimum level]") { local RealKey = Pack.slice(1, -1); DataTable[RealKey] <- Data.Get(); } @@ -214,7 +214,7 @@ class _AssetManager_ { else if (Pack == "[icon]") { DataTable.icon <- {}; local Ret = Data.Get(); - DataTable.icon.path <- Ret.tolower(); + DataTable.icon.path <- "sprite/" + Ret.tolower(); Ret = Data.Get(); DataTable.icon.index <- Ret.tointeger(); } diff --git a/sqr/User/Asset/Item/Equipment.nut b/sqr/User/Asset/Item/Equipment.nut index 7e5ca96..3749ca9 100644 --- a/sqr/User/Asset/Item/Equipment.nut +++ b/sqr/User/Asset/Item/Equipment.nut @@ -4,6 +4,64 @@ 创建日期:2024-12-12 19:03 文件用途: */ +//装备信息窗口 +class GameItem.EquipmentInfo extends Yosin_Window { + + //装备 + Equipment = null; + //画布 + Canvas = null; + //稀有度边框颜色对应Idx表 + RarityColorIdx = [ + 0, //白装 普通 + 1, //蓝装 高级 + 2, //紫装 稀有 + 4, //粉装 神器 + 6, //金装 史诗 + 3, //红装 勇者 + 5, //橙装 传说 + ]; + + constructor(Equipment) { + this.Equipment = Equipment.weakref(); + base.constructor(clock() + "EquipmentInfo" + Equipment.Idx, 0, 0, 0, 0, 0); + + local background = Yosin_NineBoxStretch(0, 0, 210, 50, "sprite/interface/lenheartwindowcommon.img", 213); + AddUIChild(background); + //210 + Init(); + } + + function Init() { + Canvas = CL_CanvasObject(); + Canvas.ResizeAndClear(210, 600); + Canvas.SetFillBrush(sq_RGBA(255, 255, 255, 250)); + Canvas.SetStrokeBrush(sq_RGBA(255, 255, 255, 250)); + Canvas.BeginDraw(); + + //构造图标 及图标边框 + if (Equipment.Icon) { + local Icon = CL_SpriteFrameObject(Equipment.Icon.path, Equipment.Icon.index); + Canvas.DrawSpriteFrame(Icon, 7, 7); + + local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + RarityColorIdx[Equipment.Rarity]); + Canvas.DrawSpriteFrame(IconFrame, 7, 7); + } + + //绘制装备名称 + if (Equipment.Name.len() > 0) { + local EquName = FontAssetManager.GenerateNormal(Equipment.Name, true, { + color = sq_RGBA(255, 0, 255 255) + }); + Canvas.DrawActor(EquName, 41, 7); + } + + + Canvas.EndDraw(); + Addchild(Canvas); + } +} + class GameItem.Equipment extends GameItem.Item { //装备ID Idx = -1; @@ -17,10 +75,12 @@ class GameItem.Equipment extends GameItem.Item { Minimum_level = -1; //装备等级组 Grade = null; + //装备稀有度 + Rarity = 0; //装备可穿戴职业 Job = 0; //装备图标 - Icon = ""; + Icon = null; //动画 Animation_Job = null; //装备描述 @@ -45,11 +105,19 @@ class GameItem.Equipment extends GameItem.Item { local EquInfo = AssetManager.GetEquipment(vargv[0]); if (EquInfo) { Idx = vargv[0]; + //名称 if (EquInfo.rawin("name")) Name = EquInfo["name"]; + //类型 if (EquInfo.rawin("type")) GetRealEquipmentType(EquInfo["type"].path); + //最低使用等级 if (EquInfo.rawin("minimum level")) Minimum_level = EquInfo["minimum level"]; + //等级组 if (EquInfo.rawin("grade")) Grade = EquInfo["grade"]; + //稀有度 + if (EquInfo.rawin("rarity")) Rarity = EquInfo["rarity"]; + //职业 if (EquInfo.rawin("usable_job")) Job = EquInfo["usable_job"]; + //图标 if (EquInfo.rawin("icon")) Icon = EquInfo["icon"]; if (EquInfo.rawin("Ani")) Animation_Job = EquInfo["Ani"]; if (EquInfo.rawin("DirPath")) DirPath = EquInfo["DirPath"]; @@ -79,6 +147,15 @@ class GameItem.Equipment extends GameItem.Item { else if (EType == "aurora avatar") SetRealEquipmentType("aurora", "aurora"); } + //获取装备信息窗口 + function GetEquipmentInfoWindow() { + if (Property) { + + } else { + return GameItem.EquipmentInfo(this); + } + } + //穿戴装备回调 function OnWearStart() { diff --git a/sqr/User/Controller/ObjectController.nut b/sqr/User/Controller/ObjectController.nut index 83451e1..9f1308d 100644 --- a/sqr/User/Controller/ObjectController.nut +++ b/sqr/User/Controller/ObjectController.nut @@ -62,6 +62,8 @@ class Object_Controller { Move_Instruction_Horizontal = null; //纵向移动方向List Move_Instruction_Vertical = null; + //最终角色移动方向 + MoveFlag = DIRECTION.NONE; //检查按键与移动方向 function CheckMove(Key, Flag, Buffer) { //上 0 下 1 左 2 右 3 @@ -90,8 +92,34 @@ class Object_Controller { else if (Move_Horizontal == 3) X = 1; if (Move_Vertical == 0) Y = -1; else if (Move_Vertical == 1) Y = 1; - //至少有一个方向才会调用 - Parent.Move(Dt, X, Y); + + // 根据 X 和 Y 赋值给 MoveFlagBuf + local MoveFlagBuf; + if (X == 0 && Y == -1) { + MoveFlagBuf = DIRECTION.UP; + } else if (X == 0 && Y == 1) { + MoveFlagBuf = DIRECTION.DOWN; + } else if (X == -1 && Y == 0) { + MoveFlagBuf = DIRECTION.LEFT; + } else if (X == 1 && Y == 0) { + MoveFlagBuf = DIRECTION.RIGHT; + } else if (X == -1 && Y == -1) { + MoveFlagBuf = DIRECTION.UP_LEFT; + } else if (X == 1 && Y == -1) { + MoveFlagBuf = DIRECTION.UP_RIGHT; + } else if (X == -1 && Y == 1) { + MoveFlagBuf = DIRECTION.DOWN_LEFT; + } else if (X == 1 && Y == 1) { + MoveFlagBuf = DIRECTION.DOWN_RIGHT; + } else { + MoveFlagBuf = DIRECTION.NONE; + } + + if (MoveFlagBuf != this.MoveFlag) { + this.MoveFlag = MoveFlagBuf; + + TOWN_PACKET.SendTownMoveStatePacket(this.Parent.X, this.Parent.Y, this.MoveFlag); + } } //控制器更新 diff --git a/sqr/User/Object/ActiveObject/CharacterObjectClass.nut b/sqr/User/Object/ActiveObject/CharacterObjectClass.nut index 6d210c3..0729ec7 100644 --- a/sqr/User/Object/ActiveObject/CharacterObjectClass.nut +++ b/sqr/User/Object/ActiveObject/CharacterObjectClass.nut @@ -145,30 +145,72 @@ class GameObject.Character extends GameObject.ActiveObject { 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 Move(Dt, X, Y) { + function MoveLogic(Dt) { if (!Parent) return; + //没有移动状态 + if (MoveFlag == DIRECTION.NONE) return; //在城镇里 if (typeof Parent == "townmap") { - if (X == 0 && Y == 0) { - //设置回站立动画 - if (AnimationManager.CurrentAni != AnimationManager.RestAni) { - AnimationManager.SetAnimation("RestAni"); - } - } else { - //设置移动动画 - if (AnimationManager.CurrentAni != AnimationManager.MoveAni) { - AnimationManager.SetAnimation("MoveAni"); - } - //设置人物朝向 - if (X > 0) SetDirection(DIRECTION.RIGHT); - else if (X< 0) SetDirection(DIRECTION.LEFT); - MoveBy(Dt * X * Move_Speed * 0.001, Dt * Y * Move_Speed * 0.001 * 0.71, 0); + // 根据 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); } } @@ -179,6 +221,8 @@ class GameObject.Character extends GameObject.ActiveObject { base.OnUpdate(Dt); //控制器逻辑更新 if (Controller) Controller.OnUpdate(Dt); + //移动逻辑更新 + MoveLogic(Dt); } } @@ -198,4 +242,18 @@ GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false //设置站立模式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; + } + } + } } \ No newline at end of file diff --git a/sqr/User/Object/Map/MapObject.nut b/sqr/User/Object/Map/MapObject.nut index 51d9784..76909da 100644 --- a/sqr/User/Object/Map/MapObject.nut +++ b/sqr/User/Object/Map/MapObject.nut @@ -13,6 +13,9 @@ class Map extends Actor { //图层对象Map LayerObject = null; + //角色列表 + PlayerList = null; + //所属城镇 m_town = 0; //地图编号 @@ -291,6 +294,7 @@ class Map extends Actor { obj.Parent.Removechild(obj); } LayerObject.normal.Addchild(obj); + PlayerList[obj.Cid] <- obj; obj.MySelfMap = this.weakref(); //如果是玩家自己 if (IsPlayer) { @@ -309,7 +313,10 @@ class Map extends Actor { //移除对象 function RemoveObject(obj) { + //图层对象中移除玩家 LayerObject.normal.Removechild(obj); + //玩家列表中移除玩家 + PlayerList.rawdelete(obj.Cid); //角色对象 if (typeof obj == "character") { //将地图信息写入角色中 @@ -319,7 +326,7 @@ class Map extends Actor { //移除地图中所有的角色对象 function RemoveAllCharacterObject() { - foreach(obj in LayerObject.normal.Children) { + foreach(obj in PlayerList) { //角色对象 if (typeof obj == "character") { RemoveObject(obj); @@ -376,6 +383,7 @@ class Map extends Actor { } //将角色添加到地图的normal图层 LayerObject.normal.Addchild(obj); + PlayerList[obj.Cid] <- obj; //设置坐标 obj.SetPosition(pos); //将地图信息写入角色中 @@ -384,6 +392,7 @@ class Map extends Actor { } constructor(arg) { + PlayerList = {}; base.constructor(); if (typeof arg == "integer") { diff --git a/sqr/User/Object/Object/BaseObject.nut b/sqr/User/Object/Object/BaseObject.nut index 2ffc658..d3ea1ef 100644 --- a/sqr/User/Object/Object/BaseObject.nut +++ b/sqr/User/Object/Object/BaseObject.nut @@ -110,7 +110,8 @@ class BaseObject extends Actor { Z += vargv[1]; } SetZOrder(Y); - MySelfMap.CheckMovableAreaTransmit(this, X, Y); + //如果是客户端玩家 则判断移动城镇 + if (IsClientPlayer()) MySelfMap.CheckMovableAreaTransmit(this, X, Y); } //设置方向 diff --git a/sqr/User/Socket/FunctionalPack.nut b/sqr/User/Socket/FunctionalPack.nut index 062a48f..0df6ca9 100644 --- a/sqr/User/Socket/FunctionalPack.nut +++ b/sqr/User/Socket/FunctionalPack.nut @@ -16,6 +16,7 @@ function RegisterFunctionalPack() { local name = Pack.Get_String(namelen); local job = Pack.Get_Byte(); local lv = Pack.Get_Byte(); + local moveflag = Pack.Get_Byte(); local posx = Pack.Get_Int(); local posy = Pack.Get_Int(); local posz = 0; @@ -32,6 +33,11 @@ function RegisterFunctionalPack() { if (GlobalTownManager.CurrentMap) { GlobalTownManager.CurrentMap.AddObject(Charc); } + + //设置角色移动状态 + if (moveflag != DIRECTION.NONE) { + Charc.SetMoveFlag(moveflag); + } }); //城镇中移除角色的回包 @@ -39,7 +45,7 @@ function RegisterFunctionalPack() { //从全局地图中找到城镇并移除角色 if (GlobalTownManager.CurrentMap) { //遍历所有角色 - foreach(obj in GlobalTownManager.CurrentMap.LayerObject.normal.Children) { + foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { //角色对象 if (typeof obj == "character" && obj.Cid == Jso.cid) { GlobalTownManager.CurrentMap.RemoveObject(obj); @@ -54,4 +60,32 @@ function RegisterFunctionalPack() { local MapObj = GlobalTownManager.TownList[Jso.town].map[Jso.region]; MapObj.AddObjectByChangeTown(ClientCharacter, Jso.pos); }); + + //城镇中角色移动的回包 + MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_CHARACTER_MOVE_CALLBACK, function(Binary) { + local Pack = Packet(Binary); + Pack.Get_Int(); + local cid = Pack.Get_Int(); + local MoveFlag = Pack.Get_Byte(); + local X = Pack.Get_Int(); + local Y = Pack.Get_Int(); + //获取角色对象 + local obj = GameObject.GetCharacterByCid(cid); + if (obj) { + obj.SetPosition(X, Y, 0); + obj.SetMoveFlag(MoveFlag); + } + }); +} + +//城镇包 +TOWN_PACKET <- { + //城镇角色移动改变状态包 + function SendTownMoveStatePacket(X, Y, MoveFlag) { + local Pack = Packet(); + Pack.Put_Byte(MoveFlag); + Pack.Put_Int(X); + Pack.Put_Int(Y); + MySocket.Send(PACKET_ID.TOWN_CHARACTER_MOVE, Pack.Data); + } } \ No newline at end of file diff --git a/sqr/User/Socket/Packet.nut b/sqr/User/Socket/Packet.nut index a3c6782..07b373d 100644 --- a/sqr/User/Socket/Packet.nut +++ b/sqr/User/Socket/Packet.nut @@ -20,22 +20,22 @@ class Packet { //字节 function Put_Byte(Value) { - this.Data.writen('c', Value); + this.Data.writen(Value, 'c'); } //短整型 function Put_Short(Value) { - this.Data.writen('s', Value); + this.Data.writen(Value, 's'); } //整型 function Put_Int(Value) { - this.Data.writen('i', Value); + this.Data.writen(Value, 'i'); } //浮点型 function Put_Float(Value) { - this.Data.writen('f', Value); + this.Data.writen(Value, 'f'); } //字符串 diff --git a/sqr/User/Stage/TestStage.nut b/sqr/User/Stage/TestStage.nut index a33136c..e172640 100644 --- a/sqr/User/Stage/TestStage.nut +++ b/sqr/User/Stage/TestStage.nut @@ -10,7 +10,14 @@ function TestStage() { T.Enter(); - local Window = Sq_CreateWindow(_Login_Window, "登录界面窗口", 0, 0, 1066, 600, 0); + // local Window = Sq_CreateWindow(_Login_Window, "登录界面窗口", 0, 0, 1066, 600, 0); + + + local Equ = GameItem.Equipment(27675); + local Window = Equ.GetEquipmentInfoWindow(); + Window.SetPosition(300, 80); + Window.ResetFocus(); + // local Window = Sq_CreateWindow(_Inventory, "背包窗口", 150, 12, 257, 555, 20); // //大背景 diff --git a/sqr/User/UI/Window/0_Login.nut b/sqr/User/UI/Window/0_Login.nut index 2b24e03..0ddbee5 100644 --- a/sqr/User/UI/Window/0_Login.nut +++ b/sqr/User/UI/Window/0_Login.nut @@ -129,6 +129,7 @@ class _Login_Window extends Yosin_Window { RegisterTextActor.SetPosition(26, 4); RegisterButton.Addchild(RegisterTextActor); AddUIChild(RegisterButton); + } function RegisterDraw() { diff --git a/sqr/User/UI/Window/1_Select_Character.nut b/sqr/User/UI/Window/1_Select_Character.nut index 90e6e18..b5d3ee6 100644 --- a/sqr/User/UI/Window/1_Select_Character.nut +++ b/sqr/User/UI/Window/1_Select_Character.nut @@ -361,6 +361,7 @@ class _Select_Character_Window extends Yosin_Window { local Info = Jso.charac; local TownObj = Town(Info.town); local Charc = GameObject.CreateCharacter(Info.job, Info.equ, true); + Charc.Cid = Info.cid; TownObj.AddObject(Charc, true); ClientCharacter = Charc; }.bindenv(this)); diff --git a/sqr/User/_ENUM/enum_game.nut b/sqr/User/_ENUM/enum_game.nut index 2346ef9..0926f20 100644 --- a/sqr/User/_ENUM/enum_game.nut +++ b/sqr/User/_ENUM/enum_game.nut @@ -143,6 +143,16 @@ enum DIRECTION { UP = 2 //下 DOWN = 3 + //左上 + UP_LEFT = 4 + //右上 + UP_RIGHT = 5 + //左下 + DOWN_LEFT = 6 + //右下 + DOWN_RIGHT = 7 + //无 + NONE = 8 } //基础状态枚举表 diff --git a/sqr/User/_ENUM/enum_packet.nut b/sqr/User/_ENUM/enum_packet.nut index 52647c1..0bb22e6 100644 --- a/sqr/User/_ENUM/enum_packet.nut +++ b/sqr/User/_ENUM/enum_packet.nut @@ -28,6 +28,8 @@ enum PACKET_ID { //城镇移动切换区域 CHANGE_TOWN_AREA = 10001 + //城镇中角色移动 + TOWN_CHARACTER_MOVE = 10004 @@ -45,4 +47,6 @@ enum PACKET_ID { TOWN_ADD_CHARACTER_CALLBACK = 10002 //城镇中移除角色的回包 TOWN_REMOVE_CHARACTER_CALLBACK = 10003 + //城镇中角色移动的回包 + TOWN_CHARACTER_MOVE_CALLBACK = 10004 } \ No newline at end of file diff --git a/sqr/folder-alias.json b/sqr/folder-alias.json index 6a1d1df..5bef230 100644 --- a/sqr/folder-alias.json +++ b/sqr/folder-alias.json @@ -253,5 +253,11 @@ }, "User/Socket/FunctionalPack.nut": { "description": "功能数据包" + }, + "Core/BaseClass/CanvasObject.nut": { + "description": "画布类" + }, + "Core/BaseClass/AudioClass.nut": { + "description": "音频类" } } \ No newline at end of file