81 lines
2.3 KiB
Go
81 lines
2.3 KiB
Go
//go:build gl
|
||
|
||
// 界面屏幕构建:中文标题与按钮(UI还原.md §2、§4 中文回退)。
|
||
package main
|
||
|
||
import (
|
||
"image/color"
|
||
"os"
|
||
"path/filepath"
|
||
|
||
"mc/internal/assets"
|
||
"mc/internal/cjkfont"
|
||
"mc/internal/ui"
|
||
)
|
||
|
||
// cjkPaths 系统 CJK 字体候选。
|
||
var cjkPaths = []string{
|
||
filepath.Join(os.Getenv("WINDIR"), "Fonts", "msyh.ttc"),
|
||
filepath.Join(os.Getenv("WINDIR"), "Fonts", "msyh.ttf"),
|
||
}
|
||
|
||
// buildScreens 构建主菜单与暂停菜单(按钮纹理 = 中文文本光栅化)。
|
||
func buildScreens(r *ui.Renderer, lang *assets.Lang) (*ui.TitleScreen, *ui.PauseScreen) {
|
||
cjk := loadCJK()
|
||
text := func(key, fallback string, size float64) (uint32, float32, float32) {
|
||
label := fallback
|
||
if lang != nil {
|
||
label = lang.Get(key)
|
||
}
|
||
if cjk != nil {
|
||
img := cjk.Draw(label, color.RGBA{255, 255, 255, 255})
|
||
tex := r.UploadImage(img)
|
||
return tex, float32(img.Bounds().Dx()), float32(img.Bounds().Dy())
|
||
}
|
||
return 0, 0, 0
|
||
}
|
||
|
||
titleTex, titleW, titleH := text("menu.title", "年糕历险记", 48)
|
||
if titleW == 0 {
|
||
titleW, titleH = 320, 48 // 无 CJK 字体时占位
|
||
}
|
||
|
||
// 主菜单按钮(居中列,UI还原.md §2)
|
||
btn := func(key, fallback, action string, y float32, w, h int) ui.Button {
|
||
tex, tw, th := text(key, fallback, 24)
|
||
x := float32(w)/2 - tw/2
|
||
return ui.Button{X: x, Y: y, W: tw, H: th, Tex: tex, Action: action}
|
||
}
|
||
title := &ui.TitleScreen{}
|
||
title.TitleTex = titleTex
|
||
title.TitleW = titleW
|
||
title.TitleH = titleH
|
||
title.Buttons = []ui.Button{
|
||
btn("menu.singleplayer", "单人游戏", "play", 300, 1280, 720),
|
||
btn("menu.multiplayer", "多人游戏", "", 350, 1280, 720),
|
||
btn("menu.quit", "退出游戏", "quit", 400, 1280, 720),
|
||
}
|
||
_ = titleTex
|
||
_ = titleH
|
||
|
||
pause := &ui.PauseScreen{}
|
||
pause.TitleTex, pause.TitleW, pause.TitleH = text("menu.game", "游戏菜单", 32)
|
||
pause.Buttons = []ui.Button{
|
||
btn("gui.resume", "继续游戏", "resume", 300, 1280, 720),
|
||
btn("menu.quit", "保存并退出", "quit", 350, 1280, 720),
|
||
}
|
||
return title, pause
|
||
}
|
||
|
||
// loadCJK 加载系统 CJK 字体(失败返回 nil → 按钮退化不显示文本)。
|
||
func loadCJK() *cjkfont.Renderer {
|
||
for _, p := range cjkPaths {
|
||
if _, err := os.Stat(p); err == nil {
|
||
if r, err := cjkfont.Load(p, 24); err == nil {
|
||
return r
|
||
}
|
||
}
|
||
}
|
||
return nil
|
||
}
|