作者ak147 (斬擊掰)
看板WOW
標題Re: [心得] 精確介面縮放
時間Thu Sep 8 03:31:49 2011
夜半三更睡不著 把故事說完好了..
前情提要:
目前大家所看到的遊戲畫面 = 遊戲預設解析度 X 放大倍率
所以再把放大的倍率除回來就可以得到1:1精確的顯示
BUT,
放大倍率算法就是就是就是
目前畫面解析度的高度÷
遊戲原始解析度的高度(768)
幹..高亮好刺眼
恩...
到此看起來推理很正確
但其實在這邊遇到了一個問題
甚麼時候遊戲的原始解析度會改變?
4.0.X前
當 選項>進階>使用者介面縮放 這欄沒有打勾時
遊戲會顯示預設的解析度(高=768)
4.0.X後
(也就是我回鍋之前orz...)
當 選項>進階>使用者介面縮放 這欄沒有打勾時
遊戲會顯示 選項>影像>解析度 的設定值
這代表著4.0.X以後 你只要不勾介面縮放 就會是精確的顯示
什麼? 上篇故事看那麼久白看的 還看沒有
巨集也白打了 我只要不打勾就好了嘛!
這麼想是正確的 顆顆
但不是所有玩家都不打勾不縮放吧!!
同樣的 細心的UI開發者 也會想盡辦法讓UI在各種解析度之下都不會變形
所以下面來介紹4.0.X之後怎麼寫scaleFix (拖走
首先依照上篇的原理算出縮放修正值
local scaleFix = 768/string.match(GetCVar("gxResolution","%d+x(%d+)")
再來要檢查玩家
"那邊"有沒有打勾 (這邊順便加入修正值 最後function比較好看)
local m -- 設個變數放計算結果
if GetCVar("useUiScale") == "1" then -- 如果"那邊"有打勾
m = scaleFix / GetCVar("uiScale") -- 就把玩家設定的縮放值除回來
else -- 不然有打勾的話
m = 1 -- 就不動
end -- 以上
變數都OK了 最後把function寫出來
local scale = function(value) -- 新增一個叫scale的function, 變數叫做value
return m * value -- 給value就計算 m * value 然後丟回去
end -- end
好了之後我們就能在ui中以scale()來取得精確值
舉例來說,
我想要某Frame
在1600x900 與1440x900 與1920x1080 三種解析度下
位置距離螢幕中間+10px <<有單位喔
我們就可以這樣寫
Frame:SetPoint("CENTER", UIParent, "CENTER", 0, scale(10))
同樣的我們也可以精確設定他的大小
Frame:SetHeight(scale(20))
Frame:SetWidth(scale(100))
以上大概就這樣
反正能精確做設計就能自由發揮想像力了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.43.231.32
→ incKevin:就那個那個嘛!! 09/08 03:34
凱文醫生早啊 你一定直接end 你給我300p
→ incKevin:降都被發現END了...嗚嗚 09/08 03:43
我壞壞啊
推 andy30093:我看不懂T_T 09/08 03:57
不懂沒差啦...0學分的選修
→ dlikeayu:跟網頁設計抓使用者者解析度來決定釋放哪種tpl一樣 09/08 05:06
一樣是為了呈現最好的視覺效果沒錯拉
不過這邊是修正單位大小 網頁是直接放出整個版型
推 dito99:哦 原來如此 09/08 05:10
就這麼簡單
推 Unbreak:斬擊可以帶我拿裝嗎?(大誤)(遮臉)(逃跑) 09/08 12:43
→ ak147:Go! 09/08 12:47
推 sleepybaby:真的 那個那個啦(亂指 09/09 04:13
/指/指/指
※ 編輯: ak147 來自: 114.25.146.251 (09/09 10:30)