エンジニアブログ

エンジニアブログ
Perl

Perlでマ◯オを作ってみた - Hokkaido Perl Mongers #5 に参加してきました

kaeru1.jpg 谷内 2011年07月20日

谷内@帯広です。

7月16日土曜日、Hokkaido.pm に参加してきました。
Hokkaido.pm では毎回、さらに今年は OSC、昨年は YAPC::Asia にも参戦して発表をしてきましたが、LT(Lightning Talk)形式は初めてでした。
LTは5分間という枠内で、技術的な内容に加えて「ウケ」が重視した発表が求められます。
またトリを務める上に、体調も思わしくなく緊張しました。

お題は「Perl meets 次世代ゲームコンソール」です。
CUI上で ASCIIアートではなく、スプライトを使ったグラフィカルなゲームを作るという内容です。
上の動画の3分52秒あたりで「マ○オ」もどきが動くデモが見られます。

利用している技術は以下です。

  • イベントループ ... AnyEvent
  • リアルタイムキースキャン ... Term::TermKey、AnyEvent::TermKey
  • サウンド ... Audio::Beep
  • グラフィック ... Curses
  • スプライトクラス ... Mouse、Data::Section::Simple

ポイントは以下です。

  • AnyEvent(AE::timer) で、毎秒30フレームとなるように画面更新を行う
  • use AnyEvent;
    my $t = AE::timer 0, 0.033, sub { "Curses の erase/addstr/refresh 処理など" };
    my $cv = AE::cv;
    $cv->recv;
    
  • AnyEvent::TermKey で、非同期にキー入力を待ち受ける
  • use AnyEvent::TermKey;
    my $kw = AnyEvent::TermKey->new({
        term => ¥*STDIN,
        on_key => sub {
            my ($key) = @_;
            if ($key->utf8 eq 'h') { "移動処理"; }
        },
    });
    
  • Curses を使って色と座標を指定し、ターミナル画面上にドットを出力する
  • Mouse を利用して、汎用的なスプライトクラスを作成する
  • Data::Section::Simple で、スプライトとして出力するビットマップデータを読み取る
  • Microsoft Excel で、キャラクタパターンのモデリングを行う

これはあくまでもネタですので、このまま大きなゲームを作成すると破綻すると思います。
また、衝突判定などもいちいち自力で書かないといけません。

この辺の課題は、今後 Games::CUI という汎用的なゲーム作成ライブラリを開発してクリアしようと考えています。

モノになったらエンジニアブログにて、サンプルゲームととも公開しますので、お楽しみに!