ハローワールド!
最初の 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
構造体を定義します。Game
は ebiten.Game
インターフェースを実装したものです。 ebiten.Game
は Ebitengine のゲームに必須な関数である Update
、Draw
、Layout
を持っています。 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 回呼び出されます。
Draw
は ebiten.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 以外のエラーが返されると致命的なエラーとしてログに記録します。