Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Go言語でゲーム開発

More than 5 years have passed since last update.

Go言語はよくサーバー開発で使われていますが、ゲーム制作でもGoが使えますよ!

engi

今回紹介するライブラリーは「engi」です。

https://github.com/ajhager/engi

2Dゲームエンジンです。ちょっとXNA的な感じ。"SUPER ALPHA"なので、APIがよく変わりますが、とりあえず、engiのロゴを表示するdemos/hello.goを見てみましょう。

engiの使い方

インポート

まずインポートします。ライブラリーではなく実行できるプログラムなのでpackage mainになります。

package main

import (
    "github.com/ajhager/engi"
)

engiが使っているウインドを表示してくれるazul3d.org/native/glfw.v4というライブラリーはgo getすると、自動的にGLFWをインストールするから、go getだけで大丈夫です。

ゲームオブジェクトを定義

engiはengi.Gameという形に対してUpdate()Render()を呼んでくれるので、*engi.Gameを組み込めばいいです。

type Game struct {
    *engi.Game
    bot   engi.Drawable
    batch *engi.Batch
    font  *engi.Font
}

botはengiのロゴのスプライトです。batchはスプライトをrenderする際に使うSpriteBatch的な物です。fontはテキストを表示するためのテクスチャーなどが入っている物です。

スプライトなどを読み込む

GameのPreload()が一番最初に呼ばれるメッソドです。定義するとスプライトとかを読み込めます。

func (game *Game) Preload() {
    engi.Files.Add("bot", "data/icon.png")
    engi.Files.Add("font", "data/font.png")
    game.batch = engi.NewBatch(engi.Width(), engi.Height())
}

スプライトなどを用意する

Preload()が終わってウインドが作られたら、Setup()が呼ばれます。ここでPreload()で読み込まれたファイルを使います。

func (game *Game) Setup() {
    engi.SetBg(0x2d3739) // 背景の色
    game.bot = engi.Files.Image("bot")
    game.font = engi.NewGridFont(engi.Files.Image("font"), 20, 20)
}

表示する

いよいよDraw()です。engiが勝手に呼んでくれるので表示ループとか書かなくてもOKです。

func (game *Game) Render() {
    game.batch.Begin()
    game.font.Print(game.batch, "ENGI", 475, 200, 0xffffff) // "ENGI"を表示
    game.batch.Draw(game.bot, 512, 320, 0.5, 0.5, 10, 10, 0, 0xffffff, 1) // ロゴを表示
    game.batch.End()
}

最後にmain()

package mainにするならmain関数が必要です。engi.Open()を使います。

func main() {
    //      タイトル, height, width, fullscreen, Gameオブジェクト
    engi.Open("Hello", 1024, 640, false, &Game{})
}

こうなります…

Screen Shot 2014-12-22 at 4.20.57 PM.png

双方向にしよう

キーボードでロゴを動かせるようにしましょう。Gameのロゴのx, y変数を追加します。そしてこれから使うkeyMapを定義。

type Game struct {
    *engi.Game
    bot   engi.Drawable
    batch *engi.Batch
    font  *engi.Font

    botX, botY float32
    keyMap     map[engi.Key]bool
}

Preload()にkeyMapのmakeとデフォルト配置を入れます。

func (game *Game) Preload() {
    ...
    game.keyMap = make(map[engi.Key]bool)
    game.botX, game.botY = 512, 320
}

Render()をbotX, botYを見るようにします。

func (game *Game) Render() {
    ...
    game.batch.Draw(game.bot, game.botX, game.botY, 0.5, 0.5, 10, 10, 0, 0xffffff, 1)
    ...
}

GameのKey()メッソドを定義すれば、キーボードイベントを対応できます。

func (game *Game) Key(key engi.Key, modifier engi.Modifier, action engi.Action) {
    switch action {
    case engi.PRESS:
        game.keyMap[key] = true
    case engi.RELEASE:
        game.keyMap[key] = false
    }
}

そしてUpdate()メッソドで、keyMapに応じてロゴの配置を変えます。

func (game *Game) Update(dt float32) {
    // dt = 時間差 (0.01635106とか)
    var dx, dy float32
    if game.keyMap[engi.ArrowUp] { // trueなら押されている
        dy = -500
    }
    if game.keyMap[engi.ArrowDown] {
        dy = 500
    }
    if game.keyMap[engi.ArrowLeft] {
        dx = -500
    }
    if game.keyMap[engi.ArrowRight] {
        dx = 500
    }
    dx, dy = dx*dt, dy*dt // 適当に時間差に応じて動かす
    game.botX += dx
    game.botY += dy
}

よし。これでアローキーを使って動かせます!

最後に

Go言語のゲームの世界はこれから広がります!ぜひGo言語でゲームを作りましょう。engiはgopherjs対応しているので、javascriptにもコンパイルできますよ!

wondershake
株式会社Wondershake(ワンダーシェイク)は30代前後の女性をターゲットにしたLocari(ロカリ)というメディアの開発と運営を行っている会社です。
http://wondershake.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away