local function zhuanpan(msgID, msgData)
local screenWidth = SL:GetMetaValue("SCREEN_WIDTH", 0)
local screenHeight = SL:GetMetaValue("SCREEN_HEIGHT", 0)
local parent = GUI:Win_Create("zhuanpan", 0, 0, 0, 0, false, false, true, false,
🤖 回答引擎: 前端Lua |
🕒 时间: 2026-04-21 16:32:57 |
👁️ 阅读: 16
你的代码中,按钮坐标不跟随分辨率变化的原因在于:**你使用了一个本地坐标来计算按钮位置**。
让我们分析一下问题所在:
```lua
local disanPos = GUI:getPosition(disan)
local beimian = GUI:Button_Create(disan, "bt1",disanPos.x/2, disanPos.y/2-300, "res/yuding/donghua/2.png")
```
这里`GUI:getPosition(disan)`获取的是`disan`在其父节点`parent`中的**相对坐标**,而不是屏幕绝对坐标。当`disan`本身位于屏幕中心(`screenWidth/2, screenHeight/2`)时,`disanPos.x/2`和`disanPos.y/2-300`这个计算就失去了意义。
**正确的做法是:直接使用屏幕分辨率计算按钮的绝对位置**:
```lua
-- 创建第三个序列帧(初始透明)
local disan = GUI:Frames_Create(
parent,
"threeFrames",
screenWidth/2,
screenHeight/2,
"res/yuding/donghua/d/d",
".png",
1,
25,
{speed = 50, count = 25, loop = -1}
)
-- 按钮应该放在屏幕中心偏下300像素的位置
local buttonX = screenWidth/2
local buttonY = screenHeight/2 - 300
local beimian = GUI:Button_Create(disan, "bt1", buttonX, buttonY, "res/yuding/donghua/2.png")
```
**关键点说明:**
1. **坐标系统**:在996引擎中,当你创建子控件时,传入的x,y坐标是相对于父控件的**局部坐标**,不是屏幕绝对坐标
2. **分辨率适配**:`screenWidth`和`screenHeight`是获取的屏幕实际分辨率,用它们计算可以确保在不同设备上位置一致
3. **锚点影响**:你设置了`GUI:setAnchorPoint(disan, 0.5, 0.5)`,这意味着`disan`的位置(screenWidth/2, screenHeight/2)是它的中心点,而不是左上角
**改进建议:**
如果你想让按钮始终在`disan`这个序列帧的某个固定位置(比如正下方),可以这样计算:
```lua
-- 假设disan的尺寸是已知的,比如宽200,高200
local disanWidth = 200
local disanHeight = 200
-- 按钮放在disan正下方,水平居中
local buttonX = 0 -- 相对于disan的x坐标
local buttonY = -disanHeight/2 - 50 -- 在disan下方50像素
local beimian = GUI:Button_Create(disan, "bt1", buttonX, buttonY, "res/yuding/donghua/2.png")
GUI:setAnchorPoint(beimian, 0.5, 0.5) -- 让按钮的锚点也在中心
```
这样无论屏幕分辨率如何变化,按钮都会相对于`disan`保持固定的相对位置。
**总结:**
坐标问题通常是因为混淆了**屏幕绝对坐标**和**父节点相对坐标**。记住:创建子控件时使用的是父控件的局部坐标系!
← 返回问答库