DOF/sqr/Core/UI_Class/UI_Widget.nut

411 lines
12 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;
local ScaleRateH = H / SpriteList[1].GetSize().h;
SpriteList[1].SetPosition(SpriteList[0].GetSize().w, 0);
SpriteList[1].SetScale(ScaleRate, ScaleRateH);
SpriteList[2].SetPosition(SpriteList[0].GetSize().w + ScaleW, 0);
if (H != SpriteList[1].GetSize().h) {
SpriteList[0].SetScale(1, ScaleRateH);
SpriteList[2].SetScale(1, ScaleRateH);
}
}
//纵向
else {
local ScaleH = (H - SpriteList[0].GetSize().h - SpriteList[2].GetSize().h);
local ScaleRate = ScaleH / SpriteList[1].GetSize().h;
local ScaleRateW = H / SpriteList[1].GetSize().w;
SpriteList[1].SetPosition(0, SpriteList[0].GetSize().h);
SpriteList[1].SetScale(ScaleRateW, ScaleRate);
SpriteList[2].SetPosition(0, SpriteList[0].GetSize().h + ScaleH);
if (W != SpriteList[1].GetSize().w) {
SpriteList[0].SetScale(ScaleRateW, ScaleRateH);
SpriteList[2].SetScale(ScaleRateW, ScaleRateH);
}
}
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 : 3), 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 Yosin_TopTitle extends Yosin_CommonUi {
constructor(W, H, title, drawBackground = true) {
base.constructor(0, 0, W, H);
//内容背景
if (drawBackground){
local background = Yosin_NineBoxStretch(-1, 15, W + 1, H - 15, "sprite/interface/lenheartwindowcommon.img", 97);
AddUIChild(background);
}
// 标题背景
local Background = Yosin_EmeStretch(0, 0, W, 22, "sprite/interface/lenheartwindowcommon.img", 609);
Addchild(Background);
// 标题亮色背景
local BackgroundBright = CL_SpriteObject("sprite/interface/lenheartwindowcommon.img", 483);
local scaleW = (W / BackgroundBright.GetSize().w).tofloat();
BackgroundBright.SetScale( scaleW , 1);
Addchild(BackgroundBright);
// 标题
local titleTextActor = FontAssetManager.GenerateNormal(title, true, {
color = sq_RGBA(206, 189, 140, 255),
alignment = TextAlign.Center,
});
local titleX = W / 2 - titleTextActor.GetSize().w / 2;
// 绘制标题
titleTextActor.SetPosition(titleX, 2);
Addchild(titleTextActor);
}
}