ブラウザでも動く簡易 2D ゲームライブラリ Ebiten を Go で作った

# Ebiten (海老天)

https://hajimehoshi.github.io/ebiten/

## 概要

![Ebiten](https://hajimehoshi.github.io/ebiten/images/examples/paint.png)

年末年始休みを費やして Go でゲームライブラリ Ebiten の新バージョン 1.1.0-rc1 をリリースしました。特徴は以下の通り:

* [Go](https://golang.org) を使ったゲーム開発
  * 楽しい!
* [シンプルな API](https://godoc.org/github.com/hajimehoshi/ebiten)
  * スクリーンもテクスチャも全部 [ebiten.Image](https://godoc.org/github.com/hajimehoshi/ebiten#Image) 構造体で表されます。 Ebiten における描画は ebiten.Image に ebiten.Image を描画する形だけでほぼすべて表現されます (v1.1.0-rc1 時点)。また、 ebiten.Image 構造体は [image.Image](http://golang.org/pkg/image/#Image) インターフェイスを実装しているため、例えば描画中の画面を PNG にデコードして保存なども簡単にできます。
* 2D グラフィックス
  * アルファブレンディング
  * 行列演算による描画 (幾何変換および色変換)、いずれもシェーダ (GLSL) で実行されるので高速
  * オフスクリーンレンダリング (画面ではなくテクスチャを描画対象とした描画)
* キーボード、マウスによる入力
* [GopherJS](http://gopherjs.org/) を使ったブラウザ上での実行
  * Chrome、 Firefox、 Safari で動作確認
  * **JavaScript を一切書かなくても、ブラウザで動くゲームが作れる!**
* [Apache License ver 2.0](http://www.apache.org/licenses/LICENSE-2.0)

**追記 (2017-05-17):** マルチプラットフォーム対応です。 Windows、 macOS、 Linux、 FreeBSD、 Android、 iOS、 Web ブラウザで動きます。

コントリビュートはご気軽に!

## サンプル

[お絵かきソフト](https://hajimehoshi.github.io/ebiten/examples/paint.html)や[みんなが知っているブロックを消すゲーム](https://hajimehoshi.github.io/ebiten/examples/blocks.html)など。その他 [Ebiten Web サイト](http://hajimehoshi.github.io/ebiten/)からどうぞ。

![](https://hajimehoshi.github.io/ebiten/images/examples/blocks.png)

## インストール方法

**追記および修正 (2017-05-27):** 詳しくは[公式の Wiki](https://github.com/hajimehoshi/ebiten/wiki) をどうぞ。各プラットフォームごとに準備方法が異なります。

```sh
:; go get github.com/hajimehoshi/ebiten
```

GopherJS を使う場合は以下のライブラリも必要になります:

```sh
:; go get github.com/gopherjs/gopherjs
:; go get github.com/gopherjs/webgl
```

## ブラウザで自分のゲームを動かす方法

GopherJS で Go ファイルからゲームの JavaScript を生成した後、以下のような HTML を (HTTP サーバー経由で) 開けばゲームが動きます:

```html
<!DOCTYPE html>
<script src="yourgame.js"></script>
```

JavaScript が自動的に ``canvas`` 要素を作って表示してくれます。Ebiten ゲームの JavaScript を埋め込んだ HTML に他の要素を書くことはできません。そうしたい場合はゲームの HTML を ``iframe`` に埋め込んでください。実際、 Ebiten の Web サイトでは、各サンプルを ``iframe`` に埋め込んで実行しています。 Ebiten ゲームのブラウザ上実行はかなり重いので、ひとつの HTML ページに複数の Ebiten ゲームを ``iframe`` で埋め込むのは避けましょう。

## 実装

ほぼすべて Go です。 OpenGL の呼び出しなどはバインディングを使用しているため、 Ebiten 自体はほぼ cgo を使っていません。

### デスクトップ版

* [GLFW3](http://www.glfw.org/) (Go バインディングとして [go-gl/glfw3](https://github.com/go-gl/glfw))
* [OpenGL](https://www.opengl.org/) (Go バインディングとして [go-gl/gl](https://github.com/go-gl/gl)) と GLSL

### ブラウザ版

* [GopherJS](http://gopherjs.org/)
* WebGL ([GopherJS の WebGL バインディング](https://github.com/gopherjs/webgl)) と GLSL

GopherJS でコンパイルする際には ``js`` タグが使われるので、 Go ファイルの [Build Constraints](http://golang.org/pkg/go/build/) を使って、デスクトップ版とブラウザ版実装を分けています:

```go
// GopherJS の時にコンパイルされるファイルの場合:
// +build js
```

```go
// GopherJS の時にコンパイルされないファイルの場合:
// +build !js
```

例えば [internal/opengl/context_desktop.go](https://github.com/hajimehoshi/ebiten/blob/35288e3c947ab055dcc55aeb7ad6ab80b8a2d6d2/internal/opengl/context_desktop.go) はデスクトップ用、 [internal/opengl/context_js.go](https://github.com/hajimehoshi/ebiten/blob/35288e3c947ab055dcc55aeb7ad6ab80b8a2d6d2/internal/opengl/context_js.go) はブラウザ用の実装です。

### その他使用したもの

* [go-bindata](https://github.com/jteeuwen/go-bindata) (バイナリを Go コード化するツール)

## 今後の予定

**追記 (2017-05-16):** 2017 年 5 月現在、以下の予定は全て完了しています。

* ゲームパッド対応
* モバイル Web 対応
  * 一応現在もブラウザ版として iOS 上で動くことを確認してはいるが、タップ入力はまだ
* モバイルネイティブ対応
* オーディオ周り
  * [audio ブランチ](https://github.com/hajimehoshi/ebiten/tree/audio)で開発中
* テキストレンダリング
* ちゃんとした Windows 対応 (要望があれば)

## 名前の由来

エビの天ぷらはおいしいからです。

## 免責事項

この文章は私個人の見解を述べたものであり、私の所属している団体等とは一切の関係がありません。