用途
Ebitengine(Ebiten v2)是一个面向 Go 的 2D 游戏引擎技能,覆盖 Ebitengine 的完整 API 与周边生态,并按领域路由到对应子技能。适用场景是:使用 Go 与 Ebitengine(Ebiten v2)构建 2D 游戏或交互式图形应用。资料称其为“极其简单(dead simple)的 Go 2D 游戏库”,主张从 Game 接口入手,仅在需要时再添加第三方库。
主要能力
技能按领域拆分为以下子技能:
ebiten/game-loop:游戏循环、ebiten.Game接口、TPS/FPS、窗口配置。ebiten/input:键盘、鼠标、手柄、触屏输入。ebiten/rendering:图像、精灵、图块、相机、着色器、文本。ebiten/ecs:实体组件系统(Donburi、Ark 等)。ebiten/physics:碰撞检测、物理、寻路。ebiten/audio:音效、音乐、音频播放。ebiten/deployment:WASM、移动端、Steam、跨平台构建。ebiten/resources:资源加载、图块地图(LDtk、Tiled)、资源管理。
导入路径为 github.com/hajimehoshi/ebiten/v2。资料列出的平台包括桌面(Windows/macOS/Linux)、移动端(iOS/Android)、WebAssembly 与 Nintendo Switch。
使用方式
资料提供的最小游戏模板如下:
package main
import (
"log"
"github.com/hajimehoshi/ebiten/v2"
)
type Game struct{}
func (g *Game) Update() error {
return nil
}
func (g *Game) Draw(screen *ebiten.Image) {
}
func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
return 320, 240
}
func main() {
ebiten.SetWindowSize(640, 480)
ebiten.SetWindowTitle("Title")
if err := ebiten.RunGame(&Game{}); err != nil {
log.Fatal(err)
}
}
核心概念:
- TPS 与 FPS:TPS 指
Update()每秒调用次数,默认 60,可通过ebiten.SetTPS()设置;FPS 指Draw()每秒调用次数,与显示器刷新率相关。可用ebiten.CurrentTPS()/ebiten.CurrentFPS()监控。使用ebiten.SetTPS(ebiten.SyncWithFPS)可将更新与渲染解耦。 - 坐标系:原点 (0,0) 位于左上,X 向右增大,Y 向下增大;
Layout()定义逻辑屏幕尺寸,引擎缩放到窗口。 - 图像模型:
ebiten.Image是核心绘制表面;Draw()中的screen参数是最终渲染目标;SubImage()用于精灵表区域(零拷贝);ebiten.NewImage()用于离屏缓冲。
生态库(资料列举)
- 架构:donburi(ECS,500+ stars)、ark(原型式 ECS,400+)、mizu(ECS 框架,400+)、ebiten-extended(Godot 风格场景图、相机、精灵,100+)。
- GUI:ebitenui(完整控件库:按钮、列表、下拉框)、furex(基于 Flexbox 的 UI 框架)、etk(图形界面工具包)。
- 图形与动画:ganim8(动画库)、aseprite(Aseprite 文件解析,含图层、标签、切片)、aseplayer(Aseprite 动画播放)、etxt(字体管理与文本渲染)、colorgrad(颜色渐变)、tetra3d(基于 Ebitengine 的 3D 软件渲染器)。
- 物理与碰撞:resolv(2D 碰撞检测与解算)、cp(Chipmunk2D 移植)、box2d-go(Box2D v3 移植)、coll(2D 碰撞检测)。
- 世界与地图:ldtkgo(LDtk 关卡设计器加载器)、go-tiled(Tiled TMX 解析器)、dngn(随机地图生成)、paths(A* 寻路)。
- 输入:ebitengine-input(Godot 风格动作输入系统)。
- 音频:resound(音效:延迟、低通、声像、失真)、xm(XM 音乐格式播放)。
- 资源与工具:ebitengine-resource(资源管理器)、gdata(跨平台游戏数据存储)、kamera(带震动、插值、缩放相机)。
- 网络:necs(Donburi ECS 的网络层)。
- 集成:go-steamworks(Steamworks SDK 绑定)。
实践规范(资料给出的反模式与建议)
- 不要在
Update()/Draw()中调用ebiten.NewImage(),应在NewGame()或加载阶段一次性创建。 - 不要用浮点表示像素位置,应使用
float64配合 GeoM(引擎处理亚像素)。 - 不要在
Draw()中加载资源,应在init()或专用加载阶段完成。 - 不要忽略
Layout()返回值,应返回一致逻辑尺寸。 - 单次动作用
inpututil.IsKeyJustPressed(),而非ebiten.IsKeyPressed()。 - 不要每帧新建
*ebiten.DrawImageOptions,应复用并用opts.GeoM.Reset()重置。 - 不要把游戏状态与渲染逻辑混在一起,
Update()保持纯逻辑,Draw()保持纯渲染。
参考资源
- 文档:https://ebitengine.org/en/documents/
- 速查表:https://ebitengine.org/en/documents/cheatsheet.html
- 示例:https://github.com/hajimehoshi/ebiten/tree/main/examples
- 资源列表:https://github.com/sedyh/awesome-ebitengine
- Kage 着色器:https://ebitengine.org/en/documents/shader.html
- TPS vs FPS:https://github.com/tinne26/tps-vs-fps
限制
资料明确要求:仅当任务清晰匹配上述范围时使用本技能;不应将输出视为环境特定验证、测试或专家评审的替代;若缺少必要输入、权限、安全边界或成功标准,应停止并请求澄清。