rustで変なテトリスを書いた
Rust1.0リリースパーティーで、絶対にPistonを使ってみるぞ!!!と決心してから早3ヶ月、やっとPistonを触ってみました。
Piston触ってみようかな #rustlang
— ぎふ (@gifnksm) 2015, 5月 16
チュートリアル編
RustリリースパーティーでLTをされていた、http://cakecatz.hatenadiary.com/entry/2015/05/17/221004 さんの記事を参考に、Pistonのチュートリアルから触ってみました、が、バージョンを明に指定せずに (=最新版のpiston関連ライブラリを使って) 実行しようとすると、チュートリアルの記法のままでは動かず、またライブラリの構成自体も大きく変わってしまっているようだったため、piston_window
というユーティリティ (?) ライブラリを使ってみました。piston_window
を使うと、チュートリアルのソースコード とほとんど同じような使い方ができました。以下は■を高速で回転させるプログラムです。実行するとちょっと楽しい。
extern crate piston_window; use piston_window::{PistonWindow, WindowSettings, UpdateEvent, RenderEvent, Transformed, rectangle}; const GREEN: [f32; 4] = [0.5, 1.0, 0.5, 1.0]; const PURPLE: [f32; 4] = [0.5, 0.5, 1.0, 1.0]; fn main() { let window: PistonWindow = WindowSettings::new("spinning-square", [200, 200]) .exit_on_esc(true) .build() .unwrap(); let mut rot = 0.0; for e in window { if let Some(r) = e.render_args() { let square = rectangle::square(-25.0, -25.0, 50.0); e.draw_2d(|c, g| { piston_window::clear(GREEN, g); let (x, y) = ((r.draw_width / 4) as f64, (r.draw_height / 4) as f64); let transform = c.transform .trans(x, y) .rot_rad(rot); rectangle(PURPLE, square, transform, g); }); } if let Some(u) = e.update_args() { rot += 20.0 * u.dt; } } }
テトリス編
よっしゃ、Rustでグラフィカルなプログラミングいけそうだぞ!!!という気持ちになったので、お手軽な練習プログラムとして割とよくやられがちなテトリスを作ってみました。ただし、先の cakecatz さんのLTでもテトリスを作られていたので、ちょっとひねりをいれて、普通のテトリスではなく一人称視点のテトリスを作成してみました。
一人称視点テトリス大体できたけど、慣れると普通のテトリスとほとんど同じ間隔で操作できるな。。。 pic.twitter.com/ClwaLWJ4M0
— ぎふ (@gifnksm) 2015, 8月 11
通常のテトリスでは、固定されたステージに対して上からテトリミノ (ブロック) が落ちてきます。一人称テトリスでは、テトリミノは動かず、ステージが動くように見えます。操作方法は以下の通り。お暇があれば、是非上のGitHubのリンクからダウンロードしてプレイしてみてください!
↑
,w
,k
: テトリミノから見て前方に移動↓
,s
,j
: テトリミノから見て後方に移動→
,d
,l
: 右方向に旋回←
,a
,h
: 左方向に旋回space
: 重力方向への落下を加速
一人称テトリスにも piston_window
を使っています。pistonだから難しいとかそういうことは特になく、逆にRustのenum
が使えたりしてうれしい面の方が多かったかなぁと思います。もう少し複雑なことをやろうとするといろいろと難しいことがあるかもしれませんが、今のところ不満は特にないですね。
なお、一人称テトリスには先行研究があります。こっちの方がグラフィックは凝っていて良い感じです。ここまでできるようになると、更に楽しくなりそうですね。