production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集

## はじめに
[Ebiten](https://ebiten.org/) は、Goで書かれた非常にシンプルな2Dゲームライブラリです。（公式サイト: https://ebiten.org ）

圧倒的な安定性を誇り、今2Dゲームを作るなら非常にオススメ！ というわけで、改めて紹介記事を書いてみます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ねずみバスターズ、インドとブラジルに数万人規模でリリースしたんですが、報告されたクラッシュが30件程度なので驚愕の安定性...</p>&mdash; Daigo (@daigo) <a href="https://twitter.com/daigo/status/1304225257784393728?ref_src=twsrc%5Etfw">September 11, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[Ebiten で作られた「くまのレストラン」などの名作を手掛ける odencat の最新作、ねずみバスターズが公開されました（もちろん Ebiten 製）。現在各種アプリストアにてダウンロードできます。（勝手に宣伝）](https://mousebusters.odencat.com)

## 特徴
* クロスプラットフォームで、非常に安定
    * Windows
    * macOS (Metalを使用）
    * Linux
    * FreeBSD
    * Android
    * iOS
    * web
        * WebAssembly
    * Nintendo Switch（
* 非常にシンプルなAPI （参照: [ゲームエンジンはアートである - 8 年以上自作ゲームエンジンをメンテし続けている話](https://note.com/hajimehoshi/n/nc09751f2dbf9)）
* 豊富なサンプル（[ここですぐに触れます](https://ebiten.org/examples/)）
* 高いパフォーマンス
* 今もアクティブに開発中で、バグはすぐに修正され、新機能も追加されている
    * [最近は、Go風シェーダー言語 Kage が実装された。](https://github.com/hajimehoshi/ebiten/blob/master/examples/shader/water.go)

## はじめる
（ここではGoのインストールおよび、Goの基礎知識に関しては割愛します。）

Windowsおよび、macOSで Ebiten を使い始めるのは非常に簡単です！

まずは、`go mod init <モジュール名>` で適当なGo Moduleを作り、以下のコードを書いてみましょう。
（https://ebiten.org/tour/hello_world.html の転載）

```go:main.go
package main

import (
	"log"

	"github.com/hajimehoshi/ebiten"
	"github.com/hajimehoshi/ebiten/ebitenutil"
)

type Game struct{}

func (g *Game) Update(screen *ebiten.Image) error {
	return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
	ebitenutil.DebugPrint(screen, "Hello, World!")
}

func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) {
	return 320, 240
}

func main() {
	ebiten.SetWindowSize(640, 480)
	ebiten.SetWindowTitle("Hello, World!")
	if err := ebiten.RunGame(&Game{}); err != nil {
		log.Fatal(err)
	}
}
```

できたら、`go run main.go` を実行します。初回だけは各種ビルドに時間がかかるので待ちましょう。

画像のような、いい感じに味のあるHello Worldが表示されれば成功です！
![スクリーンショット 2020-09-12 19.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348791/2290abe4-e43d-9c15-f05f-145540394cf3.png)

Windows, macOS以外のプラットフォームでのビルドについては、ドキュメント https://ebiten.org/documents/ を参照してください。

## できること
ざっくりと Ebiten の機能を列挙してみます。詳しい解説は [Ebitenの個人的まとめ](https://qiita.com/takeopy/items/1b213f0c3e81e93d6613) に譲りますので、実際に扱う際はそちらを参照してください。

* 画像の描画
    * 変形：移動、回転、拡大縮小、切り抜き、スキュー
    * 色の変化：色相、スケールなど
    * [各種アルファブレンディング](https://pkg.go.dev/github.com/hajimehoshi/ebiten?tab=doc#CompositeMode)
* [音声の再生 (mp3, wav, ogg)](https://github.com/hajimehoshi/ebiten/blob/master/examples/audio/main.go)
    * [ループ再生も可能](https://github.com/hajimehoshi/ebiten/blob/master/examples/audioinfiniteloop/main.go)
* テキスト描画
    * [truetype フォントを利用できる。](https://github.com/hajimehoshi/ebiten/blob/master/examples/text/main.go)
* [フラグメントシェーダーと、その記述のための独自言語 Kage](https://github.com/hajimehoshi/ebiten/tree/master/examples/shader)
* 入力の取得
    * キーボード、マウス、ゲームパッド、タッチ
    * [入力まわりを補助してくれるパッケージもある。](https://pkg.go.dev/github.com/hajimehoshi/ebiten/inpututil?tab=doc)

入力まわりを除けば全ての機能が、Webやモバイルを含む各種プラットフォームで同じように利用できます。（[対応状況](https://ebiten.org/documents/features.html)）

## できないこと
Ebiten は意図的にシンプルさを保っているため、フレームワーク的な部分は備えていないのでご留意ください。

* ゲームオブジェクトの管理機能
* カメラ機能
* 当たり判定
* HTML Canvas レベルの高度なベクター描画
    * [シンプルなものはサポートされています。](https://pkg.go.dev/github.com/hajimehoshi/ebiten@v1.11.7/vector?tab=doc)
* などなど...

## より深く
最後に各種リソースへのリンクをご紹介するので、学習に役立ててください！

### サンプル
[Webサイト](https://ebiten.org/examples/) には、たくさんの今すぐ触れるサンプルが掲載されています。

ソースは、リポジトリの `examples/` ディレクトリ以下にあります。Webよりもさらに数が多いです。（[GitHubのリンク](https://github.com/hajimehoshi/ebiten/tree/master/examples)）

```sh
# go run ソースへのパス

go run ./examples/rotate/main.go
```

### ドキュメント
* [公式サイト](https://ebiten.org/documents/)
* [リファレンス（godoc）](https://pkg.go.dev/github.com/hajimehoshi/ebiten?tab=doc)
* [Ebitenの個人的まとめ](https://qiita.com/takeopy/items/1b213f0c3e81e93d6613)
    * Qiitaの詳細な解説記事。
* [Go のゲームライブラリ Ebiten における API 設計思想](https://qiita.com/hajimehoshi/items/9ef2d90b8f28a42646de)

### コミュニティ
* [Gophers Slack の #ebiten チャンネル](https://gophers.slack.com)
    * 参加は [この招待リンク](https://invite.slack.golangbridge.org/) から。
    * 英語メインですが、比較的アクティブで、最新情報の告知もここでされることが多いです。
    * すぐ反応してもらえるので、非常にサポートが手厚い（重要）
* [vim-jp slack の #lang-go #gamedev チャンネル](https://vim-jp.org/docs/chat.html)
    * Vim のコミュニティですが、*なぜか日本で一番盛り上がっている*技術コミュニティでもあります。Ebiten の話題もすぐ反応してもらえるので、こちらの方が便利かも。
* [作者ツイッター](https://twitter.com/hajimehoshi)
* [Reddit の r/golang](https://www.reddit.com/r/golang/)
    * たまに Ebiten に関連する話題が投下されることがある。
* [Reddit の r/ebiten](https://www.reddit.com/r/ebiten/)
    * まだ作りたてだけど、これから盛り上がってほしい。