posted by rerofumi
2007/8/11 土曜日 1:22:29
てなわけで、V850とCPLD CRTCによるインベーダーゲームの完成です。
タイトルはプロジェクト名だった「コメベーダー」をそのままタイトルにしてしまいました。考えるの面倒だったので。
まずは作成成果物の提示ということで、動作している所を紹介するムービーとスクリーンショットから。
ムービーはニコニコ動画にあるのと同じもの。
作成成果物としてのソースコード。
CPLDは以前から変わっていないはず。
V850のソースコードも画面周りはCPLDとSRAMが無いと意味がないので参考程度に。でも、音声出力周りは使い回しが効くんじゃないかと。
3月 14th, 2008 at 21:05:09
とある途上国の大学開設に協力している者です。工学系大学の電気電子科の教員を
養成するということで、2名ほど留学生として受け入れて、教育を行っています。1人は、
FPGAを使ったオリジナル(といっても、情報処理技術者試験のCOMETIIの亜流ですが)
の16bit CPUを製作し、1人は、それ用の C Compilerを作成しています。Compilerの
テスト用に、komevaderのソースを使用させて頂きました。有難うございました。
画面は折角ですので、色を付け(今のところ8色ですが)、さすがに音が出ないとインベ
ーダらしくないので、FPGAの評価ボード上16bit コーデックを使って音を出しています。
チャンネルのミキシングは、CPU(50Mhzで走らせていますが1インストラクションあたりの
クロック数が多く、精々5MIPS程度)で行うのは酷なので、FPGA側で加算させて誤魔化
しています。ただ、コーデック側のサンプリング周波数が速すぎるのか、ゲーム・オーバ
ー時の音などが、「プギャッ」といった感じで上手く再生していないように感じるのですが
本物の音はどのような感じでしょうか? お手数ですが、お返事下されば幸いです。
3月 15th, 2008 at 5:08:02
拙作がそんな形で利用されているなんて、なんか逆に恐縮してしまいます。
そちらのハードもインベーダーにしては豪華な作りですね :-)
音声ですが、この記事に張り付いているフラッシュムービーをご覧になれていますでしょうか。ソースコード内のデータは、このムービー内で鳴っているのと同じ物です。ですので、ゲームオーバーは「でろりろ〜♪」とかいった感じですね。
音声サンプリング 8kHz で 8bit のデータですので、125ns毎に1byteを取り出しDACに流し込めば意図通りの音になるはずですよ。
3月 15th, 2008 at 20:45:18
ご返信、有難うございます。
>拙作がそんな形で利用されているなんて、なんか逆に恐縮してしまいます。
ドライバ部分が綺麗に抽象化されて分離されており、移植作業(これ自体は私が行ったのですが)は、必要なハードを組みながらの形で、極めてスムーズに、音を除いて2日ほどで済みました。上位側も分かりやすい模範的な構造で、向こうの大学での教材としても重宝すると思います。ただ、CPUが16bitで、主メモリ空間が64KByteしかないので、Titleイメージは省略せざるを得ないのと、あと、留学生が帰国した後に、現地で政府要人(下手をすると大統領^^;)が成果物を見学するかもしれないので、最初のSplashは割愛させて頂きましたm__m
CPUもCompilerも、ほぼゼロの状態から、いわゆるフル・スクラッチで組んだのですが、当人達は、このような本格的なゲームが動くものを作っているとは思ってもいなかったらしく、ビックリしています。
>そちらのハードもインベーダーにしては豪華な作りですね :-)
評価ボードは、Terasic のDE2を使ってます。
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=39&No=30
台湾のメーカですが、非常に品質が高く、おまけに安価で・・・。翻って日本メーカーの評価ボードの現状を見ると、何か「日本の製造業は終わった・・・」、と感じる次第です。まあ、Alteraの技術指導も入っているとは思いますが。
>音声ですが、この記事に張り付いているフラッシュムービーをご覧になれていますでしょうか。ソースコード内のデータは、このムービー内で鳴っているのと同じ物です。ですので、ゲームオーバーは「でろりろ〜♪」とかいった感じですね。
申し訳ありません。あちこちのパソコンでTryしたのですが、なぜかしらフラッシュがロードされず、「聞いた方が早いか」と横着をした次第です。
>音声サンプリング 8kHz で 8bit のデータですので、125ns毎に1byteを取り出しDACに流し込めば意図通りの音になるはずですよ。
コーデックは元々48kHzのサンプルだったものを12kHzに落としていますが、あまり落としすぎると、別な要因で変な音になるようで、この辺で止めています。UFOの登場音とか他の音は、それなりに鳴っていますし、サウンドのテストのために作った別プログラム上では、「でろりろ〜♪」に近い4音ほどで再生されるようなので、何かヘマをしているのかもしれません。もう少し調べてみます。
4月 2nd, 2008 at 17:04:33
例のサウンドの件ですが、ゲームオーバーの音が上手く再生されなかったのは、ただ単に、チャンネル・ミキサーの手前に設けたFIFOのフラグのビット位置を間違えていて、コーデック側にデータが送られる前に、後ろのデータを上書きしてしまっていたためでした。修正したら上手く「でろりろ〜♪」と鳴らすことができました。ありがとうございました。
で、インベーダーの歩行音が、各4音の終わりに、「ボツ」とかノイズが入っていたので、「何でかな〜」と色々、調べたのですが、これって元々のWAVデータの各末尾に入っているノイズで、
komeAudioSERequest(…. , se_size[se_num] – 55, …);
の -55 は、そのノイズを取り除くためだったんでしょうか?ウッカリ、
const int se_size[12] = { sizeof(se_data_1),… };
などとやって、この -55 を取り除いてしまっていたのですが・・・。
あと、使ってるCPUが16ビットでint型が2バイトなもので、m_title_timer をint型で宣言していると、10分ぐらいで正の数から負の数にラップ・ラウンドして、
if ((m_title_timer > 30)…
の判定がしばらく偽になり、ボタンを押してもスタートできなくなると言う問題がありましたので、取りあえず、unsigned型で宣言し直しました。まあ、int型が4バイトだと、ラップ・ラウンドするまで1年以上かかりますので、実用上は何の問題もありませんが。
また、敵キャラの数が少なくなり、ゲームが佳境に入ってくると、衝突判定が甘くなると言うか、ど真ん中に命中しても当り判定がされない場合があるようなのですが、そちらでは、そのような現象は出ないでしょうか? まあ、何せすべて自作なので、こちらのコンパイラの単なるバグかも知れませんが・・・。
色々、お手数をお掛けして恐縮ですが、よろしくお願い致します。
4月 2nd, 2008 at 22:03:10
その後のリポートありがとうございます。
音は正常になってなによりです。
-55 はデータの後ろにRIFFチャンクが残っていたのを削るためでした。データの方を削ればよいのに横着した残りです。すみません :-)
m_title_timer もバグでしょうなー。普段は無意識で unsigned を使う人なのですが、珍しく int で済ませちゃったというか。
判定については、ゲームの進行で変化する事はないので単にその様に見えているとかじゃないでしょうかね。数値演算なのでコンパイラバグは入りにくい部分だと思いますが。
自機のショットに対し敵が横から体当たりを食らわせるような判定では微妙に座標が怪しかった様な覚えがあります。とはいえ、このへんのあたり判定を調整すると難易度が目に見えて変化してしまうので、難しいところなのですが。(一応今の数値でゲームバランスをとっているので)
8月 18th, 2014 at 12:48:39
I spend time, lead to I stumbled upon precisely what I had been having a look to get. You’ve got broken my personal some day time prolonged search for! The almighty Thanks a lot male. Possess a good working day. Cya