chore: M0 项目骨架(年糕历险记)——配置/日志/主循环/数据文件/构建脚本
This commit is contained in:
6
cmd/client/dev_dev.go
Normal file
6
cmd/client/dev_dev.go
Normal file
@@ -0,0 +1,6 @@
|
||||
//go:build dev
|
||||
|
||||
package main
|
||||
|
||||
// dev 构建:开发模式默认开启(直接读取 assets/ 目录)。
|
||||
const devDefault = true
|
||||
6
cmd/client/dev_release.go
Normal file
6
cmd/client/dev_release.go
Normal file
@@ -0,0 +1,6 @@
|
||||
//go:build !dev
|
||||
|
||||
package main
|
||||
|
||||
// release 构建:默认关闭开发模式(go:embed 嵌入资源)。
|
||||
const devDefault = false
|
||||
52
cmd/client/main.go
Normal file
52
cmd/client/main.go
Normal file
@@ -0,0 +1,52 @@
|
||||
// 年糕历险记 —— 客户端入口。
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
||||
"mc/internal/config"
|
||||
"mc/internal/engine"
|
||||
"mc/internal/logx"
|
||||
)
|
||||
|
||||
var devMode = flag.Bool("dev", devDefault, "开发模式:直接读取 assets/(默认随构建 tag)")
|
||||
|
||||
// clientApp 客户端应用骨架(窗口/渲染在 Todo 4 接入)。
|
||||
type clientApp struct {
|
||||
cfg *config.ClientConfig
|
||||
log *logx.Logger
|
||||
}
|
||||
|
||||
// Tick 每 tick(20Hz)逻辑。
|
||||
func (a *clientApp) Tick(dt float64) {}
|
||||
|
||||
// Render 每帧渲染(占位)。
|
||||
func (a *clientApp) Render() {}
|
||||
|
||||
// ShouldClose 窗口关闭判定(占位)。
|
||||
func (a *clientApp) ShouldClose() bool { return false }
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
log, err := logx.New("logs/client.log", logx.LevelInfo)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cfg, err := config.Load("config/client.yaml", config.DefaultClient())
|
||||
if err != nil {
|
||||
log.Warnf("配置加载失败,使用默认值:%v", err)
|
||||
}
|
||||
log.Infof("%s 客户端启动:%dx%d,语言 %s,视距 %d", cfg.Client.WindowTitle, cfg.Client.WindowWidth, cfg.Client.WindowHeight, cfg.Client.Language, cfg.Client.RenderDistance)
|
||||
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
defer stop()
|
||||
|
||||
app := &clientApp{cfg: cfg, log: log}
|
||||
engine.Run(ctx, app, app)
|
||||
log.Infof("客户端已退出")
|
||||
}
|
||||
50
cmd/server/main.go
Normal file
50
cmd/server/main.go
Normal file
@@ -0,0 +1,50 @@
|
||||
// 年糕历险记 —— 专用服务器入口。
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"os"
|
||||
"os/signal"
|
||||
|
||||
"mc/internal/config"
|
||||
"mc/internal/engine"
|
||||
"mc/internal/logx"
|
||||
)
|
||||
|
||||
// serverApp 服务器应用骨架(世界/网络在后续里程碑接入)。
|
||||
type serverApp struct {
|
||||
cfg *config.ServerConfig
|
||||
log *logx.Logger
|
||||
tickCount uint64
|
||||
}
|
||||
|
||||
// Tick 每 tick(20Hz)服务器逻辑。
|
||||
func (s *serverApp) Tick(dt float64) {
|
||||
s.tickCount++
|
||||
if s.tickCount%100 == 0 { // 每 5 秒
|
||||
s.log.Debugf("tick=%d", s.tickCount)
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
|
||||
log, err := logx.New("logs/server.log", logx.LevelInfo)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
cfg, err := config.Load("config/server.yaml", config.DefaultServer())
|
||||
if err != nil {
|
||||
log.Warnf("配置加载失败,使用默认值:%v", err)
|
||||
}
|
||||
log.Infof("年糕历险记 服务器启动:端口 %d,世界 %q,种子 %d,tick 率 %d", cfg.Server.Port, cfg.World.Name, cfg.World.Seed, cfg.Server.TickRate)
|
||||
|
||||
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
|
||||
defer stop()
|
||||
|
||||
app := &serverApp{cfg: cfg, log: log}
|
||||
engine.Run(ctx, app, engine.NoopRenderer{})
|
||||
log.Infof("服务器已退出")
|
||||
}
|
||||
Reference in New Issue
Block a user