DOF/sqr/Core/UI_Class/UI_Widget.nut

637 lines
17 KiB
Plaintext

/*
文件名:UI_Widget.nut
路径:Core/UI_Class/UI_Widget.nut
创建日期:2024-11-08 14:24
文件用途: 控件基类
*/
//基础UI
class Yosin_CommonUi extends Yosin_BaseWindow {
ObjectId = null;
Localtion_X = 0;
Localtion_Y = 0;
isLBDown = false;
//是否悬停
isInRect = false;
OnClick = null;
OnClickSound = null;
Data = null;
constructor(x, y, width, height) {
this.Localtion_X = x;
this.Localtion_Y = y;
this.Width = width;
this.Height = height;
ObjectId = clock();
base.constructor();
//构造时第一次同步坐标
SyncPos(x, y);
}
//override
//鼠标事件回调
function OnMouseProc(MousePos_X, MousePos_Y) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) isInRect = true;
else isInRect = false;
base.OnMouseProc(MousePos_X, MousePos_Y);
}
//鼠标左键按下回调
function OnMouseLbDown(MousePos_X, MousePos_Y) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
isLBDown = true;
}
base.OnMouseLbDown(MousePos_X, MousePos_Y);
}
//鼠标左键弹起回调
function OnMouseLbUp(MousePos_X, MousePos_Y) {
isLBDown = false;
base.OnMouseLbUp(MousePos_X, MousePos_Y);
}
//鼠标左键单击回调
function OnMouseLbClick(MousePos_X, MousePos_Y) {
local Pos = GetWorldPosition();
if (Math.IsIntersectRect(MousePos_X, MousePos_Y, 1, 1, Pos.x, Pos.y, Width, Height)) {
if (OnClick) OnClick(this);
//如果有配置按键音效
if (OnClickSound) {
Sq_PlaySoundEffect(OnClickSound);
}
}
base.OnMouseLbClick(MousePos_X, MousePos_Y);
}
}
//基础按钮
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);
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);
}
}
}
//九宫格拉伸
class Yosin_NineBoxStretch extends Yosin_CommonUi {
constructor(X, Y, W, H, Path, Idx) {
base.constructor(X, Y, W, H);
DrawBackground(W, H, Path, Idx);
}
// 绘制
function DrawBackground(width, height, 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);
// 左上角
backgroundTopLeft.SetPosition(0, 0);
Addchild(backgroundTopLeft);
// 中间图片大小
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.SetPosition(backgroundTopLeft.right() + 1, 0);
backgroundTop.SetScale(scaleW, 1);
Addchild(backgroundTop);
// 右上角
backgroundTopRight.SetPosition(width - backgroundTopRight.GetSize().w, 0);
Addchild(backgroundTopRight);
// 左边
local backgroundLeft = CL_SpriteObject(path, imgId + 3);
backgroundLeft.SetPosition(0, backgroundTopLeft.bottom() + 1);
backgroundLeft.SetScale(1, scaleH);
Addchild(backgroundLeft);
// 中间
backgroundCenter.SetPosition(backgroundLeft.right() + 1, backgroundLeft.Y);
backgroundCenter.SetScale(scaleW, scaleH);
Addchild(backgroundCenter);
// 右边
backgroundRight.SetPosition(width - backgroundRight.GetSize().w, backgroundCenter.Y);
backgroundRight.SetScale(1, scaleH);
Addchild(backgroundRight);
// 左下角
backgroundBottomLeft.SetPosition(0, height - backgroundBottomLeft.GetSize().h);
Addchild(backgroundBottomLeft);
// 下边
backgroundBottom.SetPosition(backgroundBottomLeft.right() + 1, backgroundBottomLeft.Y);
backgroundBottom.SetScale(scaleW, 1);
Addchild(backgroundBottom);
// 右下角
backgroundBottomRight.SetPosition(width - backgroundBottomRight.GetSize().w, backgroundBottomLeft.Y);
Addchild(backgroundBottomRight);
}
}
//拼接按钮
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(0, 0, W, H, Path, Idx, Direction);
//悬停态
SpriteList[1] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + (UnavailableFlag ? 4 : 3), Direction);
//按下态
SpriteList[2] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + (UnavailableFlag ? 8 : 6), Direction);
if (UnavailableFlag) {
//不可用态
SpriteList[3] = Yosin_EmeStretch(0, 0, 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;
AddUIChild(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(0, 0, W, H, Path, Idx);
AddUIChild(SpriteList[0]);
//悬停态
SpriteList[1] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + 3);
SpriteList[1].SetVisible(false)
AddUIChild(SpriteList[1]);
//按下态
SpriteList[2] = Yosin_EmeStretch(0, 0, W, H, Path, Idx + 6);
SpriteList[2].SetVisible(false)
AddUIChild(SpriteList[2]);
// 文字
titleText = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(130, 114, 84, 255)
});
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, titles, path, idx, selectIndex = 0, baseWidth = 34) {
this.tests = titles;
btns = [];
local btnX = 0;
for (local i = 0; i< titles.len(); i++) {
local textW = FontAssetManager.GenerateNormal(titles[i], true).GetSize().w + 10;
local btnW = baseWidth + 10;
btnW = textW > btnW ? textW : btnW;
local titleBtn = Yosin_StretchTitleButton(btnX, 1, btnW, 19, path, idx, titles[i]);
titleBtn.index = i;
titleBtn.LBDownOnClick = function(btn) {
btn.Parent.LBDownOnClick(this, btn.index);
for (local i = 0; i< btn.Parent.btns.len(); i++) {
btn.Parent.btns[i].SetSelect(false);
btn.Parent.btns[i].titleText.SetFillColor(sq_RGBA(130, 114, 84, 255));
}
btn.SetSelect(true);
btn.Parent.btns[btn.index].titleText.SetFillColor(sq_RGBA(187, 176, 149, 255));
};
btns.push(titleBtn);
btnX += btnW + 1;
}
base.constructor(X, Y, btnX, 21);
for (local i = 0; i< btns.len(); i++) {
AddUIChild(btns[i]);
}
btns[0].SetSelect(true);
}
}
// 进度显示
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);
}
}
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();
}