Compare commits

...

6 Commits

Author SHA1 Message Date
Lenheart 275d66556a 长更新 2025-02-20 13:53:36 +08:00
Lenheart 223a3d3246 Merge remote-tracking branch 'origin/yi' into dong 2025-01-20 20:14:37 +08:00
WONIU a055e69606 Merge remote-tracking branch 'origin/dong' into yi
# Conflicts:
#	sqr/Core/UI_Class/UI_Widget.nut
#	sqr/User/Stage/LodingStage.nut
#	sqr/User/Stage/TestStage.nut
#	sqr/User/UI/Window/5_Inventory/5_Inventory.nut
#	sqr/User/UI/Window/5_Inventory/Inventory_DressUpPage.nut
#	sqr/User/main.nut
2025-01-20 18:20:17 +08:00
WONIU 85586a714c 聊天 2025-01-19 17:44:38 +08:00
WONIU a9d9468cb5 背包 装扮页 2025-01-19 14:35:36 +08:00
WONIU d2077de719 拉伸修改为返回画布 2025-01-19 14:09:38 +08:00
71 changed files with 7490 additions and 2648 deletions

Binary file not shown.

View File

@ -19,6 +19,10 @@ class Animation extends CL_SpriteObject {
CurrentFrame = null; CurrentFrame = null;
//下帧延迟 //下帧延迟
NextFrameDelay = 9999999; NextFrameDelay = 9999999;
//染色Flag
DyeingFlag = false;
//插值模式
InterpolationFlag = null;
//状态机对象(只有存在时才有KeyFlag) //状态机对象(只有存在时才有KeyFlag)
StateMachine = null; StateMachine = null;
@ -42,6 +46,14 @@ class Animation extends CL_SpriteObject {
OutlineList = null; OutlineList = null;
//当前描边对象 //当前描边对象
CurrentOutline = null; CurrentOutline = null;
//染色颜色
DyeColor = null;
//染色帧List
DyeFrameList = null;
//整体染色
DyeAllFlag = false;
//裁切数据
CropRect = null;
//附加选项 //附加选项
AdditionalOptions = null; AdditionalOptions = null;
@ -66,6 +78,7 @@ class Animation extends CL_SpriteObject {
} }
//初始化数据 //初始化数据
InitData(vargv[0]); InitData(vargv[0]);
} }
@ -146,6 +159,7 @@ class Animation extends CL_SpriteObject {
if (CurrentIndexT == 0) SetSize(SpriteArr[0].GetSize()); if (CurrentIndexT == 0) SetSize(SpriteArr[0].GetSize());
//记录总帧数 //记录总帧数
TotalFrameIndex = FrameArr.len(); TotalFrameIndex = FrameArr.len();
DyeFrameList = array(TotalFrameIndex);
} }
//被添加时 要刷新一下当前帧 //被添加时 要刷新一下当前帧
@ -195,6 +209,31 @@ class Animation extends CL_SpriteObject {
} }
} }
//设置整体染色
function SetDye(Color, Flag = 0) {
foreach(Index, FrameSf in SpriteArr) {
local DyeFrame = FrameSf.Dye(Color, Flag);
DyeFrameList[Index] = (DyeFrame);
}
DyeColor = Color;
DyeAllFlag = true;
}
//设置裁切
function SetCropRect(Parameter1, Parameter2, ...) {
if (vargv.len() == 0) {
local Point1 = Parameter1;
local Point2 = Parameter2;
CropRect = [Point1.x, Point1.y, Point2.x, Point2.y];
} else if (vargv.len() == 2) {
local X1 = Parameter1;
local Y1 = Parameter2;
local X2 = vargv[0];
local Y2 = vargv[1];
CropRect = [X1, Y1, X2, Y2];
}
}
//添加描边子对象 //添加描边子对象
function AddOutlineChild() { function AddOutlineChild() {
//如果有上一个描边对象先移除 //如果有上一个描边对象先移除
@ -216,6 +255,9 @@ class Animation extends CL_SpriteObject {
//当前帧更换为本帧 //当前帧更换为本帧
CurrentFrame = SpriteArr[CurrentFrameIndex]; CurrentFrame = SpriteArr[CurrentFrameIndex];
//如果是整体染色 则直接使用染色帧
if (DyeAllFlag) CurrentFrame = DyeFrameList[CurrentFrameIndex];
CurrentFrame.SetPosition(FrameArr[CurrentFrameIndex].Pos);
SetFrame(CurrentFrame); SetFrame(CurrentFrame);
local FrameInfo = FrameArr[CurrentFrameIndex]; local FrameInfo = FrameArr[CurrentFrameIndex];
@ -234,14 +276,129 @@ class Animation extends CL_SpriteObject {
SetScale(FlagBuf.IMAGE_RATE.x, FlagBuf.IMAGE_RATE.y); SetScale(FlagBuf.IMAGE_RATE.x, FlagBuf.IMAGE_RATE.y);
} }
//线性减淡 //线性减淡
if ("GRAPHIC_EFFECT_LINEARDODGE" in FrameInfo.Flag) { if ("GRAPHIC_EFFECT_LINEARDODGE" in FlagBuf) {
SetMode(0); SetMode(0);
} }
//旋转
if ("IMAGE_ROTATE" in FlagBuf) {
SetRotation(FlagBuf.IMAGE_ROTATE);
}
//染色 在没有开启整体染色时才执行的逻辑
if (!DyeAllFlag) {
if ("RGBA" in FlagBuf) {
DyeingFlag = true;
if (!DyeFrameList[CurrentFrameIndex]) {
local RGBA_V = sq_RGBA(FlagBuf.RGBA[0], FlagBuf.RGBA[1], FlagBuf.RGBA[2], FlagBuf.RGBA[3]);
DyeFrameList[CurrentFrameIndex] = SpriteArr[CurrentFrameIndex].Dye(RGBA_V);
DyeFrameList[CurrentFrameIndex].SetPosition(FrameArr[CurrentFrameIndex].Pos);
}
CurrentFrame = DyeFrameList[CurrentFrameIndex];
SetFrame(CurrentFrame);
//设置透明度
SetOpacity(FlagBuf.RGBA[3].tofloat() / 250.0);
} else {
if (DyeingFlag) {
DyeingFlag = false;
//恢复透明度
SetOpacity(1.0);
}
}
}
//插值模式
if ("INTERPOLATION" in FlagBuf) {
//初始化插值数据
if (!InterpolationFlag) {
InterpolationFlag = [];
//旧插值数据
InterpolationFlag.push(sq_DeepCopy(FrameArr[CurrentFrameIndex]));
//新插值数据
InterpolationFlag.push(sq_DeepCopy(FrameArr[CurrentFrameIndex + 1]));
}
} else {
if (InterpolationFlag) {
InterpolationFlag = null;
}
}
//如果有描边 //如果有描边
if (IsOutline) AddOutlineChild(); if (IsOutline) AddOutlineChild();
//Ani对象的大小同步为精灵帧对象的大小 //Ani对象的大小同步为精灵帧对象的大小
if (CurrentFrame) SetSize(CurrentFrame.GetSize()); if (CurrentFrame) SetSize(CurrentFrame.GetSize());
//裁切
if (CropRect) {
base.SetCropRect(CropRect[0], CropRect[1], CropRect[2], CropRect[3]);
//所有子对象裁切
foreach(Child in Children) {
Child.SetCropRect(CropRect[0], CropRect[1], CropRect[2], CropRect[3]);
}
}
}
function InterpolationLogic() {
if (!InterpolationFlag) return;
//插值倍率
local InterRate = Math.getUniformVelocity(0, 100, CurrentIndexT, NextFrameDelay).tofloat() / 100.0;
//旧插值数据
local OldData = InterpolationFlag[0];
//新插值数据
local NewData = InterpolationFlag[1];
//RGBA插值
{
local OldRgbaData = [255, 255, 255, 250];
local NewRgbaData = [255, 255, 255, 250];
if ("RGBA" in OldData.Flag) OldRgbaData = OldData.Flag.RGBA;
if ("RGBA" in NewData.Flag) NewRgbaData = NewData.Flag.RGBA;
local RgbaData = [
OldRgbaData[0] + (NewRgbaData[0] - OldRgbaData[0]) * InterRate,
OldRgbaData[1] + (NewRgbaData[1] - OldRgbaData[1]) * InterRate,
OldRgbaData[2] + (NewRgbaData[2] - OldRgbaData[2]) * InterRate,
OldRgbaData[3] + (NewRgbaData[3] - OldRgbaData[3]) * InterRate
];
// //设置染色
// DyeFrameList[CurrentFrameIndex] = CurrentFrame.Dye(sq_RGBA(RgbaData[0], RgbaData[1], RgbaData[2], RgbaData[3]));
// CurrentFrame = DyeFrameList[CurrentFrameIndex];
// CurrentFrame.SetPosition(FrameArr[CurrentFrameIndex].Pos);
// SetFrame(CurrentFrame);
//设置透明度
SetOpacity(RgbaData[3].tofloat() / 250.0);
};
//坐标
{
local PosData = {
x = OldData.Pos.x + (NewData.Pos.x - OldData.Pos.x) * InterRate,
y = OldData.Pos.y + (NewData.Pos.y - OldData.Pos.y) * InterRate
}
CurrentFrame.SetPosition(PosData);
SetFrame(CurrentFrame);
};
//缩放
{
local OldRateData = {
x = 1.0,
y = 1.0
};
local NewRateData = {
x = 1.0,
y = 1.0
};
if ("IMAGE_RATE" in OldData.Flag) OldRateData = OldData.Flag.IMAGE_RATE;
if ("IMAGE_RATE" in NewData.Flag) NewRateData = NewData.Flag.IMAGE_RATE;
local ScaleData = {
x = OldRateData.x + (NewRateData.x - OldRateData.x) * InterRate,
y = OldRateData.y + (NewRateData.y - OldRateData.y) * InterRate
}
SetScale(ScaleData);
}
//旋转
{
local OldRotateData = 0.0;
local NewRotateData = 0.0;
if ("IMAGE_ROTATE" in OldData.Flag) OldRotateData = OldData.Flag.IMAGE_ROTATE;
if ("IMAGE_ROTATE" in NewData.Flag) NewRotateData = NewData.Flag.IMAGE_ROTATE;
local RotateData = OldRotateData + (NewRotateData - OldRotateData) * InterRate;
SetRotation(RotateData);
}
} }
//override //override
@ -250,7 +407,8 @@ class Animation extends CL_SpriteObject {
if (IsUsability) { if (IsUsability) {
//累加当前帧时间 //累加当前帧时间
CurrentIndexT += dt; CurrentIndexT += dt;
//插值模式判断
InterpolationLogic();
//当前帧时间 超过 当前帧延迟就需要切换帧了 //当前帧时间 超过 当前帧延迟就需要切换帧了
if (CurrentIndexT >= NextFrameDelay) { if (CurrentIndexT >= NextFrameDelay) {
CurrentIndexT = 0; CurrentIndexT = 0;

View File

@ -167,6 +167,7 @@ function InitPvfAni(Ro) {
AttackBox = [], AttackBox = [],
DamageBox = [], DamageBox = [],
Flag = {}, Flag = {},
Delay = 0,
}; };
//碰撞框项目数量 //碰撞框项目数量

View File

@ -33,8 +33,8 @@ class Script {
return Asset_GetPvfBinString(C_Object, Key); return Asset_GetPvfBinString(C_Object, Key);
} }
function GetLoadString(Key) { function GetLoadString(Type, Key) {
return Asset_GetPvfLoadString(C_Object, Key); return Asset_GetPvfLoadString(C_Object, Type, Key);
} }
} }
@ -139,13 +139,14 @@ class GlobaData {
function ResolvingData(IO, Func, Path) { function ResolvingData(IO, Func, Path) {
local DataTable = {}; local DataTable = {};
DataTable.filepath <- Path; DataTable.filepath <- Path;
local Type = Path.slice(0, Path.find("/")).tolower();
local DataArr = []; local DataArr = [];
local Length = IO.len(); local Length = IO.len();
if (Length >= 7) { if (Length >= 7) {
local i = 2; local i = 2;
while (true) { while (true) {
if (i< Length && Length - i >= 5) { if (i< Length && Length - i >= 5) {
local str = UnpackData(IO, i); local str = UnpackData(IO, i, Type);
i += 5; i += 5;
DataArr.push(str); DataArr.push(str);
} else break; } else break;
@ -156,7 +157,7 @@ class GlobaData {
return null; return null;
} }
function UnpackData(IO, i) { function UnpackData(IO, i, Type) {
IO.seek(i); //内容指示位 IO.seek(i); //内容指示位
local currentByte = IO.readn('c'); //内容指示位 local currentByte = IO.readn('c'); //内容指示位
local after = IO.GetInt(); local after = IO.GetInt();
@ -168,7 +169,7 @@ class GlobaData {
if (!Buf) { if (!Buf) {
Buf = ""; Buf = "";
} else { } else {
Buf = getroottable()._Script_Data_.GetLoadString(Buf); Buf = getroottable()._Script_Data_.GetLoadString(Type, Buf);
} }
return Buf; return Buf;
} }
@ -177,7 +178,7 @@ class GlobaData {
if (!Buf) { if (!Buf) {
Buf = ""; Buf = "";
} else { } else {
Buf = getroottable()._Script_Data_.GetLoadString(Buf); Buf = getroottable()._Script_Data_.GetLoadString(Type, Buf);
} }
return Buf; return Buf;
} }
@ -187,12 +188,11 @@ class GlobaData {
return ret; return ret;
} }
case 4: { case 4: {
// local Bbuf = blob(4); local Bbuf = blob(4);
// Bbuf.writen(after, 'i'); Bbuf.writen(after, 'i');
// Bbuf.seek(0); Bbuf.seek(0);
// local Buf = Bbuf.readn('f'); local Buf = Bbuf.readn('f');
// out += after + '\t'; return Buf.tofloat();
return after;
} }
case 6: case 6:
case 8: case 8:

View File

@ -57,12 +57,14 @@ class CL_SpriteObject extends CL_BaseObject {
local Point1 = Parameter1; local Point1 = Parameter1;
local Point2 = Parameter2; local Point2 = Parameter2;
Sprite_SetCropRect(this.C_Object, Point1, Point2); Sprite_SetCropRect(this.C_Object, Point1, Point2);
SetSize(Point2.x - Point1.x, Point2.y - Point1.y);
} else if (vargv.len() == 2) { } else if (vargv.len() == 2) {
local X1 = Parameter1; local X1 = Parameter1;
local Y1 = Parameter2; local Y1 = Parameter2;
local X2 = vargv[0]; local X2 = vargv[0];
local Y2 = vargv[1]; local Y2 = vargv[1];
Sprite_SetCropRect(this.C_Object, X1, Y1, X2, Y2); Sprite_SetCropRect(this.C_Object, X1, Y1, X2, Y2);
SetSize(X2 - X1, Y2 - Y1);
} }
} }
} }

View File

@ -42,8 +42,13 @@ class CL_SpriteFrameObject extends CL_BaseObject {
} }
} }
//返回一个画布精灵 //创建描边 返回一个画布精灵
function CreateOutLine(Color) { function CreateOutLine(Color) {
return CL_SpriteObject(SpriteFrame_CreateOutLine(this.C_Object, Color)); return CL_SpriteObject(SpriteFrame_CreateOutLine(this.C_Object, Color));
} }
//染色 返回一个精灵帧
function Dye(Color, Flag = 0) {
return CL_SpriteFrameObject(SpriteFrame_Dye(this.C_Object, Color, Flag));
}
} }

View File

@ -15,6 +15,7 @@ class TextActor extends CL_BaseObject {
* @参数 textstyle Map 可选对象: * @参数 textstyle Map 可选对象:
alignment 对其方式 alignment 对其方式
wrap_width 自动换行宽度 wrap_width 自动换行宽度
word_wrapping 自动换行模式
line_spacing 行间距 line_spacing 行间距
show_underline 显示下划线 show_underline 显示下划线
show_strikethrough 显示删除线 show_strikethrough 显示删除线
@ -64,4 +65,33 @@ class TextActor extends CL_BaseObject {
function SetFillColor(Color) { function SetFillColor(Color) {
TextActor_SetFillColor(this.C_Object, Color); TextActor_SetFillColor(this.C_Object, Color);
} }
//设置坐标
function SetPosition(Value, ...) {
if (vargv.len() == 0) {
X = Value.x;
Y = Value.y;
} else if (vargv.len() == 1) {
X = Value;
Y = vargv[0];
}
X = X.tointeger();
Y = Y.tointeger();
BaseObject_SetPosition(this.C_Object, X, Y);
}
//移动坐标
function MoveTo(Value, ...) {
if (vargv.len() == 0)
BaseObject_MoveTo(this.C_Object, Value.tointeger());
else if (vargv.len() == 1)
BaseObject_MoveTo(this.C_Object, Value.tointeger(), vargv[0].tointeger());
}
//移动相对坐标
function MoveBy(Value, ...) {
if (vargv.len() == 0)
BaseObject_MoveBy(this.C_Object, Value.tointeger());
else if (vargv.len() == 1)
BaseObject_MoveBy(this.C_Object, Value.tointeger(), vargv[0].tointeger());
}
} }

View File

@ -45,5 +45,9 @@ function sq_DeepCopy(original) {
* @函数作用: 返回颜色的十六进制数 * @函数作用: 返回颜色的十六进制数
*/ */
function sq_RGBA(R, G, B, A) { function sq_RGBA(R, G, B, A) {
R = R.tointeger();
G = G.tointeger();
B = B.tointeger();
A = A.tointeger();
return (A << 24) + (R << 16) + (G << 8) + B; return (A << 24) + (R << 16) + (G << 8) + B;
} }

View File

@ -318,6 +318,17 @@ class Math {
} }
//除以两个值并四舍五入
function DivideAndRound(var1, var2) {
local ret = var1.tofloat() / var2.tofloat();
return Round(ret);
}
//总是舍去
function Floor(var) {
return var.tointeger();
}
//currentRate 越接近maxRate ,返回值由sv越接近ev //currentRate 越接近maxRate ,返回值由sv越接近ev
function getUniformVelocity(sv, ev, currentRate, maxRate) { function getUniformVelocity(sv, ev, currentRate, maxRate) {
@ -345,6 +356,18 @@ class Math {
return sv + varyValue * increaseRate; return sv + varyValue * increaseRate;
} }
//根据原数值 浮动比例 最终倍率 获得最终值
function getFinalValueByFloatRate(originalValue, floatRate, finalRate) {
// 计算 Value 的 15%
local fifteenPercent = originalValue * 0.15;
// 计算浮动范围的下限和上限
local lowerBound = originalValue - fifteenPercent;
local upperBound = originalValue + fifteenPercent;
// 根据 Rate 计算最终值
local finalValue = lowerBound + floatRate * (upperBound - lowerBound);
return finalValue;
}
function Max(a, b) { function Max(a, b) {
if (a< b) if (a< b)

View File

@ -21,4 +21,17 @@ class String {
} }
return Path; return Path;
} }
function ReplaceString(input, pattern, replacement) {
local rbuf = typeof pattern == "string" ? regexp(pattern) : pattern;
while (true) {
local result = rbuf.capture(input);
if (!result) break;
local begin = result[0].begin;
local end = result[0].end;
input = input.slice(0, begin) + replacement + input.slice(end);
}
return input;
}
} }

View File

@ -231,3 +231,15 @@ enum DashStyle {
DashDot ///< 圆角样式 DashDot ///< 圆角样式
DashDotDot ///< 圆角样式 DashDotDot ///< 圆角样式
}; };
/**
* \~chinese
* @brief 换行模式
*/
enum TextWordWrapping {
WRAPPING_WRAP ///< 在单词边界处换行,这是实现自动换行的常用模式
WRAPPING_NO_WRAP ///< 不进行换行,文本将超出布局边界
WRAPPING_EMERGENCY_BREAK ///< 在必要时在任意字符处换行,即使不在单词边界
WRAPPING_WHOLE_WORD ///< 仅在完整的单词边界处进行换行
WRAPPING_CHARACTER ///< 可以在任意字符处进行换行
};

47
sqr/Core/Timer/Timer.nut Normal file
View File

@ -0,0 +1,47 @@
/*
文件名:Timer.nut
路径:Core/Timer/Timer.nut
创建日期:2025-02-11 23:25
文件用途:定时器
*/
class _Timer_ {
Exec_Tree = null;
constructor() {
//执行树
Exec_Tree = [];
//注册Proc
_Game_Logic_Func_._Timer_Proc <- Proc.bindenv(this);
getroottable().Timer <- this;
}
//下帧执行
function SetNextFrame(target_func, ...) {
local target_arg_list = [];
target_arg_list.push(getroottable());
for (local i = 0; i< vargv.len(); i++) {
target_arg_list.push(vargv[i]);
}
//设置下一次执行
local func_info = [];
func_info.push(target_func);
func_info.push(target_arg_list);
Exec_Tree.push(func_info);
}
function Proc(Dt, Lister) {
foreach(Info in Exec_Tree) {
//函数
local func = Info[0];
//参数
local func_args = Info[1];
//执行函数
func.acall(func_args);
}
}
}
_Timer_();

View File

@ -5,9 +5,9 @@
文件用途:UI核心类 文件用途:UI核心类
*/ */
//UI层Actor //UI层Actor
_UiObject_ <- null; if (!(getroottable().rawin("_UiObject_"))) _UiObject_ <- null;
//窗口队列 //窗口队列
_SYS_WINDOW_LIST_ <- []; if (!(getroottable().rawin("_SYS_WINDOW_LIST_"))) _SYS_WINDOW_LIST_ <- [];
//基础窗口类 所有UI类继承与本类 //基础窗口类 所有UI类继承与本类
class Yosin_BaseWindow extends Layer { class Yosin_BaseWindow extends Layer {
//父控件 //父控件
@ -56,80 +56,80 @@ class Yosin_BaseWindow extends Layer {
} }
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseProc(MousePos_X, MousePos_Y); Window.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseLbDown(MousePos_X, MousePos_Y); Window.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) { function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseLbClick(MousePos_X, MousePos_Y); Window.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseLbUp(MousePos_X, MousePos_Y); Window.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标右键按下回调 //鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y) { function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseRbDown(MousePos_X, MousePos_Y); Window.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标右键单击回调 //鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y) { function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseRbClick(MousePos_X, MousePos_Y); Window.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标右键弹起回调 //鼠标右键弹起回调
function OnMouseRbUp(MousePos_X, MousePos_Y) { function OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseRbUp(MousePos_X, MousePos_Y); Window.OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标中键按下回调 //鼠标中键按下回调
function OnMouseMbDown(MousePos_X, MousePos_Y) { function OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseMbDown(MousePos_X, MousePos_Y); Window.OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标中键单击回调 //鼠标中键单击回调
function OnMouseMbClick(MousePos_X, MousePos_Y) { function OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseMbClick(MousePos_X, MousePos_Y); Window.OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标中键弹起回调 //鼠标中键弹起回调
function OnMouseMbUp(MousePos_X, MousePos_Y) { function OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseMbUp(MousePos_X, MousePos_Y); Window.OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//鼠标滚轮事件回调 //鼠标滚轮事件回调
function OnMouseWheel(Wheel, MousePos_X, MousePos_Y) { function OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
foreach(Window in UI_Childrens) { foreach(Window in UI_Childrens) {
Window.OnMouseWheel(Wheel, MousePos_X, MousePos_Y); Window.OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//设置回调事件 //设置回调事件
@ -329,7 +329,7 @@ class Yosin_Window extends Yosin_BaseWindow {
} }
//override //override
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
//设定拖动逻辑 //设定拖动逻辑
if (MoveFlag) { if (MoveFlag) {
@ -338,15 +338,15 @@ class Yosin_Window extends Yosin_BaseWindow {
Y = B_Y - (M_Ypos - MousePos_Y); Y = B_Y - (M_Ypos - MousePos_Y);
} }
//调用原生方法 //调用原生方法
base.OnMouseProc(MousePos_X, MousePos_Y); base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//override //override
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
//如果点击事件在窗口内 //如果点击事件在窗口内
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) { if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height) && !WindowInteractiveFlag) {
if (IsIndependent) ResetFocus(); if (IsIndependent) ResetFocus();
//如果点下去在标题栏 //如果点下去在标题栏
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, TitleH)) { if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, TitleH)) {
@ -358,11 +358,11 @@ class Yosin_Window extends Yosin_BaseWindow {
} }
} }
//调用原生方法 //调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//override //override
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
if (MoveFlag) { if (MoveFlag) {
MoveFlag = false; MoveFlag = false;
@ -372,28 +372,64 @@ class Yosin_Window extends Yosin_BaseWindow {
B_Y = null; B_Y = null;
} }
//调用原生方法 //调用原生方法
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
}
//override
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
//调用原生方法
base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//override //override
//鼠标右键按下回调 //鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y) { function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
//调用原生方法 //调用原生方法
base.OnMouseRbDown(MousePos_X, MousePos_Y); base.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//override //override
//鼠标右键弹起回调 //鼠标右键弹起回调
function OnMouseRbUp(MousePos_X, MousePos_Y) { function OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
//调用原生方法 //调用原生方法
base.OnMouseRbUp(MousePos_X, MousePos_Y); base.OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//override //override
//鼠标滚轮事件回调 //鼠标右键单击回调
function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
//调用原生方法 //调用原生方法
base.OnMouseWheel(Flag, MousePos_X, MousePos_Y); base.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
}
//override
//鼠标中键按下回调
function OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
//调用原生方法
base.OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
}
//override
//鼠标中键弹起回调
function OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
//调用原生方法
base.OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
}
//override
//鼠标中键单击回调
function OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
//调用原生方法
base.OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
}
//override
//鼠标滚轮事件回调
function OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
//调用原生方法
base.OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
@ -444,81 +480,82 @@ _Yosin_Cursor();
_Yosin_Mouse_Logic_Func_ <- {}; _Yosin_Mouse_Logic_Func_ <- {};
//鼠标逻辑入口 //鼠标逻辑入口
function _Yosin_Windows_Mouse_Logic_(MouseState, Wheel, MousePos_X, MousePos_Y) { function _Yosin_Windows_Mouse_Logic_(MouseState, Wheel, MousePos_X, MousePos_Y) {
//鼠标逻辑
Yosin_Cursor.Event(MouseState, Wheel, MousePos_X, MousePos_Y); Yosin_Cursor.Event(MouseState, Wheel, MousePos_X, MousePos_Y);
//克隆一遍窗口列表 //克隆一遍窗口列表
local WindowListF = clone(_SYS_WINDOW_LIST_); local WindowListF = clone(_SYS_WINDOW_LIST_);
WindowListF.reverse(); WindowListF.reverse();
local WindowInteractiveFlag = false;
foreach(Window in WindowListF) { foreach(Window in WindowListF) {
if (Window.Visible) { if (Window.Visible) {
switch (MouseState) { switch (MouseState) {
//常规或者拖动事件 //常规或者拖动事件
case 0x305: { case 0x305: {
Window.OnMouseProc(MousePos_X, MousePos_Y); Window.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//左键按下 //左键按下
case 0x101: { case 0x101: {
_Mouse_Click_Flag.LbFlag <- true; Window.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
Window.OnMouseLbDown(MousePos_X, MousePos_Y);
break; break;
} }
//左键松开 //左键松开
case 0x001: { case 0x001: {
//左键单击 Window.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (_Mouse_Click_Flag.LbFlag == true) { break;
_Mouse_Click_Flag.LbFlag <- false;
Window.OnMouseLbClick(MousePos_X, MousePos_Y);
} }
Window.OnMouseLbUp(MousePos_X, MousePos_Y); //左键单击
case 0x201: {
Window.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//右键按下 //右键按下
case 0x102: { case 0x102: {
_Mouse_Click_Flag.RbFlag <- true; Window.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
Window.OnMouseRbDown(MousePos_X, MousePos_Y);
break; break;
} }
//右键松开 //右键松开
case 0x002: { case 0x002: {
//右键单击 Window.OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (_Mouse_Click_Flag.RbFlag == true) { break;
_Mouse_Click_Flag.RbFlag <- false;
Window.OnMouseRbClick(MousePos_X, MousePos_Y);
} }
Window.OnMouseRbUp(MousePos_X, MousePos_Y); //右键单击
case 0x202: {
Window.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//中键按下 //中键按下
case 0x103: { case 0x103: {
_Mouse_Click_Flag.MbFlag <- true; Window.OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
Window.OnMouseMbDown(MousePos_X, MousePos_Y);
break; break;
} }
//中键松开 //中键松开
case 0x003: { case 0x003: {
//中键单击 Window.OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (_Mouse_Click_Flag.MbFlag == true) { break;
_Mouse_Click_Flag.MbFlag <- false;
Window.OnMouseMbClick(MousePos_X, MousePos_Y);
} }
Window.OnMouseMbUp(MousePos_X, MousePos_Y); //中键单击
case 0x203: {
Window.OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//滚轮事件 //滚轮事件
case 0x406: { case 0x406: {
Window.OnMouseWheel(Wheel, MousePos_X, MousePos_Y); Window.OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
} }
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Window.X, Window.Y, Window.Width, Window.Height)) break; if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Window.X, Window.Y, Window.Width, Window.Height)) {
WindowInteractiveFlag = Window;
}
} }
} }
//可注册的除窗口外的其他事件 //可注册的除窗口外的其他事件
foreach(Func in _Yosin_Mouse_Logic_Func_) { foreach(Func in _Yosin_Mouse_Logic_Func_) {
local ret = Func(MouseState, Wheel, MousePos_X, MousePos_Y); local ret = Func(MouseState, Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (ret == true) return; if (ret == true) return;
} }
} }

View File

@ -10,9 +10,14 @@ class _Yosin_Cursor extends CL_SpriteObject {
_Mouse_Click_Flag = null; _Mouse_Click_Flag = null;
function _typeof() {
return "_Yosin_Cursor";
}
constructor() { constructor() {
base.constructor(); base.constructor();
_Mouse_Click_Flag = {}; _Mouse_Click_Flag = {};
SetName("鼠标");
getroottable().Yosin_Cursor <- this; getroottable().Yosin_Cursor <- this;
} }
@ -32,17 +37,18 @@ class _Yosin_Cursor extends CL_SpriteObject {
//事件 //事件
function Event(MouseState, Wheel, MousePos_X, MousePos_Y) { function Event(MouseState, Wheel, MousePos_X, MousePos_Y) {
local WindowInteractiveFlag = false;
switch (MouseState) { switch (MouseState) {
//常规或者拖动事件 //常规或者拖动事件
case 0x305: { case 0x305: {
SetPosition(MousePos_X, MousePos_Y); SetPosition(MousePos_X, MousePos_Y);
OnMouseProc(MousePos_X, MousePos_Y); OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//左键按下 //左键按下
case 0x101: { case 0x101: {
_Mouse_Click_Flag.LbFlag <- true; _Mouse_Click_Flag.LbFlag <- true;
OnMouseLbDown(MousePos_X, MousePos_Y); OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//左键松开 //左键松开
@ -50,15 +56,15 @@ class _Yosin_Cursor extends CL_SpriteObject {
//左键单击 //左键单击
if (_Mouse_Click_Flag.LbFlag == true) { if (_Mouse_Click_Flag.LbFlag == true) {
_Mouse_Click_Flag.LbFlag <- false; _Mouse_Click_Flag.LbFlag <- false;
OnMouseLbClick(MousePos_X, MousePos_Y); OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
OnMouseLbUp(MousePos_X, MousePos_Y); OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//右键按下 //右键按下
case 0x102: { case 0x102: {
_Mouse_Click_Flag.RbFlag <- true; _Mouse_Click_Flag.RbFlag <- true;
OnMouseRbDown(MousePos_X, MousePos_Y); OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//右键松开 //右键松开
@ -66,15 +72,15 @@ class _Yosin_Cursor extends CL_SpriteObject {
//右键单击 //右键单击
if (_Mouse_Click_Flag.RbFlag == true) { if (_Mouse_Click_Flag.RbFlag == true) {
_Mouse_Click_Flag.RbFlag <- false; _Mouse_Click_Flag.RbFlag <- false;
OnMouseRbClick(MousePos_X, MousePos_Y); OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
OnMouseRbUp(MousePos_X, MousePos_Y); OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//中键按下 //中键按下
case 0x103: { case 0x103: {
_Mouse_Click_Flag.MbFlag <- true; _Mouse_Click_Flag.MbFlag <- true;
OnMouseMbDown(MousePos_X, MousePos_Y); OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//中键松开 //中键松开
@ -82,14 +88,14 @@ class _Yosin_Cursor extends CL_SpriteObject {
//中键单击 //中键单击
if (_Mouse_Click_Flag.MbFlag == true) { if (_Mouse_Click_Flag.MbFlag == true) {
_Mouse_Click_Flag.MbFlag <- false; _Mouse_Click_Flag.MbFlag <- false;
OnMouseMbClick(MousePos_X, MousePos_Y); OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
OnMouseMbUp(MousePos_X, MousePos_Y); OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
//滚轮事件 //滚轮事件
case 0x406: { case 0x406: {
OnMouseWheel(Wheel, MousePos_X, MousePos_Y); OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
break; break;
} }
} }
@ -97,25 +103,25 @@ class _Yosin_Cursor extends CL_SpriteObject {
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) {} function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {} function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) {} function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {} function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标右键按下回调 //鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y) {} function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标右键单击回调 //鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y) {} function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标右键弹起回调 //鼠标右键弹起回调
function OnMouseRbUp(MousePos_X, MousePos_Y) {} function OnMouseRbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标中键按下回调 //鼠标中键按下回调
function OnMouseMbDown(MousePos_X, MousePos_Y) {} function OnMouseMbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标中键单击回调 //鼠标中键单击回调
function OnMouseMbClick(MousePos_X, MousePos_Y) {} function OnMouseMbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标中键弹起回调 //鼠标中键弹起回调
function OnMouseMbUp(MousePos_X, MousePos_Y) {} function OnMouseMbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
//鼠标滚轮事件回调 //鼠标滚轮事件回调
function OnMouseWheel(Wheel, MousePos_X, MousePos_Y) {} function OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {}
} }

View File

@ -18,6 +18,8 @@ class Yosin_CommonUi extends Yosin_BaseWindow {
OnClick = null; OnClick = null;
OnClickSound = null; OnClickSound = null;
OnClickMoveSound = null;
OnClickMoveSoundFlag = false;
Data = null; Data = null;
@ -35,28 +37,37 @@ class Yosin_CommonUi extends Yosin_BaseWindow {
//override //override
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition(); local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) isInRect = true; if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
else isInRect = false; //如果有配置移动音效
base.OnMouseProc(MousePos_X, MousePos_Y); if (OnClickMoveSound && !OnClickMoveSoundFlag) {
OnClickMoveSoundFlag = true;
Sq_PlaySoundEffect(OnClickMoveSound);
}
isInRect = true;
} else {
OnClickMoveSoundFlag = false;
isInRect = false;
}
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition(); local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) { if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
isLBDown = true; isLBDown = true;
} }
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
isLBDown = false; isLBDown = false;
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) { function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition(); local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) { if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
if (OnClick) OnClick(this); if (OnClick) OnClick(this);
@ -65,755 +76,7 @@ class Yosin_CommonUi extends Yosin_BaseWindow {
Sq_PlaySoundEffect(OnClickSound); Sq_PlaySoundEffect(OnClickSound);
} }
} }
base.OnMouseLbClick(MousePos_X, MousePos_Y); base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
} }
} }
//基础按钮
class Yosin_BaseButton extends Yosin_CommonUi {
//按钮状态
State = 0;
Path = null;
Idx = null;
Sprite = null;
SpriteState = -1;
FrameList = null;
//按下时的模拟偏移
DownSimulateOffset = true;
constructor(X, Y, W, H, Path, Idx) {
this.Path = Path;
this.Idx = Idx;
base.constructor(X, Y, W, H);
FrameList = [];
Sprite = CL_SpriteObject();
// Sprite.ShowBorder(true);
Addchild(Sprite);
for (local i = 0; i< 4; i++) {
local Sf = CL_SpriteFrameObject(this.Path, this.Idx + i);
FrameList.push(Sf);
}
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
//按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
if (DownSimulateOffset) {
if (State == 2) {
Y += 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y -= 1;
SyncPos(X, Y);
}
}
SpriteState = State;
Sprite.SetFrame(FrameList[SpriteState]);
Sprite.SetPosition(0, 0);
}
}
function Proc(Dt) {
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
//三分法拉伸
// class Yosin_EmeStretch extends Yosin_CommonUi {
// Path = null;
// Idx = null;
// //按钮状态
// SpriteList = null;
// constructor(X, Y, W, H, Path, Idx, Direction = true) {
// this.Path = Path;
// this.Idx = Idx;
// base.constructor(X, Y, W, H);
// // 创建画布
// local Canvas = CL_CanvasObject();
// // 重设大小并清空
// Canvas.ResizeAndClear(W, H);
// // 开始绘制
// Canvas.BeginDraw();
// SpriteList = [];
// SpriteList.push(CL_SpriteObject(Path, Idx));
// SpriteList.push(CL_SpriteObject(Path, Idx + 1));
// SpriteList.push(CL_SpriteObject(Path, Idx + 2));
// //横向
// 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.0);
// SpriteList[1].SetScale(ScaleRate, 1.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);
// }
// foreach(Child in SpriteList) {
// // Addchild(Child);
// Canvas.DrawSprite(Child);
// }
// // 结束绘制
// Canvas.EndDraw();
// // 添加画布
// Addchild(Canvas);
// }
// }
//三分法拉伸
class Yosin_EmeStretch extends CL_CanvasObject {
Path = null;
Idx = null;
//按钮状态
SpriteList = null;
constructor(W, H, Path, Idx, Direction = true) {
this.Path = Path;
this.Idx = Idx;
base.constructor();
// 创建画布
CL_CanvasObject();
// 重设大小并清空
ResizeAndClear(W, H);
// 开始绘制
BeginDraw();
SpriteList = [];
SpriteList.push(CL_SpriteObject(Path, Idx));
SpriteList.push(CL_SpriteObject(Path, Idx + 1));
SpriteList.push(CL_SpriteObject(Path, Idx + 2));
//横向
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.0);
SpriteList[1].SetScale(ScaleRate, 1.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);
}
foreach(Child in SpriteList) {
// Addchild(Child);
DrawSprite(Child);
}
// 结束绘制
EndDraw();
// 添加画布
// Addchild(Canvas);
}
}
//九宫格拉伸
function Yosin_NineBoxStretch(width, height, path, imgId) {
// 创建画布
local Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(width, height);
// 开始绘制
Canvas.BeginDraw();
// 左上角
// local backgroundTopLeft = CL_SpriteObject(path, imgId);
local backgroundTopLeft = CL_SpriteObject(path, imgId);
// 上边
local backgroundTop = CL_SpriteObject(path, imgId + 1);
// 右上角
local backgroundTopRight = CL_SpriteObject(path, imgId + 2);
// 左边
local backgroundLeft = CL_SpriteObject(path, imgId + 3);
// 中间
local backgroundCenter = CL_SpriteObject(path, imgId + 4);
// 右边
local backgroundRight = CL_SpriteObject(path, imgId + 5);
// 左下角
local backgroundBottomLeft = CL_SpriteObject(path, imgId + 6);
// 下边
local backgroundBottom = CL_SpriteObject(path, imgId + 7);
// 右下角
local backgroundBottomRight = CL_SpriteObject(path, imgId + 8);
// 左上角
Canvas.DrawSprite(backgroundTopLeft);
local TopLeftSize = backgroundTopLeft.GetSize();
local TopLeftBottom = TopLeftSize.h;
local TopLeftRight = TopLeftSize.w;
// 中间图片大小
local centerImgSize = backgroundCenter.GetSize();
local centerImgWidth = centerImgSize.w;
local centerImgHeight = centerImgSize.h;
local centerWidth = width - backgroundTopLeft.GetSize().w - backgroundTopRight.GetSize().w;
local centerHeight = height - backgroundTopLeft.GetSize().h - backgroundBottomLeft.GetSize().h;
local scaleW = (centerWidth - 1).tofloat() / centerImgWidth.tofloat();
local scaleH = (centerHeight - 1).tofloat() / centerImgHeight.tofloat();
// 上边
backgroundTop.SetScale(scaleW, 1);
backgroundTop.SetPosition(TopLeftRight, 0);
Canvas.DrawSprite(backgroundTop);
// 右上角
backgroundTopRight.SetPosition(width - backgroundTopRight.GetSize().w - 1, 0);
Canvas.DrawSprite(backgroundTopRight);
// 左边
backgroundLeft.SetScale(1, scaleH);
backgroundLeft.SetPosition(0, TopLeftBottom);
Canvas.DrawSprite(backgroundLeft);
// 中间
backgroundCenter.SetScale(scaleW, scaleH);
// Addchild(backgroundCenter);
backgroundCenter.SetPosition(TopLeftRight, backgroundLeft.Y);
Canvas.DrawSprite(backgroundCenter);
// 右边
backgroundRight.SetScale(1, scaleH);
backgroundRight.SetPosition(width - backgroundRight.GetSize().w - 1, backgroundCenter.Y);
Canvas.DrawSprite(backgroundRight);
// 左下角
backgroundBottomLeft.SetPosition(0, height - backgroundBottomLeft.GetSize().h - 1);
Canvas.DrawSprite(backgroundBottomLeft);
// 下边
backgroundBottom.SetScale(scaleW, 1);
backgroundBottom.SetPosition(TopLeftRight, backgroundBottomLeft.Y);
Canvas.DrawSprite(backgroundBottom);
// 右下角
backgroundBottomRight.SetPosition(width - backgroundBottomRight.GetSize().w - 1, backgroundBottomLeft.Y);
Canvas.DrawSprite(backgroundBottomRight);
// 结束绘制
Canvas.EndDraw();
// 添加画布
// Addchild(Canvas);
local Sp = CL_SpriteObject();
Sp.SetFrame(Canvas.ExportSpriteFrame());
return Sp;
}
/*
//九宫格拉伸
class Yosin_NineBoxStretch extends CL_CanvasObject {
constructor( width, height, path, imgId) {
base.constructor();
// 创建画布
CL_CanvasObject();
// 重设大小并清空
ResizeAndClear(width, height);
// 开始绘制
BeginDraw();
// 左上角
local backgroundTopLeft = CL_SpriteObject(path, imgId);
// 上边
local backgroundTop = CL_SpriteObject(path, imgId + 1);
// 右上角
local backgroundTopRight = CL_SpriteObject(path, imgId + 2);
// 左边
local backgroundLeft = CL_SpriteObject(path, imgId + 3);
// 中间
local backgroundCenter = CL_SpriteObject(path, imgId + 4);
// 右边
local backgroundRight = CL_SpriteObject(path, imgId + 5);
// 左下角
local backgroundBottomLeft = CL_SpriteObject(path, imgId + 6);
// 下边
local backgroundBottom = CL_SpriteObject(path, imgId + 7);
// 右下角
local backgroundBottomRight = CL_SpriteObject(path, imgId + 8);
// 左上角
DrawSprite(backgroundTopLeft);
local TopLeftSize = backgroundTopLeft.GetSize();
local TopLeftBottom = TopLeftSize.h;
local TopLeftRight = TopLeftSize.w;
// 中间图片大小
local centerImgSize = backgroundCenter.GetSize();
local centerImgWidth = centerImgSize.w;
local centerImgHeight = centerImgSize.h;
local centerWidth = width - backgroundTopLeft.GetSize().w - backgroundTopRight.GetSize().w;
local centerHeight = height - backgroundTopLeft.GetSize().h - backgroundBottomLeft.GetSize().h;
local scaleW = (centerWidth - 1).tofloat() / centerImgWidth.tofloat();
local scaleH = (centerHeight - 1).tofloat() / centerImgHeight.tofloat();
// 上边
backgroundTop.SetScale(scaleW, 1);
backgroundTop.SetPosition(TopLeftRight, 0);
DrawSprite(backgroundTop);
// 右上角
backgroundTopRight.SetPosition(width - backgroundTopRight.GetSize().w - 1, 0);
DrawSprite(backgroundTopRight);
// 左边
backgroundLeft.SetScale(1, scaleH);
backgroundLeft.SetPosition(0, TopLeftBottom);
DrawSprite(backgroundLeft);
// 中间
backgroundCenter.SetScale(scaleW, scaleH);
// Addchild(backgroundCenter);
backgroundCenter.SetPosition(TopLeftRight, backgroundLeft.Y);
DrawSprite(backgroundCenter);
// 右边
backgroundRight.SetScale(1, scaleH);
backgroundRight.SetPosition(width - backgroundRight.GetSize().w - 1, backgroundCenter.Y);
DrawSprite(backgroundRight);
// 左下角
backgroundBottomLeft.SetPosition(0, height - backgroundBottomLeft.GetSize().h - 1);
DrawSprite(backgroundBottomLeft);
// 下边
backgroundBottom.SetScale(scaleW, 1);
backgroundBottom.SetPosition(TopLeftRight, backgroundBottomLeft.Y);
DrawSprite(backgroundBottom);
// 右下角
backgroundBottomRight.SetPosition(width - backgroundBottomRight.GetSize().w - 1, backgroundBottomLeft.Y);
DrawSprite(backgroundBottomRight);
// 结束绘制
EndDraw();
}
}
*/
//拼接按钮
class Yosin_SplicingButton extends Yosin_CommonUi {
//按钮状态
State = 0;
Path = null;
Idx = null;
SpriteList = null;
SpriteState = -1;
FrameList = null;
//按下时的模拟偏移
DownSimulateOffset = true;
constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true) {
this.Path = Path;
this.Idx = Idx;
base.constructor(X, Y, W, H);
SpriteList = array(4);
//普通态
SpriteList[0] = Yosin_EmeStretch(W, H, Path, Idx, Direction);
//悬停态
SpriteList[1] = Yosin_EmeStretch(W, H, Path, Idx + (UnavailableFlag ? 4 : 3), Direction);
//按下态
SpriteList[2] = Yosin_EmeStretch(W, H, Path, Idx + (UnavailableFlag ? 8 : 6), Direction);
if (UnavailableFlag) {
//不可用态
SpriteList[3] = Yosin_EmeStretch(W, H, Path, Idx + 12, Direction);
}
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
//按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
if (DownSimulateOffset) {
if (State == 2) {
Y += 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y -= 1;
SyncPos(X, Y);
}
}
if (SpriteState != -1) {
RemoveUIChild(SpriteList[SpriteState]);
}
SpriteState = State;
Addchild(SpriteList[SpriteState]);
}
}
function Proc(Dt) {
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
// 标题按钮
class titleButton extends Yosin_BaseButton {
index = null;
select = false;
cacheSelect = false;
cacheY = null;
LBDownOnClick = null;
constructor(X, Y, W, H, Path, Idx, title) {
base.constructor(X, Y, W, H, Path, Idx);
cacheY = Y;
DownSimulateOffset = false;
local backText = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(130, 114, 84, 255)
});
backText.SetUpdateFunc(function(Text, Dt) {
if (select == cacheSelect) return;
if (select) {
Text.SetFillColor(sq_RGBA(187, 176, 149, 255));
} else {
Text.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
cacheSelect = select;
})
backText.SetPosition(9, 2);
Addchild(backText);
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
if (State == 2) {
Y = cacheY - 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y = cacheY;
SyncPos(X, Y);
}
SpriteState = State;
Sprite.SetFrame(FrameList[SpriteState]);
Sprite.SetPosition(0, 0);
}
}
function Proc(Dt) {
if (select) return;
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
select = true;
if (LBDownOnClick != null) {
LBDownOnClick(this);
}
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
// 拉伸标题按钮
class Yosin_StretchTitleButton extends Yosin_CommonUi {
index = null;
//按钮状态
State = 0;
//ui的当前状态
uiState = 0;
cecheY = null;
titleText = null;
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(W, H, Path, Idx);
Addchild(SpriteList[0]);
//悬停态
SpriteList[1] = Yosin_EmeStretch(W, H, Path, Idx + 3);
SpriteList[1].SetVisible(false)
Addchild(SpriteList[1]);
//按下态
SpriteList[2] = Yosin_EmeStretch(W, H, Path, Idx + 6);
SpriteList[2].SetVisible(false)
Addchild(SpriteList[2]);
// 文字
titleText = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(130, 114, 84, 255)
});
titleText.SetUpdateFunc(function(Text, Dt) {
if (select == cacheSelect) return;
if (select) {
Text.SetFillColor(sq_RGBA(187, 176, 149, 255));
} else {
Text.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
cacheSelect = select;
})
titleText.SetPosition(W / 2 - titleText.GetSize().w / 2, 2);
Addchild(titleText);
}
// 设置为选中状态
function SetSelect(select) {
if (select) {
State = 2;
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;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
ChangeFrame();
}
}
// 横向多个标题单选按钮
class Yosin_RowMoreTitleBtn extends Yosin_CommonUi {
LBDownOnClick = null;
btns = null;
tests = null;
constructor(X, Y, W, titles, path, idx, baseWidth = 48) {
this.tests = titles;
btns = [];
local btnX = 5;
for (local i = 0; i< titles.len(); i++) {
local textW = FontAssetManager.GenerateNormal(titles[i], true).GetSize().w + 10;
local btnW = baseWidth;
btnW = textW > btnW ? textW : btnW;
local titleBtn = Yosin_StretchTitleButton(btnX, 1, btnW, 19, path, idx, titles[i]);
titleBtn.index = i;
titleBtn.LBDownOnClick = function(btn) {
LBDownOnClick(btn.Parent, btn.index);
for (local i = 0; i< btns.len(); i++) {
btns[i].SetSelect(false);
btns[i].titleText.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
btn.SetSelect(true);
btns[btn.index].titleText.SetFillColor(sq_RGBA(187, 176, 149, 255));
}.bindenv(this);
btns.push(titleBtn);
btnX += btnW;
}
base.constructor(X, Y, btnX, 21);
for (local i = 0; i< btns.len(); i++) {
AddUIChild(btns[i]);
}
btns[0].SetSelect(true);
// 创建画布
local Canvas = CL_CanvasObject();
Canvas.SetPosition(0, 19);
// 重设大小并清空
Canvas.ResizeAndClear(W, 1);
// 设置填充画刷 用于绘制边框和线条
Canvas.SetFillBrush(sq_RGBA(66, 61, 59, 250));
// 设置轮廓画刷 用于绘制边框和线条
Canvas.SetStrokeBrush(sq_RGBA(66, 61, 59, 250));
// 开始绘制
Canvas.BeginDraw();
// 画线段
Canvas.DrawLine(0, 1, W, 1);
// 结束绘制
Canvas.EndDraw();
// 添加画布
Addchild(Canvas);
}
}
// 进度显示
class Yosin_Schedule extends Yosin_CommonUi {
//背景
BgSprite = null;
//条
BarSprite = null;
// schedule 进度比例0-1
constructor(X, Y, W, H, path, idx) {
base.constructor(X, Y, W, H);
BgSprite = CL_SpriteObject(path, idx + 1);
Addchild(BgSprite);
BarSprite = CL_SpriteObject(path, idx);
Addchild(BarSprite);
}
function SetPercentage(Rate) {
local barSize = BarSprite.GetSize();
local barW = barSize.w * Rate;
BarSprite.SetCropRect(BarSprite.X, BarSprite.Y, barW, barSize.h);
BarSprite.SetSize(barW, barSize.h);
}
}

View File

@ -10,6 +10,12 @@ class _AssetManager_ {
CharacterList = null; CharacterList = null;
//角色信息表 //角色信息表
CharacterInfoList = null; CharacterInfoList = null;
//角色经验表
CharacterExptable = null;
//技能信息表
SkillList = null;
//技能树信息表
SkillTreeList = null;
//地图列表 //地图列表
MapList = null; MapList = null;
//城镇列表 //城镇列表
@ -20,6 +26,28 @@ class _AssetManager_ {
StackableList = null; StackableList = null;
//NPC列表 //NPC列表
NpcList = null; NpcList = null;
//NPC商店列表
NpcShopList = null;
//杂项配置信息
EtcConfig = null;
//属性脚本
AttributeScript = null;
function InitTownList() {
TownList = ScriptData.GetFileData("town/town.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册城镇列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载城镇List完成, 共" + DataTable.len() + "个");
});
}
function InitMapList() { function InitMapList() {
MapList = ScriptData.GetFileData("map/map.lst", function(DataTable, Data) { MapList = ScriptData.GetFileData("map/map.lst", function(DataTable, Data) {
@ -41,6 +69,14 @@ class _AssetManager_ {
} }
if (_DEBUG_) print("加载角色List完成, 共" + DataTable.len() + "个"); if (_DEBUG_) print("加载角色List完成, 共" + DataTable.len() + "个");
}); });
CharacterExptable = ScriptData.GetFileData("character/exptable.tbl", function(DataTable, Data) {
local Level = 1;
while (!Data.Eof()) {
local Exp = Data.Get();
DataTable.rawset(Level, Exp.tointeger());
Level += 1;
}
})
CharacterInfoList = []; CharacterInfoList = [];
foreach(Index, Path in CharacterList) { foreach(Index, Path in CharacterList) {
if (Index == "filepath") continue; if (Index == "filepath") continue;
@ -66,12 +102,6 @@ class _AssetManager_ {
DataTable.default_avatar.append(Ret); DataTable.default_avatar.append(Ret);
} }
} }
//基础属性
else if (Key == "[HP MAX]]" || Key == "[MP MAX]]" || Key == "[physical attack]]" || Key == "[physical defense]]" || Key == "[magical attack]]" || Key == "[magical defense]]" || Key == "[inventory limit]]" || Key == "[MP regen speed]]" || Key == "[move speed]]" || Key == "[attack speed]]" || Key == "[cast speed]]" || Key == "[hit recovery]]" || Key == "[jump power]]" || Key == "[weight]]" || Key == "[jump speed]]") {
local RealKey = Key.slice(1, Key.len() - 1);
DataTable[RealKey] <- Data.Get().tofloat();
}
//基础Ani //基础Ani
else if (Key == "[waiting motion]" || Key == "[move motion]" || Key == "[sit motion]" || Key == "[damage motion 1]" || Key == "[damage motion 2]" || Key == "[down motion]" || Key == "[overturn motion]" || Key == "[jump motion]" || Key == "[jumpattack motion]" || Key == "[rest motion]" || Key == "[throw motion 1-1]" || Key == "[throw motion 1-2]" || Key == "[throw motion 2-1]" || Key == "[throw motion 2-2]" || Key == "[throw motion 3-1]" || Key == "[throw motion 3-2]" || Key == "[throw motion 4-1]" || Key == "[throw motion 4-2]" || Key == "[dash motion]" || Key == "[dashattack motion]" || Key == "[getitem motion]" || Key == "[buff motion]" || Key == "[simple rest motion]" || Key == "[simple move motion]" || Key == "[back motion]") { else if (Key == "[waiting motion]" || Key == "[move motion]" || Key == "[sit motion]" || Key == "[damage motion 1]" || Key == "[damage motion 2]" || Key == "[down motion]" || Key == "[overturn motion]" || Key == "[jump motion]" || Key == "[jumpattack motion]" || Key == "[rest motion]" || Key == "[throw motion 1-1]" || Key == "[throw motion 1-2]" || Key == "[throw motion 2-1]" || Key == "[throw motion 2-2]" || Key == "[throw motion 3-1]" || Key == "[throw motion 3-2]" || Key == "[throw motion 4-1]" || Key == "[throw motion 4-2]" || Key == "[dash motion]" || Key == "[dashattack motion]" || Key == "[getitem motion]" || Key == "[buff motion]" || Key == "[simple rest motion]" || Key == "[simple move motion]" || Key == "[back motion]") {
local RealKey = Key.slice(1, Key.len() - 1); local RealKey = Key.slice(1, Key.len() - 1);
@ -118,14 +148,99 @@ class _AssetManager_ {
DataTable.etc_attack_info.append(dirpath + Ret.tolower()); DataTable.etc_attack_info.append(dirpath + Ret.tolower());
} }
} }
//属性
else if (Key == "[growtype attribute]") {
DataTable.Attribute <- [];
while (true) {
local Ret = Data.Get();
if (Ret == "[/growtype attribute]") break;
local attrtable = ScriptData.GetFileData(Ret, function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//基础属性
if (AttributeScript.rawin(Key)) {
DataTable[AttributeScript[Key]] <- Data.Get();
}
//名称
else if (Key == "[name]") {
DataTable.name <- Data.Get();
}
}
}.bindenv(this));
DataTable.Attribute.push(attrtable);
}
}
} }
// print(DataTable); // print(DataTable);
if (_DEBUG_) print("初始化角色" + DataTable.job); if (_DEBUG_) print("初始化角色" + DataTable.job);
}); }.bindenv(this));
CharacterInfoList.push(Info); CharacterInfoList.push(Info);
} }
} }
function InitSkill() {
SkillList = ScriptData.GetFileData("skill/skilllist.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册装备列表 路径写入 数据未读取
DataTable.rawset(Key, ScriptData.GetFileData("skill/" + Data.Get().tolower(), function(DataTableA, DataA) {
while (!DataA.Eof()) {
local SkillIndex = DataA.Get();
//注册装备列表 路径写入 数据未读取
DataTableA.rawset(SkillIndex, DataA.Get());
}
if (_DEBUG_) print("加载职业技能" + Key + "List完成, 共" + DataTableA.len() + "个");
}));
}
if (_DEBUG_) print("加载技能List完成, 共" + DataTable.len() + "个");
})
}
function InitJobSkillTree(Path) {
local ConfigBuffer = ScriptData.GetFileData("clientonly/" + Path, function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
if (Key == "[skill info]") {
Data.Get();
local SkillIndex = Data.Get();
DataTable.rawset(SkillIndex, {});
while (true) {
local Ret = Data.Get();
if (Ret == "[/skill info]") break;
//技能图标位置
if (Ret == "[icon pos]") {
DataTable[SkillIndex].IconPos <- {
x = Data.Get(),
y = Data.Get()
}
}
}
}
}
});
ConfigBuffer.rawdelete("filepath");
return ConfigBuffer;
}
function InitSkillTree() {
//先读职业技能树list 在读转职职业list
SkillTreeList = ScriptData.GetFileData("clientonly/skilltree.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册技能树列表 路径写入 数据未读取
DataTable.rawset(Key, ScriptData.GetFileData("clientonly/" + Data.Get().tolower(), function(DataTableA, DataA) {
while (!DataA.Eof()) {
local GrowJob = DataA.Get();
local GrowJobSkillTreePath = DataA.Get();
local Config = InitJobSkillTree(GrowJobSkillTreePath);
DataTableA.rawset(GrowJob, Config);
}
}.bindenv(this)));
}
if (_DEBUG_) print("加载技能树List完成, 共" + DataTable.len() + "个职业技能树");
}.bindenv(this))
}
function InitEquipmentList() { function InitEquipmentList() {
EquipmentList = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) { EquipmentList = ScriptData.GetFileData("equipment/equipment.lst", function(DataTable, Data) {
while (!Data.Eof()) { while (!Data.Eof()) {
@ -138,8 +253,55 @@ class _AssetManager_ {
} }
if (_DEBUG_) print("加载装备List完成, 共" + DataTable.len() + "个"); if (_DEBUG_) print("加载装备List完成, 共" + DataTable.len() + "个");
}); });
//顺带初始化装备信息标签tag配置 }
GameItem.EquipmentInfoTag = ScriptData.GetFileData("equipment/equipmentinfo.etc", function(DataTable, Data) {
function InitStackableList() {
StackableList = ScriptData.GetFileData("stackable/stackable.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册装备列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载消耗品List完成, 共" + DataTable.len() + "个");
});
}
function InitNpcList() {
NpcList = ScriptData.GetFileData("npc/npc.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册NPC列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载NPCList完成, 共" + DataTable.len() + "个");
});
}
function InitNpcShopList() {
NpcShopList = ScriptData.GetFileData("itemshop/itemshop.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册NPC商店列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载NPC商店List完成, 共" + DataTable.len() + "个");
});
}
function InitEtcConfig() {
//初始化装备信息标签tag配置
{
EtcConfig.ItemInfoTag <- ScriptData.GetFileData("etc/iteminfo.etc", function(DataTable, Data) {
while (!Data.Eof()) { while (!Data.Eof()) {
local Pack = Data.Get(); local Pack = Data.Get();
//名称 grade 套装Id 稀有度 最低穿戴登记 重量 //名称 grade 套装Id 稀有度 最低穿戴登记 重量
@ -212,62 +374,90 @@ class _AssetManager_ {
} }
}); });
} }
//初始化NPC功能对应配置
function InitStackableList() { {
StackableList = ScriptData.GetFileData("stackable/stackable.lst", function(DataTable, Data) { EtcConfig.NpcRole <- ScriptData.GetFileData("etc/npcroleconfig.dat", function(DataTable, Data) {
while (!Data.Eof()) { while (!Data.Eof()) {
local Key = Data.Get(); local Pack = Data.Get();
//注册装备列表 路径写入 数据未读取 //名称 grade 套装Id 稀有度 最低穿戴登记 重量
DataTable.rawset(Key, { if (Pack == "[config]") {
Path = Data.Get(), while (true) {
Data = null local Ret = Data.Get();
}); if (Ret == "[/config]") break;
DataTable[Ret] <- {
imgidx = Data.Get(),
name = Data.Get(),
namecolor = HexStringToInt(Data.Get()),
iconpath = Data.Get(),
iconidx = Data.Get(),
}
}
}
} }
if (_DEBUG_) print("加载消耗品List完成, 共" + DataTable.len() + "个");
}); });
} }
function InitNpcList() {
NpcList = ScriptData.GetFileData("npc/npc.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册NPC列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载NPCList完成, 共" + DataTable.len() + "个");
});
}
function InitTownList() {
TownList = ScriptData.GetFileData("town/town.lst", function(DataTable, Data) {
while (!Data.Eof()) {
local Key = Data.Get();
//注册城镇列表 路径写入 数据未读取
DataTable.rawset(Key, {
Path = Data.Get(),
Data = null
});
}
if (_DEBUG_) print("加载城镇List完成, 共" + DataTable.len() + "个");
});
} }
constructor() { constructor() {
EtcConfig = {};
AttributeScript = {};
AttributeScript.rawset("[HP MAX]", "HPMax");
AttributeScript.rawset("[MP MAX]", "MPMax");
AttributeScript.rawset("[HP regen speed]", "HPRegenSpeed");
AttributeScript.rawset("[MP regen speed]", "MPRegenSpeed");
AttributeScript.rawset("[jump power]", "JumpPower");
AttributeScript.rawset("[hit recovery]", "HitRecovery");
AttributeScript.rawset("[stuck]", "Stuck");
AttributeScript.rawset("[stuck resistance]", "StuckResistance");
AttributeScript.rawset("[physical attack]", "PhysicalAttack");
AttributeScript.rawset("[magical attack]", "MagicalAttack");
AttributeScript.rawset("[physical defense]", "PhysicalDefense");
AttributeScript.rawset("[magical defense]", "MagicalDefense");
AttributeScript.rawset("[all elemental attack]", "AllElementalAttack");
AttributeScript.rawset("[dark attack]", "DarkAttack");
AttributeScript.rawset("[light attack]", "LightAttack");
AttributeScript.rawset("[water attack]", "WaterAttack");
AttributeScript.rawset("[fire attack]", "FireAttack");
AttributeScript.rawset("[equipment physical attack]", "EquipmentPhysicalAttack");
AttributeScript.rawset("[equipment magical attack]", "EquipmentMagicalAttack");
AttributeScript.rawset("[separate attack]", "SeparateAttack");
AttributeScript.rawset("[equipment physical defense]", "EquipmentPhysicalDefense");
AttributeScript.rawset("[equipment magical defense]", "EquipmentMagicalDefense");
AttributeScript.rawset("[attack speed]", "AttackSpeed");
AttributeScript.rawset("[cast speed]", "CastSpeed");
AttributeScript.rawset("[move speed]", "MoveSpeed");
AttributeScript.rawset("[jump speed]", "JumpSpeed");
AttributeScript.rawset("[physical critical hit]", "PhysicalCriticalHit");
AttributeScript.rawset("[magical critical hit]", "MagicalCriticalHit");
AttributeScript.rawset("[dark resistance]", "DarkResistance");
AttributeScript.rawset("[light resistance]", "LightResistance");
AttributeScript.rawset("[water resistance]", "WaterResistance");
AttributeScript.rawset("[fire resistance]", "FireResistance");
AttributeScript.rawset("[elemental property]", "ElementalProperty");
//初始化城镇列表 //初始化城镇列表
InitTownList(); InitTownList();
//初始化地图列表 //初始化地图列表
InitMapList(); InitMapList();
//初始化角色 //初始化角色
InitCharacter(); InitCharacter();
//初始化技能
InitSkill();
//初始化技能树
InitSkillTree();
//初始化装备列表 //初始化装备列表
InitEquipmentList(); InitEquipmentList();
//初始化消耗品列表 //初始化消耗品列表
InitStackableList(); InitStackableList();
//初始化NPC列表 //初始化NPC列表
InitNpcList(); InitNpcList();
//初始化NPC商店列表
InitNpcShopList();
//初始化杂项配置信息
InitEtcConfig();
getroottable().AssetManager <- this; getroottable().AssetManager <- this;
@ -287,11 +477,20 @@ class _AssetManager_ {
DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1); DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1);
while (!Data.Eof()) { while (!Data.Eof()) {
local Pack = Data.Get(); local Pack = Data.Get();
//名称 grade 套装Id 稀有度 最低穿戴登记 重量 组名 购买价格 出售价格 耐久 名望 四维 所有属强 四属强 双暴 命中 四属抗 属性攻击 //名称 grade 套装Id 稀有度 最低穿戴登记 重量 组名 购买价格 出售价格 耐久 描述
if (Pack == "[name]" || Pack == "[part set index]" || Pack == "[grade]" || Pack == "[rarity]" || Pack == "[minimum level]" || Pack == "[weight]" || Pack == "[item group name]" || Pack == "[price]" || Pack == "[repair price]" || Pack == "[value]" || Pack == "[durability]" || Pack == "[physical attack]" || Pack == "[magical attack]" || Pack == "[physical defense]" || Pack == "[magical defense]" || Pack == "[all elemental attack]" || Pack == "[dark attack]" || Pack == "[light attack]" || Pack == "[water attack]" || Pack == "[fire attack]" || Pack == "[attack speed]" || Pack == "[cast speed]" || Pack == "[move speed]" || Pack == "[physical critical hit]" || Pack == "[magical critical hit]" || Pack == "[stuck]" || Pack == "[fire resistance]" || Pack == "[dark resistance]" || Pack == "[light resistance]" || Pack == "[water resistance]" || Pack == "[elemental property]" || Pack == "[flavor text]") { if (Pack == "[name]" || Pack == "[part set index]" || Pack == "[grade]" || Pack == "[rarity]" || Pack == "[minimum level]" || Pack == "[weight]" || Pack == "[item group name]" || Pack == "[price]" || Pack == "[repair price]" || Pack == "[value]" || Pack == "[durability]" || Pack == "[flavor text]") {
local RealKey = Pack.slice(1, -1); local RealKey = Pack.slice(1, -1);
DataTable[RealKey] <- Data.Get(); DataTable[RealKey] <- Data.Get();
} }
//属性
else if (AttributeScript.rawin(Pack)) {
//三攻 和 双防 要读取两个值因为是浮动数组
if (Pack == "[equipment physical attack]" || Pack == "[equipment magical attack]" || Pack == "[separate attack]" || Pack == "[equipment physical defense]" || Pack == "[equipment magical defense]") {
DataTable[AttributeScript[Pack]] <- [Data.Get(), Data.Get()];
} else {
DataTable[AttributeScript[Pack]] <- Data.Get();
}
}
//适用角色 //适用角色
else if (Pack == "[usable job]") { else if (Pack == "[usable job]") {
DataTable.usable_job <- []; DataTable.usable_job <- [];
@ -301,10 +500,14 @@ class _AssetManager_ {
DataTable.usable_job.append(Ret.slice(1, -1).tolower()); DataTable.usable_job.append(Ret.slice(1, -1).tolower());
} }
} }
//读取三攻 和 双防 //隐藏图层
else if (Pack == "[equipment physical attack]" || Pack == "[equipment magical attack]" || Pack == "[separate attack]" || Pack == "[equipment physical defense]" || Pack == "[equipment magical defense]") { else if (Pack == "[hide layer]") {
local RealKey = Pack.slice(1, -1); DataTable.hide_layer <- [];
DataTable[RealKey] <- [Data.Get(), Data.Get()]; while (true) {
local Ret = Data.Get();
if (Ret == "[/hide layer]") break;
DataTable.hide_layer.append(Ret);
}
} }
//图标 //图标
else if (Pack == "[icon]") { else if (Pack == "[icon]") {
@ -334,6 +537,33 @@ class _AssetManager_ {
DataTable.aurora_effects.push(T); DataTable.aurora_effects.push(T);
} }
} }
//Expand Ani
else if (Pack == "[expand ani]") {
if (!(DataTable.rawin("Ani"))) DataTable["Ani"] <- {};
local DataBuffer = {};
DataBuffer.layer_variation <- [];
while (true) {
local Ret = Data.Get();
if (Ret == "[/expand ani]") break;
if (Ret == "[variation]") {
DataBuffer.variation <- [Data.Get(), Data.Get()];
} else if (Ret == "[layer variation]") {
local InfoBuf = {};
InfoBuf.Zorder <- Data.Get();
InfoBuf.Path <- Data.Get();
DataBuffer.layer_variation.append(InfoBuf);
} else if (Ret == "[expand path]") {
DataTable["expand_path"] <- Data.Get();
}
}
foreach(Job in DataTable.usable_job) {
DataTable["Ani"]["Ani_" + Job] <- {};
DataTable["Ani"]["Ani_" + Job].variation <- sq_DeepCopy(DataBuffer.variation);
DataTable["Ani"]["Ani_" + Job].layer_variation <- sq_DeepCopy(DataBuffer.layer_variation)
}
}
//Ani //Ani
else if (Pack == "[animation job]") { else if (Pack == "[animation job]") {
local Job = Data.Get().slice(1, -1); local Job = Data.Get().slice(1, -1);
@ -360,7 +590,7 @@ class _AssetManager_ {
} }
} }
} }
}); }.bindenv(this));
EquipmentList[Idx].Data = m_data; EquipmentList[Idx].Data = m_data;
return m_data; return m_data;
} }
@ -420,8 +650,6 @@ class _AssetManager_ {
return m_data; return m_data;
} }
//Public::
//获取NPC信息 //获取NPC信息
function GetNpc(Idx) { function GetNpc(Idx) {
//如果没有这个NPC则返回 //如果没有这个NPC则返回
@ -437,7 +665,7 @@ class _AssetManager_ {
if (Pack == "[small face]" || Pack == "[big face]" || Pack == "[popup face]") { if (Pack == "[small face]" || Pack == "[big face]" || Pack == "[popup face]") {
local RealKey = Pack.slice(1, Pack.find(" face")) + "_face"; local RealKey = Pack.slice(1, Pack.find(" face")) + "_face";
DataTable[RealKey] <- { DataTable[RealKey] <- {
img = Data.Get().tolower(), img = "sprite/" + Data.Get().tolower(),
idx = Data.Get() idx = Data.Get()
} }
} else if (Pack == "[field animation]") { } else if (Pack == "[field animation]") {
@ -465,4 +693,172 @@ class _AssetManager_ {
NpcList[Idx].Data = m_data; NpcList[Idx].Data = m_data;
return m_data; return m_data;
} }
//获取NPC商店信息
function GetNpcShop(Idx) {
//如果没有这个商店则返回
if (!(NpcShopList.rawin(Idx))) return;
//如果商店数据已经读取过存在了则直接返回
if (NpcShopList[Idx].Data) return NpcShopList[Idx].Data;
local Path = NpcShopList[Idx].Path;
local m_data = ScriptData.GetFileData("itemshop/" + Path, function(DataTable, Data) {
DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1);
DataTable.PageList <- [];
DataTable.PageNameList <- [];
while (!Data.Eof()) {
local Pack = Data.Get();
//商店信息
if (Pack == "[page]") {
local ItemList = [];
DataTable.PageNameList.push(Data.Get());
while (true) {
local Buffer = Data.Get();
if (Buffer == "[/page]") break;
local ItemInfo = {};
ItemInfo.Id <- Buffer;
ItemInfo.Cera <- Data.Get();
ItemInfo.CeraPoint <- Data.Get();
ItemInfo.Gold <- Data.Get();
ItemInfo.Material <- Data.Get();
ItemInfo.MaterialCount <- Data.Get();
ItemList.push(ItemInfo);
}
DataTable.PageList.push(ItemList);
} else if (Pack == "[name]") {
DataTable.name <- Data.Get();
}
}
});
NpcList[Idx].Data = m_data;
return m_data;
}
//获取技能信息
function GetSkill(Job, Idx) {
//如果没有这个技能则返回
if (!(SkillList.rawin(Job))) return;
if (!(SkillList[Job].rawin(Idx))) return;
//如果技能数据已经读取过存在了则直接返回
if (typeof SkillList[Job][Idx] == "table") return SkillList[Job][Idx];
local Path = SkillList[Job][Idx];
local m_data = ScriptData.GetFileData("skill/" + Path, function(DataTable, Data) {
DataTable.DirPath <- DataTable.filepath.slice(0, DataTable.filepath.lastfind("/") + 1);
while (!Data.Eof()) {
local Pack = Data.Get();
if (Pack == "[command key explain]" || Pack == "[basic explain]" || Pack == "[explain]" || Pack == "[name]" || Pack == "[name2]" || Pack == "[required level]" || Pack == "[required level range]" || Pack == "[skill class]" || Pack == "[maximum level]" || Pack == "[skill fitness second growtype]") {
DataTable[Pack.slice(1, -1)] <- Data.Get();
}
//技能类型
else if (Pack == "[type]") {
local Type = Data.Get();
if (Type == "[active]") {
DataTable.type <- 0;
} else if (Type == "[passive]") {
DataTable.type <- 0;
}
}
//技能消耗道具
else if (Pack == "[consume item]") {
DataTable.consume_item <- [];
while (true) {
local Ret = Data.Get();
if (Ret == "[/consume item]") break;
DataTable.consume_item.push(Ret);
DataTable.consume_item.push(Data.Get());
DataTable.consume_item.push(Data.Get());
}
}
//各职业是否可学习
else if (Pack == "[skill fitness growtype]") {
DataTable.skill_fitness_growtype <- {};
while (true) {
local Ret = Data.Get();
if (Ret == "[/skill fitness growtype]") break;
DataTable.skill_fitness_growtype.rawset(Ret, true);
}
}
//图标
else if (Pack == "[icon]") {
DataTable.icon <- {};
local Ret = Data.Get();
DataTable.icon.path <- "sprite/" + Ret.tolower();
Ret = Data.Get();
DataTable.icon.index <- Ret.tointeger();
}
//技能指令
else if (Pack == "[command]") {
DataTable.command <- [];
while (true) {
local Ret = Data.Get();
if (Ret == "[/command]") break;
DataTable.command.push(Ret);
}
}
//技能属性
else if (Pack == "[level property]") {
DataTable.level_property <- {};
DataTable.level_property.data <- [];
Data.Get();
Data.Get();
local ExplainBuffer = Data.Get();
ExplainBuffer = String.ReplaceString(ExplainBuffer, "<int>", "%d");
ExplainBuffer = String.ReplaceString(ExplainBuffer, "<float1>", "%.1f");
ExplainBuffer = String.ReplaceString(ExplainBuffer, "<float2>", "%.2f");
DataTable.level_property.explain <- ExplainBuffer;
while (true) {
local Ret = Data.Get();
if (Ret == "[/level property]") break;
DataTable.level_property.data.push(Ret);
}
}
//地下城数据
else if (Pack == "[dungeon]") {
DataTable.dungeon_data <- {};
DataTable.dungeon_data.consume_mp <- 0;
while (true) {
local Ret = Data.Get();
if (Ret == "[/dungeon]") break;
if (Ret == "[cool time]") {
DataTable.dungeon_data.cooltime <- [Data.Get(), Data.Get()];
} else if (Ret == "[consume MP]") {
DataTable.dungeon_data.consume_mp <- [Data.Get(), Data.Get()];
} else if (Ret == "[casting time]") {
DataTable.dungeon_data.casting_time <- [Data.Get(), Data.Get()];
} else if (Ret == "[static data]") {
DataTable.dungeon_data.static_data <- [];
while (true) {
local Ret2 = Data.Get();
if (Ret2 == "[/static data]") break;
DataTable.dungeon_data.static_data.push(Ret2);
}
} else if (Ret == "[level info]") {
local ListCount = Data.Get();
DataTable.dungeon_data.level_info <- [];
while (true) {
local Ret2 = Data.Get();
if (Ret2 == "[/level info]") break;
local ArrBuffer = [Ret2];
for (local i = 0; i< ListCount - 1; i++) {
ArrBuffer.push(Data.Get());
}
DataTable.dungeon_data.level_info.push(ArrBuffer);
}
}
}
}
}
})
SkillList[Job][Idx] = m_data;
return m_data;
}
//获取指定职业的技能树配置
function GetSkillTreeByJob(Job, GrowType) {
if (SkillTreeList.rawin(Job) && SkillTreeList[Job].rawin(GrowType)) {
return SkillTreeList[Job][GrowType];
}
error("没有找到指定职业的技能树配置");
}
} }

View File

@ -0,0 +1,130 @@
/*
文件名:AdditionalItems.nut
路径:User/Asset/Character/AdditionalItems.nut
创建日期:2025-01-26 12:28
文件用途:
*/
class Character_AdditionalItems extends Actor {
ENUM_RINDRO_JOB_TITLE_HEIGHT = [
//男鬼剑士
{
x = -18,
y = -154
},
//女格斗
{
x = -18,
y = -140
},
//男神枪手
{
x = -20,
y = -168
},
//女魔法师
{
x = -22,
y = -126
},
//男圣职者
{
x = -22,
y = -166
},
//女神枪手
{
x = -18,
y = -156
},
//女暗夜使者
{
x = -20,
y = -154
},
//男格斗家
{
x = -21,
y = -160
},
//男魔法师
{
x = -21,
y = -140
},
//黑暗武士
{
x = -18,
y = -154
},
//缔造者
{
x = -22,
y = -126
},
];
//光环
AuroraAni = null;
//名字
Name = null;
//聊天气泡
ChatObject = null;
function Init() {
//初始化名字
InitName();
}
//初始化光环
function InitAuroa() {
//光环
local Info = Parent.aurora;
//如果有光环
if (AuroraAni) {
foreach(Ani in AuroraAni) {
Removechild(Ani);
}
}
AuroraAni = [];
foreach(Effect in Info.Aurora_effects) {
local AniBuf = Animation(Effect.path);
AuroraAni.append(AniBuf);
Addchild(AniBuf);
//front
if (Effect.type == 1) {
AniBuf.SetZOrder(100000);
} else {
AniBuf.SetZOrder(-100000);
}
}
}
//初始化名字
function InitName() {
//创建名字对象
Name = FontAssetManager.GenerateNormal("", true, {
color = sq_RGBA(209, 185, 148, 255),
});
Name.SetZOrder(80000);
Addchild(Name);
}
//设置名字
function SetName(gName) {
this.Name.SetText(gName);
this.Name.SetPosition(ENUM_RINDRO_JOB_TITLE_HEIGHT[Parent.Job].x + 19 - (Name.GetSize().w / 2), ENUM_RINDRO_JOB_TITLE_HEIGHT[Parent.Job].y + 13);
}
//设置聊天气泡
function SetChatBubble(Chat) {
//如果有对话气泡没消失先移除
if (ChatObject) Removechild(ChatObject);
ChatObject = Character_ChatBubble(Chat);
ChatObject.SetPosition(ENUM_RINDRO_JOB_TITLE_HEIGHT[Parent.Job].x + 19 - ((ChatObject.RealWidth) / 2), Name.Y - (ChatObject.RealHeight));
ChatObject.SetZOrder(80001);
Addchild(ChatObject);
}
}

View File

@ -25,7 +25,7 @@ class Character_Animation extends Actor {
//被击后退Ani //被击后退Ani
OverturnAni = null; OverturnAni = null;
//跳跃Ani //跳跃Ani
JumoAni = null; JumpAni = null;
//跳跃攻击Ani //跳跃攻击Ani
JumpAttackAni = null; JumpAttackAni = null;
//站立Ani //站立Ani
@ -50,165 +50,148 @@ class Character_Animation extends Actor {
//普通攻击Ani //普通攻击Ani
AttackAni = null; AttackAni = null;
//光环 SMap = {
AuroraAni = null; WaitingAni = "waiting motion",
MoveAni = "move motion",
SitAni = "sit motion",
DamageAni1 = "damage motion 1",
DamageAni2 = "damage motion 2",
DownAni = "down motion",
OverturnAni = "overturn motion",
JumpAni = "jump motion",
JumpAttackAni = "jumpattack motion",
RestAni = "rest motion",
ThrowAni1_1 = "throw motion 1-1",
ThrowAni1_2 = "throw motion 1-2",
ThrowAni2_1 = "throw motion 2-1",
ThrowAni2_2 = "throw motion 2-2",
ThrowAni3_1 = "throw motion 3-1",
ThrowAni3_2 = "throw motion 3-2",
ThrowAni4_1 = "throw motion 4-1",
ThrowAni4_2 = "throw motion 4-2",
DashAni = "dash motion",
DashAttackAni = "dashattack motion",
GetItemAni = "getitem motion",
BuffAni = "buff motion",
}
//名字 //默认的Ani
Name = null; Default_Avatar = null;
//隐藏图层
HideLayer = null;
//使用武器装扮
UseWeaponAvatar = false;
ENUM_RINDRO_JOB_TITLE_HEIGHT = [
//男鬼剑士
{
x = -18,
y = -154
},
//女格斗
{
x = -18,
y = -140
},
//男神枪手
{
x = -20,
y = -168
},
//女魔法师
{
x = -22,
y = -126
},
//男圣职者
{
x = -22,
y = -166
},
//女神枪手
{
x = -18,
y = -156
},
//女暗夜使者
{
x = -20,
y = -154
},
//男格斗家
{
x = -21,
y = -160
},
//男魔法师
{
x = -21,
y = -140
},
//黑暗武士
{
x = -18,
y = -154
},
//缔造者
{
x = -22,
y = -126
},
];
constructor() { constructor() {
base.constructor(); base.constructor();
} }
//同步单部位动画 //根据Ani路径和格式化数组来创建Ani ImgVariation Ani对应的格式化的数组 | Src Ani路径
function SyncAnimationBySlot(Type, AniObj, Src) { function CreateAni(ImgVariation, Src) {
this[AniObj][Type] <- []; //拷贝Ani的信息
local AniInfo = sq_DeepCopy(ScriptData.GetAni(Src));
//构造Ani的处理函数
local Ao = {
//传递Img的格式化方法
ImgFormat = function(ImgPath) {
//如果是皮肤这里会是"%04d" 这里要格式化成"%02d%02d"
if (ImgPath.find("%04d")) {
local Pos = ImgPath.find("%04d");
ImgPath = ImgPath.slice(0, Pos) + "%02d%02d" + ImgPath.slice(Pos + 4);
}
//替换掉Img的索引编号
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
}
}
//构造Ani
local Ani = Animation(AniInfo, Ao);
return Ani;
}
//同步单部位动画 Type 时装的类型名字 "hair" | Src Ani的路径
function SyncAnimationBySlot(Type, Src) {
//单部位的动画组
local AniList = [];
//如果有时装就初始化Ani //如果有时装就初始化Ani
//除了皮肤 在没有的情况下初始化0 //除了皮肤 在没有的情况下初始化0
if (Type == "skin") { if (Type == "skin_avatar") {
local variation = [0, 0]; local variation = [0, 0];
//如果存在皮肤就读取variation //如果存在皮肤就读取variation
if (Parent[Type] != null) { if (Parent[Type] != null) {
//获取对应装备或时装的信息
local AvaInfo = Parent[Type]; local AvaInfo = Parent[Type];
//获取对应职业对应的格式化信息
local JobInfo = AvaInfo["Animation_Job"]["Ani_" + Parent.Info["job"]]; local JobInfo = AvaInfo["Animation_Job"]["Ani_" + Parent.Info["job"]];
variation = JobInfo["variation"]; variation = JobInfo["variation"];
} }
local BufInfo = sq_DeepCopy(ScriptData.GetAni(Src)); local SkinAni = CreateAni(variation, Src);
local Ao = {
ImgVariation = variation,
ImgFormat = function(ImgPath) {
if (ImgVariation[0] > 0) {
local Pos = ImgPath.find("%04d");
ImgPath = ImgPath.slice(0, Pos) + "%02d%02d" + ImgPath.slice(Pos + 4);
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
} else {
return format(ImgPath, ImgVariation[1]);
}
}
}
local SkinAni = Animation(BufInfo, Ao);
//如果是皮肤Ani 绑定状态机 确保唯一性 //如果是皮肤Ani 绑定状态机 确保唯一性
SkinAni.BindenvStateMachine(Parent.StateMachine); SkinAni.BindenvStateMachine(Parent.StateMachine);
//将Ani类型设置为皮肤 //将Ani类型设置为皮肤
SkinAni.Type = "skin"; SkinAni.Type = "skin";
//加入组 //加入组
this[AniObj][Type].append(SkinAni); AniList.append(SkinAni);
} else { } else {
//先判断类型 //先判断 时装类型 角色有没有穿戴这个类型的时装
if (Parent[Type] != null) { if (Parent[Type] != null) {
//获取对应装备或时装的信息
local AvaInfo = Parent[Type]; local AvaInfo = Parent[Type];
if (AvaInfo) { if (AvaInfo) {
//获取对应职业对应的格式化信息
local JobInfo = AvaInfo["Animation_Job"]["Ani_" + Parent.Info["job"]]; local JobInfo = AvaInfo["Animation_Job"]["Ani_" + Parent.Info["job"]];
local variation = JobInfo["variation"];
//非皮肤的时装 会有多个层
foreach(_index, value in JobInfo["layer_variation"]) { foreach(_index, value in JobInfo["layer_variation"]) {
local BufInfo = sq_DeepCopy(ScriptData.GetAni(AvaInfo["DirPath"] + value["Path"] + Src.slice(Src.lastfind("/")))); local RealAniPath;
local Ao = { //如果有指定Ani Path 就使用指定的Ani Path
ImgVariation = JobInfo["variation"], if (AvaInfo["ExpandPath"]) RealAniPath = AvaInfo["ExpandPath"] + value["Path"] + Src.slice(Src.lastfind("/"));
ImgFormat = function(ImgPath) { //否则 拼接真实的Ani路径
return format(ImgPath, ImgVariation[0], ImgVariation[1]); else RealAniPath = AvaInfo["DirPath"] + value["Path"] + Src.slice(Src.lastfind("/"));
} local AniBuf = CreateAni(variation, RealAniPath);
}
local AniBuf = Animation(BufInfo, Ao);
//设置Ani类型 //设置Ani类型
AniBuf.Type = Type; AniBuf.Type = Type;
//设置Ani的ZOrder
AniBuf.SetZOrder(value["Zorder"]); AniBuf.SetZOrder(value["Zorder"]);
this[AniObj][Type].append(AniBuf); //加入组
AniList.append(AniBuf);
} }
} }
} }
} }
return AniList;
} }
//读取并设置Ani //根据动画组名称构造AniMap AniObj 角色类的动画组名称 Src Ani代表的标签 “sit motion” SlotType 装备类型
function ReadAndSetAni(AniObj, Src, SlotType) { function StructureAniMap(Src) {
//从父对象 也就是角色对象取得Info //初始化所有时装部位
local Info = Parent.Info; local AniObjectMap = {};
//如果有这个标签Ani则初始化 获取ani路径 foreach(Type, NString in getconsttable().AvatarType) {
if (Info.rawin(Src)) Src = Info[Src]; local AniList = SyncAnimationBySlot(Type, Src);
else return; AniObjectMap[Type] <- AniList;
//如果不存在则构造
if (this[AniObj] == null) this[AniObj] = {};
//如果没有传递装备类型就初始化所有
if (!SlotType) {
foreach(Type in getconsttable().AvatarType) {
SyncAnimationBySlot(Type, AniObj, Src);
} }
return AniObjectMap;
} }
//否则只初始化这一件装备的
else { //切换装备的刷新Ani
function RefreshAni(AniObj, Src, SlotType) {
//记录当前皮肤Ani的时间 确保唯一性 //记录当前皮肤Ani的时间 确保唯一性
local AniTime = 0; local AniTime = 0;
if (this.CurrentAni) AniTime = this.CurrentAni["skin"][0].CurrentIndexT; if (this.CurrentAni) AniTime = this.CurrentAni["skin_avatar"][0].CurrentIndexT;
//记录当前皮肤Ani的帧 确保唯一性 //记录当前皮肤Ani的帧 确保唯一性
local AniFrameIndex = 0; local AniFrameIndex = 0;
if (this.CurrentAni) AniFrameIndex = this.CurrentAni["skin"][0].CurrentFrameIndex; if (this.CurrentAni) AniFrameIndex = this.CurrentAni["skin_avatar"][0].CurrentFrameIndex;
//如果当前播放Ani是 构造的Ani 则移除 并清空 //如果当前播放Ani是 构造的Ani 则移除 并清空
if (this.CurrentAni == this[AniObj]) { if (this.CurrentAni == this[AniObj]) {
foreach(AniBuf in this.CurrentAni[SlotType]) { foreach(AniBuf in this.CurrentAni[SlotType]) {
AniBuf.RemoveSelf(); AniBuf.RemoveSelf();
} }
} }
SyncAnimationBySlot(SlotType, AniObj, Src); local AniList = SyncAnimationBySlot(SlotType, Src);
this[AniObj][SlotType] <- AniList;
//如果当前播放Ani是 构造的Ani //如果当前播放Ani是 构造的Ani
if (this.CurrentAni == this[AniObj]) { if (this.CurrentAni == this[AniObj]) {
//添加Ani 并设置为当前皮肤Ani的时间 //添加Ani 并设置为当前皮肤Ani的时间
@ -220,168 +203,99 @@ class Character_Animation extends Actor {
} }
} }
} }
}
function ReadAndSetAttackAni() {
local AttackAniArrSrc = Info["attack_motion"];
AttackAni = array(AttackAniArrSrc.len());
foreach(_Index, Path in AttackAniArrSrc) {
local Src = Path;
AttackAni[_Index] = [];
foreach(Type in getconsttable().AvatarType) {
//如果有时装就初始化Ani
//除了皮肤 在没有的情况下初始化0
if (Type == "skin") {
local SkinAni;
if (this[Type] == null) {
local BufInfo = sq_DeepCopy(ScriptData.GetAni(Src));
local Ao = {
ImgVariation = [0, 0],
ImgFormat = function(ImgPath) {
if (ImgVariation[0] > 0) {
local Pos = ImgPath.find("%04d");
ImgPath = ImgPath.slice(0, Pos) + "%02d%02d" + ImgPath.slice(Pos + 4);
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
} else {
return format(ImgPath, ImgVariation[1]);
}
}
}
SkinAni = Animation(BufInfo, Ao);
} else {
local AvaInfo = AssetManager.GetEquipment(this[Type]);
local JobInfo = AvaInfo["Ani"]["Ani_" + Info["job"]];
local BufInfo = sq_DeepCopy(ScriptData.GetAni(Src));
local Ao = {
ImgVariation = JobInfo["variation"],
ImgFormat = function(ImgPath) {
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
}
}
SkinAni = Animation(BufInfo, Ao);
}
//如果是皮肤Ani 绑定状态机 确保唯一性
SkinAni.BindenvStateMachine(StateMachine);
//将Ani类型设置为皮肤
SkinAni.Type = "skin";
//加入组
AttackAni[_Index].append(SkinAni);
} else {
if (this[Type] != null) {
local AvaInfo = AssetManager.GetEquipment(this[Type]);
local JobInfo = AvaInfo["Ani"]["Ani_" + Info["job"]];
foreach(_index, value in JobInfo["layer_variation"]) {
local BufInfo = sq_DeepCopy(ScriptData.GetAni(AvaInfo["DirPath"] + value["Path"] + Src.slice(Src.lastfind("/"))));
local Ao = {
ImgVariation = JobInfo["variation"],
ImgFormat = function(ImgPath) {
return format(ImgPath, ImgVariation[0], ImgVariation[1]);
}
}
local AniBuf = Animation(BufInfo, Ao);
//设置Ani类型
AniBuf.Type = Type;
AniBuf.SetZOrder(value["Zorder"]);
AttackAni[_Index].append(AniBuf);
}
}
}
}
}
}
//初始化
function Init(SlotType = false) { function Init(SlotType = false) {
//初始化Ani //遍历所有Ani类型并构造
InitAni(SlotType); foreach(ChrAniObj, InfoSrc in SMap) {
//初始化名字 //从父对象 角色对象取得Info 判断其中有没有这个Ani标签 如果有 取得路径
InitName(); if (Parent.Info.rawin(InfoSrc)) InfoSrc = Parent.Info[InfoSrc];
} else continue;
if (!SlotType) {
function InitAni(SlotType) { this[ChrAniObj] = StructureAniMap(InfoSrc);
//读取并设置 等待Ani
ReadAndSetAni("WaitingAni", "waiting motion", SlotType);
//读取并设置 移动Ani
ReadAndSetAni("MoveAni", "move motion", SlotType);
//读取并设置 蹲下Ani
ReadAndSetAni("SitAni", "sit motion", SlotType);
//读取并设置 受伤Ani
ReadAndSetAni("DamageAni1", "damage motion 1", SlotType);
//读取并设置 受伤Ani
ReadAndSetAni("DamageAni2", "damage motion 2", SlotType);
//读取并设置 倒地Ani
ReadAndSetAni("DownAni", "down motion", SlotType);
//读取并设置 被击后退Ani
ReadAndSetAni("OverturnAni", "overturn motion", SlotType);
//读取并设置 跳跃Ani
ReadAndSetAni("JumoAni", "jump motion", SlotType);
//读取并设置 跳跃攻击Ani
ReadAndSetAni("JumpAttackAni", "jumpattack motion", SlotType);
//读取并设置 站立Ani
ReadAndSetAni("RestAni", "rest motion", SlotType);
//读取并设置 引导Ani
ReadAndSetAni("ThrowAni1_1", "throw motion 1-1", SlotType);
ReadAndSetAni("ThrowAni1_2", "throw motion 1-2", SlotType);
ReadAndSetAni("ThrowAni2_1", "throw motion 2-1", SlotType);
ReadAndSetAni("ThrowAni2_2", "throw motion 2-2", SlotType);
ReadAndSetAni("ThrowAni3_1", "throw motion 3-1", SlotType);
ReadAndSetAni("ThrowAni3_2", "throw motion 3-2", SlotType);
ReadAndSetAni("ThrowAni4_1", "throw motion 4-1", SlotType);
ReadAndSetAni("ThrowAni4_2", "throw motion 4-2", SlotType);
//读取并设置 奔跑Ani
ReadAndSetAni("DashAni", "dash motion", SlotType);
//读取并设置 奔跑攻击Ani
ReadAndSetAni("DashAttackAni", "dashattack motion", SlotType);
//读取并设置 拾取Ani
ReadAndSetAni("GetItemAni", "getitem motion", SlotType);
//读取并设置 释放BUFFAni
ReadAndSetAni("BuffAni", "buff motion", SlotType);
//读取并设置 AttackAni
// ReadAndSetAttackAni();
}
function InitAuroa() {
//光环
local Info = Parent.aurora;
//如果有光环
if (AuroraAni) {
foreach(Ani in AuroraAni) {
Removechild(Ani);
}
}
AuroraAni = [];
foreach(Effect in Info.Aurora_effects) {
local AniBuf = Animation(Effect.path);
AuroraAni.append(AniBuf);
Addchild(AniBuf);
//front
if (Effect.type == 1) {
AniBuf.SetZOrder(100000);
} else { } else {
AniBuf.SetZOrder(-100000); RefreshAni(ChrAniObj, InfoSrc, SlotType);
}
}
//将默认时装类型存储起来 因为脱下时装的时候要恢复默认时装的设定
if (!Default_Avatar) {
Default_Avatar = {};
foreach(EquiId in Parent.Info.default_avatar) {
local EquBuffer = GameItem.Equipment(EquiId);
Default_Avatar[EquBuffer.SlotType] <- EquBuffer;
} }
} }
} }
//初始化名字 //构造临时Ani
function InitName() { function CreateTempAni(AniName) {
//创建名字对象 local InfoSrc = SMap[AniName];
Name = FontAssetManager.GenerateNormal("", true, { //从父对象 角色对象取得Info 判断其中有没有这个Ani标签 如果有 取得路径
color = sq_RGBA(209, 185, 148, 255), if (Parent.Info.rawin(InfoSrc)) InfoSrc = Parent.Info[InfoSrc];
}); else return;
Name.SetPosition(ENUM_RINDRO_JOB_TITLE_HEIGHT[Parent.Job].x, ENUM_RINDRO_JOB_TITLE_HEIGHT[Parent.Job].y); local Ani = Actor();
Name.SetZOrder(80000); foreach(Key, AniGroup in StructureAniMap(InfoSrc)) {
Addchild(Name); //如果是皮肤Ani 则设置Ani的大小
if (Key == "skin_avatar") Ani.SetSize(AniGroup[0].GetSize());
//如果使用了武器装扮 不加入武器的Ani
if (Key == "weapon" && UseWeaponAvatar) continue;
foreach(AniObj in AniGroup) {
//如果AniObj的ZOrder在隐藏图层中 则隐藏
if (HideLayer.rawin(AniObj.GetZOrder())) {
} else {
Ani.Addchild(AniObj);
}
}
}
return Ani;
} }
//设置名字 //处理隐藏图层
function SetName(Name) { function HandlingHideLayers() {
this.Name.SetText(Name); //遍历全部时装计算隐藏图层
HideLayer = {};
UseWeaponAvatar = false;
foreach(Type, NString in getconsttable().AvatarType) {
local Equip = Parent[Type];
if (Equip) {
//如果装备有隐藏图层 则加入隐藏图层
if (Equip.HideLayer) {
foreach(layer in Equip.HideLayer) {
HideLayer[layer] <- true;
}
}
//如果有佩戴武器装扮
if (Type == "weapon_avatar") {
UseWeaponAvatar = true;
}
}
}
//遍历全部Ani
foreach(ChrAniObj, InfoSrc in SMap) {
//取得Ani组
if (this[ChrAniObj]) {
foreach(Key, AniGroup in this[ChrAniObj]) {
//如果使用了武器装扮 则隐藏武器Ani
if (Key == "weapon" && UseWeaponAvatar) {
foreach(AniObj in AniGroup) {
AniObj.SetVisible(false);
}
} else {
//遍历Ani组
foreach(AniObj in AniGroup) {
//如果AniObj的ZOrder在隐藏图层中 则隐藏
if (HideLayer.rawin(AniObj.GetZOrder())) {
AniObj.SetVisible(false);
} else {
AniObj.SetVisible(true);
}
}
}
}
}
}
} }
//设置Ani //设置Ani
function SetAnimation(Ani) { function SetAnimation(Ani) {
@ -409,4 +323,13 @@ class Character_Animation extends Actor {
} }
} }
} }
//设置方向
function SetDirection(D) {
if (D == DIRECTION.RIGHT) {
SetScale(fabs(GetScale().x), GetScale().y);
} else if (D == DIRECTION.LEFT) {
SetScale(-fabs(GetScale().x), GetScale().y);
}
}
} }

View File

@ -0,0 +1,60 @@
/*
文件名:ChatBubble.nut
路径:User/Asset/Character/ChatBubble.nut
创建日期:2025-01-24 19:04
文件用途:聊天气泡
*/
class Character_ChatBubble extends CL_CanvasObject {
RealWidth = null;
RealHeight = null;
constructor(Msg) {
base.constructor();
Init(Msg);
}
function Init(Msg) {
//渲染文本
local BoxWidth = 0;
local Tag = {
color = sq_RGBA(255, 255, 255, 250)
};
if (Msg.len() > 27) {
Tag.wrap_width <- 114;
BoxWidth = 130;
}
local Text = FontAssetManager.GenerateNormal(Msg, false, Tag);
//计算文本大小
local TextSize = Text.GetSize();
RealWidth = BoxWidth ? BoxWidth : TextSize.w + 18;
RealHeight = TextSize.h + 18;
//创建背景框 +18是 上下的空隙
local Bg = Yosin_NineBoxStretch(RealWidth, RealHeight, "sprite/interface/messageballoon.img", 20);
//重设大小
ResizeAndClear(TextSize.w + 20, TextSize.h + 40);
SetFillBrush(sq_RGBA(105, 212, 238, 250));
SetStrokeBrush(sq_RGBA(105, 212, 238, 250));
// 开始绘制
BeginDraw();
//绘制背景
DrawActor(Bg, 0, 0);
//绘制文字
DrawActor(Text, 9, 8);
// DrawRect(9, 8, TextSize.w + 9, TextSize.h + 8)
// 结束绘制
EndDraw();
}
function OnUpdate(Dt) {
base.OnUpdate(Dt);
if (ExistingTime >= 4000) {
Parent.ChatObject = null;
RemoveSelf();
}
}
}

View File

@ -11,7 +11,8 @@ class _FontAssetManager_ {
function InitFont() { function InitFont() {
//普通宋体小字 //普通宋体小字
// Font.PreLoad("新宋体"); // Font.PreLoad("新宋体");
Font("宋体", 11.5).Register(0); Font("新宋体", 11.5).Register(0);
Font("新宋体", 10).Register(1);
} }
constructor() { constructor() {
@ -24,6 +25,10 @@ class _FontAssetManager_ {
//生成普通宋体小字 //生成普通宋体小字
function GenerateNormal(text, stroke, style = {}) { function GenerateNormal(text, stroke, style = {}) {
//如果有设置换行宽度 则设置默认的自动换行模式
if (!(style.rawin("word_wrapping")) && style.rawin("wrap_width")) {
style.word_wrapping <- TextWordWrapping.WRAPPING_CHARACTER;
}
//登录按钮文本 //登录按钮文本
local TextActor = TextActor(0, style); local TextActor = TextActor(0, style);
TextActor.SetText(text); TextActor.SetText(text);
@ -31,4 +36,18 @@ class _FontAssetManager_ {
TextActor.SetOutline(); TextActor.SetOutline();
return TextActor; return TextActor;
} }
//生成普通宋体小字
function GenerateMini(text, stroke, style = {}) {
//如果有设置换行宽度 则设置默认的自动换行模式
if (!(style.rawin("word_wrapping")) && style.rawin("wrap_width")) {
style.word_wrapping <- TextWordWrapping.WRAPPING_CHARACTER;
}
//登录按钮文本
local TextActor = TextActor(1, style);
TextActor.SetText(text);
if (stroke)
TextActor.SetOutline();
return TextActor;
}
} }

View File

@ -0,0 +1,190 @@
/*
文件名:Attribute.nut
路径:User/Asset/Item/Attribute.nut
创建日期:2025-02-10 07:00
文件用途:属性类
*/
class Attribute {
//最大生命值
HPMax = 0;
//最大魔法值
MPMax = 0;
//生命值回复速度
HPRegenSpeed = 0;
//魔法值回复速度
MPRegenSpeed = 0;
//跳跃力
JumpPower = 0;
//硬直
HitRecovery = 0;
//命中率
Stuck = 0;
//闪避率
StuckResistance = 0;
//力量
PhysicalAttack = 0;
//智力
MagicalAttack = 0;
//体力
PhysicalDefense = 0;
//精神
MagicalDefense = 0;
//所有属强
AllElementalAttack = 0;
//暗属强
DarkAttack = 0;
//光属强
LightAttack = 0;
//水属强
WaterAttack = 0;
//火属强
FireAttack = 0;
//物理攻击力
EquipmentPhysicalAttack = 0;
//魔法攻击力
EquipmentMagicalAttack = 0;
//独立攻击力
SeparateAttack = 0;
//物理防御力
EquipmentPhysicalDefense = 0;
//魔法防御力
EquipmentMagicalDefense = 0;
//攻击速度
AttackSpeed = 0;
//释放速度
CastSpeed = 0;
//移动速度
MoveSpeed = 0;
//跳跃速度
JumpSpeed = 0;
//物理暴击率
PhysicalCriticalHit = 0;
//魔法暴击率
MagicalCriticalHit = 0;
//暗属抗
DarkResistance = 0;
//光属抗
LightResistance = 0;
//水属抗
WaterResistance = 0;
//火属抗
FireResistance = 0;
//属性攻击
ElementalProperty = null;
constructor(Args) {
ElementalProperty = [];
//使用装备构造
if (typeof Args == "table") {
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
//普通属性
if (Args.rawin(member)) {
this[member] = Args[member];
}
} else {
//属性攻击
if (Args.rawin(member)) {
switch (Args[member]) {
case "[dark element]":
this[member].push(0);
break;
case "[light element]":
this[member].push(1);
break;
case "[water element]":
this[member].push(2);
break;
case "[fire element]":
this[member].push(3);
}
}
}
}
}
//使用角色构造
else if (typeof Args == "Game_Character") {
local Info = sq_DeepCopy(Args.Info.Attribute[Args.GrowJob]);
Info.rawdelete("filepath");
foreach(Key, Value in Info) {
// print(Value);
if (Key == "HPMax" || Key == "MPMax" || Key == "PhysicalAttack" || Key == "MagicalAttack" || Key == "PhysicalDefense" || Key == "MagicalDefense")
this[Key] = Value * Args.Level;
else {
if (this.rawin(Key)) this[Key] = Value;
}
}
}
}
function _typeof() {
return "Attribute";
}
function _add(other) {
if (typeof other != "Attribute") throw "属性运算参数错误";
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
this[member] += other[member];
} else {
foreach(EleType in other[member]) {
local index = this["ElementalProperty"].find(EleType);
if (!index) this["ElementalProperty"].push(EleType);
}
}
}
return this;
}
function _sub(other) {
if (typeof other != "Attribute") throw "属性运算参数错误";
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
this[member] -= other[member];
} else {
foreach(EleType in other[member]) {
local index = this["ElementalProperty"].find(EleType);
if (index) this["ElementalProperty"].remove(index);
}
}
}
return this;
}
function _mul(other) {
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
this[member] *= other;
}
}
return this;
}
function _div(other) {
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
this[member] /= other;
}
}
return this;
}
function Show() {
foreach(member, val in getconsttable().ATTRIBUTE) {
if (member != "ElementalProperty") {
print(getconsttable().ATTRIBUTE[member] + " : " + this[member]);
} else {
print(getconsttable().ATTRIBUTE[member] + " : ");
print(this[member]);
}
}
}
}

View File

@ -4,8 +4,6 @@
创建日期:2024-12-12 19:03 创建日期:2024-12-12 19:03
文件用途: 文件用途:
*/ */
//装备信息标签类(信息类)
if (!GameItem.rawin("EquipmentInfoTag")) GameItem.EquipmentInfoTag <- null;
//装备图标窗口 //装备图标窗口
class GameItem.EquipmentIcon extends CL_CanvasObject { class GameItem.EquipmentIcon extends CL_CanvasObject {
@ -28,7 +26,7 @@ class GameItem.EquipmentIcon extends CL_CanvasObject {
} }
//边框 //边框
local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + GameItem.EquipmentInfoTag.rarityframe_color_idx[Equipment.Rarity]); local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + AssetManager.EtcConfig.ItemInfoTag.rarityframe_color_idx[Equipment.Rarity]);
DrawSpriteFrame(IconFrame, 0, 0); DrawSpriteFrame(IconFrame, 0, 0);
} }
EndDraw(); EndDraw();
@ -77,7 +75,7 @@ class GameItem.EquipmentInfo extends Yosin_Window {
if (Equipment.SeparateLevel > 0) SeparateLevelName = "(" + Equipment.SeparateLevel + ")"; if (Equipment.SeparateLevel > 0) SeparateLevelName = "(" + Equipment.SeparateLevel + ")";
if ((Equipment.Upgrade + Equipment.SeparateLevel) > 0) DrawName = UpgradeName + SeparateLevelName + " " + DrawName; if ((Equipment.Upgrade + Equipment.SeparateLevel) > 0) DrawName = UpgradeName + SeparateLevelName + " " + DrawName;
local EquName = FontAssetManager.GenerateNormal(DrawName, false, { local EquName = FontAssetManager.GenerateNormal(DrawName, false, {
color = GameItem.EquipmentInfoTag.rarity_color[Equipment.Rarity] color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Equipment.Rarity]
}); });
Canvas.DrawActor(EquName, 41, 7); Canvas.DrawActor(EquName, 41, 7);
} }
@ -103,8 +101,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
Canvas.DrawActor(PercentageGradeText, 6, 41); Canvas.DrawActor(PercentageGradeText, 6, 41);
Canvas.DrawActor(PercentageText, 130, 41); Canvas.DrawActor(PercentageText, 130, 41);
//绘制稀有度名称 //绘制稀有度名称
local RarityTagName = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.rarity_name_tag[Equipment.Rarity], false, { local RarityTagName = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.rarity_name_tag[Equipment.Rarity], false, {
color = GameItem.EquipmentInfoTag.rarity_color[Equipment.Rarity] color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Equipment.Rarity]
}); });
Canvas.DrawActor(RarityTagName, 210 - RarityTagName.GetSize().w - 6, 41); Canvas.DrawActor(RarityTagName, 210 - RarityTagName.GetSize().w - 6, 41);
@ -122,13 +120,13 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制交易类型 如果有主体属性读取 否则一律为封装 //绘制交易类型 如果有主体属性读取 否则一律为封装
local TradeType = Equipment.TradeType; local TradeType = Equipment.TradeType;
local TradeTypeText = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.trade_type_text[TradeType], false, { local TradeTypeText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.trade_type_text[TradeType], false, {
color = GameItem.EquipmentInfoTag.trade_type_color[TradeType] color = AssetManager.EtcConfig.ItemInfoTag.trade_type_color[TradeType]
}); });
Canvas.DrawActor(TradeTypeText, 210 - TradeTypeText.GetSize().w - 6, 73); Canvas.DrawActor(TradeTypeText, 210 - TradeTypeText.GetSize().w - 6, 73);
//绘制装备类型 //绘制装备类型
local GroupNameText = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.item_group_name_table[Equipment.GroupName], false, { local GroupNameText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.item_group_name_table[Equipment.GroupName], false, {
color = sq_RGBA(194, 161, 56, 255) color = sq_RGBA(194, 161, 56, 255)
}); });
Canvas.DrawActor(GroupNameText, 210 - GroupNameText.GetSize().w - 6, 89); Canvas.DrawActor(GroupNameText, 210 - GroupNameText.GetSize().w - 6, 89);
@ -187,6 +185,10 @@ class GameItem.EquipmentInfo extends Yosin_Window {
DrawAttack("EquipmentMagicalAttack", "魔法攻击力"); DrawAttack("EquipmentMagicalAttack", "魔法攻击力");
//绘制独立攻击力 //绘制独立攻击力
DrawAttack("SeparateAttack", "独立攻击力"); DrawAttack("SeparateAttack", "独立攻击力");
//绘制物理防御力
DrawAttack("EquipmentPhysicalDefense", "物理防御力");
//绘制魔法防御力
DrawAttack("EquipmentMagicalDefense", "魔法防御力");
//绘制四维 //绘制四维
DrawAttribute("PhysicalAttack", "力量"); DrawAttribute("PhysicalAttack", "力量");
DrawAttribute("MagicalAttack", "智力"); DrawAttribute("MagicalAttack", "智力");
@ -221,8 +223,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
DrawElement("WaterAttack", "水属性强化"); DrawElement("WaterAttack", "水属性强化");
//绘制属性攻击 //绘制属性攻击
if (Equipment.ElementalProperty) { if (Equipment.Attr.ElementalProperty.len() > 0) {
local Text = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.elemental_property_tag[Equipment.ElementalProperty], false, { local Text = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.elemental_property_tag[Equipment.Attr.ElementalProperty[0].tostring()], false, {
color = sq_RGBA(215, 196, 147, 255) color = sq_RGBA(215, 196, 147, 255)
}); });
Canvas.DrawActor(Text, 6, RealCanvasHeight); Canvas.DrawActor(Text, 6, RealCanvasHeight);
@ -250,8 +252,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制属强属抗 //绘制属强属抗
function DrawElement(Type, TypeName) { function DrawElement(Type, TypeName) {
if (Equipment[Type] != 0) { if (Equipment.Attr[Type] != 0) {
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment[Type] >= 0 ? "+" : "-") + Equipment[Type], false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment.Attr[Type] >= 0 ? "+" : "-") + Equipment.Attr[Type], false, {
color = sq_RGBA(215, 196, 147, 255) color = sq_RGBA(215, 196, 147, 255)
}); });
Canvas.DrawActor(AttackText, 6, RealCanvasHeight); Canvas.DrawActor(AttackText, 6, RealCanvasHeight);
@ -261,8 +263,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制命中 //绘制命中
function DrawStuck(Type, TypeName) { function DrawStuck(Type, TypeName) {
if (Equipment[Type] != 0) { if (Equipment.Attr[Type] != 0) {
local Value = Equipment[Type]; local Value = Equipment.Attr[Type];
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "") + Value + "%", false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "") + Value + "%", false, {
color = sq_RGBA(215, 196, 147, 255) color = sq_RGBA(215, 196, 147, 255)
}); });
@ -273,8 +275,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制双爆 //绘制双爆
function DrawCritical(Type, TypeName) { function DrawCritical(Type, TypeName) {
if (Equipment[Type] != 0) { if (Equipment.Attr[Type] != 0) {
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment[Type] >= 0 ? "+" : "-") + Equipment[Type] + "%", false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Equipment.Attr[Type] >= 0 ? "+" : "-") + Equipment.Attr[Type] + "%", false, {
color = sq_RGBA(215, 196, 147, 255) color = sq_RGBA(215, 196, 147, 255)
}); });
Canvas.DrawActor(AttackText, 6, RealCanvasHeight); Canvas.DrawActor(AttackText, 6, RealCanvasHeight);
@ -284,8 +286,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制三速 //绘制三速
function DrawSpeed(Type, TypeName) { function DrawSpeed(Type, TypeName) {
if (Equipment[Type] != 0) { if (Equipment.Attr[Type] != 0) {
local Value = (Equipment[Type].tofloat() * 0.1).tointeger(); local Value = (Equipment.Attr[Type].tofloat() * 0.1).tointeger();
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "-") + Value + "%", false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + (Value >= 0 ? "+" : "-") + Value + "%", false, {
color = sq_RGBA(215, 196, 147, 255) color = sq_RGBA(215, 196, 147, 255)
}); });
@ -296,8 +298,8 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制四维 //绘制四维
function DrawAttribute(Type, TypeName) { function DrawAttribute(Type, TypeName) {
if (Equipment[Type] != 0) { if (Equipment.Attr[Type] != 0) {
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + Equipment[Type], false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + Equipment.Attr[Type], false, {
color = sq_RGBA(134, 120, 79, 255) color = sq_RGBA(134, 120, 79, 255)
}); });
Canvas.DrawActor(AttackText, 6, RealCanvasHeight); Canvas.DrawActor(AttackText, 6, RealCanvasHeight);
@ -307,18 +309,18 @@ class GameItem.EquipmentInfo extends Yosin_Window {
//绘制三攻 //绘制三攻
function DrawAttack(Type, TypeName) { function DrawAttack(Type, TypeName) {
if (Equipment[Type] != null) { if (Equipment.Attr[Type]) {
local RealValue; local RealValue;
//数组为没有百分比计算过的原始数据 //数组为没有百分比计算过的原始数据
if (typeof Equipment[Type] == "array") { if (typeof Equipment.Attr[Type] == "array") {
local MaxValue = Equipment[Type][0]; local MaxValue = Equipment.Attr[Type][0];
local MinValue = Equipment[Type][1]; local MinValue = Equipment.Attr[Type][1];
local Rate = 1.0; local Rate = 1.0;
RealValue = (MinValue + ((MaxValue - MinValue).tofloat() * Rate).tointeger()); RealValue = (MinValue + ((MaxValue - MinValue).tofloat() * Rate).tointeger());
} }
//百分比计算过的数据 //百分比计算过的数据
else if (typeof Equipment[Type] == "integer" || typeof Equipment[Type] == "float") { else if (typeof Equipment.Attr[Type] == "integer" || typeof Equipment.Attr[Type] == "float") {
RealValue = Equipment[Type]; RealValue = Equipment.Attr[Type];
} }
local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + RealValue, false, { local AttackText = FontAssetManager.GenerateNormal(TypeName + " " + RealValue, false, {
color = sq_RGBA(134, 120, 79, 255) color = sq_RGBA(134, 120, 79, 255)
@ -341,33 +343,20 @@ class GameItem.EquipmentInfo extends Yosin_Window {
// 根据数值获取对应的品级文字 // 根据数值获取对应的品级文字
function GetPercentageText(num) { function GetPercentageText(num) {
if (num< GameItem.EquipmentInfoTag.percentage_range_boundaries[0]) { if (num< AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries[0]) {
return GameItem.EquipmentInfoTag.percentage_text[0]; return AssetManager.EtcConfig.ItemInfoTag.percentage_text[0];
} }
for (local i = 0; i< GameItem.EquipmentInfoTag.percentage_range_boundaries.len(); i++) { for (local i = 0; i< AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries.len(); i++) {
if (num <= GameItem.EquipmentInfoTag.percentage_range_boundaries[i]) { if (num <= AssetManager.EtcConfig.ItemInfoTag.percentage_range_boundaries[i]) {
return GameItem.EquipmentInfoTag.percentage_text[i + 1]; return AssetManager.EtcConfig.ItemInfoTag.percentage_text[i + 1];
} }
} }
return GameItem.EquipmentInfoTag.percentage_text.top(); return AssetManager.EtcConfig.ItemInfoTag.percentage_text.top();
} }
} }
// if (!getroottable().rawin("chongzaiflag")) {
// getroottable()["chongzaiflag"] <- true;
// } else {
// //遍历窗口队列 如果可见则调用Show
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
// local Window = _SYS_WINDOW_LIST_[i];
// Window.Visible = false;
// Window.RemoveSelf();
// }
// TestStage();
// }
class GameItem.Equipment extends GameItem.Item { class GameItem.Equipment extends GameItem.Item {
//装备ID //装备ID
@ -426,68 +415,14 @@ class GameItem.Equipment extends GameItem.Item {
DirPath = null; DirPath = null;
//光环特效 //光环特效
Aurora_effects = null; Aurora_effects = null;
//装备属性 //装备属性
Property = null; Attr = null;
//力量
PhysicalAttack = 0;
//智力
MagicalAttack = 0;
//体力
PhysicalDefense = 0;
//精神
MagicalDefense = 0;
//所有属强
AllElementalAttack = 0;
//暗属强
DarkAttack = 0;
//光属强
LightAttack = 0;
//水属强
WaterAttack = 0;
//火属强
FireAttack = 0;
//物理攻击力
EquipmentPhysicalAttack = 0;
//魔法攻击力
EquipmentMagicalAttack = 0;
//独立攻击力
SeparateAttack = 0;
//物理防御力
EquipmentPhysicalDefense = 0;
//魔法防御力
EquipmentMagicalDefense = 0;
//攻击速度
AttackSpeed = 0;
//释放速度
CastSpeed = 0;
//移动速度
MoveSpeed = 0;
//物理暴击率
PhysicalCriticalHit = 0;
//魔法暴击率
MagicalCriticalHit = 0;
//命中率
Stuck = 0;
//暗属抗
DarkResistance = 0;
//光属抗
LightResistance = 0;
//水属抗
WaterResistance = 0;
//火属抗
FireResistance = 0;
//属性攻击
ElementalProperty = null;
//描述 //描述
FlavorText = null; FlavorText = null;
//隐藏图层
HideLayer = null;
//拓展Ani路径
ExpandPath = null;
function _typeof() { function _typeof() {
@ -528,36 +463,37 @@ class GameItem.Equipment extends GameItem.Item {
this.SeparateLevel = Info.EquipSeparate; this.SeparateLevel = Info.EquipSeparate;
//装备增幅属性 //装备增幅属性
this.EquipIncrease = Info.EquipIncrease; this.EquipIncrease = Info.EquipIncrease;
//装备力量百分比 //装备力量百分比
this.PhysicalAttack *= (Info.EquipPowerPercentage.tofloat() / 100.0); this.Attr.PhysicalAttack *= (Info.EquipPowerPercentage.tofloat() / 100.0);
//装备智力百分比 //装备智力百分比
this.MagicalAttack *= (Info.EquipIntellectPercentage.tofloat() / 100.0); this.Attr.MagicalAttack *= (Info.EquipIntellectPercentage.tofloat() / 100.0);
//装备体力百分比 //装备体力百分比
this.PhysicalDefense *= (Info.EquipStaminaPercentage.tofloat() / 100.0); this.Attr.PhysicalDefense *= (Info.EquipStaminaPercentage.tofloat() / 100.0);
//装备精神百分比 //装备精神百分比
this.MagicalDefense *= (Info.EquipSpiritPercentage.tofloat() / 100.0); this.Attr.MagicalDefense *= (Info.EquipSpiritPercentage.tofloat() / 100.0);
//装备物理攻击百分比 //装备物理攻击百分比
this.EquipmentPhysicalAttack = this.EquipmentPhysicalAttack[0] + ((this.EquipmentPhysicalAttack[1] - this.EquipmentPhysicalAttack[0]) * (Info.EquipPhysicalAttackPercentage.tofloat() / 100.0)); if (this.Attr.EquipmentPhysicalAttack) this.Attr.EquipmentPhysicalAttack = this.Attr.EquipmentPhysicalAttack[0] + ((this.Attr.EquipmentPhysicalAttack[1] - this.Attr.EquipmentPhysicalAttack[0]) * (Info.EquipPhysicalAttackPercentage.tofloat() / 100.0));
//装备魔法攻击百分比 //装备魔法攻击百分比
this.EquipmentMagicalAttack = this.EquipmentMagicalAttack[0] + ((this.EquipmentMagicalAttack[1] - this.EquipmentMagicalAttack[0]) * (Info.EquipMagicAttackPercentage.tofloat() / 100.0)); if (this.Attr.EquipmentMagicalAttack) this.Attr.EquipmentMagicalAttack = this.Attr.EquipmentMagicalAttack[0] + ((this.Attr.EquipmentMagicalAttack[1] - this.Attr.EquipmentMagicalAttack[0]) * (Info.EquipMagicAttackPercentage.tofloat() / 100.0));
//装备独立攻击百分比 //装备独立攻击百分比
this.SeparateAttack = this.SeparateAttack[0] + ((this.SeparateAttack[1] - this.SeparateAttack[0]) * (Info.EquipIndependentAttackPercentage.tofloat() / 100.0)); if (this.Attr.SeparateAttack) this.Attr.SeparateAttack = this.Attr.SeparateAttack[0] + ((this.Attr.SeparateAttack[1] - this.Attr.SeparateAttack[0]) * (Info.EquipIndependentAttackPercentage.tofloat() / 100.0));
//装备物理防御百分比 //装备物理防御百分比
this.EquipmentPhysicalDefense = this.EquipmentPhysicalDefense[0] + ((this.EquipmentPhysicalDefense[1] - this.EquipmentPhysicalDefense[0]) * (Info.EquipPhysicalDefensePercentage.tofloat() / 100.0)); if (this.Attr.EquipmentPhysicalDefense) this.Attr.EquipmentPhysicalDefense = this.Attr.EquipmentPhysicalDefense[0] + ((this.Attr.EquipmentPhysicalDefense[1] - this.Attr.EquipmentPhysicalDefense[0]) * (Info.EquipPhysicalDefensePercentage.tofloat() / 100.0));
//装备魔法防御百分比 //装备魔法防御百分比
this.EquipmentMagicalDefense = this.EquipmentMagicalDefense[0] + ((this.EquipmentMagicalDefense[1] - this.EquipmentMagicalDefense[0]) * (Info.EquipMagicDefensePercentage.tofloat() / 100.0)); if (this.Attr.EquipmentMagicalDefense) this.Attr.EquipmentMagicalDefense = this.Attr.EquipmentMagicalDefense[0] + ((this.Attr.EquipmentMagicalDefense[1] - this.Attr.EquipmentMagicalDefense[0]) * (Info.EquipMagicDefensePercentage.tofloat() / 100.0));
//装备全属强 //装备全属强
this.AllElementalAttack += Info.EquipAllElementalAttack; if (this.Attr.AllElementalAttack > 0) this.Attr.AllElementalAttack = (this.Attr.AllElementalAttack, 0.15, (Info.EquipAllElementalAttack.tofloat() / 100.0));
//装备水属强 //装备水属强
this.WaterAttack += Info.EquipWaterAttack; if (this.Attr.WaterAttack > 0) this.Attr.WaterAttack = Math.getFinalValueByFloatRate(this.Attr.WaterAttack, 0.15, (Info.EquipWaterAttack.tofloat() / 100.0));
//装备火属强 //装备火属强
this.FireAttack += Info.EquipFireAttack; if (this.Attr.FireAttack > 0) this.Attr.FireAttack = Math.getFinalValueByFloatRate(this.Attr.FireAttack, 0.15, (Info.EquipFireAttack.tofloat() / 100.0));
//装备光属强 //装备光属强
this.LightAttack += Info.EquipLightAttack; if (this.Attr.LightAttack > 0) this.Attr.LightAttack = Math.getFinalValueByFloatRate(this.Attr.LightAttack, 0.15, (Info.EquipLightAttack.tofloat() / 100.0));
//装备暗属强 //装备暗属强
this.DarkAttack += Info.EquipDarkAttack; if (this.Attr.DarkAttack > 0) this.Attr.DarkAttack = Math.getFinalValueByFloatRate(this.Attr.DarkAttack, 0.15, (Info.EquipDarkAttack.tofloat() / 100.0));
//装备品质 //装备品质
this.Percentage = Info.EquipPercentage; this.Percentage = Info.EquipPercentage;
//装备再封装次数 //装备再封装次数
@ -575,7 +511,7 @@ class GameItem.Equipment extends GameItem.Item {
//如果获取到对应的装备脚本信息 //如果获取到对应的装备脚本信息
if (EquInfo) { if (EquInfo) {
//名称 //名称
if (EquInfo.rawin("name")) Name = EquInfo["name"]; if (EquInfo.rawin("name")) Name = strip(EquInfo["name"]);
//类型 //类型
if (EquInfo.rawin("type")) GetRealEquipmentType(EquInfo["type"].path); if (EquInfo.rawin("type")) GetRealEquipmentType(EquInfo["type"].path);
//最低使用等级 //最低使用等级
@ -605,48 +541,15 @@ class GameItem.Equipment extends GameItem.Item {
if (EquInfo.rawin("Ani")) Animation_Job = EquInfo["Ani"]; if (EquInfo.rawin("Ani")) Animation_Job = EquInfo["Ani"];
if (EquInfo.rawin("DirPath")) DirPath = EquInfo["DirPath"]; if (EquInfo.rawin("DirPath")) DirPath = EquInfo["DirPath"];
if (EquInfo.rawin("aurora_effects")) Aurora_effects = EquInfo["aurora_effects"]; if (EquInfo.rawin("aurora_effects")) Aurora_effects = EquInfo["aurora_effects"];
//四维
if (EquInfo.rawin("physical attack")) PhysicalAttack = EquInfo["physical attack"];
if (EquInfo.rawin("magical attack")) MagicalAttack = EquInfo["magical attack"];
if (EquInfo.rawin("physical defense")) PhysicalDefense = EquInfo["physical defense"];
if (EquInfo.rawin("magical defense")) MagicalDefense = EquInfo["magical defense"];
//属强
if (EquInfo.rawin("all elemental attack")) AllElementalAttack = EquInfo["all elemental attack"];
if (EquInfo.rawin("dark attack")) DarkAttack = EquInfo["dark attack"];
if (EquInfo.rawin("light attack")) LightAttack = EquInfo["light attack"];
if (EquInfo.rawin("water attack")) WaterAttack = EquInfo["water attack"];
if (EquInfo.rawin("fire attack")) FireAttack = EquInfo["fire attack"];
//三攻
if (EquInfo.rawin("equipment physical attack")) EquipmentPhysicalAttack = EquInfo["equipment physical attack"];
else EquipmentPhysicalAttack = [0, 0];
if (EquInfo.rawin("equipment magical attack")) EquipmentMagicalAttack = EquInfo["equipment magical attack"];
else EquipmentMagicalAttack = [0, 0];
if (EquInfo.rawin("separate attack")) SeparateAttack = EquInfo["separate attack"];
else SeparateAttack = [0, 0];
//物理防御和魔法防御
if (EquInfo.rawin("equipment physical defense")) EquipmentPhysicalDefense = EquInfo["equipment physical defense"];
else EquipmentPhysicalDefense = [0, 0];
if (EquInfo.rawin("equipment magical defense")) EquipmentMagicalDefense = EquInfo["equipment magical defense"];
else EquipmentMagicalDefense = [0, 0];
//三速
if (EquInfo.rawin("attack speed")) AttackSpeed = EquInfo["attack speed"];
if (EquInfo.rawin("cast speed")) CastSpeed = EquInfo["cast speed"];
if (EquInfo.rawin("move speed")) MoveSpeed = EquInfo["move speed"];
//双暴
if (EquInfo.rawin("physical critical hit")) PhysicalCriticalHit = EquInfo["physical critical hit"];
if (EquInfo.rawin("magical critical hit")) MagicalCriticalHit = EquInfo["magical critical hit"];
//命中率
if (EquInfo.rawin("stuck")) Stuck = -EquInfo["stuck"];
//四属抗
if (EquInfo.rawin("dark resistance")) DarkResistance = EquInfo["dark resistance"];
if (EquInfo.rawin("light resistance")) LightResistance = EquInfo["light resistance"];
if (EquInfo.rawin("water resistance")) WaterResistance = EquInfo["water resistance"];
if (EquInfo.rawin("fire resistance")) FireResistance = EquInfo["fire resistance"];
//属性攻击
if (EquInfo.rawin("elemental property")) ElementalProperty = EquInfo["elemental property"];
//描述 //描述
if (EquInfo.rawin("flavor text")) FlavorText = EquInfo["flavor text"]; if (EquInfo.rawin("flavor text")) FlavorText = EquInfo["flavor text"];
//隐藏图层
if (EquInfo.rawin("hide_layer")) HideLayer = EquInfo["hide_layer"];
//拓展Ani路径
if (EquInfo.rawin("expand_path")) ExpandPath = EquInfo["expand_path"];
//属性
Attr = Attribute(EquInfo);
} else error("没有对应的装备信息"); } else error("没有对应的装备信息");
} }
@ -655,19 +558,27 @@ class GameItem.Equipment extends GameItem.Item {
SlotType = AType; SlotType = AType;
Type = BType; Type = BType;
} }
//获取真实装备类型 //获取真实装备类型
function GetRealEquipmentType(EType) { function GetRealEquipmentType(EType) {
if (EType == "skin avatar") SetRealEquipmentType("skin", "avatar"); //时装
else if (EType == "weapon") SetRealEquipmentType("weapon", "equipment"); if (EType == "weapon avatar") SetRealEquipmentType("weapon_avatar", "avatar");
else if (EType == "hat avatar") SetRealEquipmentType("hat", "avatar"); else if (EType == "aurora avatar") SetRealEquipmentType("aurora_avatar", "avatar");
else if (EType == "hair avatar") SetRealEquipmentType("hair", "avatar"); else if (EType == "hair avatar") SetRealEquipmentType("hair_avatar", "avatar");
else if (EType == "coat avatar") SetRealEquipmentType("coat", "avatar"); else if (EType == "hat avatar") SetRealEquipmentType("hat_avatar", "avatar");
else if (EType == "pants avatar") SetRealEquipmentType("pants", "avatar"); else if (EType == "face avatar") SetRealEquipmentType("face_avatar", "avatar")
else if (EType == "waist avatar") SetRealEquipmentType("waist", "avatar"); else if (EType == "breast avatar") SetRealEquipmentType("breast_avatar", "avatar")
else if (EType == "shoes avatar") SetRealEquipmentType("shoes", "avatar"); else if (EType == "coat avatar") SetRealEquipmentType("coat_avatar", "avatar")
else if (EType == "breast avatar") SetRealEquipmentType("breast", "avatar"); else if (EType == "skin avatar") SetRealEquipmentType("skin_avatar", "avatar")
else if (EType == "face avatar") SetRealEquipmentType("face", "avatar"); else if (EType == "waist avatar") SetRealEquipmentType("waist_avatar", "avatar")
else if (EType == "aurora avatar") SetRealEquipmentType("aurora", "aurora"); else if (EType == "pants avatar") SetRealEquipmentType("pants_avatar", "avatar")
else if (EType == "shoes avatar") SetRealEquipmentType("shoes_avatar", "avatar");
//称号和魔法石
else if (EType == "title name") SetRealEquipmentType("title_name", "equipment");
else if (EType == "magic stone") SetRealEquipmentType("magic_stone", "equipment");
//普通装备
else SetRealEquipmentType(EType, "equipment");
} }
//穿戴装备回调 //穿戴装备回调

View File

@ -11,6 +11,9 @@ class GameItem.Item {
return "Item"; return "Item";
} }
//在背包中的格子位置
PosInKnapsack = -1;
//获取信息窗口 //获取信息窗口
function GetInfoWindow() { function GetInfoWindow() {
@ -33,5 +36,102 @@ class GameItem.Item {
error("GameItem::Icon:: 未知物品类型"); error("GameItem::Icon:: 未知物品类型");
} }
//public::
//通过ID构造物品
function ConstructionItemById(Idx) {
if (AssetManager.EquipmentList.rawin(Idx)) {
return GameItem.Equipment(Idx);
} else if (AssetManager.StackableList.rawin(Idx)) {
return GameItem.Stackable(Idx);
} else {
error("没有这个道具编号: " + Idx);
}
}
//通过包构造物品
function ConstructionItemByPacket(Pack) {
local Ret = {};
local Type = Pack.Get_Byte();
Ret.Pos <- Pack.Get_Short();
//装备类型
if (Type == 1) {
local EquInfo = {
//装备ID
EquipId = Pack.Get_Int(),
//交易类型
EquipTradeType = Pack.Get_Byte(),
//装备附魔编号
EquipEnchant = Pack.Get_Int(),
//装备强化等级或增幅等级
EquipUpgrade = Pack.Get_Byte(),
//装备锻造
EquipSeparate = Pack.Get_Byte(),
//装备增幅属性 0 无 1 力量 2 智力 3 体力 4 精神
EquipIncrease = Pack.Get_Byte(),
//装备力量百分比
EquipPowerPercentage = Pack.Get_Byte(),
//装备智力百分比
EquipIntellectPercentage = Pack.Get_Byte(),
//装备体力百分比
EquipStaminaPercentage = Pack.Get_Byte(),
//装备精神百分比
EquipSpiritPercentage = Pack.Get_Byte(),
//装备物理攻击百分比
EquipPhysicalAttackPercentage = Pack.Get_Byte(),
//装备魔法攻击百分比
EquipMagicAttackPercentage = Pack.Get_Byte(),
//装备独立攻击百分比
EquipIndependentAttackPercentage = Pack.Get_Byte(),
//装备物理防御百分比
EquipPhysicalDefensePercentage = Pack.Get_Byte(),
//装备魔法防御百分比
EquipMagicDefensePercentage = Pack.Get_Byte(),
//装备全属强
EquipAllElementalAttack = Pack.Get_Byte(),
//装备水属强
EquipWaterAttack = Pack.Get_Byte(),
//装备火属强
EquipFireAttack = Pack.Get_Byte(),
//装备光属强
EquipLightAttack = Pack.Get_Byte(),
//装备暗属强
EquipDarkAttack = Pack.Get_Byte(),
//装备品质
EquipPercentage = Pack.Get_Byte(),
//装备再封装次数
EquipWrapCount = Pack.Get_Byte(),
//装备是否封装
EquipIsWrap = Pack.Get_Byte(),
//耐久度
EquipDurability = Pack.Get_Byte(),
}
Ret.Item <- GameItem.Equipment(EquInfo);
}
//消耗品类型
else if (Type == 2 || Type == 3) {
local ItemInfo = {
//道具ID
ItemId = Pack.Get_Int(),
//交易类型
ItemTradeType = Pack.Get_Byte(),
//道具数量
ItemCount = Pack.Get_Int(),
}
Ret.Item <- GameItem.Stackable(ItemInfo);
}
//时装类型
else if (Type == 4) {
local ItemInfo = {
//道具ID
ItemId = Pack.Get_Int(),
//交易类型
ItemTradeType = Pack.Get_Byte(),
//道具数量
ItemCount = Pack.Get_Int(),
}
Ret.Item <- GameItem.Equipment(ItemInfo.ItemId);
}
Ret.Item.PosInKnapsack = Ret.Pos;
return Ret;
}
} }

View File

@ -0,0 +1,325 @@
/*
文件名:Skill.nut
路径:User/Asset/Item/Skill.nut
创建日期:2025-02-17 17:05
文件用途:技能文件
*/
//技能图标窗口
class GameItem.SkillIcon extends CL_CanvasObject {
constructor(Skill, Flag) {
base.constructor();
ResizeAndClear(32, 32);
BeginDraw();
//构造图标 及图标边框
if (Skill.Icon) {
//图标
local Icon = CL_SpriteFrameObject(Skill.Icon.path, Flag ? Skill.Icon.index : Skill.Icon.index + 1);
DrawSpriteFrame(Icon, 0, 0);
//边框
local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62);
DrawSpriteFrame(IconFrame, 0, 0);
}
EndDraw();
}
}
//技能信息窗口
class GameItem.SkillInfo extends Yosin_Window {
//技能
Skill = null;
//画布
Canvas = null;
//画布实际高度
RealCanvasWidth = 257;
RealCanvasHeight = 0;
constructor(gSkill) {
this.Skill = gSkill.weakref();
base.constructor(clock() + "SkillInfo" + Skill.Name, 0, 0, 0, 0, 0);
Init();
local background = Yosin_NineBoxStretch(RealCanvasWidth, RealCanvasHeight + 10, "sprite/interface/lenheartwindowcommon.img", 213);
background.SetZOrder(-1);
Addchild(background);
}
function Init() {
Canvas = CL_CanvasObject();
Canvas.ResizeAndClear(RealCanvasWidth, 600);
Canvas.SetFillBrush(sq_RGBA(59, 56, 57, 250));
Canvas.SetStrokeBrush(sq_RGBA(59, 56, 57, 250));
Canvas.BeginDraw();
local GradeColor = sq_RGBA(194, 161, 56, 250);
if (Skill.Grade == 1) GradeColor = sq_RGBA(254, 181, 0, 250);
else if (Skill.Grade == 2) GradeColor = sq_RGBA(255, 119, 1, 250);
//绘制技能名字
local SkillName = FontAssetManager.GenerateNormal(Skill.Name + " Lv " + (Skill.Level + Skill.AddLevel), true, {
color = GradeColor
});
Canvas.DrawActor(SkillName, 5, 7);
RealCanvasHeight += SkillName.GetSize().h;
//绘制技能名字2
local SkillName2 = FontAssetManager.GenerateNormal(Skill.Name2, true, {
color = GradeColor
});
Canvas.DrawActor(SkillName2, 5, 22);
RealCanvasHeight += SkillName2.GetSize().h;
//绘制分割线
AddSliceLine();
//绘制技能等级
local SkillLevel = FontAssetManager.GenerateNormal("技能等级 : " + Skill.Level + Skill.AddLevel, true, {
color = sq_RGBA(135, 119, 80, 250)
});
Canvas.DrawActor(SkillLevel, 5, RealCanvasHeight);
//消耗魔法值
local CostText = typeof Skill.DungeonSkillData.consume_mp == "array" ? Skill.DungeonSkillData.consume_mp[0] : Skill.DungeonSkillData.consume_mp;
local SkillCost = FontAssetManager.GenerateNormal("魔法值 : " + CostText, true, {
color = sq_RGBA(82, 206, 254, 250)
});
Canvas.DrawActor(SkillCost, RealCanvasWidth - SkillCost.GetSize().w - 7, RealCanvasHeight);
RealCanvasHeight += SkillLevel.GetSize().h - 2;
//释放时间
local ReleaseTimeText = Skill.DungeonSkillData.rawin("casting_time") ? Skill.DungeonSkillData.casting_time.tofloat() / 1000.0 + " 秒" : "瞬发";
local ReleaseTime = FontAssetManager.GenerateNormal("释放时间 : " + ReleaseTimeText, true, {
color = sq_RGBA(133, 121, 78, 250)
});
Canvas.DrawActor(ReleaseTime, 5, RealCanvasHeight);
local ConsumeYpos = RealCanvasHeight;
RealCanvasHeight += ReleaseTime.GetSize().h - 2;
//操作指令
local Command = FontAssetManager.GenerateNormal(Skill.CommandExplain, true, {
color = sq_RGBA(133, 121, 78, 250)
});
Canvas.DrawActor(Command, 5, RealCanvasHeight);
RealCanvasHeight += Command.GetSize().h - 2;
//技能消耗道具
if (Skill.ConsumeItemId) {
local ConsumeItemCountText = typeof Skill.ConsumeItemCount == "array" ? Skill.ConsumeItemCount[0] : Skill.ConsumeItemCount;
local ConsumeItemCount = FontAssetManager.GenerateNormal("x" + ConsumeItemCountText, true, {
color = sq_RGBA(133, 121, 78, 250)
});
local XposOffset = RealCanvasWidth - ConsumeItemCount.GetSize().w - 6;
Canvas.DrawActor(ConsumeItemCount, XposOffset, ConsumeYpos + 16);
local ConsumeItemIcon = GameItem.Stackable(Skill.ConsumeItemId).GetIconSprite();
Canvas.DrawSprite(ConsumeItemIcon, XposOffset - ConsumeItemIcon.GetSize().w, ConsumeYpos + 6);
}
//冷却时间
local CoolDownText = Skill.DungeonSkillData.rawin("cooltime") ? (typeof Skill.DungeonSkillData.cooltime == "array" ? Skill.DungeonSkillData.cooltime[0].tofloat() / 1000.0 : Skill.DungeonSkillData.cooltime) + " 秒" : "无";
local CoolDown = FontAssetManager.GenerateNormal("冷却时间 : " + CoolDownText, true, {
color = sq_RGBA(103, 214, 236, 250)
});
Canvas.DrawActor(CoolDown, 5, RealCanvasHeight);
RealCanvasHeight += CoolDown.GetSize().h - 2;
//绘制分割线
AddSliceLine();
//技能属性
if (Skill.Property) {
local SkillPropertyArrCount = Skill.Property.data.len() / 3;
//这里直接组装调用格式化的参数
local SkillPropertyTextCallList = [this, Skill.Property.explain];
for (local i = 0; i< SkillPropertyArrCount; i++) {
local ReadType = Skill.Property.data[i * 3];
if (ReadType< 0) {
//固定伤害
if (ReadType == -2) {
SkillPropertyTextCallList.push(Skill.GetLevelData(Skill.Property.data[i * 3 + 1]) * (ClientCharacter ? ClientCharacter.Attr.SeparateAttack : 1) * (Skill.Property.data[i * 3 + 2]));
}
//百分比伤害
else {
SkillPropertyTextCallList.push(Skill.GetLevelData(Skill.Property.data[i * 3 + 1]) * (Skill.Property.data[i * 3 + 2]));
}
} else {
//静态数据
SkillPropertyTextCallList.push(Skill.GetStaticData(Skill.Property.data[i * 3 + 1]) * (Skill.Property.data[i * 3 + 2]));
}
}
local SkillProperty = FontAssetManager.GenerateNormal(format.acall(SkillPropertyTextCallList) true, {
color = sq_RGBA(133, 121, 78, 250)
});
Canvas.DrawActor(SkillProperty, 5, RealCanvasHeight);
RealCanvasHeight += SkillProperty.GetSize().h - 2;
//绘制分割线
AddSliceLine();
//描述
local SkillDescription = FontAssetManager.GenerateNormal(Skill.Explain, true, {
color = sq_RGBA(133, 121, 78, 250),
wrap_width = RealCanvasWidth - 8,
});
Canvas.DrawActor(SkillDescription, 5, RealCanvasHeight);
RealCanvasHeight += SkillDescription.GetSize().h - 2;
}
Canvas.EndDraw();
Addchild(Canvas);
}
//增加分割行
function AddSliceLine() {
RealCanvasHeight += 9;
Canvas.DrawLine(3, RealCanvasHeight, RealCanvasWidth - 4, RealCanvasHeight);
RealCanvasHeight += 1;
}
}
class GameItem.Skill {
//技能ID
Idx = -1;
//技能名称
Name = "无名称";
//技能名称2
Name2 = "无名称";
//最低学习等级
RequiredLevel = 1;
//学习等级间隔
RequiredLevelRange = 1;
//技能品阶
Grade = 0;
//技能类型
Type = 0;
//最大等级
MaxLevel = 1;
//图标
Icon = null;
//技能可学习职业
FitnessGrowType = null;
//简易技能描述
BasicExplain = null;
//技能描述
Explain = null;
//地下城技能数据
DungeonSkillData = null;
//操作指令描述
CommandExplain = null;
//操作指令
Command = null;
//当前等级
Level = 1;
//加成等级
AddLevel = 0;
//技能消耗道具
ConsumeItemId = null;
ConsumeItemCount = null;
//技能属性
Property = null;
function _typeof() {
return "Skill";
}
constructor(...) {
DungeonSkillData = {};
//直接裸构造
if (vargv.len() == 0) {
}
//通过参数构造
else if (vargv.len() == 2) {
local SkillInfo;
//通过ID构造
if (typeof vargv[0] == "integer") {
SkillInfo = AssetManager.GetSkill(vargv[0], vargv[1]);
Idx = vargv[1];
ConstructSkillFromScript(SkillInfo);
}
//通过Table来构造
else if (typeof vargv[0] == "table") {
}
}
}
//通过脚本构造
function ConstructSkillFromScript(SkillInfo) {
//如果获取到对应的技能脚本信息
if (SkillInfo) {
//名称
if (SkillInfo.rawin("name")) Name = strip(SkillInfo["name"]);
//名称2
if (SkillInfo.rawin("name2")) Name2 = strip(SkillInfo["name2"]);
//最低学习等级
if (SkillInfo.rawin("required level")) RequiredLevel = SkillInfo["required level"];
//技能学习间隔
if (SkillInfo.rawin("required level range")) RequiredLevelRange = SkillInfo["required level range"];
//技能品阶
if (SkillInfo.rawin("skill fitness second growtype")) Grade = SkillInfo["skill fitness second growtype"];
//技能类型
if (SkillInfo.rawin("type")) Type = SkillInfo["type"];
//最大等级
if (SkillInfo.rawin("maximum level")) MaxLevel = SkillInfo["maximum level"];
//图标
if (SkillInfo.rawin("icon")) Icon = SkillInfo["icon"];
//技能可学习职业
if (SkillInfo.rawin("skill_fitness_growtype")) FitnessGrowType = SkillInfo["skill_fitness_growtype"];
//简易技能描述
if (SkillInfo.rawin("basic explain")) BasicExplain = SkillInfo["basic explain"];
//技能描述
if (SkillInfo.rawin("explain")) Explain = SkillInfo["explain"];
//地下城技能数据
if (SkillInfo.rawin("dungeon_data")) DungeonSkillData = SkillInfo["dungeon_data"];
//操作指令描述
if (SkillInfo.rawin("command key explain")) CommandExplain = SkillInfo["command key explain"];
//操作指令
if (SkillInfo.rawin("command")) Command = SkillInfo["command"];
//技能消耗道具
if (SkillInfo.rawin("consume_item")) {
ConsumeItemId = SkillInfo["consume_item"][0];
ConsumeItemCount = [SkillInfo["consume_item"][1], SkillInfo["consume_item"][2]]
}
//技能属性
if (SkillInfo.rawin("level_property")) Property = SkillInfo["level_property"];
} else error("没有对应的技能信息");
}
//获取对应等级的动态数据
function GetLevelData(Index, gLevel = -1) {
if (gLevel == -1) gLevel = this.Level - 1;
if (DungeonSkillData.rawin("level_info")) {
if (DungeonSkillData.level_info.len() > gLevel) {
return DungeonSkillData["level_info"][gLevel][Index];
}
}
return 0;
}
//获取技能的静态数据
function GetStaticData(Index) {
if (DungeonSkillData.rawin("static_data")) {
if (DungeonSkillData.static_data.len() > Index) {
return DungeonSkillData["static_data"][Index];
}
}
return 0;
}
//获取技能图标
function GetIconSprite(Flag = true) {
return GameItem.SkillIcon(this, Flag);
}
//获取信息窗口
function GetInfoWindow() {
return GameItem.SkillInfo(this);
}
}

View File

@ -18,7 +18,7 @@ class GameItem.StackableIcon extends CL_CanvasObject {
DrawSpriteFrame(Icon, 0, 0); DrawSpriteFrame(Icon, 0, 0);
//边框 //边框
local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + GameItem.EquipmentInfoTag.rarityframe_color_idx[Stackable.Rarity]); local IconFrame = CL_SpriteFrameObject("sprite/item/iconmark.img", 62 + AssetManager.EtcConfig.ItemInfoTag.rarityframe_color_idx[Stackable.Rarity]);
DrawSpriteFrame(IconFrame, 0, 0); DrawSpriteFrame(IconFrame, 0, 0);
//数量 //数量
@ -68,7 +68,7 @@ class GameItem.StackableInfo extends Yosin_Window {
if (Stackable.Name.len() > 0) { if (Stackable.Name.len() > 0) {
local DrawName = Stackable.Name; local DrawName = Stackable.Name;
local EquName = FontAssetManager.GenerateNormal(DrawName, false, { local EquName = FontAssetManager.GenerateNormal(DrawName, false, {
color = GameItem.EquipmentInfoTag.rarity_color[Stackable.Rarity] color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Stackable.Rarity]
}); });
Canvas.DrawActor(EquName, 41, 7); Canvas.DrawActor(EquName, 41, 7);
} }
@ -78,14 +78,14 @@ class GameItem.StackableInfo extends Yosin_Window {
//绘制稀有度名称 //绘制稀有度名称
local RarityTagName = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.rarity_name_tag[Stackable.Rarity], false, { local RarityTagName = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.rarity_name_tag[Stackable.Rarity], false, {
color = GameItem.EquipmentInfoTag.rarity_color[Stackable.Rarity] color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Stackable.Rarity]
}); });
Canvas.DrawActor(RarityTagName, 210 - RarityTagName.GetSize().w - 6, 41); Canvas.DrawActor(RarityTagName, 210 - RarityTagName.GetSize().w - 6, 41);
//绘制类型 //绘制类型
local RealGroupName = Stackable.GroupName ? Stackable.GroupName : "cube stuff"; local RealGroupName = Stackable.GroupName ? Stackable.GroupName : "cube stuff";
local GroupNameText = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.item_group_name_table[RealGroupName], false, { local GroupNameText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.item_group_name_table[RealGroupName], false, {
color = sq_RGBA(194, 161, 56, 255) color = sq_RGBA(194, 161, 56, 255)
}); });
Canvas.DrawActor(GroupNameText, 6, 41); Canvas.DrawActor(GroupNameText, 6, 41);
@ -97,8 +97,8 @@ class GameItem.StackableInfo extends Yosin_Window {
//绘制交易类型 如果有主体属性读取 否则一律为封装 //绘制交易类型 如果有主体属性读取 否则一律为封装
local TradeType = Stackable.TradeType; local TradeType = Stackable.TradeType;
local TradeTypeText = FontAssetManager.GenerateNormal(GameItem.EquipmentInfoTag.trade_type_text[TradeType], false, { local TradeTypeText = FontAssetManager.GenerateNormal(AssetManager.EtcConfig.ItemInfoTag.trade_type_text[TradeType], false, {
color = GameItem.EquipmentInfoTag.trade_type_color[TradeType] color = AssetManager.EtcConfig.ItemInfoTag.trade_type_color[TradeType]
}); });
Canvas.DrawActor(TradeTypeText, 6, 60); Canvas.DrawActor(TradeTypeText, 6, 60);
@ -213,7 +213,7 @@ class GameItem.Stackable extends GameItem.Item {
//如果获取到对应的消耗品脚本信息 //如果获取到对应的消耗品脚本信息
if (StkInfo) { if (StkInfo) {
//名称 //名称
if (StkInfo.rawin("name")) Name = StkInfo["name"]; if (StkInfo.rawin("name")) Name = strip(StkInfo["name"]);
//类型 //类型
// if (StkInfo.rawin("type")) GetRealStackableType(StkInfo["type"].path); // if (StkInfo.rawin("type")) GetRealStackableType(StkInfo["type"].path);
//最低使用等级 //最低使用等级
@ -249,16 +249,3 @@ class GameItem.Stackable extends GameItem.Item {
TradeType = Info.ItemTradeType; TradeType = Info.ItemTradeType;
} }
} }
if (!getroottable().rawin("chongzaiflag")) {
getroottable()["chongzaiflag"] <- true;
} else {
//遍历窗口队列 如果可见则调用Show
for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
local Window = _SYS_WINDOW_LIST_[i];
Window.Visible = false;
Window.RemoveSelf();
}
TestStage();
}

View File

@ -28,6 +28,20 @@ class _GameController_ extends _Input_ {
foreach(Key, Value in getconsttable().CONTROLLER) { foreach(Key, Value in getconsttable().CONTROLLER) {
this.GameKeyCode.rawset(Key, Value); this.GameKeyCode.rawset(Key, Value);
} }
//注册Esc按钮对所有游戏窗口的操作
RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_MENU_SYSTEM__CLOSE_ALL_WINDOW, function(Flag) {
//按下的时候
if (Flag == 1) {
//遍历窗口队列 如果可见则调用Show
for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
local Window = _SYS_WINDOW_LIST_[i];
if (typeof Window == "Game_Window") {
Window.OnEsc();
}
}
}
});
} }
//系统对游戏的输入 //系统对游戏的输入
function SystemInput(Code, Type) { function SystemInput(Code, Type) {

View File

@ -22,6 +22,8 @@ class GameObject.ActiveObject extends GameObject.BaseClass {
Layer = null; Layer = null;
//状态机 //状态机
StateMachine = null; StateMachine = null;
//属性包
Attr = null;
//状态信息包 //状态信息包
StateVar = null; StateVar = null;
//受击框 //受击框
@ -64,6 +66,12 @@ class GameObject.ActiveObject extends GameObject.BaseClass {
StateVar = {}; StateVar = {};
} }
//初始化属性包
function InitAttr() {
//属性包初始化
Attr = Attribute(this);
}
//设置Ani //设置Ani
function SetAnimation(Ani) { function SetAnimation(Ani) {
//如果已经有Ani了 //如果已经有Ani了

View File

@ -6,50 +6,88 @@
*/ */
class GameObject.Character extends GameObject.ActiveObject { class GameObject.Character extends GameObject.ActiveObject {
hair = null; //头部 //时装
hat = null; //帽子 weapon_avatar = null; //武器装扮
face = null; //脸部 aurora_avatar = null; //光环装扮
breast = null; //胸部 hair_avatar = null; //头部装扮
hat_avatar = null; //帽子装扮
face_avatar = null; //脸部装扮
breast_avatar = null; //胸部装扮
coat_avatar = null; //上衣装扮
skin_avatar = null; //皮肤装扮
waist_avatar = null; //腰部装扮
pants_avatar = null; //下装装扮
shoes_avatar = null; //鞋子装扮
//装备
shoulder = null; //护肩
coat = null; //上衣 coat = null; //上衣
skin = null; //皮肤
waist = null; //腰部
pants = null; //下装 pants = null; //下装
waist = null; //腰部
shoes = null; //鞋子 shoes = null; //鞋子
weapon = null; //武器 weapon = null; //武器
aurora = null; //光环 wrist = null; //手镯
amulet = null; //项链
ring = null; //戒指
title_name = null; //称号
support = null; //辅助装备
magic_stone = null; //魔法石
earring = null; //耳环
//装备
Equip = null;
//动画对象管理器 //动画对象管理器
AnimationManager = null; AnimationManager = null;
//附加项管理器
AdditionalItemsManager = null;
//传送阵Flag //传送阵Flag
TransmitFlag = false; TransmitFlag = false;
//属性对象
Attribute = null;
//名字 //名字
Name = "无名字"; Name = "无名字";
//职业编号 //职业编号
Job = 0; Job = 0;
//转职职业
GrowJob = 0;
//cid //cid
Cid = -1; Cid = -1;
//等级
Level = 60;
//技能点
SkillPoint = 0;
//经验值
Exp = 0;
//疲劳值
Fatigue = 0;
//控制器 //控制器
Controller = null; Controller = null;
//当前生命值
HP = 0;
//当前魔法值
MP = 0;
function _typeof() { function _typeof() {
return "character"; return "Game_Character";
} }
function Init(Idx) { function Init(Idx) {
//初始化装备
Equip = {};
//初始化动画组 //初始化动画组
CurrentAni = []; CurrentAni = [];
//设置职业编号 //设置职业编号
this.Job = Idx; this.Job = Idx;
//获取角色职业信息 //获取角色职业信息
Info = sq_DeepCopy(AssetManager.CharacterInfoList[Idx]); // Info = sq_DeepCopy(AssetManager.CharacterInfoList[Idx]);
Info = AssetManager.CharacterInfoList[Idx];
base.Init(Info); base.Init(Info);
//构造角色动画对象 //构造角色动画对象
@ -57,12 +95,16 @@ class GameObject.Character extends GameObject.ActiveObject {
Addchild(AnimationManager); Addchild(AnimationManager);
AnimationManager.Init(); AnimationManager.Init();
//构造附加项
AdditionalItemsManager = Character_AdditionalItems();
Addchild(AdditionalItemsManager);
AdditionalItemsManager.Init();
foreach(EquId in Info.default_avatar) { foreach(EquId in Info.default_avatar) {
local EquObj = GameItem.Equipment(EquId); local EquObj = GameItem.Equipment(EquId);
ChangeEquipment(EquObj); ChangeEquipment(EquObj);
} }
//构造属性对象
// Attribute = AttributeClass();
} }
@ -101,35 +143,84 @@ class GameObject.Character extends GameObject.ActiveObject {
} }
} }
// function OnUpdate(dt) { //构造临时Ani
// //原始逻辑 function CreateTempAni(AniName) {
// base.OnUpdate(dt); //如果存在动画管理器则设置
// } if (AnimationManager) return AnimationManager.CreateTempAni(AniName);
}
//override
//设置Ani //设置Ani
function SetAnimation(Ani) { function SetAnimation(Ani) {
//如果存在动画管理器则设置 //如果存在动画管理器则设置
if (AnimationManager) AnimationManager.SetAnimation(Ani); if (AnimationManager) AnimationManager.SetAnimation(Ani);
} }
//切换装备 //读取全身装备的角色真实属性
function ChangeEquipment(Equ) { function ReadFullEquipAttr() {
foreach(Index, EquipObj in Equip) {
this.Attr += EquipObj.Attr;
}
//城镇里给安排满血
if (typeof Parent == "townmap") {
this.HP = this.Attr.HPMax;
this.MP = this.Attr.MPMax;
}
}
//脱下装备
function UnWearEquipment(Equ) {
//脱下装备 如果原来的装备槽位置是空的 这里将会是null 不处理后续逻辑
if (!Equ) return;
//如果当前装备槽已经有装备则移除 //如果当前装备槽已经有装备则移除
if (this[Equ.SlotType]) { if (this[Equ.SlotType]) {
//先保存一下原装备的槽类型
local ST = Equ.SlotType;
this[Equ.SlotType].OnWearEnd(); this[Equ.SlotType].OnWearEnd();
this[Equ.SlotType] = null; this[Equ.SlotType] = null;
//这里做判断 如果槽位类型模型有模型的话 要替换成默认的
if (AnimationManager.Default_Avatar.rawin(ST)) {
this[ST] = AnimationManager.Default_Avatar[ST];
} }
}
//如果是武器或者时装则同步动画
if (Equ.SlotType == "weapon" || Equ.Type == "avatar") {
//变更时装
AnimationManager.Init(Equ.SlotType);
//处理时装的隐藏图层
AnimationManager.HandlingHideLayers();
} //光环同步光环动画
else if (Equ.Type == "aurora") {
AdditionalItemsManager.InitAuroa();
}
}
//穿戴装备
function WearEquipment(Equ) {
//将装备对象赋值给对应装备槽 //将装备对象赋值给对应装备槽
this[Equ.SlotType] = Equ; this[Equ.SlotType] = Equ;
this[Equ.SlotType].OnWearStart(); this[Equ.SlotType].OnWearStart();
//如果是武器或者时装则同步动画 //如果是武器或者时装则同步动画
if (Equ.SlotType == "weapon" || Equ.Type == "avatar") { if (Equ.SlotType == "weapon" || Equ.Type == "avatar") {
//变更时装
AnimationManager.Init(Equ.SlotType); AnimationManager.Init(Equ.SlotType);
} else if (Equ.Type == "aurora") { //处理时装的隐藏图层
AnimationManager.InitAuroa(); AnimationManager.HandlingHideLayers();
} }
//光环同步光环动画
else if (Equ.Type == "aurora") {
AdditionalItemsManager.InitAuroa();
}
}
//切换装备
function ChangeEquipment(Equ) {
//如果当前装备槽已经有装备则移除
UnWearEquipment(Equ);
//将装备对象赋值给对应装备槽
WearEquipment(Equ);
} }
//切换装备列表 //切换装备列表
function ChangeEquipmentList(EquList) { function ChangeEquipmentList(EquList) {
@ -141,10 +232,15 @@ class GameObject.Character extends GameObject.ActiveObject {
//设置名字 //设置名字
function SetName(Name) { function SetName(Name) {
this.Name = Name; this.Name = Name;
AnimationManager.SetName(Name); AdditionalItemsManager.SetName(Name);
base.SetName(Name); base.SetName(Name);
} }
//设置聊天气泡
function SetChatBubble(Chat) {
AdditionalItemsManager.SetChatBubble(Chat);
}
//是否为客户端玩家 //是否为客户端玩家
function IsClientPlayer() { function IsClientPlayer() {
if (ClientCharacter && this.Cid == ClientCharacter.Cid) if (ClientCharacter && this.Cid == ClientCharacter.Cid)
@ -152,6 +248,14 @@ class GameObject.Character extends GameObject.ActiveObject {
return false; return false;
} }
//获取经验值
function GetExp() {
return {
current = this.Exp,
max = AssetManager.CharacterExptable[this.Level]
};
}
//移动速度 //移动速度
Move_Speed = 500; Move_Speed = 500;
//移动Flag //移动Flag
@ -214,8 +318,6 @@ class GameObject.Character extends GameObject.ActiveObject {
} }
} }
//更新 //更新
function OnUpdate(Dt) { function OnUpdate(Dt) {
base.OnUpdate(Dt); base.OnUpdate(Dt);
@ -224,6 +326,25 @@ class GameObject.Character extends GameObject.ActiveObject {
//移动逻辑更新 //移动逻辑更新
MoveLogic(Dt); MoveLogic(Dt);
} }
//ovverride ::
//设置方向
function SetDirection(D) {
base.SetDirection(D);
AnimationManager.SetDirection(D);
// //这里要改变名字和聊天框的朝向 免得反向
// if (D) {
// if (AnimationManager.Name) AnimationManager.Name.SetScale(1, 1);
// if (AnimationManager.ChatBubble) AnimationManager.ChatBubble.SetScale(1, 1);
// } else {
// if (AnimationManager.Name) AnimationManager.Name.SetScale(-1, 1);
// if (AnimationManager.ChatBubble) AnimationManager.ChatBubble.SetScale(-1, 1);
// }
}
} }
//通过职业和装备列表来构造一个角色 //通过职业和装备列表来构造一个角色
@ -251,7 +372,7 @@ GameObject.GetCharacterByCid <- function(cid) {
//遍历所有角色 //遍历所有角色
foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { foreach(obj in GlobalTownManager.CurrentMap.PlayerList) {
//角色对象 //角色对象
if (typeof obj == "character" && obj.Cid == cid) { if (typeof obj == "Game_Character" && obj.Cid == cid) {
return obj; return obj;
} }
} }

View File

@ -26,8 +26,6 @@ class GameObject.AICharacter extends GameObject.Character {
//根据职业构造基础角色 注意这一步会直接重新赋值Info //根据职业构造基础角色 注意这一步会直接重新赋值Info
base.Init(Job); base.Init(Job);
//加载脚本属性
Attribute.Init(ScriptInfo.Attributes, this);
} }
//重载装备 //重载装备
@ -65,8 +63,6 @@ class GameObject.AICharacter extends GameObject.Character {
//如果有APC的Proc脚本则调用 //如果有APC的Proc脚本则调用
if (getroottable().AiCharacterObjectFunction.rawin("AiCharacterObject_Proc_" + Id)) if (getroottable().AiCharacterObjectFunction.rawin("AiCharacterObject_Proc_" + Id))
getroottable().AiCharacterObjectFunction["AiCharacterObject_Proc_" + Id](this, dt); getroottable().AiCharacterObjectFunction["AiCharacterObject_Proc_" + Id](this, dt);
//属性更新
if (Attribute) Attribute.Proc(this, dt);
base.OnUpdate(dt); base.OnUpdate(dt);
} }

View File

@ -10,9 +10,6 @@ class GameObject.Monster extends GameObject.ActiveObject {
//怪物Id //怪物Id
Id = null; Id = null;
//属性表
Attribute = null;
function Init(Idx) { function Init(Idx) {
Id = Idx; Id = Idx;
@ -20,11 +17,6 @@ class GameObject.Monster extends GameObject.ActiveObject {
base.Init(Info); base.Init(Info);
//构造属性对象
Attribute = AttributeClass();
//加载脚本属性
Attribute.Init(Info.Attributes, this);
//如果存在Atk 初始化所有Atk //如果存在Atk 初始化所有Atk
if ("attackinfo" in Info) { if ("attackinfo" in Info) {
Attackinfo = []; Attackinfo = [];
@ -52,8 +44,6 @@ class GameObject.Monster extends GameObject.ActiveObject {
function OnUpdate(dt) { function OnUpdate(dt) {
//调用怪物Proc状态 //调用怪物Proc状态
getroottable().MonsterObjectFunction["MonsterObject_Proc_" + Id](this, dt); getroottable().MonsterObjectFunction["MonsterObject_Proc_" + Id](this, dt);
//属性更新
if (Attribute) Attribute.Proc(this, dt);
//原始逻辑 //原始逻辑
base.OnUpdate(dt); base.OnUpdate(dt);
} }

View File

@ -23,6 +23,8 @@ class GameObject.NPC extends GameObject.BaseClass {
//是否悬停 //是否悬停
IsHover = false; IsHover = false;
_Mouse_Click_Flag = false;
function _typeof() { function _typeof() {
return "npc"; return "npc";
} }
@ -63,15 +65,30 @@ class GameObject.NPC extends GameObject.BaseClass {
} }
} }
function OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y) { function OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//悬停事件 //悬停事件
if (!IsHover) { if (!IsHover && !WindowInteractiveFlag) {
IsHover = true; IsHover = true;
//设置Ani描边 //设置Ani描边
Ani.SetOutline(true, sq_RGBA(155, 255, 0, 250)); Ani.SetOutline(true, sq_RGBA(155, 255, 0, 250));
//设置鼠标 //设置鼠标
IMouse.ChangeActive(120, 4); IMouse.ChangeActive(120, 4);
} }
if (WindowInteractiveFlag) {
if (IsHover) {
IsHover = false;
Ani.SetOutline(false);
//设置鼠标
IMouse.Change(0);
}
}
//判断点击 在没有悬停在任何窗口的情况下
if (MouseState == 0x201 && !WindowInteractiveFlag) {
_NameSpace_FunctionInteractive._FunctionInteractive.Generator(Id, MousePos_X + 16, MousePos_Y + 16);
return true;
}
} }
function OutMouseLogic() { function OutMouseLogic() {
@ -84,5 +101,14 @@ class GameObject.NPC extends GameObject.BaseClass {
} }
} }
function OnUpdate(Dt) {
// //悬停事件
// if (IsHover) {
// IsHover = false;
// Ani.SetOutline(false);
// //设置鼠标
// IMouse.Change(0);
// }
}
} }

View File

@ -288,7 +288,7 @@ class Map extends Actor {
//添加对象 //添加对象
function AddObject(obj, IsPlayer = false) { function AddObject(obj, IsPlayer = false) {
//角色对象 //角色对象
if (typeof obj == "character") { if (typeof obj == "Game_Character") {
//如果已经处于某个地图中 //如果已经处于某个地图中
if (obj.Parent) { if (obj.Parent) {
obj.Parent.Removechild(obj); obj.Parent.Removechild(obj);
@ -318,7 +318,7 @@ class Map extends Actor {
//玩家列表中移除玩家 //玩家列表中移除玩家
PlayerList.rawdelete(obj.Cid); PlayerList.rawdelete(obj.Cid);
//角色对象 //角色对象
if (typeof obj == "character") { if (typeof obj == "Game_Character") {
//将地图信息写入角色中 //将地图信息写入角色中
obj.MySelfMap = null; obj.MySelfMap = null;
} }
@ -328,7 +328,7 @@ class Map extends Actor {
function RemoveAllCharacterObject() { function RemoveAllCharacterObject() {
foreach(obj in PlayerList) { foreach(obj in PlayerList) {
//角色对象 //角色对象
if (typeof obj == "character") { if (typeof obj == "Game_Character") {
RemoveObject(obj); RemoveObject(obj);
} }
} }
@ -337,7 +337,7 @@ class Map extends Actor {
//移动城镇的添加对象 //移动城镇的添加对象
function AddObjectByChangeTown(obj, pos) { function AddObjectByChangeTown(obj, pos) {
//角色对象 //角色对象
if (typeof obj == "character") { if (typeof obj == "Game_Character") {
//角色原城镇 //角色原城镇
local FromMapobj = obj.MySelfMap; local FromMapobj = obj.MySelfMap;
//清除原城镇里的玩家 //清除原城镇里的玩家
@ -442,7 +442,7 @@ class Map extends Actor {
} }
} }
function OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y) { function OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//判断是人物所在的地图 //判断是人物所在的地图
if (ClientCharacter && this.C_Object == ClientCharacter.MySelfMap.C_Object) { if (ClientCharacter && this.C_Object == ClientCharacter.MySelfMap.C_Object) {
local Arr = []; local Arr = [];
@ -461,7 +461,7 @@ class Map extends Actor {
local Index = Math.PointIsInWhichRectangle(MousePos_X, MousePos_Y, Arr); local Index = Math.PointIsInWhichRectangle(MousePos_X, MousePos_Y, Arr);
//有事件发生的NPC对象 //有事件发生的NPC对象
if (Index != -1) { if (Index != -1) {
return m_data.npc[Index].OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y); return m_data.npc[Index].OnMouseLogic(MouseState, Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
} else { } else {
foreach(Npcobj in m_data.npc) { foreach(Npcobj in m_data.npc) {
Npcobj.OutMouseLogic(); Npcobj.OutMouseLogic();

View File

@ -59,7 +59,7 @@ class BaseObject extends Actor {
Z = vargv[1]; Z = vargv[1];
base.SetPosition(Value, vargv[0] - vargv[1]); base.SetPosition(Value, vargv[0] - vargv[1]);
} }
SetZOrder(Y); SetZOrder(Y.tointeger());
} }
//传入坐标 xyz 的table 或者 单独传 xyz //传入坐标 xyz 的table 或者 单独传 xyz
@ -76,7 +76,7 @@ class BaseObject extends Actor {
Z = vargv[1]; Z = vargv[1];
base.MoveTo(Value, vargv[0] - vargv[1]); base.MoveTo(Value, vargv[0] - vargv[1]);
} }
SetZOrder(Y); SetZOrder(Y.tointeger());
} }
//传入坐标 xyz 的table 或者 单独传 xyz //传入坐标 xyz 的table 或者 单独传 xyz
@ -109,18 +109,13 @@ class BaseObject extends Actor {
} }
Z += vargv[1]; Z += vargv[1];
} }
SetZOrder(Y); SetZOrder(Y.tointeger());
//如果是客户端玩家 则判断移动城镇 //如果是客户端玩家 则判断移动城镇
if (IsClientPlayer()) MySelfMap.CheckMovableAreaTransmit(this, X, Y); if (IsClientPlayer()) MySelfMap.CheckMovableAreaTransmit(this, X, Y);
} }
//设置方向 //设置方向
function SetDirection(D) { function SetDirection(D) {
if (D == DIRECTION.RIGHT) {
SetScale(fabs(GetScale().x), GetScale().y);
} else if (D == DIRECTION.LEFT) {
SetScale(-fabs(GetScale().x), GetScale().y);
}
Direction = D; Direction = D;
} }

View File

@ -10,11 +10,25 @@ function RegisterFunctionalPack() {
// 选择角色进入游戏回包 // 选择角色进入游戏回包
MySocket.RegisterHandler(PACKET_ID.SELECT_CHARACTER_ENTER_GAME_CALLBACK, function(Jso) { MySocket.RegisterHandler(PACKET_ID.SELECT_CHARACTER_ENTER_GAME_CALLBACK, function(Jso) {
local Info = Jso.charac; local Info = Jso.charac;
//构造城镇
local TownObj = Town(Info.town); local TownObj = Town(Info.town);
local Charc = GameObject.CreateCharacter(Info.job, Info.equ, true);
local Charc = GameObject.CreateCharacter(Info.job, [], true);
//构造角色
{
Charc.Cid = Info.cid; Charc.Cid = Info.cid;
Charc.GrowJob = Info.jobEx;
Charc.Level = Info.lv;
Charc.Exp = Info.exp;
Charc.Fatigue = Info.fatigue;
Charc.SkillPoint = Info.sp;
Charc.SetName(Info.name);
Charc.InitAttr(); //初始化角色属性
TownObj.AddObject(Charc, true); TownObj.AddObject(Charc, true);
ClientCharacter = Charc; ClientCharacter = Charc;
}
//以下是角色应当初始化的各项东西 //以下是角色应当初始化的各项东西
{ {
@ -22,46 +36,31 @@ function RegisterFunctionalPack() {
if (ClientCharacterInventory) { if (ClientCharacterInventory) {
ClientCharacterInventory.DestroyWindow(); ClientCharacterInventory.DestroyWindow();
} }
ClientCharacterInventory = _Inventory("背包窗口", 150, 12, 262, 548, 20); ClientCharacterInventory = UISpace_Inventory._Inventory("背包窗口", 634, 20, 262, 548, 20);
//初始化个人信息
if (ClientPersonalInfo) {
ClientPersonalInfo.DestroyWindow();
}
ClientPersonalInfo = UISpace_PersonalInfo._PersonalInfo("个人信息窗口", 150, 35, 286, 530, 20);
//初始化HUD
if (ClientHUD) {
ClientHUD.DestroyWindow();
}
ClientHUD = UISpace_Hud._Hud();
ClientHUD.ResetFocus();
//初始化技能树
if (ClientSkillTreeWindow) {
ClientSkillTreeWindow.DestroyWindow();
}
ClientSkillTreeWindow = UISpace_SkillTree._SkillTree("技能树窗口", 135, 4, 796, 524, 20);
ClientSkillTreeWindow.Init(Charc.Job, Charc.GrowJob);
ClientSkillTreeWindow.ResetFocus();
} }
}); });
/*
InventorySize : int //背包大小
InventoryType : byte //背包类型
InventoryItemCount : short //背包道具数量
ItemInfo : Struct //道具信息 结构体
{
Type : byte //类型
// Type 为 1 装备类型
{
Pos : short //装备位置
EquipId : int //装备ID
EquipEnchant : int //装备附魔编号
EquipUpgrade : byte //装备强化等级或增幅等级
EquipSeparate : byte //装备锻造
EquipIncrease : byte //装备增幅属性 0 无 1 力量 2 智力 3 体力 4 精神
EquipPowerPercentage : byte //装备力量百分比
EquipIntellectPercentage : byte //装备智力百分比
EquipStaminaPercentage : byte //装备体力百分比
EquipSpiritPercentage : byte //装备精神百分比
EquipPhysicalAttackPercentage : byte //装备物理攻击百分比
EquipMagicAttackPercentage : byte //装备魔法攻击百分比
EquipIndependentAttackPercentage : byte //装备独立攻击百分比
EquipPhysicalDefensePercentage : byte //装备物理防御百分比
EquipMagicDefensePercentage : byte //装备魔法防御百分比
EquipWrapCount : byte //装备再封装次数
}
// Type 为 2 消耗品类型
{
Pos : short //道具位置
ItemId : int //道具ID
ItemCount : int //道具数量
}
}
*/
//刷新客户端角色背包数据 //刷新客户端角色背包数据
MySocket.RegisterBinaryHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK, function(Binary) { MySocket.RegisterBinaryHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK, function(Binary) {
local Pack = Packet(Binary); local Pack = Packet(Binary);
@ -78,88 +77,146 @@ function RegisterFunctionalPack() {
//道具数据 //道具数据
for (local i = 0; i< InventoryItemCount; i++) { for (local i = 0; i< InventoryItemCount; i++) {
local Type = Pack.Get_Byte(); local ItemStruct = GameItem.Item.ConstructionItemByPacket(Pack);
ItemList[ItemStruct.Pos] <- ItemStruct.Item;
}
//装备类型 //穿戴栏
if (Type == 1) { if (InventoryType == 1) {
local EquInfo = { foreach(Index, EquObj in ItemList) {
//装备位置 ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(Index, EquObj);
Pos = Pack.Get_Short(), //给角色赋予穿戴装备
//装备ID if (EquObj) {
EquipId = Pack.Get_Int(), ClientCharacter.WearEquipment(EquObj);
//交易类型
EquipTradeType = Pack.Get_Byte(),
//装备附魔编号
EquipEnchant = Pack.Get_Int(),
//装备强化等级或增幅等级
EquipUpgrade = Pack.Get_Byte(),
//装备锻造
EquipSeparate = Pack.Get_Byte(),
//装备增幅属性 0 无 1 力量 2 智力 3 体力 4 精神
EquipIncrease = Pack.Get_Byte(),
//装备力量百分比
EquipPowerPercentage = Pack.Get_Byte(),
//装备智力百分比
EquipIntellectPercentage = Pack.Get_Byte(),
//装备体力百分比
EquipStaminaPercentage = Pack.Get_Byte(),
//装备精神百分比
EquipSpiritPercentage = Pack.Get_Byte(),
//装备物理攻击百分比
EquipPhysicalAttackPercentage = Pack.Get_Byte(),
//装备魔法攻击百分比
EquipMagicAttackPercentage = Pack.Get_Byte(),
//装备独立攻击百分比
EquipIndependentAttackPercentage = Pack.Get_Byte(),
//装备物理防御百分比
EquipPhysicalDefensePercentage = Pack.Get_Byte(),
//装备魔法防御百分比
EquipMagicDefensePercentage = Pack.Get_Byte(),
//装备全属强
EquipAllElementalAttack = Pack.Get_Byte(),
//装备水属强
EquipWaterAttack = Pack.Get_Byte(),
//装备火属强
EquipFireAttack = Pack.Get_Byte(),
//装备光属强
EquipLightAttack = Pack.Get_Byte(),
//装备暗属强
EquipDarkAttack = Pack.Get_Byte(),
//装备品质
EquipPercentage = Pack.Get_Byte(),
//装备再封装次数
EquipWrapCount = Pack.Get_Byte(),
//装备是否封装
EquipIsWrap = Pack.Get_Byte(),
//耐久度
EquipDurability = Pack.Get_Byte(),
}
ItemList[EquInfo.Pos] <- GameItem.Equipment(EquInfo);
//装备栏
if (InventoryType == 2) {
ClientCharacterInventory.PageList[0].SetItemCollectionList(0, ItemList);
} }
} }
//消耗品类型 //处理完穿戴装备以后,重新计算角色属性
if (Type == 2 || Type == 3) { ClientCharacter.ReadFullEquipAttr();
local ItemInfo = { //刷新一下个人信息
//道具位置 ClientPersonalInfo.RefreshPersonalInfo();
Pos = Pack.Get_Short(),
//道具ID
ItemId = Pack.Get_Int(),
//交易类型
ItemTradeType = Pack.Get_Byte(),
//道具数量
ItemCount = Pack.Get_Int(),
} }
ItemList[ItemInfo.Pos] <- GameItem.Stackable(ItemInfo); //背包栏
else if (InventoryType > 1 && InventoryType< 7) {
ClientCharacterInventory.PageList[0].SetItemCollectionList(InventoryType - 2, ItemList); ClientCharacterInventory.PageList[0].SetItemCollectionList(InventoryType - 2, ItemList);
} }
//时装穿戴栏
else if (InventoryType == 8) {
foreach(Index, EquObj in ItemList) {
ClientCharacterInventory.PageList[1].CharactersObject.SetEquipment(Index, EquObj);
//给角色赋予穿戴装备
if (EquObj) {
ClientCharacter.WearEquipment(EquObj);
}
}
//刷新背包中的人物Ani
ClientCharacterInventory.RefreshRoleAni();
//刷新一下个人信息
ClientPersonalInfo.RefreshPersonalInfo();
}
//时装
else if (InventoryType == 9) {
ClientCharacterInventory.PageList[1].SetItemCollectionList(InventoryType - 9, ItemList);
} }
}); });
//刷新客户端角色背包单个槽数据
MySocket.RegisterBinaryHandler(PACKET_ID.INVENTORY_ADD_ITEM_CALLBACK, function(Binary) {
local Pack = Packet(Binary);
local op = Pack.Get_Int();
local InventoryType = Pack.Get_Byte(); //背包类型
local ItemStruct = GameItem.Item.ConstructionItemByPacket(Pack);
//穿戴栏
if (InventoryType == 1) {
ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(ItemStruct.Pos, ItemStruct.Item);
}
//背包栏
else if (InventoryType > 1 && InventoryType< 7) {
ClientCharacterInventory.PageList[0].SetItemCollectionSlot(InventoryType - 2, ItemStruct.Pos, ItemStruct.Item);
}
//时装
else if (InventoryType == 9) {
ClientCharacterInventory.PageList[1].SetItemCollectionSlot(InventoryType - 9, ItemStruct.Pos, ItemStruct.Item);
}
});
MySocket.RegisterBinaryHandler(PACKET_ID.INVENTORY_REMOVE_ITEM_CALLBACK, function(Binary) {
local Pack = Packet(Binary);
local op = Pack.Get_Int();
local InventoryType = Pack.Get_Byte(); //背包类型
local Pos = Pack.Get_Short();
//穿戴栏
if (InventoryType == 1) {
ClientCharacterInventory.PageList[0].CharactersObject.SetEquipment(Pos, null);
}
//背包栏
else if (InventoryType > 1 && InventoryType< 7) {
ClientCharacterInventory.PageList[0].SetItemCollectionSlot(InventoryType - 2, Pos, null);
}
//时装
else if (InventoryType == 9) {
ClientCharacterInventory.PageList[1].SetItemCollectionSlot(InventoryType - 9, Pos, null);
}
});
//穿戴装备的回包
MySocket.RegisterHandler(PACKET_ID.WEAR_EQUIPMENT_CALLBACK, function(Jso) {
//页面ID
local PageId = 0;
local OldBackpackId = Jso.oldbackpackId;
local OldPos = Jso.oldpos;
local NewBackpackId = Jso.newbackpackId;
//时装页面1
if (NewBackpackId == 9) {
PageId = 1;
NewBackpackId = 0
}
//装备页面0
else {
NewBackpackId -= 2
}
local NewPos = Jso.newpos;
local OldItem = null;
local NewItem = null;
if (OldBackpackId) {
OldItem = ClientCharacterInventory.PageList[PageId].CharactersObject.EquipmentSlot[OldPos].Item;
ClientCharacter.UnWearEquipment(OldItem);
}
//背包位置可能无装备
if (ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos]) {
NewItem = ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos].Item;
ClientCharacter.WearEquipment(ClientCharacterInventory.PageList[PageId].ItemCollectionList[NewBackpackId].ItemList[NewPos].Item);
}
//设置背包槽里的Item 如果原先有装备就设置那件 如果原先没有 则设置为null
ClientCharacterInventory.PageList[PageId].SetItemCollectionSlot(NewBackpackId, NewPos, OldItem);
//设置角色装备栏里的Item
ClientCharacterInventory.PageList[PageId].CharactersObject.SetEquipment(OldPos, NewItem);
//设置个人信息栏里的装备Item
if (PageId == 0) ClientPersonalInfo.PageList[PageId].CharactersObject.SetEquipment(OldPos, NewItem);
//刷新背包中的人物Ani
ClientCharacterInventory.RefreshRoleAni();
//处理完穿戴装备以后,重新计算角色属性
if (OldItem && PageId == 0) ClientCharacter.Attr -= OldItem.Attr;
if (NewItem && PageId == 0) ClientCharacter.Attr += NewItem.Attr;
//刷新一下个人信息
ClientPersonalInfo.RefreshPersonalInfo();
});
//刷新客户端角色背包点卷代币券信息
MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_CERA_DATA_CALLBACK, function(Jso) {
ClientCharacterInventory.WalletSet("Cera", Jso.coupon);
});
//刷新客户端角色背包金币信息
MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_GOLD_DATA_CALLBACK, function(Jso) {
ClientCharacterInventory.WalletSet("Gold", Jso.gold);
});
//刷新客户端角色背包复活币信息
MySocket.RegisterHandler(PACKET_ID.REFRESH_CLIENT_CHARACTER_REVIVE_DATA_CALLBACK, function(Jso) {
ClientCharacterInventory.WalletSet("ReviveCoin", Jso.revive);
});
//城镇中添加角色的回包 //城镇中添加角色的回包
MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_ADD_CHARACTER_CALLBACK, function(Binary) { MySocket.RegisterBinaryHandler(PACKET_ID.TOWN_ADD_CHARACTER_CALLBACK, function(Binary) {
local Pack = Packet(Binary); local Pack = Packet(Binary);
@ -181,6 +238,7 @@ function RegisterFunctionalPack() {
//构造角色 //构造角色
local Charc = GameObject.CreateCharacter(job, equ); local Charc = GameObject.CreateCharacter(job, equ);
Charc.Cid = cid; Charc.Cid = cid;
Charc.SetName(name);
Charc.SetPosition(posx, posy, posz); Charc.SetPosition(posx, posy, posz);
//从全局地图中找到城镇并添加角色 //从全局地图中找到城镇并添加角色
if (GlobalTownManager.CurrentMap) { if (GlobalTownManager.CurrentMap) {
@ -201,7 +259,7 @@ function RegisterFunctionalPack() {
//遍历所有角色 //遍历所有角色
foreach(obj in GlobalTownManager.CurrentMap.PlayerList) { foreach(obj in GlobalTownManager.CurrentMap.PlayerList) {
//角色对象 //角色对象
if (typeof obj == "character" && obj.Cid == Jso.cid) { if (typeof obj == "Game_Character" && obj.Cid == Jso.cid) {
GlobalTownManager.CurrentMap.RemoveObject(obj); GlobalTownManager.CurrentMap.RemoveObject(obj);
} }
} }
@ -230,6 +288,16 @@ function RegisterFunctionalPack() {
obj.SetMoveFlag(MoveFlag); obj.SetMoveFlag(MoveFlag);
} }
}); });
//注册聊天信息收包
MySocket.RegisterHandler(PACKET_ID.SEND_CHAT_MESSAGE_CALLBACK, function(Jso) {
ClientChatWindow.PushMsg(Jso);
//获取角色对象
local obj = GameObject.GetCharacterByCid(Jso.cid);
if (obj) obj.SetChatBubble(Jso.msg);
}.bindenv(this));
} }
//城镇包 //城镇包

View File

@ -7,14 +7,15 @@
function InitGame() { function InitGame() {
//初始化Socekt连接 //初始化Socekt连接
MySocket("192.168.200.15", 19003); MySocket("192.168.200.15", 19003);
// MySocket("125.109.36.181", 19003);
//注册功能包 //注册功能包
RegisterFunctionalPack(); RegisterFunctionalPack();
// MySocket("127.0.0.1", 19666); // MySocket("127.0.0.1", 19666);
//设定全局默认音量 //设定全局默认音量
_Globa_Audio_Volume_ = 0.001; _Globa_Audio_Volume_ = 0.015;
_Globa_Sound_Volume_ = 0.001; _Globa_Sound_Volume_ = 0.015;
Script(); Script();
@ -29,7 +30,7 @@ function InitGame() {
//初始化顶部工具条UI //初始化顶部工具条UI
Sq_CreateWindow(_Top_tool, "窗口顶部工具条", 208, 0, 650, 20, 0); Sq_CreateWindow(_Top_tool, "窗口顶部工具条", 208, 0, 650, 20, 0);
//初始化聊天窗口 //初始化聊天窗口
Sq_CreateWindow(_PlayerChat, "玩家聊天窗口", 1066, 0, 332, 600, 0); Sq_CreateWindow(_PlayerChat, "玩家聊天窗口", 1067, 0, 332, 600, 0);
//预加载 //预加载
Animation("ui/charactercreate/dust.ani"); Animation("ui/charactercreate/dust.ani");
@ -56,7 +57,7 @@ function LoginStage() {
local Kiwano = CL_SpriteObject("sprite/loding.img", 1); local Kiwano = CL_SpriteObject("sprite/loding.img", 1);
Kiwano.SetAnchor(0.5, 0.5); Kiwano.SetAnchor(0.5, 0.5);
Kiwano.SetScale(0.35, 0.35); Kiwano.SetScale(0.35, 0.35);
Kiwano.SetPosition(1066 / 2, 300); Kiwano.SetPosition(1067 / 2, 300);
Kiwano.SetUpdateFunc(function(sp, dt) { Kiwano.SetUpdateFunc(function(sp, dt) {
if (!("time" in sp.Var)) sp.Var.time <- 0; if (!("time" in sp.Var)) sp.Var.time <- 0;
sp.Var.time += dt; sp.Var.time += dt;
@ -68,7 +69,7 @@ function LoginStage() {
//Yosin图标 //Yosin图标
local Yosin = CL_SpriteObject("sprite/loding.img", 2); local Yosin = CL_SpriteObject("sprite/loding.img", 2);
Yosin.SetAnchor(0.5, 0.5); Yosin.SetAnchor(0.5, 0.5);
Yosin.SetPosition(1066 / 2, 300); Yosin.SetPosition(1067 / 2, 300);
Yosin.SetOpacity(0.0); Yosin.SetOpacity(0.0);
Yosin.SetUpdateFunc(function(sp, dt) { Yosin.SetUpdateFunc(function(sp, dt) {
if (!("time" in sp.Var)) sp.Var.time <- 0; if (!("time" in sp.Var)) sp.Var.time <- 0;

View File

@ -10,12 +10,83 @@ function TestStage() {
T.Enter(); T.Enter();
local Window = Sq_CreateWindow(_Login_Window, "登录界面窗口", 0, 0, 1066, 600, 0); // local BackGround = CL_SpriteObject("sprite/loding.img", 0);
// T.Addchild(BackGround);
// local Window = _NameSpace_FunctionInteractive._FunctionInteractive(2, 300, 200);
// //创建名字对象
// local Name = FontAssetManager.GenerateNormal("", true, {
// color = sq_RGBA(209, 185, 148, 255),
// });
// Name.SetZOrder(80000);
// Name.SetPosition(184 + 28.5, 93 + 195);
// Name.SetText("1 级 " + "倾泪寒");
// T.Addchild(Name);
// ClientCharacter = GameObject.CreateCharacter(0, []);
// ClientCharacter.Level = 95;
// ClientCharacter.SkillPoint = 6190;
// ClientCharacter.Exp = 1127310010;
// ClientCharacter.Fatigue = 50;
// ClientCharacter.InitAttr();
// Sq_CreateWindow(UISpace_PersonalInfo._PersonalInfo, "个人信息窗口", 250, 60, 286, 530, 20);
// ClientCharacterInventory = Sq_CreateWindow(UISpace_Inventory._Inventory, "背包窗口", 634, 20, 262, 548, 20);
// local SkillObject = GameItem.Skill(0, 1);
// local Icon = SkillObject.GetInfoWindow();
// Icon.SetPosition(200, 100);
// T.Addchild(Icon);
// local SkillObject2 = GameItem.Skill(0, 86);
// local Icon2 = SkillObject2.GetInfoWindow();
// Icon2.SetPosition(500, 100);
// T.Addchild(Icon2);
// local SkillObject3 = GameItem.Skill(0, 246);
// local Icon3 = SkillObject3.GetInfoWindow();
// Icon3.SetPosition(800, 100);
// T.Addchild(Icon3);
// local Window = Sq_CreateWindow(UISpace_SkillTree._SkillTree, "技能树窗口", 135, 4, 796, 524, 20);
// Window.Init(0, 0);
// local Window = UISpace_Hud._Hud();
// Window.ResetFocus();
local Window = Sq_CreateWindow(_Login_Window, "登录界面窗口", 0, 0, 1067, 600, 0);
// local BackGround = CL_SpriteObject("sprite/loding.img", 0);
// T.Addchild(BackGround);
// _QuantityInput(200, 200);
// Window.Init(2);
// local BackGround = CL_SpriteObject("sprite/loding.img", 0); // local BackGround = CL_SpriteObject("sprite/loding.img", 0);
// T.Addchild(BackGround); // T.Addchild(BackGround);
// local Test = Character_ChatBubble("thisistestprojectyoukonwmymi");
// Test.SetPosition(300, 200);
// T.Addchild(Test);
// local canvas = CL_CanvasObject();
// canvas.ResizeAndClear(600, 600);
// canvas.BeginDraw();
// local Actorobj = Actor();
// local BackGround = CL_SpriteObject("sprite/loding.img", 0);
// Actorobj.Addchild(BackGround);
// canvas.DrawActor(Actorobj);
// canvas.EndDraw();
// T.Addchild(canvas);
//初始化聊天窗口
// Sq_CreateWindow(_PlayerChat, "玩家聊天窗口", 1067, 0, 332, 600, 0);
// local Stk = GameItem.Stackable(3037); // local Stk = GameItem.Stackable(3037);
// Stk.Count = 10; // Stk.Count = 10;
@ -101,33 +172,8 @@ function TestStage() {
// ClientCharacter = Charc; // ClientCharacter = Charc;
// local Window = Sq_CreateWindow(_Inventory, "背包窗口", 150, 12, 262, 548, 20);
// local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1067, 600, 0);
// Window.EquipmentPage.ItemCollection.SetItemList([{
// ItemId = 27675
// }, {
// ItemId = 101020048
// }, {
// ItemId = 24144
// }]);
// local Window = Sq_CreateWindow(_Inventory, "背包窗口", 150, 12, 257, 555, 20);
// //大背景
// local BackGround = CL_SpriteObject("sprite/map/npc/2019_halloween_blossom_normal.img", 0);
// BackGround.SetPosition(300, 150);
// BackGround.SetOutline(true);
// T.Addchild(BackGround);
// local Fontobj = Font();
// local NPCobj = GameObject.NPC(2);
// NPCobj.SetPosition(400, 400, 0);
// T.Addchild(NPCobj);
// local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1066, 600, 0);
// local T = { // local T = {
// loginImg = 1, // loginImg = 1,
// charac = [{ // charac = [{
@ -171,6 +217,6 @@ function TestStage() {
// print(ObjectCount); // print(ObjectCount);
// Sq_CreateWindow(_CreateCharacter, "创建角色界面窗口", 0, 0, 1066, 600, 0); // Sq_CreateWindow(_CreateCharacter, "创建角色界面窗口", 0, 0, 1067, 600, 0);
} }

View File

@ -0,0 +1,600 @@
/*
文件名:BaseWidget.nut
路径:User/UI/Widget/BaseWidget.nut
创建日期:2025-02-07 21:37
文件用途:
*/
//基础按钮
class Yosin_BaseButton extends Yosin_CommonUi {
//按钮状态
State = 0;
Path = null;
Idx = null;
Sprite = null;
SpriteState = -1;
FrameList = null;
//按下时的模拟偏移
DownSimulateOffset = true;
OnClickSound = SOUND.CLICK_BUTTON2;
OnClickMoveSound = SOUND.CLICK_MOVE;
constructor(X, Y, W, H, Path, Idx) {
this.Path = Path;
this.Idx = Idx;
base.constructor(X, Y, W, H);
FrameList = [];
Sprite = CL_SpriteObject();
// Sprite.ShowBorder(true);
Addchild(Sprite);
for (local i = 0; i< 4; i++) {
local Sf = CL_SpriteFrameObject(this.Path, this.Idx + i);
FrameList.push(Sf);
}
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
//按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
if (DownSimulateOffset) {
if (State == 2) {
Y += 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y -= 1;
SyncPos(X, Y);
}
}
SpriteState = State;
Sprite.SetFrame(FrameList[SpriteState]);
Sprite.SetPosition(0, 0);
}
}
function Proc(Dt) {
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
//三分法拉伸
class Yosin_EmeStretch extends CL_CanvasObject {
Path = null;
Idx = null;
//按钮状态
SpriteList = null;
constructor(W, H, Path, Idx, Direction = true) {
this.Path = Path;
this.Idx = Idx;
base.constructor();
// 创建画布
CL_CanvasObject();
// 重设大小并清空
ResizeAndClear(W, H);
// 开始绘制
BeginDraw();
SpriteList = [];
SpriteList.push(CL_SpriteObject(Path, Idx));
SpriteList.push(CL_SpriteObject(Path, Idx + 1));
SpriteList.push(CL_SpriteObject(Path, Idx + 2));
//横向
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.0);
SpriteList[1].SetScale(ScaleRate, 1.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);
}
foreach(Child in SpriteList) {
// Addchild(Child);
DrawSprite(Child);
}
// 结束绘制
EndDraw();
// 添加画布
// Addchild(Canvas);
}
}
//九宫格拉伸
function Yosin_NineBoxStretch(width, height, path, imgId) {
// 创建画布
local Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(width, height);
// 开始绘制
Canvas.BeginDraw();
// 左上角
// local backgroundTopLeft = CL_SpriteObject(path, imgId);
local backgroundTopLeft = CL_SpriteObject(path, imgId);
// 上边
local backgroundTop = CL_SpriteObject(path, imgId + 1);
// 右上角
local backgroundTopRight = CL_SpriteObject(path, imgId + 2);
// 左边
local backgroundLeft = CL_SpriteObject(path, imgId + 3);
// 中间
local backgroundCenter = CL_SpriteObject(path, imgId + 4);
// 右边
local backgroundRight = CL_SpriteObject(path, imgId + 5);
// 左下角
local backgroundBottomLeft = CL_SpriteObject(path, imgId + 6);
// 下边
local backgroundBottom = CL_SpriteObject(path, imgId + 7);
// 右下角
local backgroundBottomRight = CL_SpriteObject(path, imgId + 8);
// 左上角
Canvas.DrawSprite(backgroundTopLeft);
local TopLeftSize = backgroundTopLeft.GetSize();
local TopLeftBottom = TopLeftSize.h;
local TopLeftRight = TopLeftSize.w;
// 中间图片大小
local centerImgSize = backgroundCenter.GetSize();
local centerImgWidth = centerImgSize.w;
local centerImgHeight = centerImgSize.h;
local centerWidth = width - backgroundTopLeft.GetSize().w - backgroundTopRight.GetSize().w;
local centerHeight = height - backgroundTopLeft.GetSize().h - backgroundBottomLeft.GetSize().h;
local scaleW = (centerWidth - 1).tofloat() / centerImgWidth.tofloat();
local scaleH = (centerHeight - 1).tofloat() / centerImgHeight.tofloat();
// 上边
backgroundTop.SetScale(scaleW, 1);
backgroundTop.SetPosition(TopLeftRight, 0);
Canvas.DrawSprite(backgroundTop);
// 右上角
backgroundTopRight.SetPosition(width - backgroundTopRight.GetSize().w - 1, 0);
Canvas.DrawSprite(backgroundTopRight);
// 左边
backgroundLeft.SetScale(1, scaleH);
backgroundLeft.SetPosition(0, TopLeftBottom);
Canvas.DrawSprite(backgroundLeft);
// 中间
backgroundCenter.SetScale(scaleW, scaleH);
// Addchild(backgroundCenter);
backgroundCenter.SetPosition(TopLeftRight, backgroundLeft.Y);
Canvas.DrawSprite(backgroundCenter);
// 右边
backgroundRight.SetScale(1, scaleH);
backgroundRight.SetPosition(width - backgroundRight.GetSize().w - 1, backgroundCenter.Y);
Canvas.DrawSprite(backgroundRight);
// 左下角
backgroundBottomLeft.SetPosition(0, height - backgroundBottomLeft.GetSize().h - 1);
Canvas.DrawSprite(backgroundBottomLeft);
// 下边
backgroundBottom.SetScale(scaleW, 1);
backgroundBottom.SetPosition(TopLeftRight, backgroundBottomLeft.Y);
Canvas.DrawSprite(backgroundBottom);
// 右下角
backgroundBottomRight.SetPosition(width - backgroundBottomRight.GetSize().w - 1, backgroundBottomLeft.Y);
Canvas.DrawSprite(backgroundBottomRight);
// 结束绘制
Canvas.EndDraw();
// 添加画布
// Addchild(Canvas);
local Sp = CL_SpriteObject();
Sp.SetFrame(Canvas.ExportSpriteFrame());
return Sp;
}
//拼接按钮
class Yosin_SplicingButton extends Yosin_CommonUi {
//按钮状态
State = 0;
Path = null;
Idx = null;
SpriteList = null;
SpriteState = -1;
FrameList = null;
//按下时的模拟偏移
DownSimulateOffset = true;
constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true, IsTwoImg = false) {
this.Path = Path;
this.Idx = Idx;
base.constructor(X, Y, W, H);
SpriteList = array(4);
//普通态
SpriteList[0] = Yosin_EmeStretch(W, H, Path, Idx, Direction);
//悬停态
SpriteList[1] = Yosin_EmeStretch(W, H, Path, Idx + (UnavailableFlag ? 4 : 3), Direction);
//按下态
SpriteList[2] = Yosin_EmeStretch(W, H, Path, Idx + (IsTwoImg ? 3 : (UnavailableFlag ? 8 : 6)), Direction);
if (UnavailableFlag) {
//不可用态
SpriteList[3] = Yosin_EmeStretch(W, H, Path, Idx + 12, Direction);
}
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
//按下时模拟偏移的Flag 如果按下 调整Y坐标向下一个单位
if (DownSimulateOffset) {
if (State == 2) {
Y += 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y -= 1;
SyncPos(X, Y);
}
}
if (SpriteState != -1) {
RemoveUIChild(SpriteList[SpriteState]);
}
SpriteState = State;
Addchild(SpriteList[SpriteState]);
}
}
function Proc(Dt) {
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
// 标题按钮
class titleButton extends Yosin_BaseButton {
index = null;
select = false;
cacheSelect = false;
cacheY = null;
LBDownOnClick = null;
constructor(X, Y, W, H, Path, Idx, title) {
base.constructor(X, Y, W, H, Path, Idx);
cacheY = Y;
DownSimulateOffset = false;
local backText = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(130, 114, 84, 255)
});
backText.SetUpdateFunc(function(Text, Dt) {
if (select == cacheSelect) return;
if (select) {
Text.SetFillColor(sq_RGBA(187, 176, 149, 255));
} else {
Text.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
cacheSelect = select;
})
backText.SetPosition(9, 2);
Addchild(backText);
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
if (State == 2) {
Y = cacheY - 1;
SyncPos(X, Y);
} else if (SpriteState == 2) {
Y = cacheY;
SyncPos(X, Y);
}
SpriteState = State;
Sprite.SetFrame(FrameList[SpriteState]);
Sprite.SetPosition(0, 0);
}
}
function Proc(Dt) {
if (select) return;
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
select = true;
if (LBDownOnClick != null) {
LBDownOnClick(this);
}
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
// 拉伸标题按钮
class Yosin_StretchTitleButton extends Yosin_CommonUi {
index = null;
//按钮状态
State = 0;
//ui的当前状态
uiState = 0;
cecheY = null;
titleText = null;
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(W, H, Path, Idx);
Addchild(SpriteList[0]);
//悬停态
SpriteList[1] = Yosin_EmeStretch(W, H, Path, Idx + 3);
SpriteList[1].SetVisible(false)
Addchild(SpriteList[1]);
//按下态
SpriteList[2] = Yosin_EmeStretch(W, H, Path, Idx + 6);
SpriteList[2].SetVisible(false)
Addchild(SpriteList[2]);
// 文字
titleText = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(130, 114, 84, 255)
});
titleText.SetUpdateFunc(function(Text, Dt) {
if (select == cacheSelect) return;
if (select) {
Text.SetFillColor(sq_RGBA(187, 176, 149, 255));
} else {
Text.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
cacheSelect = select;
})
titleText.SetPosition(W / 2 - titleText.GetSize().w / 2, 2);
Addchild(titleText);
}
// 设置为选中状态
function SetSelect(select) {
if (select) {
State = 2;
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;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
ChangeFrame();
}
}
// 横向多个标题单选按钮
class Yosin_RowMoreTitleBtn extends Yosin_CommonUi {
LBDownOnClick = null;
btns = null;
tests = null;
constructor(X, Y, W, titles, path, idx, baseWidth = 48) {
this.tests = titles;
btns = [];
local btnX = 5;
for (local i = 0; i< titles.len(); i++) {
local textW = FontAssetManager.GenerateNormal(titles[i], true).GetSize().w + 10;
local btnW = baseWidth;
btnW = textW > btnW ? textW : btnW;
local titleBtn = Yosin_StretchTitleButton(btnX, 1, btnW, 19, path, idx, titles[i]);
titleBtn.index = i;
titleBtn.LBDownOnClick = function(btn) {
LBDownOnClick(btn.Parent, btn.index);
for (local i = 0; i< btns.len(); i++) {
btns[i].SetSelect(false);
btns[i].titleText.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
btn.SetSelect(true);
btns[btn.index].titleText.SetFillColor(sq_RGBA(187, 176, 149, 255));
}.bindenv(this);
btns.push(titleBtn);
btnX += btnW;
}
base.constructor(X, Y, btnX, 21);
for (local i = 0; i< btns.len(); i++) {
AddUIChild(btns[i]);
}
btns[0].SetSelect(true);
// 创建画布
local Canvas = CL_CanvasObject();
Canvas.SetPosition(0, 19);
// 重设大小并清空
Canvas.ResizeAndClear(W, 1);
// 设置填充画刷 用于绘制边框和线条
Canvas.SetFillBrush(sq_RGBA(66, 61, 59, 250));
// 设置轮廓画刷 用于绘制边框和线条
Canvas.SetStrokeBrush(sq_RGBA(66, 61, 59, 250));
// 开始绘制
Canvas.BeginDraw();
// 画线段
Canvas.DrawLine(0, 1, W, 1);
// 结束绘制
Canvas.EndDraw();
// 添加画布
Addchild(Canvas);
}
}
// 进度显示
class Yosin_Schedule extends Yosin_CommonUi {
//背景
BgSprite = null;
//条
BarSprite = null;
// schedule 进度比例0-1
constructor(X, Y, W, H, path, idx) {
base.constructor(X, Y, W, H);
BgSprite = CL_SpriteObject(path, idx + 1);
Addchild(BgSprite);
BarSprite = CL_SpriteObject(path, idx);
Addchild(BarSprite);
}
function SetPercentage(Rate) {
local barSize = BarSprite.GetSize();
local barW = barSize.w * Rate;
BarSprite.SetCropRect(BarSprite.X, BarSprite.Y, barW, barSize.h);
BarSprite.SetSize(barW, barSize.h);
}
}

View File

@ -32,13 +32,13 @@ class Yosin_DragButton extends Yosin_CommonUi {
//侦测值 //侦测值
Detect_Value = 0; Detect_Value = 0;
constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true) { constructor(X, Y, W, H, Path, Idx, Direction = true, UnavailableFlag = true, IsTwoImg = false) {
this.Path = Path; this.Path = Path;
this.Idx = Idx; this.Idx = Idx;
this.Direction = Direction; this.Direction = Direction;
base.constructor(X, Y, W, H); base.constructor(X, Y, W, H);
Button = Yosin_SplicingButton(0, 0, W, H, Path, Idx, Direction, UnavailableFlag); Button = Yosin_SplicingButton(0, 0, W, H, Path, Idx, Direction, UnavailableFlag, IsTwoImg);
Button.DownSimulateOffset = false; Button.DownSimulateOffset = false;
AddUIChild(Button); AddUIChild(Button);
@ -51,8 +51,8 @@ class Yosin_DragButton extends Yosin_CommonUi {
//override //override
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
MoveFlag = true; MoveFlag = true;
@ -64,9 +64,9 @@ class Yosin_DragButton extends Yosin_CommonUi {
} }
//override //override
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法 //调用原生方法
base.OnMouseProc(MousePos_X, MousePos_Y); base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//移动 //移动
if (MoveFlag) { if (MoveFlag) {
@ -95,9 +95,16 @@ class Yosin_DragButton extends Yosin_CommonUi {
if (OnChange) OnChange(Value); if (OnChange) OnChange(Value);
} }
//设置位置
function SetPos(gX, gY) {
X = gX;
Y = gY;
SyncPos(X, Y);
}
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
MoveFlag = false; MoveFlag = false;
} }

View File

@ -18,7 +18,9 @@ class _IMouse_ extends _Yosin_Cursor {
//动态帧 Timer //动态帧 Timer
ActiveFrameTimer = 0; ActiveFrameTimer = 0;
//挂载的对象List //拖动的对象
DragObj = null;
//挂载的精灵
AttachObjList = null; AttachObjList = null;
constructor() { constructor() {
@ -71,6 +73,7 @@ class _IMouse_ extends _Yosin_Cursor {
Object = Obj, Object = Obj,
ZOrder = Obj.GetZOrder ZOrder = Obj.GetZOrder
}); });
Obj.SetPosition(-14, -14);
Obj.SetZOrder(-1); Obj.SetZOrder(-1);
Addchild(Obj); Addchild(Obj);
} }
@ -85,12 +88,29 @@ class _IMouse_ extends _Yosin_Cursor {
} }
} }
function OnMouseProc(MousePos_X, MousePos_Y) { //添加拖动道具
function AddDragObject(Obj) {
DragObj = Obj;
//挂载图标到鼠标下
AttachObjectBottom("Drag", DragObj.ItemIcon);
}
//移除拖动道具
function RemoveDragObject() {
if (DragObj) {
RemoveObject("Drag");
local RetObj = DragObj;
DragObj = null;
return RetObj;
}
}
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
} }
//按下 //按下
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//普通状态的点击效果 //普通状态的点击效果
if (Idx == 0) { if (Idx == 0) {
Change(1); Change(1);
@ -98,7 +118,7 @@ class _IMouse_ extends _Yosin_Cursor {
} }
//抬起 //抬起
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//普通状态的点击效果 //普通状态的点击效果
if (Idx == 1) { if (Idx == 1) {
Change(0); Change(0);

View File

@ -94,7 +94,7 @@ class Yosin_InputBox extends Yosin_CommonUi {
} }
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) { function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition(); local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) { if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
if (OnClick) OnClick(this); if (OnClick) OnClick(this);

View File

@ -9,30 +9,29 @@ class Yosin_Mininumber extends CL_CanvasObject {
//图片数字宽度 //图片数字宽度
Yosin_Mininumber_NumberWidth = [6, 4, 6, 6, 6, 6, 6, 6, 6, 6]; Yosin_Mininumber_NumberWidth = [6, 4, 6, 6, 6, 6, 6, 6, 6, 6];
//绘制宽度
DrawTextWidth = 0;
// 构造函数 // 构造函数
constructor(Number) { constructor(Number) {
if (typeof Number != "integer") error("参数错误");
local NumberString = Number.tostring();
base.constructor(); base.constructor();
SetNumber(Number);
}
// 创建画布 function SetNumber(num) {
CL_CanvasObject(); if (num == null) return;
local NumberString = num.tostring();
// 重设大小并清空 // 重设大小并清空
ResizeAndClear(NumberString.len() * 6, 10); ResizeAndClear(NumberString.len() * 6, 10);
// 开始绘制 // 开始绘制
BeginDraw(); BeginDraw();
local DrawTextWidth = 0; DrawTextWidth = 0;
foreach(value in NumberString) { foreach(value in NumberString) {
local realnum = value - 48; local realnum = value - 48;
DrawSpriteFrame(CL_SpriteFrameObject("sprite/interface/mininumberset.img", realnum), DrawTextWidth, 0); DrawSpriteFrame(CL_SpriteFrameObject("sprite/interface/mininumberset.img", realnum), DrawTextWidth, 0);
DrawTextWidth += Yosin_Mininumber_NumberWidth[realnum]; DrawTextWidth += Yosin_Mininumber_NumberWidth[realnum];
} }
// 结束绘制 // 结束绘制
EndDraw(); EndDraw();
} }

View File

@ -0,0 +1,138 @@
/*
文件名:NumberInputBox.nut
路径:User/UI/Widget/NumberInputBox.nut
创建日期:2025-02-07 20:31
文件用途:数字输入框
*/
class Yosin_NumberInputBox extends Yosin_CommonUi {
//框背景
BoxBackground = null;
//文本
TextObject = null;
Text = "0";
//输入光标
InputCursor = null;
//输入位置
InputPos = 0;
//是否获取焦点
IsFocus = false;
constructor(w, h) {
base.constructor(0, 0, w, h);
//输入框
BoxBackground = Yosin_NineBoxStretch(w, h, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
BoxBackground.SetPosition(0, 0);
Addchild(BoxBackground);
//文本
TextObject = Yosin_Mininumber(null);
TextObject.SetPosition(6, 5);
Addchild(TextObject);
//输入光标
InputCursor = CreateCursor();
InputCursor.SetUpdateFunc(function(Object, Dt) {
//处于焦点中执行
if (IsFocus) {
//光标闪烁逻辑
{
if (!(Object.Var.rawin("TimeFlag"))) {
Object.Var.TimeFlag <- 0;
Object.Var.VisibleFlag <- false;
}
Object.Var.TimeFlag += Dt;
if (Object.Var.TimeFlag >= 500) {
Object.Var.TimeFlag <- 0;
Object.SetVisible(Object.Var.VisibleFlag);
Object.Var.VisibleFlag <- !Object.Var.VisibleFlag;
}
}
//同步光标位置逻辑
{
Object.SetPosition(TextObject.X + TextObject.DrawTextWidth, 4);
}
}
}.bindenv(this));
Addchild(InputCursor);
_Imm_Input_Func_.rawset(C_Object, Imm_Input.bindenv(this));
}
//判断是否中文字符
function IsChineseChar(code) {
return (code & 0x80) != 0;
}
//接收文本数据
function Imm_Input(str) {
if (!this) return -1;
if (!IsFocus) return;
//退格键
if (str == "\b") {
if (this.Text.len() > 0) {
this.Text = Sq_RemoveStringLast(this.Text);
}
}
//只记录数字
else if (regexp("[0-9]").match(str)) {
if (this.Text.tointeger()< 9999999999999) {
if (this.Text == "0") this.Text = str;
else this.Text += str;
} else this.Text = "9999999999999";
}
//同步数字数据
TextObject.SetNumber(this.Text);
//每次设置文本时确保光标显示
InputCursor.SetVisible(true);
InputCursor.Var.TimeFlag <- 0;
InputCursor.Var.VisibleFlag <- false;
}
function CreateCursor() {
local Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(1, 15);
// 开始绘制
Canvas.BeginDraw();
Canvas.SetFillBrush(sq_RGBA(255, 255, 255, 250));
Canvas.SetStrokeBrush(sq_RGBA(255, 255, 255, 250));
Canvas.DrawLine(1, 1, 1, 10);
// 结束绘制
Canvas.EndDraw();
Canvas.SetVisible(false);
return Canvas;
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
SetFocus(true);
} else {
SetFocus(false);
}
}
//设置焦点模式
function SetFocus(Flag) {
IsFocus = Flag;
InputCursor.SetVisible(Flag);
Sq_SetImmEnabled(Flag);
}
//设置数字
function SetNumber(Number) {
if (Number< 0) return;
this.Text = Number.tostring();
TextObject.SetNumber(this.Text);
}
//获取数字
function GetNumber() {
return this.Text.tointeger();
}
}

View File

@ -8,10 +8,8 @@
class Yosin_ScrollBar extends Yosin_CommonUi { class Yosin_ScrollBar extends Yosin_CommonUi {
//控制器 //控制器
Controller = null; Controller = null;
//是否焦点 //是否焦点
IsFocus = false; IsFocus = false;
//上按钮 //上按钮
UpButton = null; UpButton = null;
//滚动按钮 //滚动按钮
@ -19,6 +17,9 @@ class Yosin_ScrollBar extends Yosin_CommonUi {
//下按钮 //下按钮
DownButton = null; DownButton = null;
//滚动条状态
ScrollBarState = true;
//回调函数 //回调函数
OnChange = null; OnChange = null;
@ -41,7 +42,8 @@ class Yosin_ScrollBar extends Yosin_CommonUi {
AddUIChild(UpButton); AddUIChild(UpButton);
//滚动条 //滚动条
ScrollButton = Yosin_DragButton(0, 13, 9, S_H, Path, 184, false, false); ScrollButton = Yosin_DragButton(0, 13, 9, S_H, Path, 184, false, false, true);
ScrollButton.OnChange = OnChange;
ScrollButton.SetMaxMoveValue(Height - 26); ScrollButton.SetMaxMoveValue(Height - 26);
AddUIChild(ScrollButton); AddUIChild(ScrollButton);
@ -57,11 +59,62 @@ class Yosin_ScrollBar extends Yosin_CommonUi {
function Proc(Dt) { function Proc(Dt) {
base.Proc(Dt); base.Proc(Dt);
Controller.CurPos = ScrollButton.Detect_Value; if (ScrollButton) Controller.CurPos = ScrollButton.Detect_Value;
}
//设置滚动条长度
function SetScrollBarHeight(height) {
if (ScrollButton) {
RemoveUIChild(ScrollButton);
ScrollButton = null;
}
SetScrollBarState(true);
ScrollButton = Yosin_DragButton(0, 13, 9, height.tointeger(), Path, 184, false, false, true);
ScrollButton.OnChange = OnChange;
ScrollButton.SetMaxMoveValue(Height - 26);
AddUIChild(ScrollButton);
}
//设置滚动条状态
function SetScrollBarState(Flag) {
if (ScrollBarState == Flag) return;
ScrollBarState = Flag;
if (!Flag) {
UpButton.State = 3;
DownButton.State = 3;
if (ScrollButton) {
RemoveUIChild(ScrollButton);
ScrollButton = null;
}
} else {
UpButton.State = 0;
DownButton.State = 0;
}
}
//设置滚动条数值
function SetScrollBarValue(Value) {
if (ScrollButton) {
ScrollButton.SetPos(0, Value * (ScrollButton.Max_Move_Value - ScrollButton.Height + 13))
ScrollButton.DragLogic(Value);
}
}
//设置滚动
function SetScroll(Flag) {
if (ScrollButton) {
local Value = Controller.CurPos;
if (Flag) Value += 0.1;
else Value -= 0.1;
if (Value< 0) Value = 0;
if (Value > 1) Value = 1;
ScrollButton.SetPos(0, Value * (ScrollButton.Max_Move_Value - ScrollButton.Height + 13))
ScrollButton.DragLogic(Value);
}
} }
function SetChangeCallBack(Func) { function SetChangeCallBack(Func) {
ScrollButton.OnChange = Func; OnChange = Func;
} }
} }

View File

@ -66,7 +66,7 @@ class _Login_Window extends Yosin_Window {
//关闭登录界面 //关闭登录界面
NoticeBox.DestroyWindow(); NoticeBox.DestroyWindow();
DestroyWindow(); DestroyWindow();
local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1066, 600, 0); local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1067, 600, 0);
Window.Init(PackInfo); Window.Init(PackInfo);
Window.BackGroundMusic = this.BackGroundMusic; Window.BackGroundMusic = this.BackGroundMusic;
}.bindenv(this)); }.bindenv(this));

View File

@ -55,8 +55,8 @@ class _Select_Character_SettingBackground_Object_Window extends Yosin_CommonUi {
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) { function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbClick(MousePos_X, MousePos_Y); base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
//必须是在框的范围内 //必须是在框的范围内
if (MousePos_Y > Parent.Y && MousePos_Y<(Parent.Y + Parent.Height)) { if (MousePos_Y > Parent.Y && MousePos_Y<(Parent.Y + Parent.Height)) {
@ -214,7 +214,7 @@ class _Select_Character_Chr extends Yosin_CommonUi {
Charc.SetAnimation("RestAni"); Charc.SetAnimation("RestAni");
Charc.SetPosition(64, 156, 0); Charc.SetPosition(64, 156, 0);
Charc.SetName(Info.lv + " 级 " + Info.name); Charc.SetName(Info.lv + " 级 " + Info.name);
Charc.AnimationManager.Name.MoveBy(21 - Charc.AnimationManager.Name.GetSize().w / 2, 180); Charc.AdditionalItemsManager.Name.MoveBy(0, 170);
Addchild(Charc); Addchild(Charc);
} }
@ -227,8 +227,8 @@ class _Select_Character_Chr extends Yosin_CommonUi {
//override //override
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseProc(MousePos_X, MousePos_Y); base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
RectMask.SetVisible(true); RectMask.SetVisible(true);
} else { } else {
@ -246,8 +246,8 @@ class _Select_Character_Chr extends Yosin_CommonUi {
//override //override
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) { function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbClick(MousePos_X, MousePos_Y); base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
//遍历父对象中的所有按钮 还原其他按钮 //遍历父对象中的所有按钮 还原其他按钮
foreach(Button in Parent.UpCharacterList) { foreach(Button in Parent.UpCharacterList) {
@ -263,8 +263,8 @@ class _Select_Character_Chr extends Yosin_CommonUi {
//override //override
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
MoveFlag = true; MoveFlag = true;
M_Xpos = MousePos_X; //原始鼠标位置数据 M_Xpos = MousePos_X; //原始鼠标位置数据
@ -281,8 +281,8 @@ class _Select_Character_Chr extends Yosin_CommonUi {
//override //override
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (MoveFlag) { if (MoveFlag) {
MoveFlag = false; MoveFlag = false;
@ -462,7 +462,7 @@ class _Select_Character_Window extends Yosin_Window {
color = sq_RGBA(186, 147, 97, 255) color = sq_RGBA(186, 147, 97, 255)
}); });
CreateButton.OnClick = function(Button) { CreateButton.OnClick = function(Button) {
local Window = Sq_CreateWindow(_CreateCharacter, "创建角色界面窗口", 0, 0, 1066, 600, 0); local Window = Sq_CreateWindow(_CreateCharacter, "创建角色界面窗口", 0, 0, 1067, 600, 0);
Window.ResetFocus(); Window.ResetFocus();
}.bindenv(this); }.bindenv(this);
AddUIChild(CreateButton); AddUIChild(CreateButton);

View File

@ -22,6 +22,8 @@ class _Yosin_MessageBox extends Yosin_Window {
titleTextActor = null; titleTextActor = null;
messageTextActor = null; messageTextActor = null;
//确认回调函数
OnConfirm = null;
constructor(message, gX = 418, gY = 200, info = { constructor(message, gX = 418, gY = 200, info = {
// 标题 // 标题
@ -74,12 +76,12 @@ class _Yosin_MessageBox extends Yosin_Window {
function RegisterWidget() { function RegisterWidget() {
//背景 //背景
local background = Yosin_NineBoxStretch( cacheW + 1, cacheH, "sprite/interface/lenheartwindowcommon.img", 97); local background = Yosin_NineBoxStretch(cacheW + 1, cacheH, "sprite/interface/lenheartwindowcommon.img", 97);
background.SetPosition(-1, 15); background.SetPosition(-1, 15);
Addchild(background); Addchild(background);
//文字背景 //文字背景
local twoBackground = Yosin_NineBoxStretch( cacheW - 8, cacheH - 36, "sprite/interface/lenheartwindowcommon.img", 97); local twoBackground = Yosin_NineBoxStretch(cacheW - 8, cacheH - 36, "sprite/interface/lenheartwindowcommon.img", 97);
twoBackground.SetPosition(4, 20); twoBackground.SetPosition(4, 20);
Addchild(twoBackground); Addchild(twoBackground);
@ -93,7 +95,7 @@ class _Yosin_MessageBox extends Yosin_Window {
local BackgroundBrightSize = BackgroundBright.GetSize(); local BackgroundBrightSize = BackgroundBright.GetSize();
local scaleW = (cacheW / BackgroundBrightSize.w).tofloat(); local scaleW = (cacheW / BackgroundBrightSize.w).tofloat();
BackgroundBright.SetScale(scaleW, 1); BackgroundBright.SetScale(scaleW, 1);
BackgroundBright.SetPosition( 0, 1); BackgroundBright.SetPosition(0, 1);
Addchild(BackgroundBright); Addchild(BackgroundBright);
//确认按钮 //确认按钮
@ -101,11 +103,14 @@ class _Yosin_MessageBox extends Yosin_Window {
confirmButton.OnClick = function(Button) { confirmButton.OnClick = function(Button) {
//关闭本窗口 //关闭本窗口
DestroyWindow(); DestroyWindow();
if (OnConfirm) OnConfirm();
}.bindenv(this); }.bindenv(this);
AddUIChild(confirmButton); AddUIChild(confirmButton);
// 绘制标题 // 绘制标题
local confirmTextActor = FontAssetManager.GenerateNormal("确认", sq_RGBA(206, 189, 140, 255), true); local confirmTextActor = FontAssetManager.GenerateNormal("确认", true, {
color = sq_RGBA(206, 189, 140, 255)
});
confirmTextActor.SetPosition(17, 6); confirmTextActor.SetPosition(17, 6);
confirmButton.Addchild(confirmTextActor); confirmButton.Addchild(confirmTextActor);
@ -137,6 +142,10 @@ class _Yosin_MessageBox extends Yosin_Window {
} }
//设置确认回调函数
function SetOnConfirmFunc(OnConfirm) {
this.OnConfirm = OnConfirm;
}
//逻辑入口 //逻辑入口
function Proc(Dt) { function Proc(Dt) {

View File

@ -0,0 +1,197 @@
/*
文件名:234_HUD_FuncInter.nut
路径:User/UI/Window/234_HUD_FuncInter.nut
创建日期:2025-01-29 13:35
文件用途:NPC 与 玩家 功能交互
*/
_NameSpace_FunctionInteractive <- {};
class _NameSpace_FunctionInteractive._InteractiveButton extends Yosin_CommonUi {
//按钮状态
State = 0;
Sprite = null;
SpriteState = -1;
Info = null;
FramePath = "sprite/interface2/popup_menu/popup_back.img";
FrameList = null;
RoleTextActor = null;
Role = null;
RoleValue = null;
constructor(RoleName, RoleValue) {
this.Role = RoleName;
this.RoleValue = RoleValue;
base.constructor(0, 0, 100, 21);
if (AssetManager.EtcConfig.NpcRole.rawin(RoleName)) {
Info = AssetManager.EtcConfig.NpcRole[RoleName];
Init();
} else {
error("NPC 功能交互 功能错误");
}
}
function Init() {
FrameList = [];
//基础态
FrameList.push(CL_SpriteFrameObject(this.FramePath, 0));
//悬停态
FrameList.push(CL_SpriteFrameObject(this.FramePath, Info.imgidx * 2 + 1));
//按下态
FrameList.push(CL_SpriteFrameObject(this.FramePath, Info.imgidx * 2 + 2));
Sprite = CL_SpriteObject();
Addchild(Sprite);
//绘制功能图标
local RoleIconActor = CL_SpriteObject("sprite/interface2/popup_menu/popup_icon_" + Info.iconpath + ".img", Info.iconidx);
RoleIconActor.SetZOrder(1);
Addchild(RoleIconActor);
//功能文本
RoleTextActor = FontAssetManager.GenerateNormal(Info.name, true, {
color = Info.namecolor
});
RoleTextActor.SetPosition(18 + (82 - RoleTextActor.GetSize().w) / 2, 1);
RoleTextActor.SetZOrder(1);
Addchild(RoleTextActor);
OnClick = function(Btn) {
_NameSpace_FunctionInteractive[Role](RoleValue);
};
}
function ChangeFrame() {
//状态更改 刷新精灵帧
if (State != SpriteState) {
//按下时 文本下移
if (State == 2) {
RoleTextActor.MoveBy(0, 1);
} else if (SpriteState == 2) {
RoleTextActor.MoveBy(0, -1);
}
SpriteState = State;
Sprite.SetFrame(FrameList[SpriteState]);
}
}
function Proc(Dt) {
//不可用
if (State == 3) {
} else {
//按下
if (isLBDown) {
State = 2;
}
//悬停
else if (isInRect) {
State = 1;
}
//普通
else {
State = 0;
}
}
ChangeFrame();
}
}
//窗口主类
class _NameSpace_FunctionInteractive._FunctionInteractive extends Yosin_Window {
NpcInfo = null;
//顶层窗口
IsTop = true;
//生成器 如果这个窗口开着就刷新一下位置 如果没有就生成一个
function Generator(Id, Xpos, Ypos) {
local RealId = "NPC交互窗口" + Id;
foreach(Index, WindowObj in _SYS_WINDOW_LIST_) {
if (WindowObj.ObjectId == RealId) {
WindowObj.SetPosition(Xpos, Ypos);
WindowObj.ResetFocus();
return WindowObj;
}
}
return _NameSpace_FunctionInteractive._FunctionInteractive(Id, Xpos, Ypos);
}
//构造函数
constructor(Id, Xpos, Ypos) {
//获取npc数据
NpcInfo = AssetManager.GetNpc(Id);
//获取npc功能数量
local NpcFuncCount = NpcInfo.role.len();
// 默认构造数据 NpcFuncCount 要+1 因为还有他自己的头像
base.constructor("NPC交互窗口" + Id, Xpos, Ypos, 100, (NpcFuncCount + 1) * 21, 0);
ResetFocus();
// OpenDeBug();
// 初始化窗口
InitWindow();
}
// 初始化窗口
function InitWindow() {
local Header = CL_SpriteObject("sprite/interface2/popup_menu/popup_back.img", 0);
Addchild(Header);
//NPC头像
local NpcFace = CL_SpriteObject(NpcInfo["popup_face"].img, NpcInfo["popup_face"].idx);
Addchild(NpcFace);
//NPC名字
local NpcNameTextActor = FontAssetManager.GenerateNormal(NpcInfo.name, true, {
color = sq_RGBA(231, 199, 156, 250)
});
NpcNameTextActor.SetPosition(18 + (82 - NpcNameTextActor.GetSize().w) / 2, 1);
NpcNameTextActor.SetZOrder(1);
Addchild(NpcNameTextActor);
local pos = 1;
foreach(Role, Value in NpcInfo.role) {
local Buffer = _NameSpace_FunctionInteractive._InteractiveButton(Role, Value);
Buffer.SetPosition(0, pos * 21)
AddUIChild(Buffer);
pos++;
}
}
//override
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//点到自己 先执行子类Button的事件 在关闭自己
base.OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
CloseWindow();
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!WindowInteractiveFlag) base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
else CloseWindow();
//没点到自己直接关闭
if (!Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, X, Y, Width, Height)) CloseWindow();
}
}
//NPC商店回调
_NameSpace_FunctionInteractive["item shop"] <- function(Value) {
//判断是否生成过
foreach(Index, WindowObj in _SYS_WINDOW_LIST_) {
if (WindowObj.ObjectId == "NPC商店") {
WindowObj.ResetFocus();
ClientCharacterInventory.ResetFocus();
return;
}
}
//生成窗口
local WindowObj = UISpace_NpcShop.Shop("NPC商店", 130, 63, 366, 486, 20);
WindowObj.Init(Value);
WindowObj.ResetFocus();
ClientCharacterInventory.ResetFocus();
}

View File

@ -0,0 +1,104 @@
/*
文件名:235_HUD_QuantityInput.nut
路径:User/UI/Window/235_HUD_QuantityInput.nut
创建日期:2025-02-07 20:24
文件用途:数量输入
*/
class _QuantityInput extends Yosin_Window {
InputBox = null;
//确认回调函数
OnConfirm = null;
constructor(Xpos, Ypos) {
// 默认构造数据
base.constructor("数量输入交互窗口" + clock(), Xpos, Ypos, 176, 72, 0);
ResetFocus();
Init();
}
function Init() {
//背景
local Bg = Yosin_NineBoxStretch(178, 75, "sprite/interface/lenheartwindowcommon.img", 97);
Addchild(Bg);
//聊天输入框
InputBox = Yosin_NumberInputBox(94, 20);
InputBox.SetPosition(43, 16);
AddUIChild(InputBox);
//数量提示文字
local TextObject = FontAssetManager.GenerateNormal("数量:", false, {
color = sq_RGBA(255, 227, 171, 250)
});
TextObject.SetPosition(11, 16);
Addchild(TextObject);
//加号按钮
local AddButton = Yosin_BaseButton(140, 12, 26, 14, "sprite/interface/lenheartwindowcommon.img", 496);
AddButton.DownSimulateOffset = false;
AddUIChild(AddButton);
AddButton.OnClick = function(btn) {
InputBox.SetNumber(InputBox.GetNumber() + 10);
InputBox.SetFocus(true);
}.bindenv(this);
//减号按钮
local SubButton = Yosin_BaseButton(140, 28, 26, 14, "sprite/interface/lenheartwindowcommon.img", 499);
SubButton.DownSimulateOffset = false;
AddUIChild(SubButton);
SubButton.OnClick = function(btn) {
InputBox.SetNumber(InputBox.GetNumber() - 10);
InputBox.SetFocus(true);
}.bindenv(this);
//确认按钮
local confirmButton = Yosin_BaseButton(28, 42, 56, 24 "sprite/interface/lenheartwindowcommon.img", 12);
confirmButton.OnClick = function(Button) {
//关闭本窗口
DestroyWindow();
if (OnConfirm) OnConfirm(InputBox.GetNumber().tointeger());
}.bindenv(this);
AddUIChild(confirmButton);
// 绘制标题
local confirmTextActor = FontAssetManager.GenerateNormal("确认", false, {
color = sq_RGBA(185, 148, 96, 255)
});
confirmTextActor.SetPosition(16, 2);
confirmButton.Addchild(confirmTextActor);
//取消按钮
local cancelButton = Yosin_BaseButton(88, 42, 56, 24 "sprite/interface/lenheartwindowcommon.img", 12);
cancelButton.OnClick = function(Button) {
//关闭本窗口
DestroyWindow();
}.bindenv(this);
AddUIChild(cancelButton);
// 绘制标题
local cancelTextActor = FontAssetManager.GenerateNormal("取消", false, {
color = sq_RGBA(185, 148, 96, 255)
});
cancelTextActor.SetPosition(16, 2);
cancelButton.Addchild(cancelTextActor);
}
//设置确认回调函数
function SetOnConfirmFunc(OnConfirm) {
this.OnConfirm = OnConfirm;
}
//ovverride
//鼠标滚轮事件回调
function OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (!Visible) return;
if (InputBox.IsFocus) {
if (Wheel > 0) {
InputBox.SetNumber(InputBox.GetNumber() + 1);
} else {
InputBox.SetNumber(InputBox.GetNumber() - 1);
}
}
}
}

View File

@ -259,7 +259,7 @@ class _CreateCharacter extends Yosin_Window {
DestroyWindow(); DestroyWindow();
MySocket.Send(PACKET_ID.QUERY_CHARACTER_LIST, null); MySocket.Send(PACKET_ID.QUERY_CHARACTER_LIST, null);
local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1066, 600, 0); local Window = Sq_CreateWindow(_Select_Character_Window, "选择角色界面窗口", 0, 0, 1067, 600, 0);
Window.AddUpCharacter(TempCharacter); Window.AddUpCharacter(TempCharacter);
} else { } else {
// 创建失败. // 创建失败.
@ -788,10 +788,10 @@ class _create_Character_enterName extends Yosin_Window {
name = null; name = null;
constructor() { constructor() {
base.constructor("输入角色名称", 0, 0, 1066, 600, 0); base.constructor("输入角色名称", 0, 0, 1067, 600, 0);
//背景 //背景
local background = Yosin_NineBoxStretch( 240, 140, "sprite/interface/lenheartwindowcommon.img", 97); local background = Yosin_NineBoxStretch(240, 140, "sprite/interface/lenheartwindowcommon.img", 97);
background.SetPosition(413, 228); background.SetPosition(413, 228);
Addchild(background); Addchild(background);

View File

@ -32,10 +32,10 @@ class _Top_tool extends Yosin_Window {
} }
function RegisterWidget() { function RegisterWidget() {
local background = Yosin_EmeStretch( 650, 20, "sprite/interface/lenheartwindowcommon.img", 612); local background = Yosin_EmeStretch(650, 20, "sprite/interface/lenheartwindowcommon.img", 612);
Addchild(background); Addchild(background);
local timeBackGround = Yosin_EmeStretch( 90, 14, "sprite/interface/lenheartwindowcommon.img", 615); local timeBackGround = Yosin_EmeStretch(90, 14, "sprite/interface/lenheartwindowcommon.img", 615);
timeBackGround.SetPosition(14, 2); timeBackGround.SetPosition(14, 2);
Addchild(timeBackGround); Addchild(timeBackGround);
@ -110,8 +110,8 @@ class _Top_tool extends Yosin_Window {
//override //override
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseProc(MousePos_X, MousePos_Y); base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//设定拖动逻辑 //设定拖动逻辑
if (WindowMoveFlag) { if (WindowMoveFlag) {
@ -132,8 +132,8 @@ class _Top_tool extends Yosin_Window {
//override //override
//鼠标左键单击回调 //鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//如果点击事件在窗口内 //如果点击事件在窗口内
if (Math.IsIntersectRect(Yosin_Cursor.X, Yosin_Cursor.Y, 1, 1, X, Y, Width, Height)) { if (Math.IsIntersectRect(Yosin_Cursor.X, Yosin_Cursor.Y, 1, 1, X, Y, Width, Height)) {
WindowMoveFlag = true; WindowMoveFlag = true;
@ -149,9 +149,9 @@ class _Top_tool extends Yosin_Window {
//override //override
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法 //调用原生方法
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (WindowMoveFlag) { if (WindowMoveFlag) {
WindowMoveFlag = false; WindowMoveFlag = false;
M_Xpos = null; M_Xpos = null;

View File

@ -5,11 +5,21 @@
文件用途: 个人信息窗口 文件用途: 个人信息窗口
*/ */
// local infoWindow = Sq_CreateWindow(_PersonalInfo, "个人信息窗口", 250, 60, 286, 530, 20); //个人信息命名空间
class _PersonalInfo extends Yosin_Window { UISpace_PersonalInfo <- {};
class UISpace_PersonalInfo._PersonalInfo extends Yosin_Window {
//分页集合 0角色 1装扮 2护石
PageList = null;
//是否可见
Visible = false;
function _typeof() {
return "Game_Window";
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
PageList = [];
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local title = Yosin_TopTitle(gWidth, gHeight, "个人信息(M)"); local title = Yosin_TopTitle(gWidth, gHeight, "个人信息(M)");
@ -17,22 +27,49 @@ class _PersonalInfo extends Yosin_Window {
//注册控件 //注册控件
RegisterWidget(); RegisterWidget();
RegisterPage();
//注册按键回调事件
Input.RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_STATUS_WINDOW, function(Flag) {
//按下的时候
if (Flag == 1) {
//如果窗口已经打开
if (this.Visible) {
//关闭窗口
CloseWindow();
} else {
//打开窗口
ResetFocus();
}
}
}.bindenv(this));
} }
function RegisterWidget() { function RegisterWidget() {
// 标题按钮 // 标题按钮
local titlesBtn = Yosin_RowMoreTitleBtn(10, 25, 266, ["角色", "装扮/宠物", "护石"], "sprite/interface/lenheartwindowcommon.img", 160); local titlesBtn = Yosin_RowMoreTitleBtn(10, 25, 266, ["角色", "装扮", "护石"], "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn); AddUIChild(titlesBtn);
titlesBtn.LBDownOnClick = function(btns, index) { titlesBtn.LBDownOnClick = function(btns, index) {};
};
//关闭按钮
local closeBtn = Yosin_BaseButton(Width - 20, 4, 12, 12, "sprite/interface/lenheartwindowcommon.img", 544);
closeBtn.DownSimulateOffset = false;
closeBtn.SetZOrder(1);
closeBtn.OnClick = function(btn) {
CloseWindow();
}.bindenv(this);
AddUIChild(closeBtn);
// 角色信息
local roleInfo = roleInfoPage(10, titlesBtn.bottom() + 2 );
AddUIChild(roleInfo);
} }
function RegisterPage() {
//角色信息页
local RoleInfo = UISpace_PersonalInfo.RoleInfoPage(10, 48);
AddUIChild(RoleInfo);
PageList.push(RoleInfo);
}
//逻辑入口 //逻辑入口
@ -41,5 +78,16 @@ class _PersonalInfo extends Yosin_Window {
base.Proc(Dt); base.Proc(Dt);
} }
}
//刷新个人信息
function RefreshPersonalInfo() {
PageList[0].Refresh();
PageList[0].CharactersObject.InitCharacter();
}
//在Esc按下时
function OnEsc() {
CloseWindow();
}
}

View File

@ -1,451 +0,0 @@
/*
文件名:Personalinfo_RoleInfoPage.nut
路径:User/UI/Window/4_Personalinfo/Personalinfo_RoleInfoPage.nut
创建日期:2025-01-09 13:51
文件用途: 个人信息-角色信息页面
*/
// 角色信息
class roleInfoPage extends Yosin_CommonUi {
brown = sq_RGBA(160, 132, 75, 255);
green = sq_RGBA(74, 161, 87, 255);
Canvas = null;
constructor(gX, gY) {
local w = 266;
local h = 465;
base.constructor( gX, gY, w, h);
// 创建画布
Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(w, h);
// 开始绘制
Canvas.BeginDraw();
// 绘制
DrawWidget();
// 结束绘制
Canvas.EndDraw();
// 添加画布
Addchild(Canvas);
// 名称变更记录按钮
local nameChangeRecordBtn = Yosin_BaseButton(70, 7, 18, 17, "sprite/interface/newstyle/windows/inventory/inventory.img", 106);
nameChangeRecordBtn.DownSimulateOffset = false;
AddUIChild(nameChangeRecordBtn);
// 底部四个按钮
RegisterBottomButton();
}
function DrawWidget() {
// 背景
local backGround = CL_SpriteFrameObject("sprite/interface2/profile/profile.img", 60);
Canvas.DrawSpriteFrame(backGround, 0, 0);
// 上半部分 装备展示
local equipment = Personalinfo_CharactersEquipment();
Canvas.DrawSprite(equipment);
// 名称 等级 其他
RegisterNameAndOther();
// 属性
RegisterPropertyItems();
}
// 名称 等级 其他
function RegisterNameAndOther() {
// 名称
local nameY = 130;
local name = FontAssetManager.GenerateNormal("账号名称", true, {
color = sq_RGBA(161, 240, 163, 255)
});
Canvas.DrawActor(name, Width / 2 - name.GetSize().w / 2, nameY);
// 等级
local level = FontAssetManager.GenerateNormal("2级 角色名称", true, {
color = green
});
Canvas.DrawActor(level, Width / 2 - level.GetSize().w / 2, nameY + 15);
// 角色定位
local jobType = CL_SpriteFrameObject("sprite/interface2/profile/profile.img", 74);
// 职业
local job = FontAssetManager.GenerateNormal("[剑魂]", true, {
color = brown
});
local jobSize = job.GetSize();
local iconX = Width / 2 - (jobSize.w + 12) / 2;
Canvas.DrawSpriteFrame(jobType, iconX, nameY + 33);
Canvas.DrawActor(job, iconX + 12, nameY + 30);
// 冒险家名望Icon
local adventurerFameY = 187;
local adventurerFameX = 70;
local adventurerFame = CL_SpriteFrameObject("sprite/interface2/profile/profile_icon.img", 53);
local adventurerFameRight = adventurerFameX + adventurerFame.GetSize().w;
Canvas.DrawSpriteFrame(adventurerFame, adventurerFameX, adventurerFameY);
// 冒险家名望
local adventurerFameText = FontAssetManager.GenerateNormal("冒险家名望", true, {
color = brown
});
local adventurerFameTextRight = adventurerFameRight + 5 + adventurerFameText.GetSize().w;
Canvas.DrawActor(adventurerFameText, adventurerFameRight + 5, 185);
// 冒险家名望数值
local adventurerFameNum = FontAssetManager.GenerateNormal("7", true, {
color = green
});
Canvas.DrawActor(adventurerFameNum, adventurerFameTextRight + 5, 185);
}
// 属性
function RegisterPropertyItems() {
// 属性
local leftListX = 0;
local rightListX = 132;
local rowY = 213;
local rowH = 18;
// 生命
local life = roleInfoPropertyItem( 0, "生命", "100");
Canvas.DrawSprite(life, leftListX, rowY);
// 魔法
local magic = roleInfoPropertyItem( 1, "魔法", "100");
Canvas.DrawSprite(magic, rightListX, rowY);
rowY += rowH;
// 物理防御力
local physicalDefense = roleInfoPropertyItem(8, "物理防御力", "100", false);
Canvas.DrawSprite(physicalDefense, leftListX, rowY);
// 魔法防御力
local magicDefense = roleInfoPropertyItem( 9, "魔法防御力", "100");
Canvas.DrawSprite(magicDefense, rightListX, rowY);
rowY += rowH;
// 力量
local strength = roleInfoPropertyItem( 2, "力量", "100");
Canvas.DrawSprite(strength, leftListX, rowY);
// 智力
local intelligence = roleInfoPropertyItem( 3, "智力", "100");
Canvas.DrawSprite(intelligence, rightListX, rowY);
rowY += rowH;
// 体力
local vitality = roleInfoPropertyItem( 4, "体力", "100");
Canvas.DrawSprite(vitality, leftListX, rowY);
// 精神
local spirit = roleInfoPropertyItem( 5, "精神", "100");
Canvas.DrawSprite(spirit, rightListX, rowY);
rowY += rowH;
// 物理攻击力
local physicalATK = roleInfoPropertyItem( 6, "物理攻击力", "100");
Canvas.DrawSprite(physicalATK, leftListX, rowY);
// 魔法攻击力
local magicATK = roleInfoPropertyItem( 7, "魔法攻击力", "100");
Canvas.DrawSprite(magicATK, rightListX, rowY);
rowY += rowH;
// 物理暴击
local physicalCrit = roleInfoPropertyItem( 10, "物理暴击", "100");
Canvas.DrawSprite(physicalCrit, leftListX, rowY);
// 魔法暴击
local magicCrit = roleInfoPropertyItem( 11, "魔法暴击", "100");
Canvas.DrawSprite(magicCrit, rightListX, rowY);
rowY += rowH;
// 独立攻击
local independentAttack = roleInfoPropertyItem( 12, "独立攻击", "100");
Canvas.DrawSprite(independentAttack, leftListX, rowY);
rowY += rowH;
// 攻击速度
local attackSpeed = roleInfoPropertyItem(13, "攻击速度", "100");
Canvas.DrawSprite(attackSpeed, leftListX, rowY);
// 释放速度
local releaseSpeed = roleInfoPropertyItem( 14, "释放速度", "100");
Canvas.DrawSprite(releaseSpeed, rightListX, rowY);
rowY += rowH;
// 移动速度
local moveSpeed = roleInfoPropertyItem( 15, "移动速度", "100");
Canvas.DrawSprite(moveSpeed, leftListX, rowY);
rowY += rowH;
// 攻击属性
local attackProperty = roleInfoPropertyItem(16, "攻击属性", "火(0)/冰(0)/光(0)/暗(0)", true, 260);
Canvas.DrawSprite(attackProperty, leftListX, rowY);
}
// 底部四个按钮
function RegisterBottomButton() {
// 副职业
local subJob = otherButton(0, 401, 62, "副职业", false);
AddUIChild(subJob);
subJob.OnClick = function (btn) {
//todo 打开副职业面板
print(11111);
}.bindenv(this);
local separation = CL_SpriteObject("sprite/interface2/profile/profile.img", 70 );
separation.SetPosition(subJob.right(), subJob.Y + 7.5);
Addchild(separation);
// 战斗分析
local battleAnalysis = otherButton(subJob.right() + 1, subJob.Y, 64, "战斗分析");
AddUIChild(battleAnalysis);
battleAnalysis.OnClick = function (btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
local separationOne = CL_SpriteObject("sprite/interface2/profile/profile.img", 70 );
separationOne.SetPosition(battleAnalysis.right(), battleAnalysis.Y + 7.5);
Addchild(separationOne);
// 决斗信息 // 根据决斗场等级 显示 sprite/interface2/pvp02/pvprank_icon/tier_icon.img 24
local duelInfo = otherButton(battleAnalysis.right() + 1, battleAnalysis.Y, 14, "决斗信息", true);
AddUIChild(duelInfo);
duelInfo.OnClick = function (btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
local separationTwo = CL_SpriteObject("sprite/interface2/profile/profile.img", 70 );
separationTwo.SetPosition(duelInfo.right(), duelInfo.Y + 7.5);
Addchild(separationTwo);
// 详细信息
local detailedInformation = otherButton(duelInfo.right() + 1, duelInfo.Y, 66, "详细信息");
AddUIChild(detailedInformation);
detailedInformation.OnClick = function (btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
}
// 属性项
class roleInfoPropertyItem extends CL_CanvasObject {
// additionReaction 属性是否有加成 加成为绿色 不加成灰色
constructor(idx, title, numText, additionReaction = true, width = 125) {
local w = width;
local h = 18;
base.constructor();
// 重设大小并清空
ResizeAndClear(w, 18);
// 开始绘制
BeginDraw();
local titlecolor = additionReaction ? sq_RGBA(160, 132, 75, 255) : sq_RGBA(79, 79, 79, 255);
local numColor = additionReaction ? sq_RGBA(75, 161, 85, 255) : sq_RGBA(79, 79, 79, 255);
local iconX = 5;
local icon = CL_SpriteFrameObject("sprite/interface2/profile/profile_icon.img", idx);
local iconRight = iconX + icon.GetSize().w;
DrawSpriteFrame(icon, iconX, h/ 2 - icon.GetSize().h / 2);
// 属性名称
local property = FontAssetManager.GenerateNormal(title, true, {
color = titlecolor
});
DrawActor(property, iconRight + 5, 0);
// 属性数值
local propertyNum = FontAssetManager.GenerateNormal(numText, true, {
color = numColor
});
local numX = w - propertyNum.GetSize().w;
DrawActor(propertyNum, numX, 0);
// 结束绘制
EndDraw();
}
}
// 其他面板按钮
class otherButton extends Yosin_CommonUi {
// 是否启用按钮
enabled = true;
iconX = null;
iconY = null;
icon = null;
// pvp 是否是pvp 按钮
constructor(gX, gY, idx, title, pvp = false, enabled = true, ) {
base.constructor(gX, gY, 65, 65);
this.enabled = enabled;
local titlecolor = enabled? sq_RGBA(160, 132, 75, 255) : sq_RGBA(79, 79, 79, 255);
// 属性名称
local property = FontAssetManager.GenerateNormal(title, true, {
color = titlecolor
});
property.SetPosition( 32 - property.GetSize().w / 2 , 45 );
Addchild(property);
local path = pvp? "sprite/interface2/profile/profile_pvp_icon.img" : "sprite/interface2/profile/profile.img";
icon = CL_SpriteObject(path, enabled ? idx : idx +1 );
iconX = 32 - icon.GetSize().w / 2;
iconY = 45 / 2 - icon.GetSize().h / 2 + 3;
icon.SetPosition( iconX , iconY );
Addchild(icon);
}
function Proc(DT) {
if (isLBDown){
icon.SetPosition( iconX , iconY + 1 );
}else{
icon.SetPosition( iconX , iconY );
}
}
}
// 上半部分 人物装备穿戴
class Personalinfo_CharactersEquipment extends CL_CanvasObject {
// 展示其他装备
showOtherEquipment = null;
// 允许更换装备
allowChangeEquipment = null;
// // 画布
// Canvas = null;
constructor() {
local w = 248;
local h = 179;
base.constructor();
showOtherEquipment = true;
allowChangeEquipment = false;
// 创建画布
CL_CanvasObject();
// 重设大小并清空
ResizeAndClear(w, h);
// 设置填充画刷 用于绘制边框和线条
// Canvas.SetFillBrush(sq_RGBA(59, 56, 57, 250));
// 设置轮廓画刷 用于绘制边框和线条
// Canvas.SetStrokeBrush(sq_RGBA(59, 56, 57, 250));
// 开始绘制
BeginDraw();
// 绘制背景
DrawBackground(w);
// 结束绘制
EndDraw();
}
// 背景
function DrawBackground(Width) {
// 装备栏背景
local equipmentBackground = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 21);
DrawSpriteFrame(equipmentBackground, 5, 5);
// 顶部光线
local topLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178);
DrawSpriteFrame(topLight, Width / 2 - topLight.GetSize().w / 2, 0);
// todo 角色展示
// 结婚戒指槽位
local ringSlotBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory_cn.img", 0);
DrawSpriteFrame(ringSlotBg, Width / 2 - ringSlotBg.GetSize().w / 2, 5);
// todo 根据是否装备 显示装备
if (showOtherEquipment) {
// 辅助装备
local assist = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 19);
DrawSpriteFrame(assist, 179, 69);
// 耳环
local earrings = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 122);
DrawSpriteFrame(earrings, 179, 102);
// 魔法石
local MagicStone = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 20);
DrawSpriteFrame(MagicStone, 211, 101);
}
}
}
// if (!getroottable().rawin("chongzaiflag")) {
// getroottable()["chongzaiflag"] <- true;
// } else {
// //遍历窗口队列 如果可见则调用Show
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
// local Window = _SYS_WINDOW_LIST_[i];
// Window.Visible = false;
// Window.RemoveSelf();
// }
// TestStage();
// }

View File

@ -0,0 +1,626 @@
/*
文件名:RoleInfoPage.nut
路径:User/UI/Window/4_Personalinfo/RoleInfoPage.nut
创建日期:2025-02-15 02:03
文件用途:
*/
// 角色信息
class UISpace_PersonalInfo.RoleInfoPage extends Yosin_CommonUi {
w = 266;
h = 465;
brown = sq_RGBA(160, 132, 75, 255);
green = sq_RGBA(74, 161, 87, 255);
CanvasObj = null;
CharactersObject = null;
constructor(gX, gY) {
base.constructor(gX, gY, w, h);
//背景
local BackGround = CL_SpriteObject("sprite/interface2/profile/profile.img", 60);
BackGround.SetZOrder(-2);
Addchild(BackGround);
// 上半部分 装备展示
CharactersObject = UISpace_PersonalInfo.CharactersEquipment();
CharactersObject.SetPosition(0, 0);
CharactersObject.SetZOrder(-1);
AddUIChild(CharactersObject);
Refresh();
// // 名称变更记录按钮
// local nameChangeRecordBtn = Yosin_BaseButton(70, 7, 18, 17, "sprite/interface/newstyle/windows/inventory/inventory.img", 106);
// nameChangeRecordBtn.DownSimulateOffset = false;
// AddUIChild(nameChangeRecordBtn);
// 底部四个按钮
RegisterBottomButton();
}
//刷新
function Refresh() {
// 创建画布
if (CanvasObj) Removechild(CanvasObj);
CanvasObj = CL_CanvasObject();
// 重设大小并清空
CanvasObj.ResizeAndClear(w, h);
// 开始绘制
CanvasObj.BeginDraw();
// 绘制
DrawWidget();
// 结束绘制
CanvasObj.EndDraw();
Addchild(CanvasObj);
//刷新装备 如果背包对象存在
if (ClientCharacterInventory) {
local Slot = ClientCharacterInventory.PageList[0].CharactersObject.EquipmentSlot;
foreach(Index, SlotObj in Slot) {
if (SlotObj.Item) CharactersObject.SetEquipment(Index, SlotObj.Item);
}
}
}
function DrawWidget() {
// 名称 等级 其他
RegisterNameAndOther();
// 属性
RegisterPropertyItems();
}
// 名称 等级 其他
function RegisterNameAndOther() {
//获取角色
local Chr = ClientCharacter ? ClientCharacter : null;
if (!Chr) return;
// 名称
local nameY = 130;
local name = FontAssetManager.GenerateNormal("暂无冒险团", true, {
color = sq_RGBA(161, 240, 163, 255)
});
CanvasObj.DrawActor(name, Width / 2 - name.GetSize().w / 2, nameY);
// 等级
local level = FontAssetManager.GenerateNormal(format("%d级 %s", Chr.Level, Chr.Name), true, {
color = green
});
CanvasObj.DrawActor(level, Width / 2 - level.GetSize().w / 2, nameY + 15);
// 角色定位
local jobType = CL_SpriteFrameObject("sprite/interface2/profile/profile.img", 74);
// 职业
local job = FontAssetManager.GenerateNormal(format("[%s]", Chr.Info.Attribute[Chr.GrowJob].name), true, {
color = brown
});
local jobSize = job.GetSize();
local iconX = Width / 2 - (jobSize.w + 12) / 2;
CanvasObj.DrawSpriteFrame(jobType, iconX, nameY + 33);
CanvasObj.DrawActor(job, iconX + 12, nameY + 30);
// 冒险家名望Icon
local adventurerFameY = 187;
local adventurerFameX = 70;
local adventurerFame = CL_SpriteFrameObject("sprite/interface2/profile/profile_icon.img", 53);
local adventurerFameRight = adventurerFameX + adventurerFame.GetSize().w;
// print(adventurerFameX);
// print(adventurerFameY);
CanvasObj.DrawSpriteFrame(adventurerFame, adventurerFameX, adventurerFameY);
// 冒险家名望
local adventurerFameText = FontAssetManager.GenerateNormal("冒险家名望", true, {
color = brown
});
local adventurerFameTextRight = adventurerFameRight + 5 + adventurerFameText.GetSize().w;
CanvasObj.DrawActor(adventurerFameText, adventurerFameRight + 5, 185);
// 冒险家名望数值
local adventurerFameNum = FontAssetManager.GenerateNormal("0", true, {
color = green
});
CanvasObj.DrawActor(adventurerFameNum, adventurerFameTextRight + 5, 185);
}
// 属性
function RegisterPropertyItems() {
// 属性
local leftListX = 0;
local rightListX = 132;
local rowY = 213;
local rowH = 18;
//获取角色
local Chr = ClientCharacter ? ClientCharacter : null;
if (!Chr) return;
// 生命
local life = roleInfoPropertyItem(0, "生命", format("%d/%d", Chr.HP.tointeger(), Chr.Attr.HPMax.tointeger()));
CanvasObj.DrawSprite(life, leftListX, rowY);
// 魔法
local magic = roleInfoPropertyItem(1, "魔法", format("%d/%d", Chr.MP.tointeger(), Chr.Attr.MPMax.tointeger()));
CanvasObj.DrawSprite(magic, rightListX, rowY);
rowY += rowH;
// 物理防御力
local physicalDefense = roleInfoPropertyItem(8, "物理防御力", format("%d", Chr.Attr.EquipmentPhysicalDefense));
CanvasObj.DrawSprite(physicalDefense, leftListX, rowY);
// 魔法防御力
local magicDefense = roleInfoPropertyItem(9, "魔法防御力", format("%d", Chr.Attr.EquipmentMagicalDefense));
CanvasObj.DrawSprite(magicDefense, rightListX, rowY);
rowY += rowH;
// 力量
local strength = roleInfoPropertyItem(2, "力量", format("%d", Chr.Attr.PhysicalAttack));
CanvasObj.DrawSprite(strength, leftListX, rowY);
// 智力
local intelligence = roleInfoPropertyItem(3, "智力", format("%d", Chr.Attr.MagicalAttack));
CanvasObj.DrawSprite(intelligence, rightListX, rowY);
rowY += rowH;
// 体力
local vitality = roleInfoPropertyItem(4, "体力", format("%d", Chr.Attr.PhysicalDefense));
CanvasObj.DrawSprite(vitality, leftListX, rowY);
// 精神
local spirit = roleInfoPropertyItem(5, "精神", format("%d", Chr.Attr.MagicalDefense));
CanvasObj.DrawSprite(spirit, rightListX, rowY);
rowY += rowH;
// 物理攻击力
local physicalATK = roleInfoPropertyItem(6, "物理攻击力", format("%d", Chr.Attr.EquipmentPhysicalAttack));
CanvasObj.DrawSprite(physicalATK, leftListX, rowY);
// 魔法攻击力
local magicATK = roleInfoPropertyItem(7, "魔法攻击力", format("%d", Chr.Attr.EquipmentMagicalAttack));
CanvasObj.DrawSprite(magicATK, rightListX, rowY);
rowY += rowH;
// 物理暴击
local physicalCrit = roleInfoPropertyItem(10, "物理暴击", format("%d%%", Chr.Attr.PhysicalCriticalHit));
CanvasObj.DrawSprite(physicalCrit, leftListX, rowY);
// 魔法暴击
local magicCrit = roleInfoPropertyItem(11, "魔法暴击", format("%d%%", Chr.Attr.MagicalCriticalHit));
CanvasObj.DrawSprite(magicCrit, rightListX, rowY);
rowY += rowH;
// 独立攻击
local independentAttack = roleInfoPropertyItem(12, "独立攻击", format("%d", Chr.Attr.SeparateAttack));
CanvasObj.DrawSprite(independentAttack, leftListX, rowY);
rowY += rowH;
// 攻击速度
local attackSpeed = roleInfoPropertyItem(13, "攻击速度", format("%.1f%%", Chr.Attr.AttackSpeed.tofloat() / 100.0));
CanvasObj.DrawSprite(attackSpeed, leftListX, rowY);
// 释放速度
local releaseSpeed = roleInfoPropertyItem(14, "释放速度", format("%.1f%%", Chr.Attr.CastSpeed.tofloat() / 100.0));
CanvasObj.DrawSprite(releaseSpeed, rightListX, rowY);
rowY += rowH;
// 移动速度
local moveSpeed = roleInfoPropertyItem(15, "移动速度", format("%.1f%%", Chr.Attr.MoveSpeed.tofloat() / 100.0));
CanvasObj.DrawSprite(moveSpeed, leftListX, rowY);
rowY += rowH;
// 攻击属性
local attackProperty = roleInfoPropertyItem(16, "攻击属性", format("火(%d)/冰(%d)/光(%d)/暗(%d)", Chr.Attr.FireAttack, Chr.Attr.WaterAttack, Chr.Attr.LightAttack, Chr.Attr.DarkAttack), true, 260);
CanvasObj.DrawSprite(attackProperty, leftListX, rowY);
}
// 底部四个按钮
function RegisterBottomButton() {
// 副职业
local subJob = otherButton(0, 401, 62, "副职业", false);
AddUIChild(subJob);
subJob.OnClick = function(btn) {
//todo 打开副职业面板
print(11111);
}.bindenv(this);
local separation = CL_SpriteObject("sprite/interface2/profile/profile.img", 70);
separation.SetPosition(subJob.right(), subJob.Y + 7.5);
Addchild(separation);
// 战斗分析
local battleAnalysis = otherButton(subJob.right() + 1, subJob.Y, 64, "战斗分析");
AddUIChild(battleAnalysis);
battleAnalysis.OnClick = function(btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
local separationOne = CL_SpriteObject("sprite/interface2/profile/profile.img", 70);
separationOne.SetPosition(battleAnalysis.right(), battleAnalysis.Y + 7.5);
Addchild(separationOne);
// 决斗信息 // 根据决斗场等级 显示 sprite/interface2/pvp02/pvprank_icon/tier_icon.img 24
local duelInfo = otherButton(battleAnalysis.right() + 1, battleAnalysis.Y, 14, "决斗信息", true);
AddUIChild(duelInfo);
duelInfo.OnClick = function(btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
local separationTwo = CL_SpriteObject("sprite/interface2/profile/profile.img", 70);
separationTwo.SetPosition(duelInfo.right(), duelInfo.Y + 7.5);
Addchild(separationTwo);
// 详细信息
local detailedInformation = otherButton(duelInfo.right() + 1, duelInfo.Y, 66, "详细信息");
AddUIChild(detailedInformation);
detailedInformation.OnClick = function(btn) {
//todo 打开面板
print(11111);
}.bindenv(this);
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
}
// 属性项
class roleInfoPropertyItem extends CL_CanvasObject {
// additionReaction 属性是否有加成 加成为绿色 不加成灰色
constructor(idx, title, numText, additionReaction = true, width = 125) {
local w = width;
local h = 18;
base.constructor();
// 重设大小并清空
ResizeAndClear(w, 18);
// 开始绘制
BeginDraw();
local titlecolor = additionReaction ? sq_RGBA(160, 132, 75, 255) : sq_RGBA(79, 79, 79, 255);
local numColor = additionReaction ? sq_RGBA(75, 161, 85, 255) : sq_RGBA(79, 79, 79, 255);
local iconX = 5;
local icon = CL_SpriteFrameObject("sprite/interface2/profile/profile_icon.img", idx);
local iconRight = iconX + icon.GetSize().w;
DrawSpriteFrame(icon, iconX, h / 2 - icon.GetSize().h / 2);
// 属性名称
local property = FontAssetManager.GenerateNormal(title, true, {
color = titlecolor
});
DrawActor(property, iconRight + 5, 0);
// 属性数值
local propertyNum = FontAssetManager.GenerateNormal(numText, true, {
color = numColor
});
local numX = w - propertyNum.GetSize().w;
DrawActor(propertyNum, numX, 0);
// 结束绘制
EndDraw();
}
}
// 其他面板按钮
class otherButton extends Yosin_CommonUi {
// 是否启用按钮
enabled = true;
iconX = null;
iconY = null;
icon = null;
// pvp 是否是pvp 按钮
constructor(gX, gY, idx, title, pvp = false, enabled = true, ) {
base.constructor(gX, gY, 65, 65);
this.enabled = enabled;
local titlecolor = enabled ? sq_RGBA(160, 132, 75, 255) : sq_RGBA(79, 79, 79, 255);
// 属性名称
local property = FontAssetManager.GenerateNormal(title, true, {
color = titlecolor
});
property.SetPosition(32 - property.GetSize().w / 2, 45);
Addchild(property);
local path = pvp ? "sprite/interface2/profile/profile_pvp_icon.img" : "sprite/interface2/profile/profile.img";
icon = CL_SpriteObject(path, enabled ? idx : idx + 1);
iconX = 32 - icon.GetSize().w / 2;
iconY = 45 / 2 - icon.GetSize().h / 2 + 3;
icon.SetPosition(iconX, iconY);
Addchild(icon);
}
function Proc(DT) {
if (isLBDown) {
icon.SetPosition(iconX, iconY + 1);
} else {
icon.SetPosition(iconX, iconY);
}
}
}
//装备槽
class UISpace_PersonalInfo.EquipmentSlot extends Yosin_CommonUi {
Pos = null;
//悬停特效
HoverEffect = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor(gPos) {
this.Pos = gPos;
base.constructor(0, 0, 28, 28);
// OpenDeBug();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function SetItem(Item) {
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
if (Item) {
this.Item = Item;
//如果原先有图标则先移除图标在添加
if (this.ItemIcon) {
Removechild(this.ItemIcon);
}
this.ItemIcon = this.Item.GetIconSprite();
Addchild(this.ItemIcon);
this.ItemInfo = this.Item.GetInfoWindow();
} else {
this.Item = null;
if (this.ItemIcon) {
Removechild(this.ItemIcon);
this.ItemIcon = null;
}
this.ItemInfo = null;
}
}
//显示详细信息
function ShowInfo(x, y) {
if (!Item) return;
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//如果有道具
if (Item) {
//设置透明度
HoverEffect.SetOpacity(0.4);
if (!ItemInfoShowFlag) {
//显示详细信息
ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemInfo.RealCanvasHeight + 10) / 2));
}
}
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
//override
//鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
// 上半部分 人物装备穿戴
class UISpace_PersonalInfo.CharactersEquipment extends Yosin_CommonUi {
//背景画布对象
CanvasObject = null;
//角色显示对象
CharacterObject = null;
//装备格子槽 0护肩 1上衣 2下装 3腰带 4鞋子 5武器 6手镯 7项链 8戒指 9称号 10辅助装备 11魔法石 12耳环
EquipmentSlot = null;
EquipmentSlotPos = [
[10, 7],
[42, 7],
[10, 39],
[42, 39],
[10, 71],
[197, 7],
[197, 39],
[229, 39],
[229, 71],
[229, 7],
[197, 71],
[229, 103],
[197, 103],
];
//悬停特效
HoverEffect = null;
constructor() {
base.constructor(0, 0, 264, 179);
EquipmentSlot = [];
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 225);
HoverEffect.SetMode(0);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
// 绘制背景
DrawBackground();
// 初始化装备栏
InitEquipment();
//初始化角色
InitCharacter();
}
// 背景
function DrawBackground() {
local w = 264;
local h = 179;
// 创建画布
CanvasObject = CL_CanvasObject();
// 重设大小并清空
CanvasObject.ResizeAndClear(w, h);
// 开始绘制
CanvasObject.BeginDraw();
// 装备栏背景
local equipmentBackground = CL_SpriteFrameObject("sprite/interface2/profile/profile.img", 14);
CanvasObject.DrawSpriteFrame(equipmentBackground, 8, 5);
// 顶部光线
local topLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178);
CanvasObject.DrawSpriteFrame(topLight, Width / 2 - topLight.GetSize().w / 2, 0);
// todo 角色展示
// // 结婚戒指槽位
// local ringSlotBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory_cn.img", 0);
// DrawSpriteFrame(ringSlotBg, Width / 2 - ringSlotBg.GetSize().w / 2, 5);
// 辅助装备
local assist = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 19);
CanvasObject.DrawSpriteFrame(assist, 195, 69);
// 耳环
local earrings = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 122);
CanvasObject.DrawSpriteFrame(earrings, 195, 102);
// 魔法石
local MagicStone = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 20);
CanvasObject.DrawSpriteFrame(MagicStone, 227, 101);
// 结束绘制
CanvasObject.EndDraw();
Addchild(CanvasObject);
}
// 初始化装备栏
function InitEquipment() {
for (local i = 0; i< 13; i++) {
local SlotBuffer = UISpace_PersonalInfo.EquipmentSlot(i);
SlotBuffer.SetPosition(EquipmentSlotPos[i][0], EquipmentSlotPos[i][1]);
AddUIChild(SlotBuffer);
EquipmentSlot.push(SlotBuffer);
}
}
//初始化角色
function InitCharacter() {
if (!ClientCharacter) return;
if (CharacterObject) Removechild(CharacterObject);
CharacterObject = ClientCharacter.CreateTempAni("WaitingAni");
CharacterObject.SetPosition(200 - CharacterObject.GetSize().w, 260 - CharacterObject.GetSize().h);
Addchild(CharacterObject);
}
//设置装备栏装备
function SetEquipment(Slot, Equipment) {
EquipmentSlot[Slot].SetItem(Equipment);
}
}

View File

@ -4,16 +4,184 @@
创建日期:2025-01-06 14:06 创建日期:2025-01-06 14:06
文件用途: 背包窗口 文件用途: 背包窗口
*/ */
//背包命名空间
UISpace_Inventory <- {};
//主类
class UISpace_Inventory._Inventory extends Yosin_Window {
//分页集合 0装备 1装扮 2宠物
PageList = null;
//钱包
Wallet = null;
// 物品栏排列按钮
PermutationBtn = null;
// 物品栏设置按钮
SetBtn = null;
// 物品栏搜索按钮
SaerchBtn = null;
// 物品栏排列搜索按钮 在显示物品栏页 时的Y坐标
itemSetBtnY = 467;
//是否可见
Visible = false;
function _typeof() {
return "Game_Window";
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
PageList = [];
//调用父类构造函数
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//注册控件
RegisterWidget();
//注册背包页面
RegisterPage();
//注册按键回调事件
Input.RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_ITEM_INVENTORY, function(Flag) {
//按下的时候
if (Flag == 1) {
//如果窗口已经打开
if (this.Visible) {
//关闭窗口
CloseWindow();
} else {
//打开窗口
ResetFocus();
}
}
}.bindenv(this));
// ChangPage(1);
}
function RegisterWidget() {
//标题栏
local title = Yosin_TopTitle(Width, Height, "装备栏(I)");
Addchild(title);
//关闭按钮
local closeBtn = Yosin_BaseButton(Width - 20, 4, 12, 12, "sprite/interface/lenheartwindowcommon.img", 544);
closeBtn.DownSimulateOffset = false;
closeBtn.SetZOrder(1);
closeBtn.OnClick = function(btn) {
CloseWindow();
}.bindenv(this);
AddUIChild(closeBtn);
//置顶按钮
local topBtn = Yosin_BaseButton(Width - 35, 2, 13, 13, "sprite/interface/lenheartwindowcommon.img", 455);
topBtn.DownSimulateOffset = false;
topBtn.OnClick = function(btn) {}
AddUIChild(topBtn);
//分页按钮
local titlesBtn = Yosin_RowMoreTitleBtn(5, 25, 250, ["物品栏", "装扮", "宠物", "护石"], "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn);
titlesBtn.LBDownOnClick = function(btns, index) {
ChangPage(index);
}.bindenv(this);
// 排列按钮
PermutationBtn = Yosin_BaseButton(226, 467, 28, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 73);
PermutationBtn.SetZOrder(1);
AddUIChild(PermutationBtn);
// 设置
SetBtn = Yosin_BaseButton(PermutationBtn.X - 20, PermutationBtn.Y, 18, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 77);
SetBtn.SetZOrder(1);
AddUIChild(SetBtn);
// 搜索
SaerchBtn = Yosin_BaseButton(SetBtn.X - 24, PermutationBtn.Y, 23, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 94);
SaerchBtn.SetZOrder(1);
AddUIChild(SaerchBtn);
//钱包类
Wallet = UISpace_Inventory.Wallet(7, Height - 55, 248, 49);
AddUIChild(Wallet);
}
function RegisterPage() {
//物品栏 装备页
local EquipmentPage = UISpace_Inventory.EquipmentPage(2, 46, 300, 441);
PageList.push(EquipmentPage);
AddUIChild(EquipmentPage);
// 装扮页
local DressUpPage = UISpace_Inventory.DressUpPage(4, 46, 300, 441);
PageList.push(DressUpPage);
AddUIChild(DressUpPage);
DressUpPage.SetVisible(false);
}
//override
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
//类型说明 金币Gold 点券Cera 复活币ReviveCoin 代币券BindCera
//钱包操作
function WalletGet(Type, Value) {
return Wallet[Type];
}
function WalletSet(Type, Value) {
Wallet[Type] = Value;
}
//刷新背包中角色的Ani
function RefreshRoleAni() {
//装备页面的角色
PageList[0].CharactersObject.InitCharacter();
//装扮页面的角色
PageList[1].CharactersObject.InitCharacter();
}
// 切换页面
function ChangPage(gIndex) {
foreach(Index, Page in PageList) {
Page.SetVisible(false);
if (gIndex == Index) {
Page.SetVisible(true);
if (gIndex == 0) {
PermutationBtn.MoveBy(0, -23);
SetBtn.MoveBy(0, -23);
SaerchBtn.MoveBy(0, -23);
} else if (gIndex == 1) {
PermutationBtn.MoveBy(0, 23);
SetBtn.MoveBy(0, 23);
SaerchBtn.MoveBy(0, 23);
}
}
}
}
//在Esc按下时
function OnEsc() {
CloseWindow();
}
}
//钱包类 //钱包类
class Inventory_Wallet extends Yosin_CommonUi { class UISpace_Inventory.Wallet extends Yosin_CommonUi {
//复活币数量 //复活币数量
ReviveCoinCount = 0; ReviveCoinCount = 0;
ReviveCoinText = null; ReviveCoinText = null;
//胜利的证明数量 //代币券数量
WinCoinCount = 0; BindCeraCount = 0;
WinCoinText = null; BindCeraText = null;
//点卷数量 //点卷数量
CeraCount = 0; CeraCount = 0;
CeraText = null; CeraText = null;
@ -30,10 +198,10 @@ class Inventory_Wallet extends Yosin_CommonUi {
ReviveCoinText.SetPosition(120 - ReviveCoinText.GetSize().w, 2); ReviveCoinText.SetPosition(120 - ReviveCoinText.GetSize().w, 2);
break; break;
} }
case "WinCoin": { case "BindCera": {
WinCoinCount = val; BindCeraCount = val;
WinCoinText.SetText(WinCoinCount + "个"); BindCeraText.SetText(BindCeraCount + "个");
WinCoinText.SetPosition(245 - WinCoinText.GetSize().w, 2); BindCeraText.SetPosition(245 - BindCeraText.GetSize().w, 2);
break; break;
} }
case "Cera": { case "Cera": {
@ -54,9 +222,28 @@ class Inventory_Wallet extends Yosin_CommonUi {
} }
} }
function _get(idx) {
switch (idx) {
case "ReviveCoin": {
return ReviveCoinCount;
}
case "BindCera": {
return BindCeraCount;
}
case "Cera": {
return CeraCount;
}
case "Gold": {
return GoldCount;
}
default:
throw null;
break;
}
}
constructor(x, y, w, h) { constructor(x, y, w, h) {
base.constructor(x, y, w, h); base.constructor(x, y, w, h);
RegisterWidget(); RegisterWidget();
} }
@ -76,12 +263,12 @@ class Inventory_Wallet extends Yosin_CommonUi {
Addchild(ReviveCoinText); Addchild(ReviveCoinText);
// 胜利的证明 // 代币券
WinCoinText = FontAssetManager.GenerateNormal(WinCoinCount + "个", true, { BindCeraText = FontAssetManager.GenerateNormal(BindCeraCount + "个", true, {
color = txtColor color = txtColor
}); });
WinCoinText.SetPosition(245 - WinCoinText.GetSize().w + bg.X, 2); BindCeraText.SetPosition(245 - BindCeraText.GetSize().w + bg.X, 2);
Addchild(WinCoinText); Addchild(BindCeraText);
// 商城 // 商城
@ -114,140 +301,3 @@ class Inventory_Wallet extends Yosin_CommonUi {
Addchild(GoldText); Addchild(GoldText);
} }
} }
//主类
class _Inventory extends Yosin_Window {
//分页集合 0装备 1装扮 2宠物
PageList = null;
//钱包
Wallet = null;
// 物品栏排列按钮
permutationBtn = null;
// 物品栏设置按钮
setBtn = null;
// 物品栏搜索按钮
saerchBtn = null;
// 物品栏排列搜索按钮 在显示物品栏页 时的Y坐标
itemSetBtnY = 467;
//是否可见
Visible = false;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
PageList = [];
//调用父类构造函数
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//注册控件
RegisterWidget();
//注册背包页面
RegisterPage();
//注册按键回调事件
Input.RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_ITEM_INVENTORY, function(Flag) {
//抬起的时候
if (Flag == 0) {
//如果窗口已经打开
if (this.Visible) {
//关闭窗口
CloseWindow();
} else {
//打开窗口
ResetFocus();
}
}
}.bindenv(this));
}
function RegisterWidget() {
//标题栏
local title = Yosin_TopTitle(Width, Height, "装备栏(I)");
Addchild(title);
//关闭按钮
local closeBtn = Yosin_BaseButton(Width - 20, 4, 12, 12, "sprite/interface/lenheartwindowcommon.img", 544);
closeBtn.DownSimulateOffset = false;
closeBtn.SetZOrder(1);
closeBtn.OnClick = function(btn) {
CloseWindow();
}.bindenv(this);
AddUIChild(closeBtn);
//置顶按钮
local topBtn = Yosin_BaseButton(Width - 35, 2, 13, 13, "sprite/interface/lenheartwindowcommon.img", 455);
topBtn.DownSimulateOffset = false;
topBtn.OnClick = function(btn) {}
AddUIChild(topBtn);
//分页按钮
local titlesBtn = Yosin_RowMoreTitleBtn(5, 25, 250, ["物品栏", "装扮", "宠物", "护石"], "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn);
titlesBtn.LBDownOnClick = function(btns, index) {
ChangPage(index);
}.bindenv(this);
// 排列按钮
permutationBtn = Yosin_BaseButton(226, itemSetBtnY, 28, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 73);
permutationBtn.SetZOrder(1);
AddUIChild(permutationBtn);
// 设置
setBtn = Yosin_BaseButton(permutationBtn.X - 20, permutationBtn.Y, 18, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 77);
setBtn.SetZOrder(1);
AddUIChild(setBtn);
// 搜索
saerchBtn = Yosin_BaseButton(setBtn.X - 24, permutationBtn.Y, 23, 23 "sprite/interface/newstyle/windows/inventory/inventory.img", 94);
saerchBtn.SetZOrder(1);
AddUIChild(saerchBtn);
//钱包类
Wallet = Inventory_Wallet(7, Height - 55, 248, 49);
AddUIChild(Wallet);
}
function RegisterPage() {
//物品栏 装备页
local EquipmentPage = Inventory_EquipmentPage(2, 46, 300, 441);
PageList.push(EquipmentPage);
AddUIChild(EquipmentPage);
// 装扮页
local DressUpPage = Inventory_DressUpPage(4, 46, 300, 441);
PageList.push(DressUpPage);
AddUIChild(DressUpPage);
DressUpPage.SetVisible(false);
}
//override
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
// 切换页面
function ChangPage(gIndex) {
foreach(Index, Page in PageList) {
Page.SetVisible(false);
if (gIndex == Index) {
Page.SetVisible(true);
if (gIndex == 0) {
permutationBtn.SetPosition(permutationBtn.X, itemSetBtnY);
setBtn.SetPosition(setBtn.X, itemSetBtnY);
saerchBtn.SetPosition(saerchBtn.X, itemSetBtnY);
} else if (gIndex == 1) {
permutationBtn.SetPosition(permutationBtn.X, itemSetBtnY + 28);
setBtn.SetPosition(setBtn.X, permutationBtn.Y);
saerchBtn.SetPosition(saerchBtn.X, permutationBtn.Y);
}
}
}
}
}

View File

@ -0,0 +1,343 @@
/*
文件名:AvatarCollect.nut
路径:User/UI/Window/5_Inventory/AvatarCollect.nut
创建日期:2025-02-16 09:07
文件用途:装扮物品栏
*/
//物品槽
class UISpace_Inventory.ItemSlot_Avatar {
X = null;
Y = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor() {
}
function SyncPos(x, y) {
this.X = x;
this.Y = y;
}
function SetItem(Item) {
this.Item = Item;
this.ItemIcon = this.Item.GetIconSprite();
}
//生成详细信息
function GenerateInfo() {
this.ItemInfo = this.Item.GetInfoWindow();
}
//显示详细信息
function ShowInfo(x, y) {
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
}
// 物品栏
class UISpace_Inventory.AvatarCollection extends Yosin_CommonUi {
//栏位类型
Type = null;
// 悬浮时显示的框
HoverEffect = null;
//行数
RowNum = null;
//底层画布对象
BottomCanvas = null;
//顶层画布对象
TopCanvas = null;
//物品对象List
ItemList = null;
//当前显示详细信息的物品对象
CurrentShowItem = null;
//当前鼠标指向的位置
ItemPos = null;
//拖拽物品原来的位置
DragItemPos = null;
constructor(x, y, rowNum, type) {
this.Type = type;
this.RowNum = rowNum;
//计算实际需要的高度
local RealH = 30 * rowNum;
base.constructor(x, y, 239, RealH);
//构造相应数量的槽
ItemList = array(8 * rowNum, null);
//整体底板
InitOverallBasePlate();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
//根据高度绘制整体底板
function InitOverallBasePlate() {
// 创建画布
BottomCanvas = CL_CanvasObject();
// 重设大小并清空
BottomCanvas.ResizeAndClear(239, this.RowNum * 30);
// 开始绘制
BottomCanvas.BeginDraw();
foreach(pos, ItemObj in ItemList) {
local XPos = (pos % 8) * 30;
local YPos = (pos / 8) * 30;
local bg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 49);
BottomCanvas.DrawSpriteFrame(bg, XPos, YPos);
}
// 结束绘制
BottomCanvas.EndDraw();
// 添加画布
Addchild(BottomCanvas);
}
//设置道具列表
function SetItemList(gItemList) {
//创建道具
foreach(Index, ItemObject in gItemList) {
ItemList[Index] = UISpace_Inventory.ItemSlot();
ItemList[Index].SetItem(ItemObject);
}
RefreshItemList();
}
//设置道具格子
function SetItemSlot(Idx, ItemObject) {
if (ItemObject == null) {
ItemList[Idx] = null;
} else {
ItemList[Idx] = UISpace_Inventory.ItemSlot();
ItemList[Idx].SetItem(ItemObject);
SetAddEffect(Idx);
}
RefreshItemList();
}
//设置添加特效
function SetAddEffect(Idx) {
local AddEffect = Animation("ui/inventory/slot.ani");
AddEffect.SetPosition((Idx % 8) * 30, (Idx / 8) * 30);
AddEffect.SetZOrder(100);
AddEffect.SetUpdateFunc(function(Ani, Dt) {
if (Ani.IsUsability == false) Ani.RemoveSelf();
});
Addchild(AddEffect);
}
//刷新道具列表
function RefreshItemList() {
//如果不存在则构造画布
if (!TopCanvas) {
// 创建画布
TopCanvas = CL_CanvasObject();
// 添加画布
Addchild(TopCanvas);
}
// 重设大小并清空
TopCanvas.ResizeAndClear(239, this.RowNum * 30);
// 开始绘制
TopCanvas.BeginDraw();
foreach(pos, ItemObj in ItemList) {
if (ItemObj) {
local XPos = (pos % 8) * 30;
local YPos = (pos / 8) * 30;
ItemObj.ItemIcon.SetPosition(XPos, YPos);
TopCanvas.DrawSprite(ItemObj.ItemIcon, XPos, YPos);
}
}
// 结束绘制
TopCanvas.EndDraw();
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
local WorldPosition = this.GetWorldPosition();
local xx = MousePos_X - WorldPosition.x;
local yy = MousePos_Y - WorldPosition.y;
local column = (yy / 30).tointeger();
//悬停的时候有可能悬停到最下面的最后一条缝 会导致判定行数多了一行 所以这里做限制
column = (column <= (RowNum - 1) ? column : (RowNum - 1));
local row = (xx / 30).tointeger();
//指向的项目位置
local Idx = column * 8 + row;
ItemPos = Idx;
//如果有道具
if (ItemList[Idx]) {
//设置透明度
HoverEffect.SetOpacity(0.4);
//如果没有物品信息窗口
if (!ItemList[Idx].ItemInfo) {
ItemList[Idx].GenerateInfo();
}
if (!ItemList[Idx].ItemInfoShowFlag) {
//关闭上一个显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
//如果当前没有拖拽物品时才打开详细信息窗口
if (!IMouse.DragObj) {
//显示详细信息
ItemList[Idx].ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemList[Idx].ItemInfo.RealCanvasHeight + 10) / 2));
//记录当前显示的对象
CurrentShowItem = ItemList[Idx];
}
}
} else {
//关闭上一个显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
HoverEffect.SetOpacity(1);
}
//设置悬停槽
HoverEffect.SetVisible(true);
HoverEffect.SetPosition(row * 30, column * 30);
} else {
ItemPos = null;
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
foreach(ItemObj in ItemList) {
if (ItemObj && ItemObj.ItemInfoShowFlag) {
ItemObj.CloseInfo();
}
}
}
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
if (ItemPos != null && ItemList[ItemPos]) {
//记录拖拽物品
IMouse.AddDragObject(ItemList[ItemPos]);
//记录拖拽物品原来的位置
DragItemPos = ItemPos;
//从槽中移除
ItemList[ItemPos] = null;
//刷新物品列表
RefreshItemList();
}
}
//override
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (IMouse.DragObj) {
//如果拖动到窗口内部 发包交换位置
local WorldPosition = this.GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, WorldPosition.x, WorldPosition.y, Width, Height)) {
MySocket.Send(PACKET_ID.INVENTORY_SWAP_ITEM, {
oldBaid = 9,
newBaid = 9,
oldPos = this.DragItemPos,
newPos = this.ItemPos,
});
}
//移除鼠标上的拖动道具
local DragItem = IMouse.RemoveDragObject();
//发包完成后先把道具放回去
ItemList[DragItemPos] = DragItem;
DragItemPos = null;
RefreshItemList();
}
}
//override
//鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
if (ItemPos != null && ItemList[ItemPos]) {
//穿戴装备
if (this.Type == 0) {
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 9,
oldPos = ItemPos
});
}
//使用道具
else if (this.Type == 1) {
}
}
}
//移动Item逻辑
function MoveItem(oldPos, newPos) {
//如果这个格子不是空的 要把他放回交换的位置
if (ItemList[newPos] != null) {
local Temp = ItemList[newPos];
ItemList[oldPos] = Temp;
}
ItemList[newPos] = DragItem;
RefreshItemList();
}
}

View File

@ -6,9 +6,13 @@
*/ */
// 背包装扮页面 // 背包装扮页面
class Inventory_DressUpPage extends Yosin_CommonUi { class UISpace_Inventory.DressUpPage extends Yosin_CommonUi {
CharactersObject = null;
ItemCollectionList = null;
ScrollObject = null;
constructor(x, y, w, h) { constructor(x, y, w, h) {
ItemCollectionList = [];
base.constructor(x, y, w, h); base.constructor(x, y, w, h);
DrawWidget(); DrawWidget();
@ -17,76 +21,330 @@ class Inventory_DressUpPage extends Yosin_CommonUi {
function DrawWidget() { function DrawWidget() {
// 人物装扮穿戴 // 人物装扮穿戴
local CharactersDressUp = Inventory_CharactersDressUp(); CharactersObject = UISpace_Inventory.CharactersDressUp();
CharactersDressUp.SetPosition(0, 0); CharactersObject.SetPosition(0, 0);
Addchild(CharactersDressUp); AddUIChild(CharactersObject);
// 镶嵌徽章 // 镶嵌徽章
local InsetBadge = Yosin_BaseButton(150, 137, 97, 22, "sprite/interface/newstyle/windows/inventory/inventory.img", 90); local InsetBadge = Yosin_BaseButton(150, 137, 97, 22, "sprite/interface/newstyle/windows/inventory/inventory.img", 90);
AddUIChild(InsetBadge); AddUIChild(InsetBadge);
//框背景
local itemBg = Yosin_NineBoxStretch(252, 250, "sprite/interface/lenheartwindowcommon.img", 97);
itemBg.SetOpacity(0.6);
itemBg.SetPosition(2, 197);
Addchild(itemBg);
//分页按钮 //分页按钮
local titlesBtn = Yosin_RowMoreTitleBtn(2, 180, 250, ["装扮", "徽章"], "sprite/interface/lenheartwindowcommon.img", 160); local titlesBtn = Yosin_RowMoreTitleBtn(2, 180, 250, ["装扮"], "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn); AddUIChild(titlesBtn);
// titlesBtn.LBDownOnClick = function(btns, index) { // 物品栏
for (local i = 0; i< 1; i++) {
// }; local ItemCollection = UISpace_Inventory.AvatarCollection(3, 202, 8, i)
AddUIChild(ItemCollection);
ItemCollectionList.push(ItemCollection);
} }
// 添加按钮 //滚动条
function AddBtn() { ScrollObject = Yosin_ScrollBar(243, 203, 242, 20);
local ibtn = Yosin_BaseButton(); ScrollObject.SetScrollBarState(false);
ScrollObject.SetChangeCallBack(function(Value) {
// MsgTextWindow.SetScrollPos(Value);
}.bindenv(this));
AddUIChild(ScrollObject);
} }
//设定物品栏列表
function SetItemCollectionList(Type, List) {
ItemCollectionList[Type].SetItemList(List);
}
//设定物品栏槽
function SetItemCollectionSlot(Type, Index, Item) {
ItemCollectionList[Type].SetItemSlot(Index, Item);
}
} }
//装扮
class UISpace_Inventory.AvatarSlot extends Yosin_CommonUi {
Pos = null;
//悬停特效
HoverEffect = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor(gPos) {
this.Pos = gPos;
base.constructor(0, 0, 28, 28);
// OpenDeBug();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function SetItem(Item) {
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
if (Item) {
this.Item = Item;
//如果原先有图标则先移除图标在添加
if (this.ItemIcon) {
Removechild(this.ItemIcon);
}
this.ItemIcon = this.Item.GetIconSprite();
Addchild(this.ItemIcon);
this.ItemInfo = this.Item.GetInfoWindow();
} else {
this.Item = null;
if (this.ItemIcon) {
Removechild(this.ItemIcon);
this.ItemIcon = null;
}
this.ItemInfo = null;
}
}
//显示详细信息
function ShowInfo(x, y) {
if (!Item) return;
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//如果有道具
if (Item) {
//设置透明度
HoverEffect.SetOpacity(0.4);
if (!ItemInfoShowFlag) {
//显示详细信息
ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemInfo.RealCanvasHeight + 10) / 2));
}
}
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
//override
//鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !WindowInteractiveFlag) {
//发送脱下装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 8,
oldPos = Pos
});
}
}
//override
//鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
// 上半部分 人物装扮穿戴 // 上半部分 人物装扮穿戴
class Inventory_CharactersDressUp extends CL_CanvasObject { class UISpace_Inventory.CharactersDressUp extends Yosin_CommonUi {
//背景画布对象
CanvasObject = null;
//角色显示对象
CharacterObject = null;
//0武器装扮 1光环装扮 2头部装扮 3帽子装扮 4脸部装扮 5胸部装扮 6上衣装扮 7皮肤装扮 8腰部装扮 9下装装扮 10鞋装扮
EquipmentSlot = null;
EquipmentSlotPos = [
[117, 32],
[117, 66],
[150, 32],
[183, 32],
[216, 32],
[150, 66],
[183, 66],
[216, 66],
[150, 100],
[183, 100],
[216, 100],
];
//悬停特效
HoverEffect = null;
constructor() { constructor() {
local w = 254; base.constructor(0, 0, 250, 175);
local h = 178; EquipmentSlot = [];
base.constructor();
// 创建画布 HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 225);
CL_CanvasObject(); HoverEffect.SetMode(0);
// 重设大小并清空 HoverEffect.SetZOrder(1);
ResizeAndClear(w, h); HoverEffect.SetVisible(false);
// 开始绘制 Addchild(HoverEffect);
BeginDraw();
// 绘制背景 // 绘制背景
DrawBackground(); DrawBackground();
// 初始化装备栏
// 结束绘制 InitEquipment();
EndDraw(); //初始化角色
InitCharacter();
} }
// 背景 // 背景
function DrawBackground() { function DrawBackground() {
local w = 248;
local h = 179;
// 创建画布
CanvasObject = CL_CanvasObject();
// 重设大小并清空
CanvasObject.ResizeAndClear(w, h);
// 开始绘制
CanvasObject.BeginDraw();
// 背景边框 // 背景边框
local bg = Yosin_NineBoxStretch(254, 178, "sprite/interface/lenheartwindowcommon.img", 97); local bg = Yosin_NineBoxStretch(254, 178, "sprite/interface/lenheartwindowcommon.img", 97);
DrawSprite(bg, 0, 0); CanvasObject.DrawSprite(bg, 0, 0);
// 装备装扮背景 // 装备装扮背景
local itemBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 11); local itemBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 11);
DrawSpriteFrame(itemBg, 116, 31); CanvasObject.DrawSpriteFrame(itemBg, 116, 31);
// 魔法阵 // 魔法阵
local MagicLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 179); local MagicLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 179);
DrawSpriteFrame(MagicLight, 5, 55); CanvasObject.DrawSpriteFrame(MagicLight, 5, 55);
// 人物打光 // 人物打光
local CharacterLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178); local CharacterLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178);
DrawSpriteFrame(CharacterLight, -10, 4); CanvasObject.DrawSpriteFrame(CharacterLight, -10, 4);
// 结束绘制
CanvasObject.EndDraw();
Addchild(CanvasObject);
}
// 初始化装备栏
function InitEquipment() {
for (local i = 0; i< 11; i++) {
local SlotBuffer = UISpace_Inventory.AvatarSlot(i);
SlotBuffer.SetPosition(EquipmentSlotPos[i][0], EquipmentSlotPos[i][1]);
AddUIChild(SlotBuffer);
EquipmentSlot.push(SlotBuffer);
}
}
//初始化角色
function InitCharacter() {
if (!ClientCharacter) return;
if (CharacterObject) Removechild(CharacterObject);
CharacterObject = ClientCharacter.CreateTempAni("WaitingAni");
CharacterObject.SetPosition(122 - CharacterObject.GetSize().w, 260 - CharacterObject.GetSize().h);
Addchild(CharacterObject);
}
//设置装备栏装备
function SetEquipment(Slot, Equipment) {
EquipmentSlot[Slot].SetItem(Equipment);
// //同步到角色对象中 时装暂不赋予属性 并且这里可能会与装备冲突 如果需要拓展 要先解决
// ClientCharacter.Equip[Slot] <- Equipment;
} }
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
//如果有拖动道具
if (IMouse.DragObj) {
HoverEffect.SetOpacity(0.4);
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
}
} else {
HoverEffect.SetVisible(false);
}
}
//override
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//必须是装备也拖上去的才触发
if (ClientCharacterInventory.PageList[0].CurrentItemListPage == 0) {
//鼠标上必须有拖拽物品
if (IMouse.DragObj) {
if (isInRect) {
//获取拖动道具在背包中的位置
local Pos = IMouse.DragObj.Item.PosInKnapsack;
//发送穿戴装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 2,
oldPos = Pos
});
}
}
}
}
} }

View File

@ -6,12 +6,15 @@
*/ */
// 背包物品栏页面 // 背包物品栏页面
class Inventory_EquipmentPage extends Yosin_CommonUi { class UISpace_Inventory.EquipmentPage extends Yosin_CommonUi {
//人物装备 //人物装备
CharactersEquipment = null; CharactersObject = null;
//物品栏 //物品栏List
ItemCollection = null; ItemCollectionList = null;
//当前物品栏页面
CurrentItemListPage = 0;
//重量进度条 //重量进度条
WeightSchedule = null; WeightSchedule = null;
//总可承载重量 //总可承载重量
@ -24,9 +27,9 @@ class Inventory_EquipmentPage extends Yosin_CommonUi {
// 人物装备 // 人物装备
CharactersEquipment = Inventory_CharactersEquipment(); CharactersObject = UISpace_Inventory.CharactersEquipment();
CharactersEquipment.SetPosition(5, 0); CharactersObject.SetPosition(5, 0);
Addchild(CharactersEquipment); AddUIChild(CharactersObject);
// 添加书本按钮 // 添加书本按钮
AddBookButton(); AddBookButton();
@ -67,11 +70,12 @@ class Inventory_EquipmentPage extends Yosin_CommonUi {
AddUIChild(itemBtns); AddUIChild(itemBtns);
itemBtns.LBDownOnClick = function(btns, index) { itemBtns.LBDownOnClick = function(btns, index) {
foreach(Iindex, ItemCollectionBuffer in ItemCollection) { foreach(Iindex, ItemCollectionListBuffer in ItemCollectionList) {
if (Iindex == index) { if (Iindex == index) {
ItemCollectionBuffer.SetVisible(true); CurrentItemListPage = index;
ItemCollectionListBuffer.SetVisible(true);
} else { } else {
ItemCollectionBuffer.SetVisible(false); ItemCollectionListBuffer.SetVisible(false);
} }
} }
}.bindenv(this); }.bindenv(this);
@ -82,15 +86,14 @@ class Inventory_EquipmentPage extends Yosin_CommonUi {
Addchild(itemBg); Addchild(itemBg);
// 物品栏 // 物品栏
ItemCollection = []; ItemCollectionList = [];
for (local i = 0; i< 5; i++) { for (local i = 0; i< 5; i++) {
local ItemCollectionBuffer = _ItemCollection(itemBg.X + 7, itemBg.Y + 3, 7); local ItemCollectionListBuffer = UISpace_Inventory.ItemCollection(itemBg.X + 7, itemBg.Y + 3, 7, i);
ItemCollection.push(ItemCollectionBuffer); ItemCollectionList.push(ItemCollectionListBuffer);
AddUIChild(ItemCollectionBuffer); AddUIChild(ItemCollectionListBuffer);
if (i != 0) ItemCollectionBuffer.SetVisible(false); if (i != 0) ItemCollectionListBuffer.SetVisible(false);
} }
local itemBgBottom = itemBg.bottom(); local itemBgBottom = itemBg.bottom();
// 重量 // 重量
local weight = FontAssetManager.GenerateNormal("重量", true, { local weight = FontAssetManager.GenerateNormal("重量", true, {
@ -117,86 +120,304 @@ class Inventory_EquipmentPage extends Yosin_CommonUi {
//设定物品栏列表 //设定物品栏列表
function SetItemCollectionList(Type, List) { function SetItemCollectionList(Type, List) {
ItemCollection[Type].SetItemList(List); ItemCollectionList[Type].SetItemList(List);
} }
//设定物品栏槽
function SetItemCollectionSlot(Type, Index, Item) {
ItemCollectionList[Type].SetItemSlot(Index, Item);
}
}
//装备槽
class UISpace_Inventory.EquipmentSlot extends Yosin_CommonUi {
Pos = null;
//悬停特效
HoverEffect = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor(gPos) {
this.Pos = gPos;
base.constructor(0, 0, 28, 28);
// OpenDeBug();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetZOrder(1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function SetItem(Item) {
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
if (Item) {
this.Item = Item;
//如果原先有图标则先移除图标在添加
if (this.ItemIcon) {
Removechild(this.ItemIcon);
}
this.ItemIcon = this.Item.GetIconSprite();
Addchild(this.ItemIcon);
this.ItemInfo = this.Item.GetInfoWindow();
} else {
this.Item = null;
if (this.ItemIcon) {
Removechild(this.ItemIcon);
this.ItemIcon = null;
}
this.ItemInfo = null;
}
}
//显示详细信息
function ShowInfo(x, y) {
if (!Item) return;
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//如果有道具
if (Item) {
//设置透明度
HoverEffect.SetOpacity(0.4);
if (!ItemInfoShowFlag) {
//显示详细信息
ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemInfo.RealCanvasHeight + 10) / 2));
}
}
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
//override
//鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !WindowInteractiveFlag) {
//发送脱下装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 1,
oldPos = Pos
});
}
}
//override
//鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
} }
// 上半部分 人物装备穿戴 // 上半部分 人物装备穿戴
class Inventory_CharactersEquipment extends CL_CanvasObject { class UISpace_Inventory.CharactersEquipment extends Yosin_CommonUi {
//背景画布对象
CanvasObject = null;
//角色显示对象
CharacterObject = null;
//装备格子槽 0护肩 1上衣 2下装 3腰带 4鞋子 5武器 6手镯 7项链 8戒指 9称号 10辅助装备 11魔法石 12耳环
EquipmentSlot = null;
EquipmentSlotPos = [
[6, 6],
[38, 6],
[6, 38],
[38, 38],
[6, 70],
[180, 6],
[180, 38],
[212, 38],
[212, 70],
[212, 6],
[180, 70],
[212, 102],
[180, 103],
];
//悬停特效
HoverEffect = null;
constructor() { constructor() {
local w = 248; base.constructor(0, 0, 248, 179);
local h = 179; EquipmentSlot = [];
base.constructor();
// 创建画布 HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 225);
CL_CanvasObject(); HoverEffect.SetMode(0);
// 重设大小并清空 HoverEffect.SetZOrder(1);
ResizeAndClear(w, h); HoverEffect.SetVisible(false);
// 开始绘制 Addchild(HoverEffect);
BeginDraw();
// 绘制背景 // 绘制背景
DrawBackground(w); DrawBackground();
// 初始化装备栏
// 结束绘制 InitEquipment();
EndDraw(); //初始化角色
InitCharacter();
} }
// 背景 // 背景
function DrawBackground(Width) { function DrawBackground() {
local w = 248;
local h = 179;
// 创建画布
CanvasObject = CL_CanvasObject();
// 重设大小并清空
CanvasObject.ResizeAndClear(w, h);
// 开始绘制
CanvasObject.BeginDraw();
// 背景图 // 背景图
local bgimg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventorybackground.img", 0); local bgimg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventorybackground.img", 0);
// 画布绘制背景 // 画布绘制背景
DrawSpriteFrame(bgimg, 0, 0); CanvasObject.DrawSpriteFrame(bgimg, 0, 0);
// 装备栏背景 // 装备栏背景
local equipmentBackground = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 21); local equipmentBackground = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 21);
DrawSpriteFrame(equipmentBackground, 5, 5); CanvasObject.DrawSpriteFrame(equipmentBackground, 5, 5);
// 顶部光线 // 顶部光线
local topLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178); local topLight = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 178);
DrawSpriteFrame(topLight, Width / 2 - topLight.GetSize().w / 2, 0); CanvasObject.DrawSpriteFrame(topLight, w / 2 - topLight.GetSize().w / 2, 0);
// todo 角色展示
// 结婚戒指槽位 // 结婚戒指槽位
local ringSlotBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory_cn.img", 0); // local ringSlotBg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory_cn.img", 0);
DrawSpriteFrame(ringSlotBg, Width / 2 - ringSlotBg.GetSize().w / 2, 5); // CanvasObject.DrawSpriteFrame(ringSlotBg, w / 2 - ringSlotBg.GetSize().w / 2, 5);
// 辅助装备 // 辅助装备
local assist = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 19); local assist = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 19);
DrawSpriteFrame(assist, 179, 69); CanvasObject.DrawSpriteFrame(assist, 179, 69);
// 耳环 // 耳环
local earrings = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 122); local earrings = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 122);
DrawSpriteFrame(earrings, 179, 102); CanvasObject.DrawSpriteFrame(earrings, 179, 102);
// 魔法石 // 魔法石
local MagicStone = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 20); local MagicStone = CL_SpriteFrameObject("sprite/interface/newstyle/windows/inventory/inventory.img", 20);
DrawSpriteFrame(MagicStone, 211, 101); CanvasObject.DrawSpriteFrame(MagicStone, 211, 101);
// 结束绘制
CanvasObject.EndDraw();
Addchild(CanvasObject);
}
// 初始化装备栏
function InitEquipment() {
for (local i = 0; i< 13; i++) {
local SlotBuffer = UISpace_Inventory.EquipmentSlot(i);
SlotBuffer.SetPosition(EquipmentSlotPos[i][0], EquipmentSlotPos[i][1]);
AddUIChild(SlotBuffer);
EquipmentSlot.push(SlotBuffer);
}
}
//初始化角色
function InitCharacter() {
if (!ClientCharacter) return;
if (CharacterObject) Removechild(CharacterObject);
CharacterObject = ClientCharacter.CreateTempAni("WaitingAni");
CharacterObject.SetPosition(126, 152);
Addchild(CharacterObject);
}
//设置装备栏装备
function SetEquipment(Slot, Equipment) {
EquipmentSlot[Slot].SetItem(Equipment);
//同步到角色对象中
ClientCharacter.Equip[Slot] <- Equipment;
} }
} //override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
//如果有拖动道具
if (IMouse.DragObj) {
HoverEffect.SetOpacity(0.4);
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
}
} else {
HoverEffect.SetVisible(false);
}
}
// if (!getroottable().rawin("chongzaiflag")) { //override
// getroottable()["chongzaiflag"] <- true; //鼠标左键弹起回调
// } else { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
// //遍历窗口队列 如果可见则调用Show if (!Visible) return;
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) { base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
// local Window = _SYS_WINDOW_LIST_[i];
// Window.Visible = false; //必须是装备也拖上去的才触发
// Window.RemoveSelf(); if (ClientCharacterInventory.PageList[0].CurrentItemListPage == 0) {
// } //鼠标上必须有拖拽物品
// TestStage(); if (IMouse.DragObj) {
// } if (isInRect) {
//获取拖动道具在背包中的位置
local Pos = IMouse.DragObj.Item.PosInKnapsack;
//发送穿戴装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 2,
oldPos = Pos
});
}
}
}
}
}

View File

@ -5,7 +5,7 @@
文件用途: 物品栏 文件用途: 物品栏
*/ */
//物品槽 //物品槽
class ItemSlot { class UISpace_Inventory.ItemSlot {
X = null; X = null;
Y = null; Y = null;
@ -41,6 +41,22 @@ class ItemSlot {
function ShowInfo(x, y) { function ShowInfo(x, y) {
if (!this.ItemInfo) GenerateInfo(); if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true; this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置 //设置位置
this.ItemInfo.SetPosition(x, y); this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus(); this.ItemInfo.ResetFocus();
@ -57,8 +73,10 @@ class ItemSlot {
// 物品栏 // 物品栏
class _ItemCollection extends Yosin_CommonUi { class UISpace_Inventory.ItemCollection extends Yosin_CommonUi {
//栏位类型
Type = null;
// 悬浮时显示的框 // 悬浮时显示的框
HoverEffect = null; HoverEffect = null;
//行数 //行数
@ -73,13 +91,12 @@ class _ItemCollection extends Yosin_CommonUi {
CurrentShowItem = null; CurrentShowItem = null;
//当前鼠标指向的位置 //当前鼠标指向的位置
ItemPos = null; ItemPos = null;
//拖拽中的物品对象
DragItem = null;
//拖拽物品原来的位置 //拖拽物品原来的位置
DragItemPos = null; DragItemPos = null;
constructor(x, y, rowNum) { constructor(x, y, rowNum, type) {
this.Type = type;
this.RowNum = rowNum; this.RowNum = rowNum;
//计算实际需要的高度 //计算实际需要的高度
local RealH = 30 * rowNum; local RealH = 30 * rowNum;
@ -121,16 +138,37 @@ class _ItemCollection extends Yosin_CommonUi {
//设置道具列表 //设置道具列表
function SetItemList(gItemList) { function SetItemList(gItemList) {
//创建道具 //创建道具
foreach(Index, ItemObject in gItemList) { foreach(Index, ItemObject in gItemList) {
ItemList[Index] = ItemSlot(); ItemList[Index] = UISpace_Inventory.ItemSlot();
ItemList[Index].SetItem(ItemObject); ItemList[Index].SetItem(ItemObject);
} }
RefreshItemList(); RefreshItemList();
} }
//设置道具格子
function SetItemSlot(Idx, ItemObject) {
if (ItemObject == null) {
ItemList[Idx] = null;
} else {
ItemList[Idx] = UISpace_Inventory.ItemSlot();
ItemList[Idx].SetItem(ItemObject);
SetAddEffect(Idx);
}
RefreshItemList();
}
//设置添加特效
function SetAddEffect(Idx) {
local AddEffect = Animation("ui/inventory/slot.ani");
AddEffect.SetPosition((Idx % 8) * 30, (Idx / 8) * 30);
AddEffect.SetZOrder(100);
AddEffect.SetUpdateFunc(function(Ani, Dt) {
if (Ani.IsUsability == false) Ani.RemoveSelf();
});
Addchild(AddEffect);
}
//刷新道具列表 //刷新道具列表
function RefreshItemList() { function RefreshItemList() {
//如果不存在则构造画布 //如果不存在则构造画布
@ -159,9 +197,9 @@ class _ItemCollection extends Yosin_CommonUi {
//override //override
//鼠标事件回调 //鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) { function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y); base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) { if (isInRect) {
local WorldPosition = this.GetWorldPosition(); local WorldPosition = this.GetWorldPosition();
@ -188,7 +226,7 @@ class _ItemCollection extends Yosin_CommonUi {
CurrentShowItem.CloseInfo(); CurrentShowItem.CloseInfo();
} }
//如果当前没有拖拽物品时才打开详细信息窗口 //如果当前没有拖拽物品时才打开详细信息窗口
if (!DragItem) { if (!IMouse.DragObj) {
//显示详细信息 //显示详细信息
ItemList[Idx].ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemList[Idx].ItemInfo.RealCanvasHeight + 10) / 2)); ItemList[Idx].ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemList[Idx].ItemInfo.RealCanvasHeight + 10) / 2));
//记录当前显示的对象 //记录当前显示的对象
@ -219,57 +257,87 @@ class _ItemCollection extends Yosin_CommonUi {
//override //override
//鼠标左键按下回调 //鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) { function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y); base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象 //关闭显示的对象
if (CurrentShowItem) { if (CurrentShowItem) {
CurrentShowItem.CloseInfo(); CurrentShowItem.CloseInfo();
} }
if (ItemPos != null && ItemList[ItemPos]) { if (ItemPos != null && ItemList[ItemPos]) {
DragItem = ItemList[ItemPos]; //记录拖拽物品
IMouse.AddDragObject(ItemList[ItemPos]);
//记录拖拽物品原来的位置
DragItemPos = ItemPos; DragItemPos = ItemPos;
//从槽中移除
ItemList[ItemPos] = null; ItemList[ItemPos] = null;
local IconBuffer = DragItem.Item.GetIconSprite(); //刷新物品列表
IconBuffer.SetPosition(-15, -15);
IMouse.AttachObjectBottom("ItemCollectDragItem", IconBuffer);
RefreshItemList(); RefreshItemList();
} }
} }
//override //override
//鼠标左键弹起回调 //鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) { function OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return; if (!Visible) return;
base.OnMouseLbUp(MousePos_X, MousePos_Y); base.OnMouseLbUp(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (DragItem) { if (IMouse.DragObj) {
//如果这个格子不是空的 要把他放回交换的位置 //如果拖动到窗口内部 发包交换位置
if (ItemList[ItemPos] != null) { local WorldPosition = this.GetWorldPosition();
local Temp = ItemList[ItemPos]; if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, WorldPosition.x, WorldPosition.y, Width, Height)) {
ItemList[DragItemPos] = Temp; MySocket.Send(PACKET_ID.INVENTORY_SWAP_ITEM, {
DragItemPos = null; oldBaid = this.Type + 2,
newBaid = this.Type + 2,
oldPos = this.DragItemPos,
newPos = this.ItemPos,
});
} }
ItemList[ItemPos] = DragItem; //移除鼠标上的拖动道具
DragItem = null; local DragItem = IMouse.RemoveDragObject();
IMouse.RemoveObject("ItemCollectDragItem"); //发包完成后先把道具放回去
ItemList[DragItemPos] = DragItem;
DragItemPos = null;
RefreshItemList(); RefreshItemList();
} }
} }
//override
//鼠标右键按下回调
function OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseRbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (CurrentShowItem) {
CurrentShowItem.CloseInfo();
}
if (ItemPos != null && ItemList[ItemPos]) {
//穿戴装备
if (this.Type == 0) {
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 2,
oldPos = ItemPos
});
}
//使用道具
else if (this.Type == 1) {
}
}
}
//移动Item逻辑
function MoveItem(oldPos, newPos) {
//如果这个格子不是空的 要把他放回交换的位置
if (ItemList[newPos] != null) {
local Temp = ItemList[newPos];
ItemList[oldPos] = Temp;
}
ItemList[newPos] = DragItem;
RefreshItemList();
}
} }
// if (!getroottable().rawin("chongzaiflag")) {
// getroottable()["chongzaiflag"] <- true;
// } else {
// //遍历窗口队列 如果可见则调用Show
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
// local Window = _SYS_WINDOW_LIST_[i];
// Window.Visible = false;
// Window.RemoveSelf();
// }
// TestStage();
// }

View File

@ -5,161 +5,6 @@
文件用途: 文件用途:
*/ */
//主类
class _PlayerChat extends Yosin_Window {
//是否为顶层窗口
IsTop = true;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local background = PlayerChat_Backgournd();
Addchild(background);
RegisterWidget();
}
function RegisterWidget() {
// 普通
local ordinary = PlayerChat_SplicingButton(6, 206, 53, 20, 8, "普通", sq_RGBA(255, 255, 255, 255));
AddUIChild(ordinary);
ordinary.LBDownOnClick = function(btn) {
print(111);
}
ordinary.OnTriangleClick = function(btn) {
print(222);
}
// 公会
local notice = PlayerChat_SplicingButton(60, 206, 53, 20, 47, "公会", sq_RGBA(254, 77, 245, 255));
AddUIChild(notice);
notice.LBDownOnClick = function(btn) {
print(111);
}
notice.OnTriangleClick = function(btn) {
print(222);
}
// 频道
local channel = PlayerChat_SplicingButton(114, 206, 53, 20, 48, "频道", sq_RGBA(221, 153, 197, 255));
AddUIChild(channel);
channel.LBDownOnClick = function(btn) {
print(111);
}
channel.OnTriangleClick = function(btn) {
print(222);
}
// 募集
local raise = PlayerChat_SplicingButton(168, 206, 53, 20, 49, "募集", sq_RGBA(105, 212, 238, 255));
AddUIChild(raise);
raise.LBDownOnClick = function(btn) {
print(111);
}
raise.OnTriangleClick = function(btn) {
print(222);
}
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
}
// 背景
class PlayerChat_Backgournd extends CL_CanvasObject {
constructor() {
base.constructor();
DrawBackground();
}
// 绘制背景
function DrawBackground() {
// 创建画布
CL_CanvasObject();
// 重设大小并清空
ResizeAndClear(332, 600);
// 开始绘制
BeginDraw();
local topLine = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 159);
DrawSpriteFrame(topLine, 0, 0);
local topBg = CL_SpriteObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 160);
topBg.SetPosition(0, 2);
topBg.SetScale(1, 28);
DrawSprite(topBg);
local bimg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 161);
DrawSpriteFrame(bimg, 0, 30);
local bottomBg = CL_SpriteObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 162);
bottomBg.SetPosition(0, 561);
bottomBg.SetScale(1, 38);
DrawSprite(bottomBg);
local bottomLine = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 163);
DrawSpriteFrame(bottomLine, 0, 598);
// 系统按钮
local systemBtnBackground = Yosin_EmeStretch(53, 21, "sprite/interface/lenheartwindowcommon.img", 166);
DrawSprite(systemBtnBackground, 6, 15);
local systemText = FontAssetManager.GenerateNormal("系统", true, {
color = sq_RGBA(200, 173, 134, 255)
});
DrawActor(systemText, 18, 18);
// 系统
local SystemBround = Yosin_NineBoxStretch(321, 72, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
DrawSprite(SystemBround, 6, 35);
// 喇叭按钮
local megaphoneBtnBackground = Yosin_EmeStretch(53, 21, "sprite/interface/lenheartwindowcommon.img", 166);
DrawSprite(megaphoneBtnBackground, 6, 109);
// 喇叭
local megaphoneext = FontAssetManager.GenerateNormal("喇叭", true, {
color = sq_RGBA(255, 239, 1, 255)
});
DrawActor(megaphoneext, 18, 112);
// 喇叭
local megaphoneBround = Yosin_NineBoxStretch(321, 72, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
DrawSprite(megaphoneBround, 6, 130);
// 消息
local PlayerChatBround = Yosin_NineBoxStretch(321, 345, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
DrawSprite(PlayerChatBround, 6, 225);
// 结束绘制
EndDraw();
}
}
// 消息分类按钮 // 消息分类按钮
class PlayerChat_SplicingButton extends Yosin_CommonUi { class PlayerChat_SplicingButton extends Yosin_CommonUi {
@ -170,11 +15,19 @@ class PlayerChat_SplicingButton extends Yosin_CommonUi {
SpriteState = -1; SpriteState = -1;
FrameList = null; FrameList = null;
select = false; Select = false;
cacheY = null; cacheY = null;
//大按钮
BigButton = null;
//三角按钮
TriangleButton = null;
//左键按下回调
LBDown = null;
//左键单击回调
LBDownOnClick = null; LBDownOnClick = null;
//三角按钮单击回调
OnTriangleClick = null; OnTriangleClick = null;
@ -187,11 +40,11 @@ class PlayerChat_SplicingButton extends Yosin_CommonUi {
Addchild(Sprite); Addchild(Sprite);
for (local i = 0; i< 3; i++) { for (local i = 0; i< 3; i++) {
local canvas = Yosin_EmeStretch(W, H, "sprite/interface/lenheartwindowcommon.img", 160 + i * 3); local canvas = Yosin_EmeStretch(W, H, "sprite/interface/lenheartwindowcommon.img", 160 + i * 3);
local Sf = canvas.ExportSpriteFrame(); local Sf = canvas.ExportSpriteFrame();
FrameList.push(Sf); FrameList.push(Sf);
} }
ChangeFrame();
// 文字 // 文字
local Text = FontAssetManager.GenerateNormal(title, true, { local Text = FontAssetManager.GenerateNormal(title, true, {
@ -206,18 +59,18 @@ class PlayerChat_SplicingButton extends Yosin_CommonUi {
Addchild(triangle); Addchild(triangle);
// 按钮 // 按钮
local bigButton = Yosin_BaseButton(0, 0, W - 15, H, "sprite/interface/lenheartwindowcommon.img", 70); BigButton = Yosin_BaseButton(0, 0, W - 15, H, "sprite/interface/lenheartwindowcommon.img", 70);
AddUIChild(bigButton); AddUIChild(BigButton);
bigButton.OnClick = function(btn) { BigButton.OnClick = function(btn) {
if (LBDownOnClick) { if (LBDownOnClick) {
LBDownOnClick(this); LBDownOnClick(this);
}; };
}.bindenv(this); }.bindenv(this);
// 三角按钮 // 三角按钮
local triangleButton = Yosin_BaseButton(W - 15, 0, 15, H, "sprite/interface/lenheartwindowcommon.img", 70); TriangleButton = Yosin_BaseButton(W - 15, 0, 15, H, "sprite/interface/lenheartwindowcommon.img", 70);
AddUIChild(triangleButton); AddUIChild(TriangleButton);
triangleButton.OnClick = function(btn) { TriangleButton.OnClick = function(btn) {
if (OnTriangleClick) { if (OnTriangleClick) {
OnTriangleClick(this); OnTriangleClick(this);
}; };
@ -241,29 +94,415 @@ class PlayerChat_SplicingButton extends Yosin_CommonUi {
} }
} }
function Proc(Dt) { //override
//鼠标事件回调
if (select) return; function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//不可用 if (Select) return;
if (State == 3) { if (isInRect) {
} else {
//按下
if (isLBDown) {
State = 2;
select = true;
}
//悬停
else if (isInRect) {
State = 1; State = 1;
} } else {
//普通
else {
State = 0; State = 0;
} }
}
ChangeFrame(); ChangeFrame();
} }
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isLBDown && !TriangleButton.isInRect) {
ChangeSelectState(true);
LBDown(this);
}
}
//更改选中状态
function ChangeSelectState(Flag) {
if (Flag) {
State = 2;
Select = true;
ChangeFrame();
} else {
State = 0;
Select = false;
ChangeFrame();
}
}
}
class PlayerChat_InputBox extends Yosin_CommonUi {
//表情按钮
EmotionButton = null;
//框背景
BoxBackground = null;
//聊天信息类型
ChatType = 0;
//文本
TextObject = null;
Text = "";
//输入光标
InputCursor = null;
//输入位置
InputPos = 0;
//是否获取焦点
IsFocus = false;
constructor() {
base.constructor(0, 0, 321, 28);
// 按钮
EmotionButton = Yosin_BaseButton(0, 0, 24, 24, "sprite/interface/newstyle/windows/chatting/chatting_new.img", 37);
EmotionButton.DownSimulateOffset = false;
AddUIChild(EmotionButton);
EmotionButton.OnClick = function(btn) {
}.bindenv(this);
//输入框
BoxBackground = Yosin_NineBoxStretch(297, 25, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
BoxBackground.SetPosition(24, 0);
Addchild(BoxBackground);
//文本
TextObject = FontAssetManager.GenerateNormal("", false, {
color = sq_RGBA(255, 255, 255, 250)
});
TextObject.SetPosition(28, 3);
Addchild(TextObject);
//输入光标
InputCursor = CreateCursor();
InputCursor.SetUpdateFunc(function(Object, Dt) {
//处于焦点中执行
if (IsFocus) {
//光标闪烁逻辑
{
if (!(Object.Var.rawin("TimeFlag"))) {
Object.Var.TimeFlag <- 0;
Object.Var.VisibleFlag <- false;
}
Object.Var.TimeFlag += Dt;
if (Object.Var.TimeFlag >= 500) {
Object.Var.TimeFlag <- 0;
Object.SetVisible(Object.Var.VisibleFlag);
Object.Var.VisibleFlag <- !Object.Var.VisibleFlag;
}
}
//同步光标位置逻辑
{
Object.SetPosition(TextObject.X + TextObject.GetSize().w, 4);
}
}
}.bindenv(this));
Addchild(InputCursor);
_Imm_Input_Func_.rawset(C_Object, Imm_Input.bindenv(this));
}
//判断是否中文字符
function IsChineseChar(code) {
return (code & 0x80) != 0;
}
//接收文本数据
function Imm_Input(str) {
if (!this) return -1;
if (!IsFocus) return;
//退格键
if (str == "\b") {
if (this.Text.len() > 0) {
this.Text = Sq_RemoveStringLast(this.Text);
}
}
//换行符去掉
else if (str != "\r") this.Text += str;
//同步文本对象数据
TextObject.SetText(this.Text);
//每次设置文本时确保光标显示
InputCursor.SetVisible(true);
InputCursor.Var.TimeFlag <- 0;
InputCursor.Var.VisibleFlag <- false;
}
function CreateCursor() {
local Canvas = CL_CanvasObject();
// 重设大小并清空
Canvas.ResizeAndClear(1, 15);
// 开始绘制
Canvas.BeginDraw();
Canvas.SetFillBrush(sq_RGBA(255, 255, 255, 250));
Canvas.SetStrokeBrush(sq_RGBA(255, 255, 255, 250));
Canvas.DrawLine(1, 1, 1, 15);
// 结束绘制
Canvas.EndDraw();
Canvas.SetVisible(false);
return Canvas;
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
SetFocus(true);
} else {
SetFocus(false);
}
}
//设置焦点模式
function SetFocus(Flag) {
IsFocus = Flag;
InputCursor.SetVisible(Flag);
Sq_SetImmEnabled(Flag);
}
//回车键回调
function OnEnter() {
SetFocus(!IsFocus);
//发送消息了
if (!IsFocus && this.Text.len() > 0) {
MySocket.Send(PACKET_ID.SEND_CHAT_MESSAGE, {
msg = this.Text,
type = this.ChatType
});
this.Text = "";
TextObject.SetText(this.Text);
//还原光标位置避免闪烁
InputCursor.SetPosition(TextObject.X, 4);
}
}
}
//消息渲染窗口
class _PlayerChat_RenderMsg_Window extends Yosin_Window {
//是否为独立窗口
IsIndependent = false;
//是否为图层窗口
IsLayer = true;
//消息文本对象
MsgTextObject = null;
//文本Y轴偏移量
TextYposOffset = 0;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
SetClipRect(0, 0, 321, 534);
MsgTextObject = CL_CanvasObject();
Addchild(MsgTextObject);
}
//渲染消息
function RenderMsg() {
MsgTextObject.ResizeAndClear(321, 5000);
MsgTextObject.BeginDraw();
TextYposOffset = 0;
foreach(Index, Msg in Parent.MsgManager) {
local Name = FontAssetManager.GenerateNormal(Msg.name + ": ", false, {
color = sq_RGBA(255, 255, 255, 255),
});
MsgTextObject.DrawActor(Name, 0, TextYposOffset);
local Text = FontAssetManager.GenerateNormal(Msg.msg, false, {
color = sq_RGBA(255, 255, 255, 255),
wrap_width = 300 - Name.GetSize().w
});
MsgTextObject.DrawActor(Text, Name.GetSize().w, TextYposOffset);
//绘制完成后增加Y轴的偏移量
TextYposOffset += Text.GetSize().h;
}
if (TextYposOffset > 534) {
Parent.ScrollObject.SetScrollBarHeight(534.0 / TextYposOffset.tofloat() * 534.0);
}
MsgTextObject.EndDraw();
}
//设置滚动位置
function SetScrollPos(Rate) {
MsgTextObject.SetPosition(0, -(TextYposOffset - 534) * Rate);
}
}
//主类
class _PlayerChat extends Yosin_Window {
//是否为顶层窗口
IsTop = true;
//消息分类按钮List
SplicingButtonList = null;
//消息管理器
MsgManager = null;
//消息文本对象
MsgTextWindow = null;
//聊天输入框
InputBox = null;
//滚动条
ScrollObject = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
SplicingButtonList = [];
MsgManager = [];
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
//渲染背景
RenderBackground();
//注册组件
RegisterWidget();
//注册按键回调事件
Input.RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_ENTER, function(Flag) {
//抬起的时候
if (Flag == 0) {
InputBox.OnEnter();
}
}.bindenv(this));
getroottable().ClientChatWindow <- this;
}
function RenderBackground() {
local Bg = CL_CanvasObject();
// 重设大小并清空
Bg.ResizeAndClear(332, 600);
// 开始绘制
Bg.BeginDraw();
local topLine = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 159);
Bg.DrawSpriteFrame(topLine, 0, 0);
local topBg = CL_SpriteObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 160);
topBg.SetPosition(0, 2);
topBg.SetScale(1, 28);
Bg.DrawSprite(topBg);
local bimg = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 161);
Bg.DrawSpriteFrame(bimg, 0, 30);
local bottomBg = CL_SpriteObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 162);
bottomBg.SetPosition(0, 561);
bottomBg.SetScale(1, 38);
Bg.DrawSprite(bottomBg);
local bottomLine = CL_SpriteFrameObject("sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 163);
Bg.DrawSpriteFrame(bottomLine, 0, 598);
// 消息
local PlayerChatBround = Yosin_NineBoxStretch(321, 544, "sprite/interface/newstyle/windows/chatting/chatting_ver4.img", 265);
PlayerChatBround.SetPosition(6, 29);
Bg.DrawSprite(PlayerChatBround);
// 结束绘制
Bg.EndDraw();
Addchild(Bg);
}
function RegisterWidget() {
// 普通
local ordinary = PlayerChat_SplicingButton(6, 10, 53, 20, 8, "普通", sq_RGBA(255, 255, 255, 255));
ordinary.ChangeSelectState(true);
AddUIChild(ordinary);
ordinary.LBDown = function(btn) {
ChangeSplicing(0);
}.bindenv(this);
ordinary.LBDownOnClick = function(btn) {}.bindenv(this);
ordinary.OnTriangleClick = function(btn) {}.bindenv(this);
SplicingButtonList.push(ordinary);
// 公会
local notice = PlayerChat_SplicingButton(60, 10, 53, 20, 47, "公会", sq_RGBA(254, 77, 245, 255));
AddUIChild(notice);
notice.LBDown = function(btn) {
ChangeSplicing(1);
}.bindenv(this);
notice.LBDownOnClick = function(btn) {}.bindenv(this);
notice.OnTriangleClick = function(btn) {}.bindenv(this);
SplicingButtonList.push(notice);
// 频道
local channel = PlayerChat_SplicingButton(114, 10, 53, 20, 48, "频道", sq_RGBA(221, 153, 197, 255));
AddUIChild(channel);
channel.LBDown = function(btn) {
ChangeSplicing(2);
}.bindenv(this);
channel.LBDownOnClick = function(btn) {}.bindenv(this);
channel.OnTriangleClick = function(btn) {}.bindenv(this);
SplicingButtonList.push(channel);
// 募集
local raise = PlayerChat_SplicingButton(168, 10, 53, 20, 49, "募集", sq_RGBA(105, 212, 238, 255));
AddUIChild(raise);
raise.LBDown = function(btn) {
ChangeSplicing(3);
}.bindenv(this);
raise.LBDownOnClick = function(btn) {}.bindenv(this);
raise.OnTriangleClick = function(btn) {}.bindenv(this);
SplicingButtonList.push(raise);
//滚动条
ScrollObject = Yosin_ScrollBar(315, 32, 537, 20);
ScrollObject.SetScrollBarState(false);
ScrollObject.SetChangeCallBack(function(Value) {
MsgTextWindow.SetScrollPos(Value);
}.bindenv(this));
AddUIChild(ScrollObject);
//聊天输入框
InputBox = PlayerChat_InputBox();
InputBox.SetPosition(6, Height - 28);
AddUIChild(InputBox);
//信息画布窗口
MsgTextWindow = _PlayerChat_RenderMsg_Window("聊天信息渲染窗口", 12, 34, 321, 550, 0);
MsgTextWindow.SetPosition(12, 34);
AddUIChild(MsgTextWindow);
}
function ChangeSplicing(Idx) {
foreach(Index, Button in SplicingButtonList) {
if (Index == Idx) continue;
Button.Select = false;
Button.State = 0;
Button.ChangeFrame();
}
}
//push消息
function PushMsg(Msg) {
MsgManager.push(Msg);
local Flag = (ScrollObject.Controller.CurPos >= 0.8) || ScrollObject.ScrollButton == null;
//渲染消息
MsgTextWindow.RenderMsg();
if (Flag) {
ScrollObject.SetScrollBarValue(1);
}
}
//override
//鼠标滚轮事件回调
function OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseWheel(Wheel, MousePos_X, MousePos_Y, WindowInteractiveFlag);
local Pos = GetWorldPosition();
if (MousePos_X > Pos.x) {
if (Wheel == -1) {
ScrollObject.SetScroll(true);
}
if (Wheel == 1) {
ScrollObject.SetScroll(false);
}
}
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
} }

View File

@ -0,0 +1,375 @@
/*
文件名:7_Npc_Shop.nut
路径:User/UI/Window/7_Npc_Shop.nut
创建日期:2025-01-26 18:30
文件用途:NPC商店
*/
//NPC商店命名空间
UISpace_NpcShop <- {};
class UISpace_NpcShop.Item extends Yosin_CommonUi {
//槽位
Index = null;
//物品
Item = null;
//物品图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
//物品需求图标
ItemRequireIcon = null;
//物品需求数量
ItemRequireCount = null;
//物品需求名称
ItemRequireName = null;
//信息
Info = null;
//画布对象
Canvas = null;
//悬停框
HoverBox = null;
constructor(gIndex, gInfo) {
base.constructor(0, 0, 165, 57);
this.Index = gIndex;
this.Info = gInfo;
InitItem();
InitDraw();
}
function InitItem() {
//构造道具
this.Item = GameItem.Item.ConstructionItemById(Info.Id);
//构造图标
this.ItemIcon = this.Item.GetIconSprite();
//构造详细信息窗口
this.ItemInfo = this.Item.GetInfoWindow();
this.ItemInfo.SetZOrder(1);
//构造需求图标
//物品
if (this.Info.Material) {
}
//金币
else if (this.Info.Gold) {
ItemRequireCount = this.Info.Gold;
ItemRequireIcon = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 299);
ItemRequireName = "金币";
}
//点卷
else if (this.Info.Cera) {
ItemRequireName = "点卷";
}
//代币券
else if (this.Info.CeraPoint) {
ItemRequireName = "代币券";
}
}
function InitDraw() {
Canvas = CL_CanvasObject();
Addchild(Canvas);
Canvas.ResizeAndClear(321, 5000);
Canvas.BeginDraw();
//绘制背景
Canvas.DrawSpriteFrame(CL_SpriteFrameObject("sprite/interface2/ui/shop/shop_slot.img", 0), 0, 0);
//绘制图标
Canvas.DrawSprite(ItemIcon, 5, 7);
//绘制名称
local Name = FontAssetManager.GenerateNormal(Item.Name, false, {
color = AssetManager.EtcConfig.ItemInfoTag.rarity_color[Item.Rarity]
});
Canvas.DrawActor(Name, 44, 7);
//绘制价格槽
local SlotBg = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 391);
SlotBg.SetScale(5.2, 1.0);
SlotBg.SetPosition(84, 38);
Canvas.DrawSprite(SlotBg);
//绘制需求道具图标
if (ItemRequireIcon) {
ItemRequireIcon.SetScale(0.5, 0.5);
ItemRequireIcon.SetPosition(142, 38);
Canvas.DrawSprite(ItemRequireIcon);
}
//绘制需求数量
if (ItemRequireCount) {
local RequireCount = FontAssetManager.GenerateNormal(ItemRequireCount.tostring(), false, {
color = sq_RGBA(255, 255, 255, 255) //TODO 这里要计算我是否有足够的道具去购买他 选择是否标红
});
Canvas.DrawActor(RequireCount, 142 - (RequireCount.GetSize().w), 37);
}
Canvas.EndDraw();
//构造悬停框精灵
HoverBox = CL_SpriteObject("sprite/interface2/ui/shop/shop_slot.img", 1);
HoverBox.SetMode(0);
HoverBox.SetVisible(false);
Addchild(HoverBox);
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect) {
//没有输入框的时候才会显示悬停框
if (!Parent.QuantityInput || Parent.QuantityInput.Visible == false) HoverBox.SetVisible(true);
//判断是否有悬停到道具图标
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x + 5, Pos.y + 7, 32, 32)) {
if (!ItemInfoShowFlag) {
ItemInfoShowFlag = true;
ItemInfo.SetPosition(MousePos_X + 16, MousePos_Y + 16);
ItemInfo.ResetFocus();
}
}
} else {
HoverBox.SetVisible(false);
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
//输入框出来了关闭道具显示信息
if (Parent.QuantityInput && Parent.QuantityInput.Visible) {
HoverBox.SetVisible(false);
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
}
//override
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭显示的对象
if (ItemInfoShowFlag) {
ItemInfoShowFlag = false;
ItemInfo.CloseWindow();
}
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//购买逻辑
if (isInRect && !WindowInteractiveFlag) {
if (!Parent.QuantityInput) {
Parent.QuantityInput = _QuantityInput(MousePos_X - 35, MousePos_Y - 35);
} else {
Parent.QuantityInput.SetPosition(MousePos_X - 35, MousePos_Y - 35);
Parent.QuantityInput.ResetFocus();
}
Parent.QuantityInput.SetOnConfirmFunc(function(Count) {
//设置购买信息
Parent.Parent.SetBuyInfo({
npcshopId = Parent.Parent.ShopId,
shopId = Parent.Type,
pos = Index,
num = Count
});
local NoticeBox = _Yosin_MessageBox(format("购买[%s]数量 %d 个\n总购买费用为 %d %s\n您确定要购买吗?", Item.Name, Count, Count * ItemRequireCount, ItemRequireName));
NoticeBox.SetOnConfirmFunc(function() {
Parent.Parent.SendBuyInfo();
}.bindenv(this));
}.bindenv(this));
}
}
}
// 物品栏
class UISpace_NpcShop.ItemCollection extends Yosin_Window {
//是否为独立窗口
IsIndependent = false;
//是否为图层窗口
IsLayer = true;
//栏位类型
Type = null;
//信息
Info = null;
//物品列表
ItemList = null;
//数量输入框
QuantityInput = null;
constructor(x, y, type, gInfo) {
this.Type = type;
this.Info = gInfo;
//计算实际需要的高度
base.constructor("商店页面" + type + clock(), x, y, 336, 400, 0);
SetClipRect(0, 0, 336, 400);
// OpenDeBug();
Init();
}
function Init() {
ItemList = [];
foreach(Index, ItemObject in Info) {
local Buffer = UISpace_NpcShop.Item(Index, ItemObject);
Buffer.SetPosition(2 + (168 * (Index % 2)), 2 + (61 * (Index / 2)));
AddUIChild(Buffer);
}
}
}
class UISpace_NpcShop.Shop extends Yosin_Window {
//商店信息
Info = null;
//商店ID
ShopId = null;
//栏
ItemCollection = null;
//滚动条
ScrollObject = null;
//购买信息包
BuyInfo = null;
function _typeof() {
return "Game_Window";
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
ItemCollection = [];
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
}
function Init(gShopId) {
ShopId = gShopId;
//判断NPC是否有商店
Info = AssetManager.GetNpcShop(ShopId);
if (Info) {
local title = Yosin_TopTitle(Width, Height, Info.name);
AddUIChild(title);
//注册控件
} else throw "NPC没有商店";
//注册控件
RegisterWidget();
}
function RegisterWidget() {
//关闭按钮
local closeBtn = Yosin_BaseButton(Width - 20, 4, 12, 12, "sprite/interface/lenheartwindowcommon.img", 544);
closeBtn.DownSimulateOffset = false;
closeBtn.SetZOrder(1);
closeBtn.OnClick = function(btn) {
DestroyWindow();
}.bindenv(this);
AddUIChild(closeBtn);
//分页按钮
local titlesBtn = Yosin_RowMoreTitleBtn(5, 30, 354, Info.PageNameList, "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn);
titlesBtn.LBDownOnClick = function(btns, index) {
// ChangPage(index);
}.bindenv(this);
titlesBtn.LBDownOnClick = function(btns, index) {
foreach(Iindex, ItemCollectionBuffer in ItemCollection) {
if (Iindex == index) {
ItemCollectionBuffer.SetVisible(true);
} else {
ItemCollectionBuffer.SetVisible(false);
}
}
}.bindenv(this);
//底框
local Bg = Yosin_NineBoxStretch(353, 407, "sprite/interface/lenheartwindowcommon.img", 97);
Bg.SetPosition(8, 51);
Addchild(Bg);
//滚动条
ScrollObject = Yosin_ScrollBar(347, 55, 400, 20);
ScrollObject.SetScrollBarState(false);
ScrollObject.SetChangeCallBack(function(Value) {
MsgTextWindow.SetScrollPos(Value);
}.bindenv(this));
AddUIChild(ScrollObject);
//创建栏位
foreach(Index, LInfo in Info.PageList) {
local Buffer = UISpace_NpcShop.ItemCollection(10, 53, Index, LInfo);
ItemCollection.push(Buffer);
AddUIChild(Buffer);
if (Index != 0) Buffer.SetVisible(false);
}
//购买按钮
local BuyButton = Yosin_SplicingButton(115, 456, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//购买按钮文本
local BuyTextActor = FontAssetManager.GenerateNormal("购买", false, {
color = sq_RGBA(186, 147, 97, 255)
});
BuyTextActor.SetZOrder(1);
BuyTextActor.SetPosition(18, 3);
BuyButton.OnClick = function(Button) {
}.bindenv(this);
BuyButton.Addchild(BuyTextActor);
AddUIChild(BuyButton);
//出售按钮
local SellButton = Yosin_SplicingButton(184, 456, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//出售按钮文本
local SellTextActor = FontAssetManager.GenerateNormal("出售", false, {
color = sq_RGBA(186, 147, 97, 255)
});
SellTextActor.SetZOrder(1);
SellTextActor.SetPosition(18, 3);
SellButton.OnClick = function(Button) {
}.bindenv(this);
SellButton.Addchild(SellTextActor);
AddUIChild(SellButton);
}
//设置购买信息
function SetBuyInfo(gTable) {
BuyInfo = gTable;
}
//发送购买信息
function SendBuyInfo() {
if (BuyInfo) {
//发送购买信息
MySocket.Send(PACKET_ID.BUY_ITEM, BuyInfo);
//清空购买信息
BuyInfo = null;
}
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
//在Esc按下时
function OnEsc() {
//下帧执行
Timer.SetNextFrame(function(Window) {
Window.DestroyWindow();
}, this);
}
}

View File

@ -0,0 +1,322 @@
/*
文件名:8_SkillTree.nut
路径:User/UI/Window/8_SkillTree/8_SkillTree.nut
创建日期:2025-02-17 10:03
文件用途:技能树
*/
//个人信息命名空间
if (!getroottable().rawin("UISpace_SkillTree")) UISpace_SkillTree <- {};
//技能对象
class UISpace_SkillTree.Skill extends Yosin_CommonUi {
//技能
Skill = 0;
//鼠标悬浮效果
HoverEffect = null;
constructor(x, y, width, height, gSkill) {
this.Skill = gSkill;
base.constructor(x, y, width, height);
// OpenDeBug();
Init();
HoverEffect = CL_SpriteObject("sprite/interface2/ui/newskillshop/newskillshop.img", 35);
HoverEffect.SetPosition(-1, -1);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function Init() {
//背景
local Background = CL_SpriteObject("sprite/interface2/ui/newskillshop/newskillshop.img", 34);
Addchild(Background);
//技能图标
local SkillIcon = Skill.GetIconSprite();
SkillIcon.SetPosition(4, 4);
Addchild(SkillIcon);
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//设置透明度
HoverEffect.SetOpacity(0.4);
// if (!ItemInfoShowFlag) {
// //显示详细信息
// ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemInfo.RealCanvasHeight + 10) / 2));
// }
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
// //关闭所有详细信息显示
// if (ItemInfoShowFlag) {
// CloseInfo();
// }
}
}
}
//技能树窗口
class UISpace_SkillTree.Tree extends Yosin_Window {
//是否为独立窗口
IsIndependent = false;
//是否可见
Visible = false;
//是否为图层窗口
IsLayer = true;
//技能树信息
TreeInfo = null;
//技能List
SkillList = null;
//滚动条
ScrollObject = null;
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
SkillList = [];
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
SetClipRect(0, 0, gWidth, gHeight);
// OpenDeBug();
// 背景
local Background = CL_SpriteObject("sprite/interface2/ui/newskillshop/newskillshop.img", 0);
Background.SetPosition(1, 0);
Addchild(Background);
//滚动条
ScrollObject = Yosin_ScrollBar(gWidth - 10, 1, 400, 20);
ScrollObject.SetScrollBarState(false);
ScrollObject.SetChangeCallBack(function(Value) {
MsgTextWindow.SetScrollPos(Value);
}.bindenv(this));
AddUIChild(ScrollObject);
}
//通过技能树Config构造
function Init(Config) {
TreeInfo = Config;
foreach(SkillIndex, Info in Config) {
local SkillBuffer = GameItem.Skill(Parent.Job, SkillIndex);
local SkillSlotBuffer = UISpace_SkillTree.Skill(35 + Info.IconPos.x, 10 + Info.IconPos.y, 36, 48, SkillBuffer);
SkillList.push(SkillSlotBuffer);
AddUIChild(SkillSlotBuffer);
}
}
}
//主类
class UISpace_SkillTree._SkillTree extends Yosin_Window {
//背景画布
BackGroundCanvas = null;
//技能树窗口
SkillTreeWindow = null;
//技能树信息
TreeInfo = null;
//技能点
SkillPoint = 11451;
//职业
Job = 0;
//转职职业
GrowType = 0;
//是否可见
Visible = false;
function _typeof() {
return "Game_Window";
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
base.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
local title = Yosin_TopTitle(gWidth, gHeight, "技能栏(K)");
AddUIChild(title);
RegisterBackGround();
RegisterButton();
// 标题按钮
local titlesBtn = Yosin_RowMoreTitleBtn(5, 30, Width - 10, ["技能类型I"], "sprite/interface/lenheartwindowcommon.img", 160);
AddUIChild(titlesBtn);
//注册按键回调事件
Input.RegisterGameKeyCode(CONTROLLER.OPTION_HOTKEY_SKILL_WINDOW, function(Flag) {
//按下的时候
if (Flag == 1) {
//如果窗口已经打开
if (this.Visible) {
//关闭窗口
CloseWindow();
} else {
//打开窗口
ResetFocus();
}
}
}.bindenv(this));
}
function RegisterBackGround() {
BackGroundCanvas = CL_CanvasObject();
// 重设大小并清空
BackGroundCanvas.ResizeAndClear(Width, Height);
BackGroundCanvas.SetFillBrush(sq_RGBA(59, 56, 57, 250));
BackGroundCanvas.SetStrokeBrush(sq_RGBA(59, 56, 57, 250));
// 开始绘制
BackGroundCanvas.BeginDraw();
//背景框-左
local LeftBox = Yosin_NineBoxStretch(Width - 230, 438, "sprite/interface/lenheartwindowcommon.img", 97);
LeftBox.SetPosition(5, 52);
BackGroundCanvas.DrawActor(LeftBox);
//技能点背景槽
local SkillPointBackgroundSlot = Yosin_NineBoxStretch(Width - 230, 35, "sprite/interface/lenheartwindowcommon.img", 97);
SkillPointBackgroundSlot.SetPosition(5, 52);
BackGroundCanvas.DrawActor(SkillPointBackgroundSlot);
//技能点文字
local SkillPointText = FontAssetManager.GenerateNormal(format("技能点 %d", SkillPoint), true, {
color = sq_RGBA(105, 212, 238, 250)
});
BackGroundCanvas.DrawActor(SkillPointText, 15, 60);
//背景框-右
local RightBox = Yosin_NineBoxStretch(223, 470, "sprite/interface/lenheartwindowcommon.img", 97);
RightBox.SetPosition(Width - 228, 52);
BackGroundCanvas.DrawActor(RightBox);
//右侧文字使用指南背景
// local BoxHelpTextBg = CL_SpriteFrameObject("sprite/interface2/ui/newskillshop/newskillshop.img", 10);
// BackGroundCanvas.DrawSpriteFrame(BoxHelpTextBg, Width - BoxHelpTextBg.GetSize().w - 5, 52);
//右侧文字使用指南
local BoxHelpText = FontAssetManager.GenerateNormal("技能窗口使用指南", true, {
color = sq_RGBA(192, 163, 54, 250)
});
BackGroundCanvas.DrawActor(BoxHelpText, 580, 52);
// 结束绘制
BackGroundCanvas.EndDraw();
Addchild(BackGroundCanvas);
}
function RegisterButton() {
//初始化按钮
local InitButton = Yosin_SplicingButton(444, 58, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//创建角色按钮文本
local CreateTextActor = FontAssetManager.GenerateNormal("初始化", false, {
color = sq_RGBA(186, 147, 97, 255)
});
InitButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(InitButton);
CreateTextActor.SetPosition(11, 3);
CreateTextActor.SetZOrder(1);
CreateTextActor.SetUpdateFunc(function(Text, Dt) {
if (Text.Parent.State == 1 || Text.Parent.State == 2) {
Text.SetFillColor(sq_RGBA(18, 71, 130, 255));
} else if (Text.Parent.State == 0) {
Text.SetFillColor(sq_RGBA(186, 147, 97, 255));
}
})
InitButton.Addchild(CreateTextActor);
//自动加点按钮
local AutoAddPointButton = Yosin_SplicingButton(506, 58, 59, 24 "sprite/interface/lenheartwindowcommon.img", 172, true, false);
//创建角色按钮文本
local CreateTextActor = FontAssetManager.GenerateNormal("自动加点", false, {
color = sq_RGBA(186, 147, 97, 255)
});
AutoAddPointButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(AutoAddPointButton);
CreateTextActor.SetPosition(6, 3);
CreateTextActor.SetZOrder(1);
CreateTextActor.SetUpdateFunc(function(Text, Dt) {
if (Text.Parent.State == 1 || Text.Parent.State == 2) {
Text.SetFillColor(sq_RGBA(18, 71, 130, 255));
} else if (Text.Parent.State == 0) {
Text.SetFillColor(sq_RGBA(186, 147, 97, 255));
}
})
AutoAddPointButton.Addchild(CreateTextActor);
}
//初始化技能树
function Init(Job, GrowType) {
this.Job = Job;
this.GrowType = GrowType;
TreeInfo = AssetManager.GetSkillTreeByJob(Job, GrowType);
print(TreeInfo);
SkillTreeWindow = UISpace_SkillTree.Tree("技能树" + Job + "-" + GrowType, 7, 85, 560, 400, 0);
AddUIChild(SkillTreeWindow);
SkillTreeWindow.Init(TreeInfo);
}
//逻辑入口
function Proc(Dt) {
SyncPos(X, Y);
base.Proc(Dt);
}
//刷新个人信息
function RefreshPersonalInfo() {
PageList[0].Refresh();
PageList[0].CharactersObject.InitCharacter();
}
//在Esc按下时
function OnEsc() {
CloseWindow();
}
}
// if (!getroottable().rawin("chongzaiflag")) {
// getroottable()["chongzaiflag"] <- true;
// } else {
// local BufferList = [];
// //遍历窗口队列 如果可见则调用Show
// for (local i = 0; i< _SYS_WINDOW_LIST_.len(); i++) {
// local Window = _SYS_WINDOW_LIST_[i];
// Window.Visible = false;
// _UiObject_.Removechild(Window);
// }
// _SYS_WINDOW_LIST_ = [];
// _SYS_WINDOW_LIST_.extend(BufferList);
// //初始化鼠标
// _IMouse_();
// TestStage();
// }

View File

@ -0,0 +1,276 @@
/*
文件名:9_HUD.nut
路径:User/UI/Window/9_HUD/9_HUD.nut
创建日期:2025-02-18 05:41
文件用途:血槽HUD
*/
//hud血槽命名空间
if (!getroottable().rawin("UISpace_Hud")) UISpace_Hud <- {};
//主类
class UISpace_Hud._Hud extends Yosin_Window {
//背景画布
BackGroundCanvas = null;
//数据画布
DataCanvas = null;
//物品槽
ItemSlotList = null;
//技能槽
SkillSlotList = null;
//生命值球
HealthBall = null;
//魔法值球
MagicBall = null;
constructor() {
ItemSlotList = [];
SkillSlotList = [];
base.constructor("血槽HUD", 0, 525, 1067, 75, 0);
DrawBackground();
//绘制血球
DrawBall();
//刷新数据
RefreshData();
//注册按钮
RegisterButton();
//物品槽
for (local i = 0; i< 6; i++) {
local ItemSlot = UISpace_Hud.ItemSlot(i);
ItemSlot.SetPosition(122 + (i * 31), 44);
AddUIChild(ItemSlot);
local ItemObject = GameItem.Stackable(1110 + i);
ItemSlot.SetItem(ItemObject);
ItemSlotList.push(ItemSlot);
}
//技能槽
for (local i = 0; i< 16; i++) {
local SkillSlot = UISpace_Hud.SkillSlot(i / 8, i % 8);
SkillSlot.SetPosition(414 + ((i % 8) * 31), 9 + (i / 8 * 31));
AddUIChild(SkillSlot);
local SkillObject = GameItem.Skill(0, 230 + i);
SkillSlot.SetSkill(SkillObject);
SkillSlotList.push(SkillSlot);
}
}
function DrawBackground() {
if (BackGroundCanvas) Removechild(BackGroundCanvas);
BackGroundCanvas = CL_CanvasObject();
// 重设大小并清空
BackGroundCanvas.ResizeAndClear(Width, Height);
// 开始绘制
BackGroundCanvas.BeginDraw();
//绘制背景
local HudBg = CL_SpriteFrameObject("sprite/interface2/hud/hud.img", 0);
BackGroundCanvas.DrawSpriteFrame(HudBg, (Width - HudBg.GetSize().w) / 2, 0);
//绘制消耗品槽
for (local i = 0; i< 6; i++) {
local Slot = CL_SpriteFrameObject("sprite/interface2/hud/hud.img", 200);
BackGroundCanvas.DrawSpriteFrame(Slot, 122 + (i * 31), 44);
}
//绘制疲劳值文字
local FatigueSlotText = CL_SpriteFrameObject("sprite/interface2/hud/hud.img", 211);
BackGroundCanvas.DrawSpriteFrame(FatigueSlotText, 789, 64);
//绘制疲劳槽
local FatigueSlot = CL_SpriteFrameObject("sprite/interface2/hud/hud.img", 230);
BackGroundCanvas.DrawSpriteFrame(FatigueSlot, 824, 69);
// 结束绘制
BackGroundCanvas.EndDraw();
Addchild(BackGroundCanvas);
}
//绘制血球
BallSize = null;
function DrawBall() {
if (!HealthBall) {
HealthBall = Animation("common/hud/hud_ui/hpmp_vessel.ani");
HealthBall.SetPosition(295, 40);
HealthBall.SetDye(sq_RGBA(255, 0, 0, 255), 1);
Addchild(HealthBall);
local Effect = Animation("common/hud/hud_ui/hpmp_vessel.ani");
Effect.SetPosition(0, 0);
Effect.SetDye(sq_RGBA(255, 0, 0, 255), 1);
Effect.SetMode(0);
Effect.SetOpacity(0.6);
HealthBall.Addchild(Effect);
local Effect2 = CL_SpriteObject("sprite/interface2/hud/hud.img", 212);
Effect2.SetPosition(295 + 45, 40 - 32);
Addchild(Effect2);
}
if (!MagicBall) {
MagicBall = Animation("common/hud/hud_ui/hpmp_vessel.ani");
MagicBall.SetPosition(618, 40);
MagicBall.SetDye(sq_RGBA(0, 0, 255, 255), 1);
Addchild(MagicBall);
local Effect = Animation("common/hud/hud_ui/hpmp_vessel.ani");
Effect.SetPosition(0, 0);
Effect.SetDye(sq_RGBA(0, 0, 255, 255), 1);
Effect.SetMode(0);
Effect.SetOpacity(0.6);
MagicBall.Addchild(Effect);
local Effect2 = CL_SpriteObject("sprite/interface2/hud/hud.img", 213);
Effect2.SetPosition(618 + 45, 40 - 32);
Addchild(Effect2);
}
BallSize = HealthBall.GetSize();
}
function SetHp(Rate) {
local Slice = BallSize.h * (1.0 - Rate);
HealthBall.SetCropRect(0, Slice, HealthBall.GetSize().w, BallSize.h);
HealthBall.SetPosition(295, 40 + Slice);
}
function SetMp(Rate) {
local Slice = BallSize.h * (1.0 - Rate);
MagicBall.SetCropRect(0, Slice, MagicBall.GetSize().w, BallSize.h);
MagicBall.SetPosition(618, 40 + Slice);
}
function RefreshData() {
if (DataCanvas) Removechild(DataCanvas);
DataCanvas = CL_CanvasObject();
// 重设大小并清空
DataCanvas.ResizeAndClear(Width, Height);
// 开始绘制
DataCanvas.BeginDraw();
//绘制经验槽
local ExpSlot = CL_SpriteFrameObject("sprite/interface2/hud/hud.img", 202);
DataCanvas.DrawSpriteFrame(ExpSlot, (Width - ExpSlot.GetSize().w) / 2, 58);
//人物经验
local Exp = ClientCharacter ? ClientCharacter.GetExp() : {
current = 100,
max = 100
};
local ExpRate = Exp.current.tofloat() / Exp.max.tofloat();
local ExpImgIndex = 60;
if (ExpRate< 1) ExpImgIndex = 4;
local ExpBar = CL_SpriteObject("sprite/interface2/hud/hud.img", ExpImgIndex);
ExpBar.SetPosition(374, 70);
ExpBar.SetCropRect(0, 0, ExpBar.GetSize().w * ExpRate, ExpBar.GetSize().h);
DataCanvas.DrawSprite(ExpBar);
//人物等级
local Level = ClientCharacter ? ClientCharacter.Level : 1;
local LevelText = FontAssetManager.GenerateNormal(Level + "级", true, {
color = sq_RGBA(147, 118, 56, 250)
});
DataCanvas.DrawActor(LevelText, 343 - LevelText.GetSize().w / 2, 60);
//人物Sp点
local SkillPoint = ClientCharacter ? ClientCharacter.SkillPoint : 0;
local SkillPointText = FontAssetManager.GenerateMini("SP:" + SkillPoint, true, {
color = sq_RGBA(24, 123, 174, 250)
});
DataCanvas.DrawActor(SkillPointText, 730 - SkillPointText.GetSize().w / 2, 60);
//人物疲劳值
local Fatigue = ClientCharacter ? ClientCharacter.Fatigue : 0;
local FatigueRate = (156.0 - Fatigue.tofloat()) / 156.0;
local FatigueBar = CL_SpriteObject("sprite/interface2/hud/hud.img", 3);
FatigueBar.SetPosition(823, 68);
FatigueBar.SetCropRect(0, 0, FatigueBar.GetSize().w * FatigueRate, FatigueBar.GetSize().h);
DataCanvas.DrawSprite(FatigueBar);
//人物疲劳值文字
local FatigueText = FontAssetManager.GenerateMini((156 - Fatigue) + "/156", true, {
color = sq_RGBA(201, 199, 201, 250)
});
DataCanvas.DrawActor(FatigueText, 892 - FatigueText.GetSize().w / 2, 62);
// 结束绘制
DataCanvas.EndDraw();
Addchild(DataCanvas);
}
//商城按钮
function RegisterButton() {
//商城按钮
local LoginButton = Yosin_BaseButton(786, 38, 64, 27, "sprite/interface2/hud/hud.img", 72);
//点击事件回调
LoginButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(LoginButton);
//菜单按钮
local MenuButton = Yosin_BaseButton(849, 38, 27, 27, "sprite/interface2/hud/hud.img", 68);
//点击事件回调
MenuButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(MenuButton);
//个人信息按钮
local InfoButton = Yosin_BaseButton(875, 38, 20, 27, "sprite/interface2/hud/hud.img", 5);
//点击事件回调
InfoButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(InfoButton);
//背包按钮
local BagButton = Yosin_BaseButton(894, 38, 20, 27, "sprite/interface2/hud/hud.img", 8);
//点击事件回调
BagButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(BagButton);
//技能按钮
local SkillButton = Yosin_BaseButton(913, 38, 20, 27, "sprite/interface2/hud/hud.img", 14);
//点击事件回调
SkillButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(SkillButton);
//任务按钮
local TaskButton = Yosin_BaseButton(932, 38, 20, 27, "sprite/interface2/hud/hud.img", 11);
//点击事件回调
TaskButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(TaskButton);
//拍卖行按钮
local AuctionButton = Yosin_BaseButton(951, 38, 20, 27, "sprite/interface2/hud/hud.img", 17);
//点击事件回调
AuctionButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(AuctionButton);
//拓展技能按钮
local ExtendSkillButton = Yosin_BaseButton(400, 7, 17, 34, "sprite/interface2/hud/hud.img", 193);
//点击事件回调
ExtendSkillButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(ExtendSkillButton);
//切换技能按钮
local SwitchSkillButton = Yosin_BaseButton(400, 37, 17, 34, "sprite/interface2/hud/hud.img", 52);
//点击事件回调
SwitchSkillButton.OnClick = function(Button) {
}.bindenv(this);
AddUIChild(SwitchSkillButton);
}
function Proc(Dt) {
}
}

View File

@ -0,0 +1,152 @@
/*
文件名:ItemSlot.nut
路径:User/UI/Window/9_HUD/ItemSlot.nut
创建日期:2025-02-18 07:36
文件用途:HUD血槽的物品槽
*/
class UISpace_Hud.ItemSlot extends Yosin_CommonUi {
Pos = null;
//悬停特效
HoverEffect = null;
//物品对象
Item = null;
//物品对象的图标
ItemIcon = null;
//物品对象的详细信息窗口
ItemInfo = null;
//详细信息窗口显示Flag
ItemInfoShowFlag = false;
constructor(gPos) {
this.Pos = gPos;
base.constructor(0, 0, 28, 28);
// OpenDeBug();
//角标绘制
local CornerMarkerDrawing = CL_SpriteObject("sprite/interface/keyshortcut.img", 46 + gPos);
CornerMarkerDrawing.SetZOrder(9);
Addchild(CornerMarkerDrawing);
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetPosition(1, 1);
HoverEffect.SetZOrder(10);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function SetItem(Item) {
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
if (Item) {
this.Item = Item;
//如果原先有图标则先移除图标在添加
if (this.ItemIcon) {
Removechild(this.ItemIcon);
}
this.ItemIcon = this.Item.GetIconSprite();
Addchild(this.ItemIcon);
this.ItemInfo = this.Item.GetInfoWindow();
} else {
this.Item = null;
if (this.ItemIcon) {
Removechild(this.ItemIcon);
this.ItemIcon = null;
}
this.ItemInfo = null;
}
this.ItemIcon.SetPosition(1, 1);
}
//显示详细信息
function ShowInfo(x, y) {
if (!Item) return;
if (!this.ItemInfo) GenerateInfo();
this.ItemInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.ItemInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.ItemInfo.SetPosition(x, y);
this.ItemInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.ItemInfo) {
this.ItemInfoShowFlag = false;
this.ItemInfo.CloseWindow();
}
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//如果有道具
if (Item) {
//设置透明度
HoverEffect.SetOpacity(0.4);
if (!ItemInfoShowFlag) {
//显示详细信息
ShowInfo(MousePos_X - 50, MousePos_Y - ((ItemInfo.RealCanvasHeight + 10) / 2));
}
}
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}
//override
//鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !WindowInteractiveFlag) {
//发送脱下装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 8,
oldPos = Pos
});
}
}
//override
//鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭所有详细信息显示
if (ItemInfoShowFlag) {
CloseInfo();
}
}
}

View File

@ -0,0 +1,163 @@
/*
文件名:SkillSlot.nut
路径:User/UI/Window/9_HUD/SkillSlot.nut
创建日期:2025-02-18 07:51
文件用途:HUD血槽的技能槽
*/
class UISpace_Hud.SkillSlot extends Yosin_CommonUi {
Type = null;
Pos = null;
//悬停特效
HoverEffect = null;
//物品对象
Skill = null;
//物品对象的图标
SkillIcon = null;
//物品对象的详细信息窗口
SkillInfo = null;
//详细信息窗口显示Flag
SkillInfoShowFlag = false;
constructor(gType, gPos) {
this.Type = gType;
this.Pos = gPos;
base.constructor(0, 0, 28, 28);
local KeyValue;
if (gType == 0) {
if (gPos == 0) KeyValue = getconsttable().CONTROLLER["OPTION_HOTKEY_SKILL"];
else KeyValue = getconsttable().CONTROLLER["OPTION_HOTKEY_EXSKILL" + gPos];
} else if (gType == 1) {
if (gPos == 0) KeyValue = getconsttable().CONTROLLER["OPTION_HOTKEY_ATTACK"];
else KeyValue = getconsttable().CONTROLLER["OPTION_HOTKEY_QUICK_SKILL" + gPos];
}
//角标绘制
local CornerMarkerDrawing = CL_SpriteObject("sprite/interface/keyshortcut.img", (KeyValue <= 10) ? KeyValue : 40 + KeyValue);
CornerMarkerDrawing.SetZOrder(9);
Addchild(CornerMarkerDrawing);
// OpenDeBug();
HoverEffect = CL_SpriteObject("sprite/interface/newstyle/windows/inventory/inventory.img", 131);
HoverEffect.SetPosition(1, 1);
HoverEffect.SetZOrder(10);
HoverEffect.SetVisible(false);
Addchild(HoverEffect);
}
function SetSkill(Skill) {
//关闭所有详细信息显示
if (SkillInfoShowFlag) {
CloseInfo();
}
if (Skill) {
this.Skill = Skill;
//如果原先有图标则先移除图标在添加
if (this.SkillIcon) {
Removechild(this.SkillIcon);
}
this.SkillIcon = this.Skill.GetIconSprite();
Addchild(this.SkillIcon);
this.SkillInfo = this.Skill.GetInfoWindow();
} else {
this.Skill = null;
if (this.SkillIcon) {
Removechild(this.SkillIcon);
this.SkillIcon = null;
}
this.SkillInfo = null;
}
this.SkillIcon.SetPosition(1, 1);
}
//显示详细信息
function ShowInfo(x, y) {
if (!Skill) return;
if (!this.SkillInfo) GenerateInfo();
this.SkillInfoShowFlag = true;
// 获取信息框尺寸
local infoW = 211;
local infoH = this.SkillInfo.RealCanvasHeight;
// X轴边界修正
if (x< 0) {
x = 0;
} else if (x + infoW > 1067) {
x = 1067 - infoW;
}
// Y轴边界修正
if (y< 0) {
y = 0;
} else if (y + infoH > 600) {
y = 600 - infoH;
}
//设置位置
this.SkillInfo.SetPosition(x, y);
this.SkillInfo.ResetFocus();
}
//关闭显示详细信息
function CloseInfo() {
if (this.SkillInfo) {
this.SkillInfoShowFlag = false;
this.SkillInfo.CloseWindow();
}
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
if (!Visible) return;
base.OnMouseProc(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !IMouse.DragObj && !WindowInteractiveFlag) {
//如果有道具
if (Skill) {
//设置透明度
HoverEffect.SetOpacity(0.4);
if (!SkillInfoShowFlag) {
//显示详细信息
ShowInfo(MousePos_X - 50, MousePos_Y - ((SkillInfo.RealCanvasHeight + 10) / 2));
}
}
//设置悬停槽
HoverEffect.SetVisible(true);
} else {
HoverEffect.SetVisible(false);
//关闭所有详细信息显示
if (SkillInfoShowFlag) {
CloseInfo();
}
}
}
//override
//鼠标右键单击回调
function OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseRbClick(MousePos_X, MousePos_Y, WindowInteractiveFlag);
if (isInRect && !WindowInteractiveFlag) {
//发送脱下装备包
MySocket.Send(PACKET_ID.WEAR_EQUIPMENT, {
backpackId = 8,
oldPos = Pos
});
}
}
//override
//鼠标左键单击回调
function OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag) {
//调用原生方法
base.OnMouseLbDown(MousePos_X, MousePos_Y, WindowInteractiveFlag);
//关闭所有详细信息显示
if (SkillInfoShowFlag) {
CloseInfo();
}
}
}

View File

@ -29,16 +29,60 @@ enum CHARACTERJOB {
//时装枚举类 //时装枚举类
enum AvatarType { enum AvatarType {
hair = "hair" //头部 weapon_avatar = "武器装扮"
hat = "hat" //帽子 aurora_avatar = "光环装扮"
face = "face" //脸部 hair_avatar = "头部装扮"
breast = "breast" //胸部 hat_avatar = "帽子装扮"
coat = "coat" //上衣 face_avatar = "脸部装扮"
skin = "skin" //皮肤 breast_avatar = "胸部装扮"
waist = "waist" //腰部 coat_avatar = "上衣装扮"
pants = "pants" //下装 skin_avatar = "皮肤装扮"
shoes = "shoes" //鞋子 waist_avatar = "腰部装扮"
weapon = "weapon" //武器 pants_avatar = "下装装扮"
shoes_avatar = "鞋子装扮"
weapon = "武器"
}
//属性枚举表
enum ATTRIBUTE {
HPMax = "最大生命值"
MPMax = "最大魔法值"
HPRegenSpeed = "生命值回复速度"
MPRegenSpeed = "魔法值回复速度"
JumpPower = "跳跃力"
HitRecovery = "硬直"
Stuck = "命中率"
StuckResistance = "闪避率"
PhysicalAttack = "力量"
MagicalAttack = "智力"
PhysicalDefense = "体力"
MagicalDefense = "精神"
AllElementalAttack = "所有属强"
DarkAttack = "暗属强"
LightAttack = "光属强"
WaterAttack = "水属强"
FireAttack = "火属强"
EquipmentPhysicalAttack = "物理攻击力"
EquipmentMagicalAttack = "魔法攻击力"
SeparateAttack = "独立攻击力"
EquipmentPhysicalDefense = "物理防御力"
EquipmentMagicalDefense = "魔法防御力"
AttackSpeed = "攻击速度"
CastSpeed = "释放速度"
MoveSpeed = "移动速度"
JumpSpeed = "跳跃速度"
PhysicalCriticalHit = "物理暴击率"
MagicalCriticalHit = "魔法暴击率"
DarkResistance = "暗属抗"
LightResistance = "光属抗"
WaterResistance = "水属抗"
FireResistance = "火属抗"
ElementalProperty = "属性攻击"
} }
//控制器枚举 //控制器枚举
@ -48,13 +92,13 @@ enum CONTROLLER {
OPTION_HOTKEY_MOVE_LEFT = 2 // 移动键 左 OPTION_HOTKEY_MOVE_LEFT = 2 // 移动键 左
OPTION_HOTKEY_MOVE_DOWN = 4 // 移动键 下 OPTION_HOTKEY_MOVE_DOWN = 4 // 移动键 下
OPTION_HOTKEY_MOVE_RIGHT = 3 // 移动键 右 OPTION_HOTKEY_MOVE_RIGHT = 3 // 移动键 右
OPTION_HOTKEY_ATTACK = 4 // 攻击键 OPTION_HOTKEY_ATTACK = 38 // 攻击键
OPTION_HOTKEY_JUMP = 5 // 跳跃 OPTION_HOTKEY_ENTER = 5 // 回车
OPTION_HOTKEY_SKILL = 6 // 快捷技能键 OPTION_HOTKEY_SKILL = 40 // 快捷技能键
OPTION_HOTKEY_SKILL2 = 7 // Buff技能键 OPTION_HOTKEY_SKILL2 = 7 // Buff技能键
OPTION_HOTKEY_CREATURE_SKILL = 8 // 宠物技能键 OPTION_HOTKEY_CREATURE_SKILL = 8 // 宠物技能键
OPTION_HOTKEY_STATUS_WINDOW = 9 // (M) OPTION_HOTKEY_STATUS_WINDOW = 27 // (M)
OPTION_HOTKEY_SKILL_WINDOW = 10 // (K) OPTION_HOTKEY_SKILL_WINDOW = 25 // (K)
OPTION_HOTKEY_ITEM_INVENTORY = 23 // (I) OPTION_HOTKEY_ITEM_INVENTORY = 23 // (I)
OPTION_HOTKEY_OPTION_WINDOW = 12 // (O) OPTION_HOTKEY_OPTION_WINDOW = 12 // (O)
OPTION_HOTKEY_NORMAL_QUEST_WINDOW = 13 // (Q) OPTION_HOTKEY_NORMAL_QUEST_WINDOW = 13 // (Q)
@ -64,18 +108,20 @@ enum CONTROLLER {
OPTION_HOTKEY_CREATURE_WINDOW = 17 // (Y) OPTION_HOTKEY_CREATURE_WINDOW = 17 // (Y)
OPTION_HOTKEY_TOOLTIP_ = 18 // 庸삥뮢弱붹솱 ?わ읂??R) OPTION_HOTKEY_TOOLTIP_ = 18 // 庸삥뮢弱붹솱 ?わ읂??R)
OPTION_HOTKEY_EPIC_QUEST_WINDOW = 19 // (W) OPTION_HOTKEY_EPIC_QUEST_WINDOW = 19 // (W)
OPTION_HOTKEY_QUICK_SKILL1 = 20 // ?띌돱 ?쀧뀥(A, S, D, F, G, H) OPTION_HOTKEY_QUICK_SKILL1 = 15 // ?띌돱 ?쀧뀥(A, S, D, F, G, H, ctrl)
OPTION_HOTKEY_QUICK_SKILL2 = 21 OPTION_HOTKEY_QUICK_SKILL2 = 33
OPTION_HOTKEY_QUICK_SKILL3 = 22 OPTION_HOTKEY_QUICK_SKILL3 = 18
OPTION_HOTKEY_QUICK_SKILL4 = 23 OPTION_HOTKEY_QUICK_SKILL4 = 20
OPTION_HOTKEY_QUICK_SKILL5 = 24 OPTION_HOTKEY_QUICK_SKILL5 = 21
OPTION_HOTKEY_QUICK_SKILL6 = 25 OPTION_HOTKEY_QUICK_SKILL6 = 22
OPTION_HOTKEY_EXSKILL1 = 26 // ?멩퐤?띌돱 ?쀧뀥(F1 - F6) OPTION_HOTKEY_QUICK_SKILL7 = 8
OPTION_HOTKEY_EXSKILL2 = 27 OPTION_HOTKEY_EXSKILL1 = 31 // ?멩퐤?띌돱 ?쀧뀥(QWERTY)
OPTION_HOTKEY_EXSKILL3 = 28 OPTION_HOTKEY_EXSKILL2 = 37
OPTION_HOTKEY_EXSKILL4 = 29 OPTION_HOTKEY_EXSKILL3 = 19
OPTION_HOTKEY_EXSKILL5 = 30 OPTION_HOTKEY_EXSKILL4 = 32
OPTION_HOTKEY_EXSKILL6 = 31 OPTION_HOTKEY_EXSKILL5 = 34
OPTION_HOTKEY_EXSKILL6 = 39
OPTION_HOTKEY_EXSKILL7 = 10
OPTION_HOTKEY_ITEM_QUICKSLOT1 = 32 // 爺닸¨?????쀧뀥(1 - 6) OPTION_HOTKEY_ITEM_QUICKSLOT1 = 32 // 爺닸¨?????쀧뀥(1 - 6)
OPTION_HOTKEY_ITEM_QUICKSLOT2 = 33 OPTION_HOTKEY_ITEM_QUICKSLOT2 = 33
OPTION_HOTKEY_ITEM_QUICKSLOT3 = 34 OPTION_HOTKEY_ITEM_QUICKSLOT3 = 34
@ -92,7 +138,7 @@ enum CONTROLLER {
OPTION_HOTKEY_MENU_COMMUNITY = 45 // ?닷뿽?뽳썙 瑥→솺(8) OPTION_HOTKEY_MENU_COMMUNITY = 45 // ?닷뿽?뽳썙 瑥→솺(8)
OPTION_HOTKEY_MENU_CONTENTS = 46 // ?잒샇??瑥→솺(9) OPTION_HOTKEY_MENU_CONTENTS = 46 // ?잒샇??瑥→솺(9)
OPTION_HOTKEY_MENU_SERVICE = 47 // ?껆뼁??瑥→솺(0) OPTION_HOTKEY_MENU_SERVICE = 47 // ?껆뼁??瑥→솺(0)
OPTION_HOTKEY_MENU_SYSTEM__CLOSE_ALL_WINDOW = 48 // 壅낁땶?뷸츐??Esc) OPTION_HOTKEY_MENU_SYSTEM__CLOSE_ALL_WINDOW = 7 // 壅낁땶?뷸츐??Esc)
OPTION_HOTKEY_PVP = 49 // 恙든삮逆?P) OPTION_HOTKEY_PVP = 49 // 恙든삮逆?P)
OPTION_HOTKEY_RECOMMEND_USER = 50 // 瓮룩뙢玲뺟뙼([) OPTION_HOTKEY_RECOMMEND_USER = 50 // 瓮룩뙢玲뺟뙼([)
OPTION_HOTKEY_PARTY_MATCHING = 51 // ?뷂썙烏숃뒭(]) OPTION_HOTKEY_PARTY_MATCHING = 51 // ?뷂썙烏숃뒭(])

View File

@ -335,4 +335,7 @@ enum SOUND {
CLICK_BUTTON2 = "sounds/UI/click2.ogg" CLICK_BUTTON2 = "sounds/UI/click2.ogg"
CLICK_BUTTON3 = "sounds/UI/click3.ogg" CLICK_BUTTON3 = "sounds/UI/click3.ogg"
CLICK_BUTTON4 = "sounds/UI/click4.ogg" CLICK_BUTTON4 = "sounds/UI/click4.ogg"
CLICK_MOVE = "sounds/UI/click_move.ogg"
CHAT_MESSAGE = "sounds/UI/chat.ogg" //来消息的声音
} }

View File

@ -20,6 +20,8 @@ enum PACKET_ID {
CREATE_CHARACTER = 7 CREATE_CHARACTER = 7
//查询账号中的角色列表 //查询账号中的角色列表
QUERY_CHARACTER_LIST = 9 QUERY_CHARACTER_LIST = 9
//背包道具位置交换
INVENTORY_SWAP_ITEM = 13
//选择角色 //选择角色
SELECT_CHARACTER = 11 SELECT_CHARACTER = 11
//更换角色位置 //更换角色位置
@ -31,6 +33,13 @@ enum PACKET_ID {
//城镇中角色移动 //城镇中角色移动
TOWN_CHARACTER_MOVE = 10004 TOWN_CHARACTER_MOVE = 10004
//发送聊天消息
SEND_CHAT_MESSAGE = 15
//购买项目
BUY_ITEM = 16
//穿戴装备
WEAR_EQUIPMENT = 17
/**** 客户端收包 ***/ /**** 客户端收包 ***/
@ -43,6 +52,20 @@ enum PACKET_ID {
SELECT_CHARACTER_ENTER_GAME_CALLBACK = 5 SELECT_CHARACTER_ENTER_GAME_CALLBACK = 5
//刷新客户端角色背包数据 //刷新客户端角色背包数据
REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK = 6 REFRESH_CLIENT_CHARACTER_INVENTORY_DATA_CALLBACK = 6
//添加Item到背包
INVENTORY_ADD_ITEM_CALLBACK = 7
//删除Item到背包
INVENTORY_REMOVE_ITEM_CALLBACK = 8
//背包道具位置交换
INVENTORY_SWAP_ITEM_CALLBACK = 10
//刷新客户端角色点卷代币券信息
REFRESH_CLIENT_CHARACTER_CERA_DATA_CALLBACK = 11
//刷新客户端角色金币信息
REFRESH_CLIENT_CHARACTER_GOLD_DATA_CALLBACK = 12
//刷新客户端角色复活币信息
REFRESH_CLIENT_CHARACTER_REVIVE_DATA_CALLBACK = 13
//穿戴装备回包
WEAR_EQUIPMENT_CALLBACK = 14
//城镇移动切换区域回包 //城镇移动切换区域回包
CHANGE_TOWN_AREA_CALLBACK = 10001 CHANGE_TOWN_AREA_CALLBACK = 10001
//城镇添加角色回包 //城镇添加角色回包
@ -51,4 +74,6 @@ enum PACKET_ID {
TOWN_REMOVE_CHARACTER_CALLBACK = 10003 TOWN_REMOVE_CHARACTER_CALLBACK = 10003
//城镇中角色移动的回包 //城镇中角色移动的回包
TOWN_CHARACTER_MOVE_CALLBACK = 10004 TOWN_CHARACTER_MOVE_CALLBACK = 10004
//聊天消息回包
SEND_CHAT_MESSAGE_CALLBACK = 9
} }

View File

@ -5,7 +5,15 @@
文件用途:全局对象 文件用途:全局对象
*/ */
//客户端聊天窗口
ClientChatWindow <- null;
//客户端角色对象 //客户端角色对象
ClientCharacter <- null; ClientCharacter <- null;
//客户端角色的背包 //客户端角色的背包
ClientCharacterInventory <- null; ClientCharacterInventory <- null;
//客户端角色的个人信息
ClientPersonalInfo <- null;
//客户端角色的HUD
ClientHUD <- null;
//客户端角色的技能树窗口
ClientSkillTreeWindow <- null;

View File

@ -14,7 +14,7 @@ function main(args) {
local Game = GameWindow(); local Game = GameWindow();
Game.title = "Yosin & Kiwano"; Game.title = "Yosin & Kiwano";
Game.bg_color = [255.0, 255.0, 255.0, 255.0]; Game.bg_color = [255.0, 255.0, 255.0, 255.0];
Game.size = [1066 + 332, 600]; Game.size = [1067 + 332, 600];
Game.v_sync = false; Game.v_sync = false;
Game.frame_interval = 10000; Game.frame_interval = 10000;
Game.debug_mode = true; Game.debug_mode = true;

View File

@ -292,5 +292,41 @@
}, },
"User/UI/Window/6_PlayerChat.nut": { "User/UI/Window/6_PlayerChat.nut": {
"description": "聊天消息窗口" "description": "聊天消息窗口"
},
"User/UI/Window/7_Town_Chat_Msg.nut": {
"description": "城镇聊天气泡"
},
"User/Asset/Character/ChatBubble.nut": {
"description": "聊天气泡"
},
"User/Asset/Character/AdditionalItems.nut": {
"description": "附加项"
},
"User/UI/Window/7_Npc_Shop.nut": {
"description": "NPC商店"
},
"User/UI/Window/234_HUD_FuncInter.nut": {
"description": "功能交互"
},
"User/UI/Window/235_HUD_QuantityInput.nut": {
"description": "数量输入"
},
"User/UI/Widget/NumberInputBox.nut": {
"description": "数字输入框"
},
"User/UI/Widget/BaseWidget.nut": {
"description": "基础控件"
},
"Core/Timer": {
"description": "定时器类"
},
"User/UI/Window/5_Inventory/ItemACollect.nut": {
"description": "装扮物品栏"
},
"User/UI/Window/5_Inventory/AvatarCollect.nut": {
"description": "装扮物品栏"
},
"User/UI/Window/8_SkillTree": {
"description": "技能树"
} }
} }

View File

@ -1,3 +1,3 @@
equipment/equipmentinfo.etc 装备信息界面的配置 etc/iteminfo.etc 装备和道具信息界面的配置
角色chr文件新增了[default avatar] 的标签用于设置 角色默认装备 角色chr文件新增了[default avatar] 的标签用于设置 角色默认装备