Perl Hobby Programming - Games::BeLike::EightBITターミナルで8ビット風ゲームを作ろうゲーム製作協力(画像提供): nekokak氏谷内 元  twitter@keroyonn_  /  Hokkaido.pmYAPC::Asia 2011
自己紹介WEB系プログラマ in Hokkaido.pm仕事のメイン:Java/Flex/ExtJS-> 最近Perl趣味のメイン:C# + WPF+ Perlちょっとずつ違う素敵なID達cpan	: keroyonhttp://search.cpan.org/~keroyon/github	: keroyonnhttp://github.com/keroyonntwitter	: keroyonn_http://twitter.com/keroyonn_hatena	:keroyon0630http://d.hatena.ne.jp/keroyon0630YAPC::Asia 2011
Games::BeLike::EightBITその特徴ターミナルにグラフィックを描いてゲームをつくれるよ! (Curses)8ビット時代のコンシュマー機と同等以上の解像度でアクションゲームも制作可能簡単 && perlで全部作れる(ターミナル上の vim からそのまま実行できる)スプライト、マップ、スクロール、イベント、キーアップイベントのエミュレーションなど (将来項目) line & paint スタイルのグラフィックYAPC::Asia 2011
注意事項テストもドキュメントも例外処理もないし、APIすらまだあまり決めていないよCPU負荷が高いので、本番サーバーに入れて遊ばないでね。  もちろん、新手のワームとして使いたい場合は別だよ!YAPC::Asia 2011
最近の開発とかYAPC::Asia 2011そんなこともあろうかと
最近の開発とかYAPC::Asia 2011メモリリークだって直してないよ!
作った動機 1Perlでも気楽にホビープログラミングがしたい。特に絵が動いたりするやつ。PlackとかRouter::SimpleでオレオレWAFとか Web::Scraper とか、ホビープログラミングは気軽にできる。しかし、グラフィックを扱いたいゲーム系の書籍に書いてあることが、Perlで気軽に試せるようにしたかったYAPC::Asia 2011
最近の開発とかYAPC::Asia 2011こういうの
作った動機 2気楽にできるようにしたい環境を作るコストを0にしたいつまり開発用VMとターミナルで動いてほしい。普段はターミナルしか使わないし、Windows環境に「そのためにしか使わない」perlとSDLを入れるくらいなら、Flash Builder 立ち上げて作る方がむしろ早くて合理的学習コストを下げたい面倒な決りごとや、概念を学習しないで使えるようにしたいYAPC::Asia 2011
何ができるのかYAPC::Asia 2011デモ
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面Gradiusゴーファーの野望のパロディです。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面「トップを狙え」を意識しています。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面こちも「トップを狙え」を意識しています。VicPHPerはVicviperです。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面PHPerが悪のPerlMongerを倒すという誰もが納得の勧善懲悪シューティングとなっております。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面クトゥルフの二次創作をしたものは破滅すると言われています。あっ!やば。俺じゃん。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面ステージ1は「省鯖運用的空間」となっています。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面フレームレートが30はりつきです。現在の表示スプライト数は22個です。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面背景の星と手前の地形は一応多重スクロールです。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面ボスが後方から高速で飛来して駆け抜けていきます。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面点滅するワーニング。登場するボスは、ビッグ鯖でんな。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面目玉がコアになっています。ビックコアは青白く、銀色に光り鯖に似ているなーと思いました。
簡単なゲームを作ってみるその1 準備Githubで落してインストールhttps://github.com/keroyonn/p5-Games-BeLike-EightBITperl Makefile.PLmake make install注意:ドキュメント、テスト、例外処理がなく、APIも決定していません。タグづけもしてません。依存モジュールは、Curses と Class::Accessor::Fast です。YAPC::Asia 2011
今回作るゲームYAPC::Asia 2011デモ
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面高品質なことでは定評のあるシンプルシリーズをつくってみましょう。
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面シンプルシリーズの名を汚さぬよう精一杯頑張りました!
最近の開発とかYAPC::Asia 2011DEMO: PuTTYの実行画面エラー鬼がアニメーションしながら追いかけてくる!そして鬼につかまると、エラーで停止しまう!
簡単なゲームを作ってみるその2 プレイヤーの移動#!/usr/bin/envperluse Games::BeLike::EightBIT;my $stage = create_stage('stage1');my $plane = create_plane('stage1:main');my $player_bitmap = create_bitmap()->load_text("111\n222\n333");my $player = create_sprite({bitmaps => $player_bitmap, x=> 20, y=>10});$plane->add($player);$stage->keymap( {        h => sub { $player->{x} -= 2 },        l => sub { $player->{x} += 2 },        j => sub { $player->{y} += 2 },        k => sub { $player->{y} -= 2 },        q => sub { $stage->exit; },    });$stage->run;YAPC::Asia 2011適当なステージ名ステージ名:プレーン名
簡単なゲームを作ってみるその3 敵キャラと当り判定#!/usr/bin/envperluse Games::BeLike::EightBIT;my $stage = create_stage( 'stage1', { debug => 1 } );my $plane = create_plane('stage1:main');my $player_bitmap =  create_bitmap( undef, [ { x => 0, y => 0, w => 6, h => 3 } ] )  ->load_text("111\n222\n333");my $player = create_sprite({ bitmaps => $player_bitmap, x => 20, y => 10, is_hit => 1 } );$player->on_hit( sub { $stage->exit; } );$plane->add($player);my $oni_bitmap =  create_bitmap( undef, [ { x => 0, y => 0, w => 6, h => 3 } ] )  ->load_text("444\n555\n666");my $oni =  create_sprite( { bitmaps => $oni_bitmap, x => 40, y => 10, is_hit => 1 } );$plane->add($oni);キーマップは省略$stage->run;YAPC::Asia 2011当り判定領域当り判定ON
簡単なゲームを作ってみるその4 敵キャラの移動$oni->animation(    'moving',    {        type     => 'custom',on_frame => sub {            my ($sprite) = @_;            my $dx = $player->{x} - $sprite->{x};            my $dy = $player->{y} - $sprite->{y};            my $d = sqrt $dx*$dx + $dy*$dy;            my $vx = $dx/$d;            my $vy = $dy/$d;            $sprite->{x} += $vx;            $sprite->{y} += $vy;        },    })->play;YAPC::Asia 2011スプライトproperty, keyframe, customかもしれないフレームごとのハンドラプレイヤーを追いかける
簡単なゲームを作ってみるその5 タイトルの追加1#!/usr/bin/envperluse Games::BeLike::EightBIT;while (1) {create_title()->run;    create_stage1()->run;create_gameover()->run;}YAPC::Asia 2011無限ループにする
簡単なゲームを作ってみるその5 タイトルの追加2sub create_title {    # ステージとプレーンmy $stage = create_stage( 'title', { debug => 1 } );    my $plane = create_plane('title:main');    # タイトルmy $message = create_message({ message => 'The Onigokko',  y => 15 } );    $plane->add($message);    $stage->keymap( { 'any' => sub { $stage->exit; }, } );    return $stage;}YAPC::Asia 2011文字を描画したビットマップをセットしたスプライトを返す
簡単なゲームを作ってみるその5 タイトルの追加3sub create_gameover {    # ステージとプレーンmy $stage = create_stage( 'title', { debug => 1 } );    my $plane = create_plane('title:main');    # タイトルmy $message = create_message({ message => 'GAME OVER', y => 15 } );    $plane->add($message);    $stage->keymap( { 'any' => sub { $stage->exit; }, } );return $stage;}YAPC::Asia 2011
簡単なゲームを作ってみるその5 タイトルの追加4sub create_stage1 {    # ステージとプレーンmy $stage = create_stage( 'stage1', { debug => 1 } );    my $plane = create_plane('stage1:main');省略 ー さっきのメインプログラムがここに全部入る    return $stage;}YAPC::Asia 2011
簡単なゲームを作ってみるその6  画像を利用する1YAPC::Asia 2011画像はPNGで書き出したものを独自形式(gb8形式)に変換します。実績があるのは Fireworks ですが、通常のパターンエディタでも(PNG書き出しができれば)いけます。ゲームの実行ファイルのある場所に、images/ と patterns/ というフォルダを作成し、images に pngファイルを入れ、patterns に gb8 を書き出すのが推奨です。
簡単なゲームを作ってみるその6  画像を利用する2sub create_title {    # ステージとプレーンmy $stage = create_stage( 'title', { debug => 1 } );    my $plane = create_plane('title:main');    # タイトルmy $title = create_sprite({bitmaps => create_bitmap('oni_title.gb8')});    $plane->add($title);    $stage->keymap( { 'any' => sub { $stage->exit; }, } );    return $stage;}YAPC::Asia 2011独自フォーマット
簡単なゲームを作ってみるその6 画像を利用する3YAPC::Asia 20111) ANSI の256色カラーテーブル作成
同梱された mk_ansi_act.pl を実行し、act ファイルを作成する
17番目の色を (0,0,0) ではなく(0,0,1)にし、透明色として利用している簡単なゲームを作ってみるその6  画像を利用する4YAPC::Asia 20112) Fireworks で、一枚のPNGに、スプライトを書く
適当なサイズのキャンパスを作成(800x600とか)
前述の act ファイルを最適化パネルにロードする
「未使用のカラーを削除する」のチェックを外す
17番目の色(0,0,1)を透明に変更する
スウォッチを「現在の書き出しパレット」に変更する -> これでスポイトできるようになる
スウォッチを分離して拡大する

Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう