44
Perl Hobby Programming - Games::BeLike::EightBIT タタタタタタ 8 タタタタタタタタタタタ ゲゲゲゲゲゲゲ ( ゲゲゲゲ ): nekokak ゲ ゲゲ ゲ twitter@keroyonn_ / Hokkaido.pm YAPC::Asia 2011

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Perl Hobby Programming - Games::BeLike::EightBIT ターミナルで 8 ビット風ゲームを作ろうゲーム製作協力 ( 画像提供 ): nekokak 氏

谷内 元 twitter@keroyonn_ / Hokkaido.pm

YAPC::Asia 2011

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

自己紹介

WEB 系プログラマ in Hokkaido.pm 仕事のメイン: Java/Flex/ExtJS → 最近 Perl 趣味のメイン: C# + WPF + Perl

ちょっとずつ違う素敵な ID 達 cpan : keroyon http://search.cpan.org/~keroyon/ github : keroyonnhttp://github.com/keroyonn twitter : keroyonn_ http://twitter.com/keroyonn_ hatena :keroyon0630

http://d.hatena.ne.jp/keroyon0630

YAPC::Asia 2011

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

Games::BeLike::EightBITその特徴 ターミナルにグラフィックを描いてゲームをつくれるよ !

(Curses)

8 ビット時代のコンシュマー機と同等以上の解像度でアクションゲームも制作可能

簡単 && perl で全部作れる ( ターミナル上の vim からそのまま実行できる )

スプライト、マップ、スクロール、イベント、キーアップイベントのエミュレーションなど

( 将来項目 ) line & paint スタイルのグラフィックYAPC::Asia 2011

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

注意事項

テストもドキュメントも例外処理もないし、 API すらまだあまり決めていないよ

CPU 負荷が高いので、本番サーバーに入れて遊ばないでね。

もちろん、新手のワームとして使いたい場合は別だよ !

YAPC::Asia 2011

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

最近の開発とか

YAPC::Asia 2011

そんなこともあろうかと

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

最近の開発とか

YAPC::Asia 2011

メモリリークだって直してないよ !

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

作った動機 1

Perl でも気楽にホビープログラミングがしたい。 特に絵が動いたりするやつ。 Plack とか Router::Simple でオレオレ WAF

とか Web::Scraper とか、ホビープログラミングは気軽にできる。しかし、グラフィックを扱いたい

ゲーム系の書籍に書いてあることが、 Perl で気軽に試せるようにしたかった

YAPC::Asia 2011

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

最近の開発とか

YAPC::Asia 2011

こういうの

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

作った動機 2

気楽にできるようにしたい 環境を作るコストを 0 にしたい つまり開発用 VM とターミナルで動いてほしい。 普段はターミナルしか使わないし、

Windows 環境に「そのためにしか使わない」 perl とSDL を入れるくらいなら、 Flash Builder 立ち上げて作る方がむしろ早くて合理的

学習コストを下げたい 面倒な決りごとや、概念を学習しないで使えるように

したいYAPC::Asia 2011

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

何ができるのか

YAPC::Asia 2011

デモ

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

Gradius ゴーファーの野望のパロディです。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

「トップを狙え」を意識しています。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

こちも「トップを狙え」を意識しています。VicPHPer は Vicviper です。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

PHPer が悪の PerlMonger を倒すという誰もが納得の勧善懲悪シューティングとなっております。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

クトゥルフの二次創作をしたものは破滅すると言われています。あっ ! やば。俺じゃん。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

ステージ 1 は「省鯖運用的空間」となっています。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

フレームレートが 30 はりつきです。現在の表示スプライト数は 22 個です。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

背景の星と手前の地形は一応多重スクロールです。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

ボスが後方から高速で飛来して駆け抜けていきます。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

点滅するワーニング。登場するボスは、ビッグ鯖でんな。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

目玉がコアになっています。ビックコアは青白く、銀色に光り鯖に似ているなーと思いました。

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

簡単なゲームを作ってみるその 1 準備

Github で落してインストール https://github.com/keroyonn/p5-Games-

BeLike-EightBIT perl Makefile.PL make make install 注意:▪ ドキュメント、テスト、例外処理がなく、 API も

決定していません。タグづけもしてません。▪ 依存モジュールは、 Curses と

Class::Accessor::Fast です。 YAPC::Asia 2011

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

今回作るゲーム

YAPC::Asia 2011

デモ

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

高品質なことでは定評のあるシンプルシリーズをつくってみましょう。

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

シンプルシリーズの名を汚さぬよう精一杯頑張りました !

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

最近の開発とか

YAPC::Asia 2011

DEMO: PuTTY の実行画面

鬼がアニメーションしながら追いかけてくる !そして鬼につかまると、エラーで停止しまう !

エラー

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

簡単なゲームを作ってみるその 2 プレイヤーの移動

#!/usr/bin/env perluse 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

適当なステージ名

ステージ名 : プレーン名

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

