SuperAPI AI 工具集

ebiten

编程与开发

查看项目

更新于 10-30 17:17

技能介绍

用途

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

限制

资料明确要求:仅当任务清晰匹配上述范围时使用本技能;不应将输出视为环境特定验证、测试或专家评审的替代;若缺少必要输入、权限、安全边界或成功标准,应停止并请求澄清。