ハローワールド!

最初の Ebitengine のゲームとして、「Hello, World!」と表示してみましょう!

プログラムを実行する前に、Ebitengine をインストールする必要があります。Ebitengine のインストール方法を参照してください。

コード

このツアーではあなたが go.mod ファイルと同じディレクトリで作業していることを想定しています。そうでなければ、以下のコマンドでディレクトリと go.mod ファイルを作成してください。

mkdir yourgame
cd yourgame
go mod init foo # もしくは github.com/yourname/yourgame など

main.go を以下のように作成します:


go.mod ファイルを go mod init で初期化したばかりの場合は、このコマンドで依存関係を解決します。

go mod tidy

その後、go run で Go のプログラムを実行します:

go run main.go

画面に「Hello, World!」というテキストが表示されたら、プログラムが正常に動作しています! おめでとうございます!

コードの仕組み


  

Ebitengine のパッケージをインポートします。このプログラムでは 2 つのパッケージをインポートします:
github.com/hajimehoshi/ebiten/v2
github.com/hajimehoshi/ebiten/v2/ebitenutil

github.com/hajimehoshi/ebiten/v2 は描画と入力の機能を提供する Ebitengine のコアパッケージです。

github.com/hajimehoshi/ebiten/v2/ebitenutil は Ebitengine のユーティリティパッケージです。このプログラムでは、このパッケージを使用してデバッグメッセージを画面に表示します。

Ebitengine には他にもいくつかのパッケージがあります。 詳細についてはパッケージのページを参照してください。


  

Game 構造体を定義します。Gameebiten.Game インターフェースを実装したものです。 ebiten.Game は Ebitengine のゲームに必須な関数である UpdateDrawLayout を持っています。 1 つずつ見ていきましょう。


  

毎ティック呼び出される (*Game).Update 関数を定義します。ティックは論理的な更新の時間単位です。デフォルト値は 1/60 [s] で、Update が 1 秒あたり 60 回呼び出されます(言い換えれば、Ebitengine のゲームは秒間 60 ティックで動作します)。

Update はゲームの論理的な状態を更新します。このハローワールドの例では何の状態も保持していないため、この関数では何も行っていません。

Update はエラーの値を返します。このコードでは Update は常に nil を返しています。一般に、更新関数が nil 以外のエラーを返すと、Ebitengine のゲームは中断されます。このプログラムでは nil 以外を返さないため、ユーザがウィンドウを閉じない限り、Ebitengine のゲームは停止しません。


  

毎フレーム呼び出される (*Game).Draw 関数を定義します。フレームはレンダリングの時間単位で、ディスプレイのリフレッシュレートによって異なります。モニターのリフレッシュレートが 60 [Hz] の場合、Draw は 1 秒間に 60 回呼び出されます。

Drawebiten.Image へのポインタである引数 screen を取ります。Ebitengine では、画像ファイルから作成された画像、オフスクリーン画像(一次的なレンダーターゲット)、画面などのような全ての画像が ebiten.Image オブジェクトとして表現されます。引数の screen は最終的なレンダリング先です。ウィンドウには screen の最終的な状態が毎フレーム表示されます。


  

ebitenutil.DebugPrint は画像上にデバッグメッセージを表示するユーティリティ関数です。この場合では、screen がデバッグ出力の表示先として渡されています。Draw が呼ばれるたびに screen はリセット(別の言葉で言えばクリア)されるので、DebugPrint は毎回呼び出す必要があります。


  

(*Game).Layout 関数を定義します。Layout はデスクトップ上のウィンドウのサイズを引数で受け取り、ゲームの論理的な画面サイズを返します。このコードでは引数を無視して固定値を返しています。つまり、ゲーム画面のサイズは、ウィンドウのサイズによらず常に同じ大きさになります。Layout は、ウィンドウのサイズが変更可能な場合などに、より意味を持ちます。


  

このプログラムのエントリーポイントである main 関数を定義します。


  

ebiten.SetWindowSize ではウィンドウの大きさを設定します。これが呼び出されない場合、デフォルトのウィンドウサイズが使用されます。


  

ebiten.SetWindowTitle ではウィンドウのタイトルを設定します。


  

ebiten.RunGame は Ebitengine のゲームのメインループを実行する関数です。引数は Game オブジェクトで、これは ebiten.Game を実装したものです。ebiten.RunGame はエラーが起きた際に nil 以外のエラー値を返します。このプログラムでは、nil 以外のエラーが返されると致命的なエラーとしてログに記録します。