はじめに
以前からRustを使ってみたくて何か練習用のテーマを考えていたのですが、
最近小学生2年生がScratchを使ってシミュレーターを作っていたのをみて素晴らしいなと思いつつ、私もRustでシミュレーターみたいなのを作ってみるのはいい練習になりそうです。せっかくなのでGUIを入出力とした何かを作ると、応用範囲が広そうなのでその辺を目指していきたいと思います。
RustのGUIライブラリに何を使うと良いのかよくわからなかったのですが、Conrodというのが目についたのでこれを使ってみます。Graphicsの描画や、マウスやキーボードイベントも取り扱えるようなので(動画)、とりあえず機能としては十分そうです。
Version
- OS: MacOS 10.15.1
- rustc, cargo: 1.39.0
Rustの環境準備は Rustのドキュメント がとてもわかりやすいです。
ちなみに開発環境は PyCharm にRust Pluginを入れています(なんでや...)。型推論、補完、Buildも普通にできるし、Cargo.tomlの [dependencies]
に crate を追加すると自動でInstallしてくれるしで、今の所かなり便利に使えています。
RustでGUIのWindowを表示する
基本的に conrod_glium/examples/hello_world.rs
を参考に作っています。
ただ、このサンプルコードは色々な処理が入っていて、単にWindowを表示する以上のことをしているので、Windowを表示するだけの最低限のコードを模索してみました。
- Projectの作成
まずは 実行プログラムを作るProjectの雛形を作ります。名前は rust_gui
です。
cargo new rust_gui --bin
cd rust_gui
- コードを書く
試行錯誤の結果、こんな感じになっています。
Cargo.toml
に追記
[dependencies]
conrod_glium = "0.68.0"
glium = "0.25.0"
src/main.rs
extern crate conrod_glium;
extern crate glium;
fn main() {
println!("Hello, world!");
let mut event_loop = glium::glutin::EventsLoop::new();
let window = glium::glutin::WindowBuilder::new()
.with_title("Hello Conrod!")
.with_dimensions((400, 200).into());
let context = glium::glutin::ContextBuilder::new()
.with_vsync(true)
.with_multisampling(4);
let display = glium::Display::new(window, context, &event_loop).unwrap();
let mut events = Vec::new();
'render: loop {
events.clear();
event_loop.poll_events(|event| { events.push(event);});
if events.is_empty() {
event_loop.run_forever(|event| {
events.push(event);
glium::glutin::ControlFlow::Break
})
}
}
}
- 実行する
cargo run
すると、何にもないWindowが表示されれば成功です。
ちなみに、Closeボタンをクリックしてもイベントをハンドリングしていないので終了しません。
CTRL+C
などで終了してください。
さいごに
特にビルドエラーにもならず、思ったより素直に表示されました。