rustで変なテトリスを書いた

Rust1.0リリースパーティーで、絶対にPistonを使ってみるぞ!!!と決心してから早3ヶ月、やっとPistonを触ってみました。

チュートリアル編

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でもテトリスを作られていたので、ちょっとひねりをいれて、普通のテトリスではなく一人称視点のテトリスを作成してみました。

通常のテトリスでは、固定されたステージに対して上からテトリミノ (ブロック) が落ちてきます。一人称テトリスでは、テトリミノは動かず、ステージが動くように見えます。操作方法は以下の通り。お暇があれば、是非上のGitHubのリンクからダウンロードしてプレイしてみてください!

  • ↑, w, k: テトリミノから見て前方に移動
  • ↓, s, j: テトリミノから見て後方に移動
  • →, d, l: 右方向に旋回
  • ←, a, h: 左方向に旋回
  • space: 重力方向への落下を加速

一人称テトリスにも piston_window を使っています。pistonだから難しいとかそういうことは特になく、逆にRustのenumが使えたりしてうれしい面の方が多かったかなぁと思います。もう少し複雑なことをやろうとするといろいろと難しいことがあるかもしれませんが、今のところ不満は特にないですね。

なお、一人称テトリスには先行研究があります。こっちの方がグラフィックは凝っていて良い感じです。ここまでできるようになると、更に楽しくなりそうですね。