Rustで外部モジュールを使えるようにする

前回は自作のライブラリを動かせるようにしました。

今回は外部ライブラリを使えるようにしましょう。

ちょうどC++でOpenGLとSDLの勉強をしてたので、 Rustも同じように勉強していこうかなと思いました。

とりあえず今回は外部モジュールの読み込み方をメインとします。

開発の続きに関してはもう一つのブログのほうで進めていきます。

Rust用のSDL2を導入してみる

https://crates.io/crates/sdl2

ここでSDL2のライブラリの情報が見られます。

Rustは1つのモジュールの塊のことを「クレート(木箱)」と表現しています。

最初にプロジェクトを作成したときに「Cargo.toml」というファイルがあります。

それにクレートの情報を記載してインストールしていくというのが基本のようです。

node.jsのpackage.jsonみたいな役割ですね。

おそらくnpmみたいにコマンドでインストールする方法もありそうですが、 今回は.tomlファイルに書き込んでインストールする方法でやります。

上記のアドレスにアクセスしたサイドバーの上部らへんに「install」の項目に 「sdl2 = "0.34.5"」という感じの文字列が有ると思うのでそれをコピーします。

コピーしたら.tomlファイルに書き込みましょう。

[dependencies]
sdl2 = "0.34.5"

デフォルトだと「dependencies」に何も描き込まれてないと思うので その下に先ほどコピーしたものをペーストします。

SDL公式からライブラリをDLをする

おそらくC++でSDLをやっているのであればすでにダウンロードしているかもしれません。

「SDL2-devel-2.0.x-VC.zip」をダウンロードしてください。

解凍すると「SDL2-devel-2.0.14-VC\SDL2-2.0.14\lib\x64」の中身

  • SDL2.dll
  • SDL2.lib
  • SDL2main.lib
  • SDL2test.lib

の4つをコピーして

「C:\Users\ユーザー名\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\x86_64-pc-windows-msvc\lib」

にペーストしてください。

ユーザー名は自分のWindowsにサインインしてるアカウント名。

そして「stable-x86_64-pc-windows-msvc」の部分は環境によって可変らしいです。

コマンドプロンプト等で

rustup show

を実行すると

stable-x86_64-pc-windows-msvc (default)

みたいな感じにでますのでそこが自分の環境の名前になります。

そして自分の環境に合わせてディレクトリをたどってコピーしたライブラリをペーストしてください。

ライブラリを無事入れられたらSDL2を使う準備ができました。

SDL2を使ってWindowを出してみる

VSCを再起動してみるとsdl2の予測変換がでるようになっています。

以下のコードを入力してください。

extern crate sdl2;

use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use std::time::Duration;

pub fn main() -> Result<(), String> {
    let sdl_context = sdl2::init()?;
    let video_subsystem = sdl_context.video()?;

    let window = video_subsystem
        .window("rust-sdl2 demo: Video", 800, 600)
        .position_centered()
        .opengl()
        .build()
        .map_err(|e| e.to_string())?;

    let mut canvas = window.into_canvas().build().map_err(|e| e.to_string())?;

    canvas.set_draw_color(Color::RGB(255, 0, 0));
    canvas.clear();
    canvas.present();
    let mut event_pump = sdl_context.event_pump()?;

    'running: loop {
        for event in event_pump.poll_iter() {
            match event {
                Event::Quit { .. }
                | Event::KeyDown {
                    keycode: Some(Keycode::Escape),
                    ..
                } => break 'running,
                _ => {}
            }
        }

        canvas.clear();
        canvas.present();
        ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 30));
        // The rest of the game loop goes here...
    }

    Ok(())
}

公式のサンプルのコピペです。

私も1から写経したので、ちゃんと覚えるならコピペせずに打ち込んでみるといいでしょう。

main.rsに書き込み終わったら

cargo run

でコンパイルしてくれます。

そして自動的にウィンドウが立ち上がり、赤で塗りつぶされた画面が表示されたらOKです。

今回は落としてきたライブラリを自力で導入して使えるようにしました。

次はcargoを使ったインストールを学べたら記事を書こうと思います。

サンプルのコードについては説明が知りたければ公式を見てもらったほうがいいでしょう。