Mais conteúdo relacionado Semelhante a Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう (20) Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで8ビット風ゲームをつくろう1. Perl Hobby Programming - Games::BeLike::EightBITターミナルで8ビット風ゲームを作ろう ゲーム製作協力(画像提供): nekokak氏 谷内 元 twitter@keroyonn_ / Hokkaido.pm YAPC::Asia 2011 2. 自己紹介 WEB系プログラマ in Hokkaido.pm 仕事のメイン:Java/Flex/ExtJS-> 最近Perl 趣味のメイン:C# + WPF+ Perl ちょっとずつ違う素敵なID達 cpan : keroyonhttp://search.cpan.org/~keroyon/ github : keroyonnhttp://github.com/keroyonn twitter : keroyonn_http://twitter.com/keroyonn_ hatena :keroyon0630http://d.hatena.ne.jp/keroyon0630 YAPC::Asia 2011 7. 作った動機 1 Perlでも気楽にホビープログラミングがしたい。 特に絵が動いたりするやつ。 PlackとかRouter::SimpleでオレオレWAFとか Web::Scraper とか、ホビープログラミングは気軽にできる。 しかし、グラフィックを扱いたい ゲーム系の書籍に書いてあることが、Perlで気軽に試せるようにしたかった YAPC::Asia 2011 22. 簡単なゲームを作ってみるその1 準備 Githubで落してインストール https://github.com/keroyonn/p5-Games-BeLike-EightBIT perl Makefile.PL make make install 注意: ドキュメント、テスト、例外処理がなく、APIも決定していません。タグづけもしてません。 依存モジュールは、Curses と Class::Accessor::Fast です。 YAPC::Asia 2011 27. 簡単なゲームを作ってみるその2 プレイヤーの移動 #!/usr/bin/envperl use Games::BeLike::EightBIT; my $stage = create_stage('stage1'); my $plane = create_plane('stage1:main'); my $player_bitmap = create_bitmap()->load_text("111222333"); 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 適当なステージ名 ステージ名:プレーン名 28. 簡単なゲームを作ってみるその3 敵キャラと当り判定 #!/usr/bin/envperl use 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("111222333"); 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("444555666"); my $oni = create_sprite( { bitmaps => $oni_bitmap, x => 40, y => 10, is_hit => 1 } ); $plane->add($oni); キーマップは省略 $stage->run; YAPC::Asia 2011 当り判定領域 当り判定ON 29. 簡単なゲームを作ってみるその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 かもしれない フレームごとのハンドラ プレイヤーを追いかける 31. 簡単なゲームを作ってみるその5 タイトルの追加2 sub 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 文字を描画したビットマップをセットしたスプライトを返す 32. 簡単なゲームを作ってみるその5 タイトルの追加3 sub 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 33. 簡単なゲームを作ってみるその5 タイトルの追加4 sub create_stage1 { # ステージとプレーン my $stage = create_stage( 'stage1', { debug => 1 } ); my $plane = create_plane('stage1:main'); 省略 ー さっきのメインプログラムがここに全部入る return $stage; } YAPC::Asia 2011 34. 簡単なゲームを作ってみるその6 画像を利用する1 YAPC::Asia 2011 画像はPNGで書き出したものを独自形式(gb8形式)に変換します。 実績があるのは Fireworks ですが、通常のパターンエディタでも(PNG書き出しができれば)いけます。 ゲームの実行ファイルのある場所に、images/ と patterns/ というフォルダを作成し、images に pngファイルを入れ、patterns に gb8 を書き出すのが推奨です。 35. 簡単なゲームを作ってみるその6 画像を利用する2 sub 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 独自フォーマット 55. 簡単なゲームを作ってみるその7 もっと複雑なゲームを作るには2 YAPC::Asia 2011 package Oni; use base 'Games::BeLike::EightBIT::Sprite'; use Games::BeLike::EightBIT; sub new { my ( $pkg, $args ) = @_; my $self = { name => 'oni', x => 450, y => 190, on_hit => amp;_on_hit, is_hit => 1, }; $self = $pkg->SUPER::new($self); return $self; } 56. 簡単なゲームを作ってみるその7 もっと複雑なゲームを作るには3 YAPC::Asia 2011 sub _init_bitmap { my $hitareas = [ { x => 0, y => 0, w => 32, h => 16 } ]; my @bitmaps = (); for my $index (1..3) { push @bitmaps, create_bitmap( "oni${index}.gb8", $hitareas); } return { default => [$bitmaps[0]], walking => [$bitmaps[2], @bitmaps], }; } ハッシュを返す 57. 簡単なゲームを作ってみるその7 もっと複雑なゲームを作るには4 YAPC::Asia 2011 sub _init_animation { my ($self) = @_; $self->animation( 'walking‘, { duration => 0.5, repeat => 1 })->play; $self->animation( 'moving', { type => 'custom', on_frame => sub { my ($sprite) = @_; my $player = get_sprite('stage1:main:player'); 省略 $sprite->{x} += $vx; $sprite->{y} += $vy; }, } )->play; } 1; walkingビットマップを勝手にアニメーションしてくれる 58. 今後の展望 YAPC::Asia 2011 テスト、ドキュメント、例外処理 -> cpanうp ゲーム開始時のシステムチェック(画面解像度、256色) line と paint を実装して、古くさい懐しいグラフィックを実現 全方向のスクロール(実は今横スクロールしか作ってない) 雛形作成用スクリプトの作成 配布用スプリプトの作成(パッケージングしてくれるやつ) ひらがなとカタカナ、記号の表示(美咲フォントを組込予定) レベル(マップ)エディタへの対応 RPGなどのゲームを作る際の便利な Util(吹き出しとか) 公式サイトの開設(ゲーム紹介のポータルサイト) ネットワークとか? アニメーションのバリエーションを拡充(easein/outとか) 年末の Advent Calendar あたりまでに何とかしたい