読者です 読者をやめる 読者になる 読者になる

RustからAltseedを使う

これはAmusementCreators AdventCalendar(通称ACAC)の12日目の記事です.

AltseedというC++/C#/Java製のゲームエンジンがあるのですが,それをRustから使ってみたという内容です.

VisualC++などの扱いには慣れていないので何か変なことを言っていたら指摘していただけると助かります.

Altseedとは

AltseedはAmusementCreatorsのOBやその他にも色々な人が集まって作っているゲームエンジンです.
AmusementCreatorsの作品はこのゲームエンジンを利用したものがほとんどです.
僕が説明するよりも ゲームエンジン - Altseed - などを見たほうが早いでしょう.

Rustとは

RustはFireFoxThunderbirdでおなじみのMozzilaが開発している言語です.
C++と同じくゼロオーバーヘッドを原則としている言語で,特徴はlifetimeによるdatarace安全でしょうか.
C++OCamlを足して2で割ったというイメージを持ちますがHaskellのほうにも結構引きずられている気がします.

公式ページは下です. www.rust-lang.org

もし興味があって使ってみたければrustupからインストールすると良さそげです. www.rustup.rs

RustからAltseedを使う仕組み

RustはFFIにも力をいれていてC言語の関数をかなり楽に呼び出すことができます.
なので,C++版のAltseedをC言語のインターフェースでくるんでやって,それをRustから使ってやります.

注意

本記事では僕の書いたasd-c-wrapperとかaltseed-rsを使っています.
それらは開発が始まった段階であり,この記事が公開されてからいくらか経つと記事を書いている現在と違ったものになっているでしょう.
RustでAltseedを使いたいならこの記事を読むよりもgithub上に上がっているReadmeなりを読んだ方がよいです.

実際にやっていく

環境はVisual Studio 2015とrustupを想定しています.

まずAltseedのCラッパーを準備します
git clone https://github.com/akitsu-sanae/asd-c-wrapper
として中のasd-c-wrapper.slnをVisual Studio 2015で開いてください.
Release/x86モードになっていることを確認してビルドするとlib以下にasd-c.libが生成されていると思います.
失敗した?それは辛いですね

次に作りたいゲームのRustのプロジェクトを作って色々設定します.
cargo new nyao --binとしてください(nyaoの部分は作りたいゲームの名前を入れていください)
プロジェクトの中にCargo.tomlができているので,その[dependencies]の下に
altseed = { git = "https://github.com/akitsu-sanae/altseed-rs"}
と追加してください.

Altseed_core.dllと先ほど生成されたasd-c.libをプロジェクトディレクトリに入れます.

rustcをlibファイルと対応しているものにします.
つまりrustup default nightly-i686-pc-windows-msvc としてください.

src/main.rsを編集してゲームのコードを書いていきます. 取り敢えず

extern crate altseed as asd;

fn main() {
    asd::initialize("test", 640, 480);
    let mut obj = asd::TextureObject2D::new();
    obj.texture(&mut asd::Texture2D::new("image.png"));
    asd::add_object2d(&mut obj);
    while asd::do_events() {
        asd::update();
    }
    asd::terminate();
}

とでも書いておきましょう.

これはimage.pngという画像を表示するというプログラムなので適当にimage.pngという画像を作ってプロジェクトのディレクトリに入れときます.

cargo runします.image.pngが左上に表示されているウィンドウが出たら成功です!!!

参考にしたもの

Foreign Function Interface

Rust言語でDxLibを使う - しらいとブログ

Rust と C言語 をコールバックで行き来する(Cブリッジが必要なVer) | d.sunnyone.org