城镇角色移动初步完成 PVF引用类型字符串查询修复BUG
This commit is contained in:
parent
ddf3166eae
commit
11bc42ddac
BIN
Yosin_Engine.exe
BIN
Yosin_Engine.exe
Binary file not shown.
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
//控制器更新
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -199,3 +243,17 @@ GameObject.CreateCharacter <- function(Job = 0, EquIdList = [], IsPlayer = false
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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") {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
//设置方向
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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');
|
||||
}
|
||||
|
||||
//字符串
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
// //大背景
|
||||
|
|
|
|||
|
|
@ -129,6 +129,7 @@ class _Login_Window extends Yosin_Window {
|
|||
RegisterTextActor.SetPosition(26, 4);
|
||||
RegisterButton.Addchild(RegisterTextActor);
|
||||
AddUIChild(RegisterButton);
|
||||
|
||||
}
|
||||
|
||||
function RegisterDraw() {
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -143,6 +143,16 @@ enum DIRECTION {
|
|||
UP = 2
|
||||
//下
|
||||
DOWN = 3
|
||||
//左上
|
||||
UP_LEFT = 4
|
||||
//右上
|
||||
UP_RIGHT = 5
|
||||
//左下
|
||||
DOWN_LEFT = 6
|
||||
//右下
|
||||
DOWN_RIGHT = 7
|
||||
//无
|
||||
NONE = 8
|
||||
}
|
||||
|
||||
//基础状态枚举表
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -253,5 +253,11 @@
|
|||
},
|
||||
"User/Socket/FunctionalPack.nut": {
|
||||
"description": "功能数据包"
|
||||
},
|
||||
"Core/BaseClass/CanvasObject.nut": {
|
||||
"description": "画布类"
|
||||
},
|
||||
"Core/BaseClass/AudioClass.nut": {
|
||||
"description": "音频类"
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue