こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。 こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。この記事では、Go言語でできること、実用例、メリット・デメリットなどを、簡単かつ具体的に紹介していきます。これからGo言語を学びたいという人は、最後まで目を通してみてください。 続きを見る
そんなGo言語でゲームを作成できるって知っていましたか?
おすすめ【簡単解説】Go言語とは?Go言語でできることやメリットを一挙紹介!
本記事では、2Dゲームエンジンのengoを使用してゲームを作成していきます。プログラミング初心者の方でも分かりやすいように、ソースコードの説明もしっかり行いたいと思います。
目次
どんなゲームを作るの?
大人気ゲーム「スーパーマリオブラザーズ」を参考に、こんな感じのゲームを作成していきます。
開発の準備を始めよう
ソースコード作成の前に、まずは、開発環境の準備をしましょう。
以下の手順で準備を進めていきます。
- 開発環境の確認
- Goのインストール
- 環境変数の設定
- srcディレクトリの作成
- engoのインストール
開発環境の確認
まずは、開発PCがengoに対応しているかを、確認してください。対応OSは以下の通りです。詳しくはこちら。
engo対応OS
・Linux
・Windows(gccコンパイラが必要)
・OSX
Goインストール
次にGoのインストールを行います。この記事ではインストール作業は省略します。詳しくはこちらの記事を参考にしてください。
こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。本記事では、そのGo言語のインストール方法と、実際にプログラムを動かして、「Hello World」を表示するまでの方法を、丁寧に紹介していきます。 続きを見る
参考【5分簡単】Go言語をインストールしてHelloWorldを表示する
インストールが完了したら、環境変数の確認を行ってください。基本的にGoは「$GOROOT$」と「$GOPATH$」の2つを設定すればOKです。
「$GOROOT$」はGoをインストールする場所です。基本的には何もせず、デフォルト設定のままでいいです。
「$GOPATH$」は任意で指定してください。これから作成するプロジェクトは全て「$GOPATH$」の直下に作成していきます。
srcディレクトリの作成
次に、$GOPATH$の直下にsrcディレクトリを作成します。
srcという名前のディレクトリを作成するのは、Go言語の決まりだと思って大丈夫です。srcはsource codeの略で、開発は全てsrc直下で行います。
engoをインストール
engoとは2Dのゲームエンジンで、デスクトップで動作するゲームアプリを作成することができます。今回はこのengoを使用してゲームを作成していきます。
ターミナルもしくはコマンドラインで、srcフォルダに「cd」コマンドで移動した後、以下のコマンドを実行し、engoのインストールを行います。
1 2 |
go get -u github.com/EngoEngine/engo |
go getコマンドを実行すると、$GOPATH$の指定フォルダにengoがインストールされます。
実行してみよう
最後に、プロジェクトディレクトリを作成しましょう。ディレクトリ構成は、$GOPATH$/src/github.com/githubユーザ名/プロジェクト名とするのが推奨されています。
1 2 3 4 5 6 7 8 |
$GOPATH$ |----bin |----pkg |----src | |----github.com | | |----githubユーザ名 | | | |----プロジェクト名 | | | | |----main.go |
ディレクトリを作成したら、engo直下にまずはmain.goを作成し、以下のコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package main import ( "github.com/EngoEngine/engo" ) type myScene struct {} // Type uniquely defines your game type func (*myScene) Type() string { return "myGame" } // Preload is called before loading any assets from the disk, // to allow you to register / queue them func (*myScene) Preload() {} // Setup is called before the main loop starts. It allows you // to add entities and systems to your Scene. func (*myScene) Setup(engo.Updater) {} func main() { opts := engo.RunOptions{ Title: "Hello World", Width: 400, Height: 400, } engo.Run(opts, &myScene{}) } |
参考:Engoチュートリアル第1章
コンパイルして実行すると、「Hello World」というタイトルで、400×400の黒い画面が現れます。これで準備OKです。
1 2 |
go build main.go |
1 2 |
go run main.go |
基本設定
リソースファイルの準備
ゲームを作成する上で必要不可欠なのは、背景画像や、キャラクター画像、効果音などのリソースファイルです。今回は、背景とプレイヤーの画像ファイルを使用します。
2Dゲームの背景はタイルマップという方法で構築するのが主流です。その名の通り、タイル(画像)をマッピングしていくイメージです。自作だと時間がかかるので、こちらのサイトで取得します。プレイヤーも動きを加えたいので、同じサイトから取得します。
engo直下にassetsディレクトリを作成し、ダウンロードしたリソースファイルは全てassets直下で管理します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$GOPATH$ |----bin |----pkg |----src | |----github.com | | |----myfuns | | | |----engo | | | | |----main.go | | | | | | | | | |----assets | | | | | |----Mario | | | | | | |----Characters | | | | | | | |----Mario.png | | | | | | | | | | | | | |----Tilesets | | | | | | | |----OverWorld.png |
リソースファイルを使用するには、あらかじめ、Preload()でファイルのロードを行う必要があります。引数にカレントディレクトリからのファイルパスを指定して、以下のように記述します。
1 2 3 4 |
func (*myScene) Preload() { engo.Files.Load("./assets/Mario/Characters/Mario.png") engo.Files.Load("./assets/Mario/Tilesets/OverWorld.png") } |
この手順を踏まないと、読み込みエラーになってしまうので、必ずリソースを使用する際は、Preload()で設定を行ってください。
キーボードの設定
プレイヤーの移動にキーボード入力が必要なので、使用するキーボードの設定を行います。
キーボードの設定は、Setup()で行い、第1引数にキーボード名(任意)、第2引数にはキーボードの種類を指定します。以下のように、同じ名前で複数のキーボード指定が可能です。
1 2 3 4 5 6 |
func (*myScene) Setup(u engo.Updater) { // キーボード設定 engo.Input.RegisterButton("MoveRight", engo.KeyD, engo.KeyArrowRight) engo.Input.RegisterButton("MoveLeft", engo.KeyA, engo.KeyArrowLeft) engo.Input.RegisterButton("Jump", engo.KeySpace) } |
キーボードの一覧はこちらを参照してください。
Systemの追加
engoの考え方として、ゲームは複数のSceneを切り替えて動作しています。そしてSceneには1つのWorldが存在します。Sceneはメイン画面やロード画面、Worldはステージ1、ステージ2みたいなイメージです。
また、Sceneには3つの要素が含まれています。
3要素
・Entity
・Component(RenderComponentとSpaceComponent)
・System
Entity=オブジェクトのことで、Sceneには複数のEntityが存在します。プレイヤー、敵キャラクター1、敵キャラクター2、背景、表示テキスト、のように、それぞれがEntityとして定義されます。
Entityは2つのコンポーネントを持っていて、RenderComponentは、何をレンダリングするかの見た目の要素、SpaceComponentは、Entityの位置情報を保持します。
Systemとは、簡単に言うとEntityを扱うインターフェスのようなもので、このSystemをWorldに追加することで、Entityの操作が可能になります。それぞれのSystemは独自のタスクで動作し、毎フレーム呼び出されます。
Gopher参考:Renée French
SceneにSystemを追加する手順はこちらです。今回は、PlayerSystem、TileSystem、RenderSystemの3つを追加します。RenderSystemとは、engoに元から備わっているSystemで、Entityのレンダリングを行います。
1 2 3 4 5 6 7 8 9 10 |
import ( "github.com/EngoEngine/ecs" "github.com/EngoEngine/engo" "github.com/EngoEngine/engo/common" ) func (*myScene) Setup(u engo.Updater) { world, _ := u.(*ecs.World) world.AddSystem(&common.RenderSystem{}) } |
main.goの完成
これでmain.goの記述は完成です。背景色は「image/color」パッケージを使用して、空色にしました。(23行目)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
package main import ( "fmt" "image/color" "github.com/EngoEngine/ecs" "github.com/EngoEngine/engo" "github.com/EngoEngine/engo/common" "github.com/myfuns/SuperMario/systems" ) type myScene struct{} func (*myScene) Type() string { return "myGame" } // Preload is called before loading any assets from the disk, // to allow you to register / queue them func (*myScene) Preload() { engo.Files.Load("./Mario/Characters/Mario.png") engo.Files.Load("./Mario/Tilesets/OverWorld.png") common.SetBackground(color.RGBA{120, 226, 250, 3}) } // Setup is called before the main loop starts. // It allows you to add entities and systems to your Scene. func (*myScene) Setup(u engo.Updater) { // キーボード設定 engo.Input.RegisterButton("MoveRight", engo.KeyD, engo.KeyArrowRight) engo.Input.RegisterButton("MoveLeft", engo.KeyA, engo.KeyArrowLeft) engo.Input.RegisterButton("Jump", engo.KeySpace) // World設定 world, _ := u.(*ecs.World) // Systemの追加 world.AddSystem(&common.RenderSystem{}) world.AddSystem(&systems.TileSystem{}) world.AddSystem(&systems.PlayerSystem{}) } func main() { opts := engo.RunOptions{ Title: "SuperMario", Width: 480, Height: 320, StandardInputs: true, NotResizable: true, } fmt.Println("SuperMario Start") engo.Run(opts, &myScene{}) } func (*myScene) Exit() { engo.Exit() } |
ディレクトリ構成はこちらです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$GOPATH$ |----bin |----pkg |----src | |----github.com | | |----myfuns | | | |----engo | | | | |----main.go | | | | | | | | | |----assets | | | | | |----Mario | | | | | | |----Characters | | | | | | | |----Mario.png | | | | | | | | | | | | | |----Tilesets | | | | | | | |----OverWorld.png | | | | | | | | | |----systems | | | | | |----playerSystem.go | | | | | |----tileSystem.go |
お疲れ様でした!いよいよこの後は本格的な実装に入ります。 こんにちは!近年、多くのプログラミング言語の中で「稼げる言語」として人気が爆発しているのは、Googleが開発したGo言語です。そんなGo言語を使って、ゲームを作成してみた記事の第2回です。プログラミング初心者の方でも分かりやすいように、ソースコードの説明もしっかり行いたいと思います。 続きを見る
続きは第2回の記事で説明したいと思います。ではまた!
参考【第2回】Go言語(engo)でゲーム作成してみた【実装〜完成まで】
参考:
engo公式ドキュメント
Go言語で作るマリオ風2Dゲーム
dotstudio