360 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			360 lines
		
	
	
		
			10 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 x = 0;
 | 
						|
        local y = 0;
 | 
						|
 | 
						|
        // 左上角
 | 
						|
        local backgroundTopLeft = CL_SpriteObject(path, imgId);
 | 
						|
        backgroundTopLeft.SetPosition(x, y);
 | 
						|
        Addchild(backgroundTopLeft);
 | 
						|
        // 左上角图片大小
 | 
						|
        local cornerImgSize = backgroundTopLeft.GetSize();
 | 
						|
        local cornerWidth = cornerImgSize.w;
 | 
						|
        local cornerHeight = cornerImgSize.h;
 | 
						|
 | 
						|
        // 中间
 | 
						|
        local backgroundCenter = CL_SpriteObject(path, imgId + 4);
 | 
						|
        backgroundCenter.SetPosition(cornerWidth, y + cornerHeight);
 | 
						|
        Addchild(backgroundCenter);
 | 
						|
        // 中间图片大小
 | 
						|
        local centerImgSize = backgroundCenter.GetSize();
 | 
						|
        local centerWidth = centerImgSize.w;
 | 
						|
        local centerHeight = centerImgSize.h;
 | 
						|
 | 
						|
 | 
						|
        local scaleW = (width.tofloat() - cornerWidth.tofloat() * 2.0) / centerWidth.tofloat();
 | 
						|
        local scaleH = (height.tofloat() - y.tofloat() - cornerHeight.tofloat()) / centerHeight.tofloat();
 | 
						|
 | 
						|
        // 上边
 | 
						|
        local backgroundTop = CL_SpriteObject(path, imgId + 1);
 | 
						|
        backgroundTop.SetPosition(cornerWidth, y);
 | 
						|
        backgroundTop.SetScale(scaleW, 1);
 | 
						|
        Addchild(backgroundTop);
 | 
						|
 | 
						|
        // 右上角
 | 
						|
        local backgroundTopRight = CL_SpriteObject(path, imgId + 2);
 | 
						|
        backgroundTopRight.SetPosition(width - cornerWidth, y);
 | 
						|
        Addchild(backgroundTopRight);
 | 
						|
 | 
						|
        // 左边
 | 
						|
        local backgroundLeft = CL_SpriteObject(path, imgId + 3);
 | 
						|
        backgroundLeft.SetPosition(x, y + cornerHeight);
 | 
						|
        backgroundLeft.SetScale(1, scaleH);
 | 
						|
        Addchild(backgroundLeft);
 | 
						|
 | 
						|
        // 中间
 | 
						|
        backgroundCenter.SetScale(scaleW, scaleH);
 | 
						|
 | 
						|
        // 右边
 | 
						|
        local backgroundRight = CL_SpriteObject(path, imgId + 5);
 | 
						|
        backgroundRight.SetPosition(width - cornerWidth, y + cornerHeight);
 | 
						|
        backgroundRight.SetScale(1, scaleH);
 | 
						|
        Addchild(backgroundRight);
 | 
						|
 | 
						|
        // 左下角
 | 
						|
        local backgroundBottomLeft = CL_SpriteObject(path, imgId + 6);
 | 
						|
        backgroundBottomLeft.SetPosition(x, height - cornerHeight);
 | 
						|
        Addchild(backgroundBottomLeft);
 | 
						|
 | 
						|
        // 下边
 | 
						|
        local backgroundBottom = CL_SpriteObject(path, imgId + 7);
 | 
						|
        backgroundBottom.SetPosition(cornerWidth, height - cornerHeight);
 | 
						|
        backgroundBottom.SetScale(scaleW, 1);
 | 
						|
        Addchild(backgroundBottom);
 | 
						|
 | 
						|
        // 右下角
 | 
						|
        local backgroundBottomRight = CL_SpriteObject(path, imgId + 8);
 | 
						|
        backgroundBottomRight.SetPosition(width - cornerWidth, height - cornerHeight);
 | 
						|
        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();
 | 
						|
    }
 | 
						|
} |