簡単なゲームを作ってみるその 3 敵キャラと当り判定

#!/usr/bin/env perluse 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

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

簡単なゲームを作ってみるその 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かもしれない

スプライト

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

簡単なゲームを作ってみるその 5 タイトルの追加 1#!/usr/bin/env perluse Games::BeLike::EightBIT;while (1) { create_title()->run; create_stage1()->run; create_gameover()->run;}

YAPC::Asia 2011

無限ループにする

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

簡単なゲームを作ってみるその 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

文字を描画したビットマップをセットしたスプライトを返す

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

簡単なゲームを作ってみるその 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

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

簡単なゲームを作ってみるその 5 タイトルの追加 4

sub create_stage1 {

# ステージとプレーン my $stage = create_stage( 'stage1', { debug => 1 } ); my $plane = create_plane('stage1:main');

省略 ー さっきのメインプログラムがここに全部入る return $stage;}

YAPC::Asia 2011

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

簡単なゲームを作ってみるその 6 画像を利用する 1

YAPC::Asia 2011

画像は PNG で書き出したものを独自形式 (gb8 形式 ) に変換します。

実績があるのは Fireworks ですが、通常のパターンエディタでも (PNG 書き出しができれば ) いけます。

ゲームの実行ファイルのある場所に、 images/ と patterns/ というフォルダを作成し、 images に png ファイルを入れ、 patterns に gb8 を書き出すのが推奨です。

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

簡単なゲームを作ってみるその 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

独自フォーマット

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

簡単なゲームを作ってみるその 6 画像を利用する 3

YAPC::Asia 2011

1) ANSI の 256 色カラーテーブル作成 同梱された mk_ansi_act.pl を実行し、

act ファイルを作成する 17 番目の色を (0,0,0) ではなく

(0,0,1) にし、透明色として利用している

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

簡単なゲームを作ってみるその 6 画像を利用する 4

YAPC::Asia 2011

2) Fireworks で、一枚の PNG に、スプライトを書く 適当なサイズのキャンパスを作成 (800x600 とか ) 前述の act ファイルを最適化パネルにロードする 「未使用のカラーを削除する」のチェックを外す 17 番目の色 (0,0,1) を透明に変更する スウォッチを「現在の書き出しパレット」に変更する → これ

でスポイトできるようになる スウォッチを分離して拡大する ウィンドウメニューで、「ウィンドウを複製」する 複製されたウィンドウをドラッグし、別ウィンドウにして重

ねる 鉛筆ツールと消しゴムツールでパターンを描画する

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

簡単なゲームを作ってみるその 6 画像を利用する 5

YAPC::Asia 2011

3) PNG8 ビットで 256 色に最適化する マットを透明に変更する 透明は、インデックス透明カラーを利用する 透明色を、 17 番目のカラーに変更されている

ことを確認する各キャラクタにスライスを切り、画像を書き

出す

4) GB8 形式のバイナリデータに変換する 同梱された png2gb8 を実行しする png2gb8 –output pattern/ images/

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

簡単なゲームを作ってみるその 7 もっと複雑なゲームを作るには 1

YAPC::Asia 2011

sub create_stage1 { my $stage = create_stage( 'stage1', { debug => 1 } ); my $plane = create_plane('stage1:main');

# プレイヤー my $player = Player->new; $plane->add($player);

# 鬼 my $oni = Oni->new; $plane->add($oni);

# キーマップ $stage->keymap( { 'h' => sub { $player->left; }, 'l' => sub { $player->right; }, 'j' => sub { $player->down; }, 'k' => sub { $player->up; }, 'q' => sub { $stage->exit; }, } ); return $stage;}

継承クラスを作成して利用

継承クラスを作成して利用

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

簡単なゲームを作ってみるその 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 => \&_on_hit, is_hit => 1, }; $self = $pkg->SUPER::new($self); return $self;}

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

簡単なゲームを作ってみるその 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], };}

ハッシュを返す

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

簡単なゲームを作ってみるその 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 ビットマップを勝手にアニメーションしてくれる

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

今後の展望

YAPC::Asia 2011

テスト、ドキュメント、例外処理 → cpan う p ゲーム開始時のシステムチェック ( 画面解像度、 256 色 ) line と paint を実装して、古くさい懐しいグラフィックを実現 全方向のスクロール ( 実は今横スクロールしか作ってない ) 雛形作成用スクリプトの作成 配布用スプリプトの作成 ( パッケージングしてくれるやつ ) ひらがなとカタカナ、記号の表示 (美咲フォントを組込予定 ) レベル ( マップ ) エディタへの対応 RPG などのゲームを作る際の便利な Util(吹き出しとか ) 公式サイトの開設 ( ゲーム紹介のポータルサイト ) ネットワークとか? アニメーションのバリエーションを拡充 (easein/out とか ) 年末の Advent Calendar あたりまでに何とかしたい

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

ご清聴ありがとうございました

YAPC::Asia 2011