Ruby/SDLでゲームフレームワークを作成
先日、Ruby/SDLで軽く動作確認をしたので、Rubyの言語勉強がてらに2Dゲームフレームワークを作ってみました。
ファミリーベーシックのキャラクタを目でトレースw
フレームワーク自体は汎用的ですが「簡単なものを…」と思い、シューティングにしました。
実装した内容は、いつものノリで、
【設計/実装】
01.Ruby/SDL(SGEも使用)にて作成。
02.クラス設計はそこそこ高度に。
03.タスク管理を設計。
04.ステージ制御を設計。
05.擬似スプライトの概念を設計。
06.擬似BGの概念を設定。
07.擬似テキストスクリーンの概念を設定。
08.フレームレート制御も行う。
09.真面目にダブルバッファ方式を採用。
10.エフェクトはフェードイン・アウトのみ。
というアーキテクチャです。
今回はソースを公開するか悩みましたが、私はRubyの素人なので、公開するにはちょっとレベルが低すぎるな…という感じなので、やめました。
SDLを使ってみて思ったのは、
【感想】
01.マルチプラットフォームといえど、インストールが結構大変。(Windowsが一番楽)
02.かなり描画が遅い。
03.アフィン変換にはSGEが必要だが、この処理がSDLの描画よりもかなり遅い。
04.サウンド(特にMIDI)のループ処理時に処理が止まる。(工夫がいりそう?)
特に02, 03が致命的で、ファミコンのハードの擬似実装をしてみたのですが、BGの転送が間に合いません…
また、ダブルバッファ処理で内部処理のスクリーン(224x256)から画面に表示されるスクリーンの倍率(xN)を上げられるようにしたのですが、これもまたネックに…
色々と試してみましたが、やっぱりCやJavaに比べて処理速度はキツイですね…
それでもRubyのプログラミングは楽しく、文字列操作と正規表現以外は結構総ナメして文法を使ってみました。(高速化も検討して、文法もアレコレ使ってみました)
お陰で最近はPS3で遊ぶよりも、こっちにのめり込んでいた感じです。(^^;
そろそろ地球防衛軍やらないとなー。
【2013/09/07 追記】
わで~んさん向けにサンプル動画を作ってみましたw
![]() | ![]() |
フレームワーク自体は汎用的ですが「簡単なものを…」と思い、シューティングにしました。
実装した内容は、いつものノリで、
【設計/実装】
01.Ruby/SDL(SGEも使用)にて作成。
02.クラス設計はそこそこ高度に。
03.タスク管理を設計。
04.ステージ制御を設計。
05.擬似スプライトの概念を設計。
06.擬似BGの概念を設定。
07.擬似テキストスクリーンの概念を設定。
08.フレームレート制御も行う。
09.真面目にダブルバッファ方式を採用。
10.エフェクトはフェードイン・アウトのみ。
というアーキテクチャです。
今回はソースを公開するか悩みましたが、私はRubyの素人なので、公開するにはちょっとレベルが低すぎるな…という感じなので、やめました。
SDLを使ってみて思ったのは、
【感想】
01.マルチプラットフォームといえど、インストールが結構大変。(Windowsが一番楽)
02.かなり描画が遅い。
03.アフィン変換にはSGEが必要だが、この処理がSDLの描画よりもかなり遅い。
04.サウンド(特にMIDI)のループ処理時に処理が止まる。(工夫がいりそう?)
特に02, 03が致命的で、ファミコンのハードの擬似実装をしてみたのですが、BGの転送が間に合いません…
また、ダブルバッファ処理で内部処理のスクリーン(224x256)から画面に表示されるスクリーンの倍率(xN)を上げられるようにしたのですが、これもまたネックに…
色々と試してみましたが、やっぱりCやJavaに比べて処理速度はキツイですね…
それでもRubyのプログラミングは楽しく、文字列操作と正規表現以外は結構総ナメして文法を使ってみました。(高速化も検討して、文法もアレコレ使ってみました)
お陰で最近はPS3で遊ぶよりも、こっちにのめり込んでいた感じです。(^^;
そろそろ地球防衛軍やらないとなー。
【2013/09/07 追記】
わで~んさん向けにサンプル動画を作ってみましたw
コメント
爽快そうな感じ!(・∀・)イイ!!
言語の勉強がてら適当に作りましたw
>画面を見た感じでは、80年代初頭のシューティング
ビットマップがファミリーベーシックなので、更にそんな感じですよね。(^^;
>タイトル画面のコピーライト部分
レトロ感を出すならコレですねー。
昔は1980年代だったので、もっと長かったのですが、2000年入ってからは…(^^;
ということで、普通の人には動かせないプログラムなので(ソースも載せてないですし…)、動画を撮ってみました。
40秒で支度できるように録画したので、触りだけ…
ビットマップがファミリーベーシックなので、更にそんな感じですよね。(^^;
>タイトル画面のコピーライト部分
レトロ感を出すならコレですねー。
昔は1980年代だったので、もっと長かったのですが、2000年入ってからは…(^^;
ということで、普通の人には動かせないプログラムなので(ソースも載せてないですし…)、動画を撮ってみました。
40秒で支度できるように録画したので、触りだけ…
サンプル動画をUPして頂き、ありがとうございます!
ということで、早速、拝見させて頂きました(笑)
いや〜、ショットの連射具合がハンパないですね!
敵が弾を発射しない代わりに、どんどん迫り来る敵を撃つという事で、シューティング本来の撃つという行為を純粋に楽しめる所がイイと思いました。(^^)
あと、ちょっとスタフォっぽさを感じるBGMも良いですね〜(´▽`)
いや〜、ショットの連射具合がハンパないですね!
敵が弾を発射しない代わりに、どんどん迫り来る敵を撃つという事で、シューティング本来の撃つという行為を純粋に楽しめる所がイイと思いました。(^^)
あと、ちょっとスタフォっぽさを感じるBGMも良いですね〜(´▽`)
やっぱり動画で見せるのが一番手っ取り早いですね。(^^)
>いや~、ショットの連射具合がハンパないですね!
ゲームプログラムって、ショットの押しっぱなしでOFFと判断できないので、普通にプログラミングすると、1フレーム毎にショットが出る事になってしまいます。
(つまり60FPSのゲームですと、秒間60発!w)
これをワザワザ次に発射できるインターバルを待って、待ち終わった時にONか確認して更にショットを撃てるように制御しています。(連射が効かない時代は、一旦内部でボタンが上がるまで、ソフトでOFFとしていることが多いです)
このサンプルだと4フレーム待つようにしたので、押しっぱなしで約60msで発射していますw つまり約15連射ですw
>敵が弾を発射しない代わりに、どんどん迫り来る敵を撃つという事で、
あっ、すみません。動画が40秒なので(ラピュタリスペクト!)、その先があったりしました…
…が、適当なので、とりあえずこんな感じで。(^^ゞ
「フェラー」という位置づけにしましょうw
>ちょっとスタフォっぽさを感じるBGMも良いですね~(´▽`)
www この音は何年か前にサンプルとして適当に作りました。
過去に掲載している別のサンプルソースに入っているものを使ってます。(^^ゞ
ゲームプログラムって、ショットの押しっぱなしでOFFと判断できないので、普通にプログラミングすると、1フレーム毎にショットが出る事になってしまいます。
(つまり60FPSのゲームですと、秒間60発!w)
これをワザワザ次に発射できるインターバルを待って、待ち終わった時にONか確認して更にショットを撃てるように制御しています。(連射が効かない時代は、一旦内部でボタンが上がるまで、ソフトでOFFとしていることが多いです)
このサンプルだと4フレーム待つようにしたので、押しっぱなしで約60msで発射していますw つまり約15連射ですw
>敵が弾を発射しない代わりに、どんどん迫り来る敵を撃つという事で、
あっ、すみません。動画が40秒なので(ラピュタリスペクト!)、その先があったりしました…
…が、適当なので、とりあえずこんな感じで。(^^ゞ
「フェラー」という位置づけにしましょうw
>ちょっとスタフォっぽさを感じるBGMも良いですね~(´▽`)
www この音は何年か前にサンプルとして適当に作りました。
過去に掲載している別のサンプルソースに入っているものを使ってます。(^^ゞ
昭和の香りがする。
最近、10年ぶりの友人が我が家にやってきて(ガレージを見て)こう言い放ちました。
「うぉ!ココだけ昭和の風景になってる!!」
「昔とやっているコト全然変わんないじゃん」・・と
>言語勉強
ガレージも昭和の風景ですが、私が現在、使用しているのもBASIC(ActiveBasic)
AE86、ゼビウス、BASIC・・・
うーん。全然、進歩していないなぁ。
Ruby。知りませんでしたので調べてみたら20年前からある言語だったんですね。
メジャーになってきたのは最近なのでしょうか。
新たな取り組み、学習をなさっているOKIさんは素晴らしい。尊敬します!
私なんて、ち~~っとも勉強していません。
>ファミコンのハードの擬似実装
その昔、ファミリーベーシックを(ほんのチョットだけ)使った事があります。
(X1を買う前には、本気で買おうかと思ったくらいです)
そんな、ファミリーベーシックみたいな画面ですね。
レトロな感じがとても良いと思いました。
私もActiveBasicを使い始めた頃に、簡単なシューティングゲームを作ってみました。
http://homepage3.nifty.com/ae85fcmxs/02-info-ab2.html
(キャラがそのまんまなので、ちょっとマズイかなぁと思いつつ、放置状態です)
>サウンド(特にMIDI)のループ処理時に処理が止まる。(工夫がいりそう?)
使用言語が違うので全く別の原因かもしれませんが、私もソレに陥りました。
結局のところ改善されず(原因究明もせず、工夫もせず)oggが一番相性がよかったのでソッチを使ってしまいました。
「うぉ!ココだけ昭和の風景になってる!!」
「昔とやっているコト全然変わんないじゃん」・・と
>言語勉強
ガレージも昭和の風景ですが、私が現在、使用しているのもBASIC(ActiveBasic)
AE86、ゼビウス、BASIC・・・
うーん。全然、進歩していないなぁ。
Ruby。知りませんでしたので調べてみたら20年前からある言語だったんですね。
メジャーになってきたのは最近なのでしょうか。
新たな取り組み、学習をなさっているOKIさんは素晴らしい。尊敬します!
私なんて、ち~~っとも勉強していません。
>ファミコンのハードの擬似実装
その昔、ファミリーベーシックを(ほんのチョットだけ)使った事があります。
(X1を買う前には、本気で買おうかと思ったくらいです)
そんな、ファミリーベーシックみたいな画面ですね。
レトロな感じがとても良いと思いました。
私もActiveBasicを使い始めた頃に、簡単なシューティングゲームを作ってみました。
http://homepage3.nifty.com/ae85fcmxs/02-info-ab2.html
(キャラがそのまんまなので、ちょっとマズイかなぁと思いつつ、放置状態です)
>サウンド(特にMIDI)のループ処理時に処理が止まる。(工夫がいりそう?)
使用言語が違うので全く別の原因かもしれませんが、私もソレに陥りました。
結局のところ改善されず(原因究明もせず、工夫もせず)oggが一番相性がよかったのでソッチを使ってしまいました。
ビットマップがチープなだけで一気にレトロ感ただよいますよねw
内部動作は昨今のスマホアプリとなんら変わらないのに…(むしろ背景描画処理はFCを模擬っているので高度にしています)
ただ、解像度をかなり低くしているので、「ドットが荒い!」が更にその臭いをかもしだしてますw
>「うぉ!ココだけ昭和の風景になってる!!」
>「昔とやっているコト全然変わんないじゃん」・・と
車の整備もゲームプログラミングも基本的な技術は昔と殆ど変わりがないと思いますが、作業情景やアウトプットが変化していないとそう思われても仕方がないですよねw
(車はハイブリッド、ゲームはポリゴンと多少変化していますが、動作原理は同じ…ということで)
>私が現在、使用しているのもBASIC(ActiveBasic)
>AE86、ゼビウス、BASIC・・・
>うーん。全然、進歩していないなぁ。
新しい何かを使用しないとならない場合は嫌でも進歩しないとならないと思いますが、古いものでも実現できて、且つスキルがそれで長けていれば、全く問題無いと思いますよ!
BASICも1990年代にVisual BASICとか出てきて、「今時BASIC?」なんて言われていましたが、現在もBASICの文法は生きていますものねw
(RubyもBASC同様にインタプリタですし)
>Ruby
言語自体はかなり古くからあり、且つPerlという言語の代替えで進んできているので、一般にプログラミングをする方(という表現も難しいですけど(^^;)ではかなり馴染みが無い言語になっています。
2000年中盤位から、強力なWebアプリケーションを作るフレームワークが出てきたので、徐々にPerlの代わりで使われるようになってきました。(それでもJavaのWebアプリケーションとのシェア率は段違いで低いですがw)
日本人が設計した言語であること(この言語は日本産なんです)、MLで議論が盛んに行われている事、「プログラミングを楽しくすることを目的にしたプログラミング言語」という思想があるそうなので、一部の研究者にはかなり使われている感じです。
>メジャーになってきたのは最近なのでしょうか。
上述の説明のとおり、2000年中盤位からですね。Perlの代替えとなるので、UNIX(Linux)系の開発者の中では割りとメジャーになってきています。(ちなみに海外ではPerlの代わりにPythsonという言語が流行っています。人工的にRubyの比ではありませんw)
>新たな取り組み、学習
これは「メシの種」なだけなんです。(爆)
仕事で使わなければ、私もこの言語を使う機会は無かったかもしれないですね。(^^ゞ
(私は基本、C/C++言語でメシを食ってきた人間ですので…)
でも、新しい言語を修得するのは割りと好きなので、このブログで書かれているように、Java, C#などゲーム作成を通して勉強している感じです。ゲームプログラミングって、割りとプログラム言語を色々と駆使できる、便利なものなんですよね。更にデバイス周り(ユーザ入力、グラフィック、サウンド)も制御する事が必要になったり、「いかに高速に処理できるか」という言語の命題をクリアする必要があるので、頭の体操にはすこぶる良かったりします。(^^)
>私なんて、ち~~っとも勉強していません。
いやいやいやいや。トモカズさんはお仕事上プログラミングが不要なのにプログラミングをする事が逆に凄いと思ってますよ!(^^)
>ファミリーベーシックみたいな画面ですね。
まんまそのキャラを目でトレースして打ちましたので(爆)
>私もActiveBasicを使い始めた頃に、簡単なシューティングゲームを作ってみました。
タルケンwww
タルケンは有人飛行なので、トーロイドの方が無人で優しい設計ですねw
インベーダーゲームとかは最初に作成するサンプルとしてはうってつけですよねー。
>oggが一番相性がよかった
オープンソースで、音声がプラットフォーム依存しないで且つ、生音が再生できるという意味ではOggはいいですよね。
私の場合、サンプルを作る時は「可搬性が大事」ということから、PCMのようなデータの大きいサウンドを使わない傾向にあります。(一番大きいデータがサウンドになってしまうんですよねー)
MIDIのループ問題は色々と考えられるのですが(リワインド処理が怪しいので、バッファリングできないか?や、マルチスレッドで鳴らして工夫するとか等)、所詮サンプルでの実験だったのと、ライブラリ任せなので、今回は見送りにしました。
(言語も結構習得できましたし。(^^))
ただ、解像度をかなり低くしているので、「ドットが荒い!」が更にその臭いをかもしだしてますw
>「うぉ!ココだけ昭和の風景になってる!!」
>「昔とやっているコト全然変わんないじゃん」・・と
車の整備もゲームプログラミングも基本的な技術は昔と殆ど変わりがないと思いますが、作業情景やアウトプットが変化していないとそう思われても仕方がないですよねw
(車はハイブリッド、ゲームはポリゴンと多少変化していますが、動作原理は同じ…ということで)
>私が現在、使用しているのもBASIC(ActiveBasic)
>AE86、ゼビウス、BASIC・・・
>うーん。全然、進歩していないなぁ。
新しい何かを使用しないとならない場合は嫌でも進歩しないとならないと思いますが、古いものでも実現できて、且つスキルがそれで長けていれば、全く問題無いと思いますよ!
BASICも1990年代にVisual BASICとか出てきて、「今時BASIC?」なんて言われていましたが、現在もBASICの文法は生きていますものねw
(RubyもBASC同様にインタプリタですし)
>Ruby
言語自体はかなり古くからあり、且つPerlという言語の代替えで進んできているので、一般にプログラミングをする方(という表現も難しいですけど(^^;)ではかなり馴染みが無い言語になっています。
2000年中盤位から、強力なWebアプリケーションを作るフレームワークが出てきたので、徐々にPerlの代わりで使われるようになってきました。(それでもJavaのWebアプリケーションとのシェア率は段違いで低いですがw)
日本人が設計した言語であること(この言語は日本産なんです)、MLで議論が盛んに行われている事、「プログラミングを楽しくすることを目的にしたプログラミング言語」という思想があるそうなので、一部の研究者にはかなり使われている感じです。
>メジャーになってきたのは最近なのでしょうか。
上述の説明のとおり、2000年中盤位からですね。Perlの代替えとなるので、UNIX(Linux)系の開発者の中では割りとメジャーになってきています。(ちなみに海外ではPerlの代わりにPythsonという言語が流行っています。人工的にRubyの比ではありませんw)
>新たな取り組み、学習
これは「メシの種」なだけなんです。(爆)
仕事で使わなければ、私もこの言語を使う機会は無かったかもしれないですね。(^^ゞ
(私は基本、C/C++言語でメシを食ってきた人間ですので…)
でも、新しい言語を修得するのは割りと好きなので、このブログで書かれているように、Java, C#などゲーム作成を通して勉強している感じです。ゲームプログラミングって、割りとプログラム言語を色々と駆使できる、便利なものなんですよね。更にデバイス周り(ユーザ入力、グラフィック、サウンド)も制御する事が必要になったり、「いかに高速に処理できるか」という言語の命題をクリアする必要があるので、頭の体操にはすこぶる良かったりします。(^^)
>私なんて、ち~~っとも勉強していません。
いやいやいやいや。トモカズさんはお仕事上プログラミングが不要なのにプログラミングをする事が逆に凄いと思ってますよ!(^^)
>ファミリーベーシックみたいな画面ですね。
まんまそのキャラを目でトレースして打ちましたので(爆)
>私もActiveBasicを使い始めた頃に、簡単なシューティングゲームを作ってみました。
タルケンwww
タルケンは有人飛行なので、トーロイドの方が無人で優しい設計ですねw
インベーダーゲームとかは最初に作成するサンプルとしてはうってつけですよねー。
>oggが一番相性がよかった
オープンソースで、音声がプラットフォーム依存しないで且つ、生音が再生できるという意味ではOggはいいですよね。
私の場合、サンプルを作る時は「可搬性が大事」ということから、PCMのようなデータの大きいサウンドを使わない傾向にあります。(一番大きいデータがサウンドになってしまうんですよねー)
MIDIのループ問題は色々と考えられるのですが(リワインド処理が怪しいので、バッファリングできないか?や、マルチスレッドで鳴らして工夫するとか等)、所詮サンプルでの実験だったのと、ライブラリ任せなので、今回は見送りにしました。
(言語も結構習得できましたし。(^^))
コメントの投稿
やはりシューティングは、自機と自機のショット、そして敵や敵弾を認識しやすい物が一番だと個人的に思います。
あと、タイトル画面のコピーライト部分で、ローマ数字を使った年表示(MMXIII)も(・∀・)イイ!!
タイトーの一部の作品や、ナムコ在籍時の遠藤氏の一連の作品を思い浮かべて、思わずニヤリとしてしまいました。(^^)