城镇角色移动初步完成 PVF引用类型字符串查询修复BUG

This commit is contained in:
WONIU 2025-01-04 20:03:17 +08:00 committed by Lenheart
parent ddf3166eae
commit 11bc42ddac
19 changed files with 477 additions and 74 deletions

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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() {

View File

@ -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);
}
}
//控制器更新

View File

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

View File

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

View File

@ -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);
}
//设置方向

View File

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

View File

@ -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');
}
//字符串

View File

@ -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);
// //大背景

View File

@ -129,6 +129,7 @@ class _Login_Window extends Yosin_Window {
RegisterTextActor.SetPosition(26, 4);
RegisterButton.Addchild(RegisterTextActor);
AddUIChild(RegisterButton);
}
function RegisterDraw() {

View File

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

View File

@ -143,6 +143,16 @@ enum DIRECTION {
UP = 2
//下
DOWN = 3
//左上
UP_LEFT = 4
//右上
UP_RIGHT = 5
//左下
DOWN_LEFT = 6
//右下
DOWN_RIGHT = 7
//无
NONE = 8
}
//基础状态枚举表

View File

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

View File

@ -253,5 +253,11 @@
},
"User/Socket/FunctionalPack.nut": {
"description": "功能数据包"
},
"Core/BaseClass/CanvasObject.nut": {
"description": "画布类"
},
"Core/BaseClass/AudioClass.nut": {
"description": "音频类"
}
}