2008年03月07日

ゲームプログラマでした

ちょっと自分のことを書いてみますね。
実は、僕は学生時代ゲームプログラマーでした。
当時はファミコンが出始めた頃。
PC88、Z80バリバリのアセンブラーでした。

日本テレネットというところで、ファイナルゾーンとかいうゲームプログラマでした。
演出関係ぜーんぶやってましたね。
今のゲームが映画のオープニングみたいだったのをある意味最初にやった人間でもあります。

FM音源ドライバも独自開発。
もともと音楽もやるので、そうとう凝ったドライバに仕上げました。
ゲーム音楽も通常はMIDIから落とすのですが、あえて、すべて手打ち。
つまり、自分の演奏にしちゃってました。

その当時の仲間が後のウルフチームです。
秋篠くん、池亀くん、(ホエー)桑田くん、林くん(デザイナ)
今思い出しても懐かしいですね。

当時は机の下に寝るような生活。
マシンサイクルを暗算、最速演算するためにレジスタ、裏レジスタを使いまくり。音楽を演奏するために割り込み処理。
メモリ足りないから、V-RAMの未使用領域使ったり、Direct Memory Accessも駆使。PS音だけですべてのドラムサウンド作ったり、
処理プロセスを減らすためプログラム領域とデータ領域を混在させたり。(つまりHL命令とかでデータ待避先をプログラムでデータを戻すところに書き込んじゃう)
てな調子なので、当然デバッガーは動きません。
人間デバッガーです。

寝ている最中にバグがわかって起き出したことも何度か。
コンピュータの気持ちがわかるレベルまで達しています。
(これ、ホントです)

で、みんなでファイナルゾーンのロゴのウルフにちなんで
「『ウルフチーム』でゲーム作ろうよ〜」
なんて、言ってました。

でも、今のカミさん(当時の彼女)に
「体壊すから、やめて」
で、カタギになったわけです(爆笑)

なので、今でもバグ見ると、プログラマがどういう処理したのかすぐにわかっちゃいます。バグ出しの名人かな(笑)

でも、当時楽しかったなぁ。
ファイナルゾーンのエンディングの太陽が沈む演出。
あれ、バグから見つけた方式です。(セレンディピーですね)
どうやってプログラミングしたのかわからないプログラムです。

しかし、わずか64KBのメモリ空間でよくやってたよなぁ。

その後ですが・・・
秋篠くんはウルフチームの社長になって、失踪・・・
池亀くんはグローディアの社長→後にハワイ行き豪華客船に無銭乗船で捕まったとか。
桑田くんは未だ現役のようです。










posted by minoru at 20:51 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年04月03日

ゲームプログラマ時代

昨日、ワリオの話書いてて思い出しました。

ゲーム作ってたときのこと。
1980年代ですね。
ちょうどファミコンのでる前。
PC88全盛期です。

まぁ、低スペックマシン。
今じゃ、想像できないだろうなぁ・・・・。

しかも4人ですよ、4人。
デザイナ、メインプログラマ、サブプログラマ、音楽
これだけ。(ちなみに日本テレネットのファイナルゾーン)
#ここでのキャラクターがウルフ。これが後のウルフチームの名前の由来です。

ちなみに私は、サブプログラマで、
オープニング、エンディング、ゲーム中のエフェクト、
キャラクター選定時の会話、効果音、BGM・・・
早い話、メインのゲーム以外をやってました。

#ワリオは130名くらいでやってたんじゃないかな?
#確か、エンディングでそれくらい落とし穴に落としました(笑)

デザイナは好き勝手言うし。
「ここ縦スクロールの背景に、横スクロールでキャラクター出して」
当時のZ80CPUにそんなの無理!(苦笑)

でも、悔しい。
RGBの一つ落とせば可能じゃないか?
知恵の絞りあいでした。

無理難題・・・・
これ、鍛えられました。
「出来ません」って悔しいじゃないですか。

最近すごく思うこと。
「あ、それ出来ません!」
「ダメです。(やったことありません)」
とあまりにも簡単に言う人が多いです。
仕事しててすごく感じます。

「できない」って言うの、すごく簡単なんです。

どうして
「そのままではダメですけど、こうすれば出来ます!」
って言えないのかなぁ。

「出来ない」って言った瞬間に成長は止まってます。
それにチャレンジしてはじめて可能になるわけなのに。
出来ることなら誰でもやってるんです。
















posted by minoru at 23:33 | Comment(7) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年05月29日

昔のSE、今のSE

以前にも書きましたが、私、学生時代は元ゲームプログラマーです。

でも、仕事では全然関係なく、金融数理学だったりします。(デリバティブですね。)

最近では、ITビジネス企画かな?

で、他の人と話をしていたのですが、最近のSEは上辺だけでどうもコンピュータそのものを知らない人も多いとのこと。

つまり、マニュアルに書いてなければお手上げだそうです。

あとはググッってわからなければだめ。

私の頃は完全にアセンブラ

しかも低スペックマシンを駆使してプログラミングしますから、自ずとハードウェア構造も知らないとだめだし、BIOSまで知らないとだめ。

DMA(Direct Memory Access)とか今の人は知らないだろうなぁ。

自分で割り込み処理をかけたりするのも。

ドライバーなんて書いたことない人多いんじゃないかな?

なんでメモリリーク起きるかきちんと説明できるのかな?

不思議なことにコンピュータはものすごく発展しているかのようにみえるのですが、基本アーキテクチャはあまり変わっていないんですよ。

まぁ、基本ノイマン型ですから(笑)

メモリに手続きを書いて逐次処理をしていく・・・。

そうそう、最近のプログラマのはやりでJAVAからやるのもいけません。


メモリ管理
(ガベージコレクション)とか勝手にやってくれるんでしょ?ちょっとやればフレームワーク作ってくれるし。

本当に勉強したければ、最低C言語ですね。(アセンブラとは言いませんけど 苦笑)

ポインタの概念くらいちゃんともってもらいたいです。

これがわかって高級言語やった方がよいです。

あと、オブジェクト指向言語の設計を極めたければ、抽象化の訓練が必要ですね。

これについては別の機会に書きます。

posted by minoru at 22:11 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年06月20日

ファイナルゾーン

えらく懐かしいものを見つけました。

なんと、YouTubeに自分が学生時代に作ったゲームが出てるんです。

フロッピーは持っているのですが、PC88ゲーム。さすがにマシンを持ってないので見れない、見せられない。

でもこれで、子供達にもオヤジの作品を見せることができます。

投稿者に感謝(^^

ファイナルゾーンという日本テレネットゲームです。もう25年くらい前の作品です。

これは店頭用に特別に作ったデモです。(よく持ってるなぁ・・・。関係者?)








私の担当はメインゲーム以外。オープニングエンディングゲーム中の演出効果ミュージックドライバも自作です。効果音も全部手作り。

ミュージックドライバは凝りに懲りましたね。もともとピアノ弾くのでクレッシェンドデクレシェンドリタルダンドなど、表現できるものは極力盛り込んでいます。

また、リズムが狂わないように音楽をまるでDJのように切り替える機能とかもつけてあります。

さらに、音はPC88版は私の手打ちです。

微妙な表現を出すためです。私の演奏そのものと言ってよいです

(実はオープニングのドラムのシンバルを一箇所私間違っています。わかった人は偉いです 笑)

ですので、X1版や同じミュージックドライバをあげたゴルフゲームのアルバトロスでは音が違うのはそのせいなんです。やつらはMIDIから落としました(苦笑)

6音とか言っていますが、本当はFM音源3音。Beep3音だったと記憶しています。

Beep音を駆使してドラムの音を作り出しています。Beep2音を使い、爆発などの効果音を出しています。

つまり、効果音があるときはドラムは1音でごまかしています。

というようなことをやっているので、なんかたくさんの音があるように錯覚しているわけ。

とにかくPC88スクロールが遅いのでありとあらゆる技を駆使しています。

オープニングファックス的シーンは私のアイデア。

このためにわざわざ世界最小フォントをデザインしました。

あそこに書かれている文章は読めます(笑)

(しかし、ほとんど内輪ネタです 笑)

リン・モモコのキスマークは、当時デザインで来ていたお姉さんのキスマークスキャニングしましたー。

会話のシーンの詳細設定も私です。

口の動かし方、瞬きのタイミング。すべて手で調整してあります

目と口だけで感情を表現しようと苦労しました。

もうひとつのTouTubeのがエンディング







このエンディングは当時、どうやってプログラミングしたのかわからない!と皆をうならせた逸品です

メラメラと太陽が燃えながら沈んでいきます。

実はバグから見つけたんですけどね(苦笑)

デザインの人に見せたら「これはすごい!」ということになり、そのため絵柄、色合いをわざわざ変えました。

しかし、懐かしいです・・・・。

エンディングのテロップに出てくるメンバーも相当なメンツですね。

その後のウルフチームという会社名はこの作品から生まれています。




posted by minoru at 21:49 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年06月29日

Z80とゲームの作り方

ゲームプログラマだったころを思い出しますが、そのころのもっとも人気CPUZ80

ザイログ社CPUです。ほとんどの80系はそのころこのZ80だったんですよね。

僕がゲーム作ったのもこのCPU8bitCPUとしての最高CPUだったと思います。

正確にはインテル80系とは命令が多少異なってます。確かLD命令とMOV命令の違いとかあったような(すみません、記憶が定かでなくなっていますね 苦笑)

このCPUは使い倒しました。

裏レジスタまで使っていましたし、割り込み処理も自分で制御していましたね。
CPUに下駄はかせてプログラマブルキャラクタジェネレータ(PCG)も作りました。

あと、懐かしい石と言えば、YAMAHAのFM音源
これのドライバも作りました。いろんな音も作りましたね。

そう、ゲームってどう動いているか知ってます?

同時にたくさんのキャラクタが動いているように見えますが、実はすべてシーケンシャル処理なんです。

まず最初にすべきことは、入力系のチェック。

どのキーを押されたのかセンシングします。

で、もし右動くキーが押された右にキャラクターが動く処理をします。

そして、シューティングゲームであれば、当たったどうかの判定、敵キャラを一つずつ動かして・・・・

ということを順次やっていくんです。

これがものすごい高速で処理されるので、同時に動いているように見えるわけ

今はスプライシング(重ね合わせ)処理とかはハードがやってくれますが、同時はソフト処理。

つまり、背景とキャラを重ねるにはあらかじめキャラの黒抜きを用意しておきます。

で、
1)まず元の背景で現在のキャラを消す。
2)移動先の背景と取り込む
3)黒抜きキャラで背景からキャラ分を取り除く
4)キャラクタ画像と合成
5)V-RAMに書き込み

こんな面倒なことをしていたわけです。

スクロールもビット単位でずらすので、ローテイトシフト命令というのを使ったり・・・。

いやぁ、今から見ればローテクですね(笑)




posted by minoru at 20:48 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年07月31日

最初のコンピュータ

僕がコンピュータに出会ったのは大学はいってからです。

入学祝いにNECPC-8001を買ってもらったのが始まりです。

PC-8001画期的なパソコンでしたね。

それまで、マイコンと言われていたワンボードコンピュータに対して、いきなりキーボードディスプレイが付いたんですから。

当時でも十数万円する機械でした。(16万円くらいだったかな?)

超高価な機械だったんですね。

その前のマイコンと言われていたのが確かTK-80。

アセンブラのみで、しかも16進コードをスイッチでパチパチと入れるタイプだったんです。それからいきなりキーボードが付いたわけですから、そりゃすごかったです。

その当時のパソコンにはフロッピーディスクないんですよ。信じられないでしょう?

じゃ、どうやって起動するか?ということですが、ROMで起動していたんですね。

そう、PC-8001ROMBASICが動いたんです。これがMicrosoft BASIC

そのころOSというのは無かったですね。というか、フロッピーもままならないわけですから、今のようにやってたんではいつシステムが立ち上がるかわからない。

でも、それをシャープパソコンはやってましたね。
OSロードするんです。しかもテープから。

だから、起動が遅くって・・・・

そういう意味でもPC-8001は画期的でした。

BASICが走るわけですから、すぐにプログラミングできるんです。

このBASICには逸話がありますね。ビルゲイツは直前までデバッグしてたとか、ROMサイズに納めるため、NECの開発者がサイズを言うと、かれはすぐに「これを削れば何バイト減る」とか即答していたとか・・・。

保存はカセットテープなんです。ボーレートもものすごい低かったような。600bpsとか1200bpsとか?今では信じられないようなスペックです。

ロードするとき音が聞こえるんですね。

「ピーガー・・・・」って。

でも、当時はこれが当たり前でした。

CPUはかの有名はZ80です。

プログラミングは、いきなり行番号打って書き始められるんです。

10 print "TEST"
と打って、

RUNって打てば、プログラムが走る。




posted by minoru at 21:43 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月01日

I/O

コンピュータ買ってもらってもソフトがなければ確かにタダの箱。

で、やったのは雑誌のプログラムを打ち込むことですね。

その当時有名だった雑誌はI/O(アイオー)とASCII

私はI/O派でしたね。でも、I/Oってロゴがエロって読めるんですよ。なんで、本屋さんによっては間違ってエロ本コーナーに置いてあることがありました。(笑)

このころは、プログラムリストが雑誌に全部出ていたんですね。

マシン語のリストもでていました。

これは、16進コードをひたすら打つわけです。

このおかげで、A〜Fまでブラインドで打てるようになりました。

チェックサムってのがあって、縦横の合計の値が出てるんですね。

これで正しく入力したかわかるわけです。

まぁ、このころはマシン語なんてわかりませんから、訳もわからずひたすら打ち込むわけです。

BASICはさすがにわかりましたね。

ちょっとしたプログラムならBASICでくめるくらいにはなりました。

このI/Oはゲームがたくさん出ていたので、いろいろ入れました。

PC-8001の弱点は細かい絵はだせないこと。ドット数も粗いんですね。

なんで、パックマンとかもハートマークとかでキャラクタが示されていました。

そこに画期的なハードが・・・。PCGです。Programable Character Generater。

さきのハートマークはフォントROMで表示されるんです。

そのROMをRAMに置き換えてしまうというもの。CPUのソケットにゲタをはかせて作動させます。

売っていましたが、回路図も出ていました。

もともと私は小学校時代からはんだごて握ってます。

小学校ですでにインターフォンラジオを作り、中学ではTVゲームを作る腕前。

なんで、電子回路もお手の物。ただ、細かいので半田ではなくラッピングで作ります。

ということで、結構いじり回して遊んでいたわけです。

そんなある日。友達とバイト探しに行きました。

そこで履歴書に無謀にも「コンピュータ」って書いちゃったんですね。




posted by minoru at 22:29 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月05日

ゲームプログラマへの道 その1 バイト先にて

ゲームプログラマーへの道の続きです。(勝手にタイトル作りましたぁ)

バイト先は、医療関係の会社でした。我々の仕事は図面描きです。(機械工学専攻なので図面はお手の物)

なのですが、「コンピュータ」と履歴書に書いてしまったのが、社長の目にとまってしまいました。

「今度インクジェットプリンタというのが東芝から発売された。
画面のハードコピーがとれるプログラムを書いてくれ。」

という指示です。

インクジェットプリンターマニュアル渡されました。

「えすけーぷしーくえんす?」
「esc?27?」

正直ちんぷんかんです。

どうやらマシン語で動かす必要があるということがわかりました。

プリンターに対して制御コマンドを送るわけです。

で、画像を印刷するので、パソコン側はビデオRAMのデータを読み出し、データとして送り込むということ。。

ビデオRAMにデータを書き込むと、それがそのまま画像に表示されると言うことがわかりました。まぁ、ハードがそう処理しているわけなんですね。

これで、なんでモニターに文字やら絵が出る仕組みがわかりました。

ということは、ビデオRAMからデータを順次RGBで読み出し、対応するコマンドをプリンターに送り込めば良いわけです。

コンパイラを入手してマシン語で組んでみます。

で、やってみると見事に動くじゃないですか!

「なんだぁ、たいしたこと無いなぁ」

なんて、気をよくして、おまけにフォントまで作って自由な大きさで文字を画面上に表示するプログラムまで書いてしまいました。

今じゃ、プリントスクリーンなんて当たり前なのですが、当時は無かったんですよね。グラフィックプリンタが出たばっかしの時代ですから。

(それまでのプリンターラインプリンターと言って、単に印字されるだけの代物でした。)

これが初めて独力で書いたプログラムとなりました。


posted by minoru at 22:29 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月07日

ゲームプログラマへの道 その2 バイト探し

人間調子にのると怖い物で・・・・

ちょっとプログラムかけたもんだから、

「おれって、もしかしたらこれでバイトできるかも!」

なんて勘違い。

さっそくFromA(アルバイト雑誌)買ってきて、片っ端から探しました。

そしたら、自由が丘にちょっとよさそうなソフトハウスがある。

さっそく面接に行きます。

社長さんと面接。

「あのね、今、うち、インクジェットプリンタの制御プログラム書ける人探してるんだよ。」

え!?

「あ、あの〜、それ、僕持ってますけど・・・」

即採用です。で、プログラムあげたら、その場で7万円くれました。

いやぁ、学生時代の7万円ですから。大きいです。

で、この制御プログラムを何に使うかというと、年賀状とかのはがきの宛名書きの印刷ソフトに使ったわけです。

今だと筆文字で印刷するのって当たり前ですよね?それをやったわけです。まだグラフィックプリンタが珍しい時代だったわけですから。

で、次の仕事・・・。

デザイナの人が「ねぇねぇ、何するか決まったの?」

「ううん、まだ決まってないですよ。」

「じゃさ、ゲーム作らない?」

は?ゲーム

確かに、自分ではI/O見ながら必死にゲームコードを入れてました。

まぁ、ゲームも好きでしたが、自分が作るとは?

だって、どうやってキャラクターが動くのかとか、どうやればキーボード情報を読みとれるのか全く知らないわけです。




posted by minoru at 21:53 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月08日

ゲームプログラマへの道 その3 キー入力

当時のゲームテンキーで動かすのが多かったですね。

4で左、6で右、スペースがシューティングという感じ。
あるいは矢印キー。

まずは、キーセンシング

キーボードマトリクス。早い話、キーボードマトリクスに置き換えれば、縦、横の位置がわかればどのキーが押されているかわかりますよね?

それと同じ原理です。

ですが、単純にその形式だと、複数のキーを同時に押した場合、正しくセンシングしません。それを防ぐために確かダイオードがいくつかはいっていたと記憶しています。

まぁ、プログラムで考えるのであれば、外部入出力−I/Oにたいして読み出しをかければ、どのキーが押されているか判別できると言うことです。

要は、このキーセンシングがすべての基本です。

とにかく、ゲーム作りのノウハウの本なんてありませんから、すべて手探りです。一つ一つ進めていきます。

じゃ、画面に何か表示するのは?

これはVideo-RAMにデータを書き込めば表示されるということ。

単純にメモリデータ書けばいいんです。

まずはグラフィックモードではなく、キャラクターモードで実験。

当時のパソコングラフィックモードの他にキャラクターモードというのがあり、横80文字、縦40文字(だったっけな・・・)の文字(キャラクター)を表示する専用モードがあったんです。

(今は、全部グラフィックですけどね。)だから、フォントとかパターンをROMで持っていました。

ハートマークを書き込むのであれば、その対応するASCIIコードVideo-RAMに書けばいいだけ。

このハートマークキーボードの動きにあわせて左右に動かすことから始めました。

どのキーも押されていなければ、処理しないで、そのままループします。

またキーセンシングを続けるわけ。

で、「4」のキーが押されたのがセンシングされたとします。

そうすると左に動かす訳ですね。

単純に左に1個ずらしてハートマークを書き込むと、ハートマークがたくさんになっちゃいます。

前のを消さないとダメなんですね。

それに動かすにしても今居る場所がわからないことには動かせません。

ということで、今の場所を覚えておき、「4」がおされたら、まず今表示している、キャラクターを消して、座標を一個左にずらして、新しくハートマークを描く・・・。そういう処理を行います。

これでキャラクターは左に動いていきます。

でも、これだと一瞬で左に行っちゃいます。つまり速すぎるんですね。

目で見えない(笑)

なので、途中にタイマーを入れるわけです。つまりウェイト待ち時間を入れるんですね。

これを「6」キーのセンシング処理を入れれば、右に動く。

そうすれば、キーの動きに従いキャラクターが動きます。

って、勘の言い方ならお気づきでしょう。すべてシーケンシャルに動くんです。

そう、ゲームキャラクターって同時に動いているように見えるのですが、実は、全部一個ずつ動かしているのです。

高速なので、同時に動いているように見えるだけ。

実は、ゲームの基本はこれだけなんですね。

キー入力センシング→処理 の繰り返し。

じゃ、次はスペースキーを押したらミサイルでも出るようにしましょう。

スペースキーを押しているのが判定されたら、ハートマークの上に、●を描きます。つまり、ハートマークの今のいる座標から、一つ上に座標(実際にはVideo-RAMアドレス)を割り出し、そこに描くわけです。

でも、これだけだと×!

移動している時スペースキーを押すと、すべてのハートマークのすぐ上に、●を連続描画しちゃいます。

スペースキーをはずさないと、次のミサイルが出ないようにしたければ、キーをはずしたというセンシングが必要なんです。

最初に押されたときのみ処理し、押されている間は処理しないと言うことです。

いろいろ動かしていくと、相当細かいところまで考えないといけないことがわかります。

失敗して初めてわかりますね、こういうのは。

つまり、相当複雑な動きも、すべて動きをばらし、順番に処理するんです。これはすごく良い頭の訓練です。




posted by minoru at 23:41 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月12日

ゲームプログラマへの道 その4 ゲーム内容

さて、どうにかキーを押すと何か絵を動かすことができることがわかりました。

じゃ、どういうゲーム作ろうか?ということなのですが・・・

シューティングゲーム作ろうということになりました。

名前忘れちゃったのですが、敵は編隊を組んで飛んできて、ミサイルを落としていくゲームがあって、それをまねようと言うことになりました。(ギャラガじゃないですよ。)

その編隊飛行も複雑で、背景は宇宙空間にある洞窟みたいな場所なのですが、その柱を3D的にくるくる廻りながら飛んできて・・・・
というようなことをデザイナーの彼は勝手なこと言ってます。(^^;

さて、これを実現するには、
1)飛行パターンを考える
2)背景の絵の前景、後景をマップを使って判断し、前景がある場合はキャラクターを表示せず、後景の場合は、キャラクターを表示する・・・

という処理が必要となります。

飛行パターンもそうですが、その飛行にあわせてキャラクターの絵も買える必要があります。

つまり、柱をくるくる巻くように回るのであれば、いろんな角度の絵が必要になります。

まずは、その飛行方式の作成を考えます。

とにかく、背景の絵に合わせて編隊飛行でくるくるときれいに動く物を考えるわけです。

まずは背景を描いてもらいました。

その絵を取り込み、座標を記録するプログラムを書きました。

カーソル動かしながら、座標を決め、そこでキーを押すと記録するプログラムです。キーを押すところで、どのキャラクターパターンを表示するのかの指定します。

また前景、背景も入力していきます。
つまり、表示したくないところと、表示したいところの切り分けです。

本来は、前景があれば、きちんと重ね合わせをするところですが、スピードもあるので、そこの処理は省きました。

それでも、重ね合わせ技術は必要なんですね。

つまり、今ではスプライシング処理はハードがやってくれますが、その当時はそんなのありませんから、ソフト処理をするわけです。

まずは、移動したいところの背景を取り込みます。

それに対して、キャラクターシルエット(実際のキャラより少し大きめ)を重ねます。そこにキャラクターを乗せます。

そうすれば、背景に対してキャラクタが表示されたようになるわけですね。少し大きめのシルエットを入れていますので、縁取りされたように見えます。

これを元の背景にはめ込むわけです。

消すときは、バックアップとっておいたもとの背景をはめ込みます。

背景にはすべて座標をうっていますので、先の飛行パターンに従い、キャラクターをとばします。

思った通りに飛んでくれるとうれしいものです。

1機ではなく、次に編隊で飛ばします。

posted by minoru at 23:05 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月18日

ゲームプログラマへの道 その5 編隊飛行とミサイル発射

一機のパターンを動かすことができたので、次は編隊飛行です。

早い話、前の機体の後ろを動かせばいいのですが、機体が3D的に宙返りをする場合、機体が重なる場合があります。

これをまともに処理するとなると、ものすごく複雑になります。

なので、今回はそれを防ぐために動きについて制約を与えることにしました。つまり、重ならないようにとばすわけです。

宙返りも螺旋を描きながら動かせば、各機体は重なりません。

あとは、飛行パターンに沿って各機体を動かしていけば良いわけです。

自機の移動、敵機の移動までなんとなくロジック的にわかりました。

つまり、キー入力をし、自機を移動、そして敵機を移動というループを繰り返すわけですね。(途中にタイマーウェイトが入ります。)

さて、次の課題がミサイルの発射です。

スペースキー
ミサイル発射アサイン(割り当て)します。

つまり、スペースキーキーセンシングを処理に加えます。

フローチャートで言うと、「スペースキーが押されているか?」の処理を行うわけです。

押したとき、ミサイルを表示し、各サイクルごとにそのミサイルを上へ移動させるわけです。

と、書くと簡単そうに聞こえますが・・・

・すでにミサイルを発射したときはどうするのか?
・ミサイルはスペースキーを押し続けていると出るのか?
・もし、そうだとしたら、インターバルはどのくらいか?(連射と言えども毎回のサイクルで打っていたのであれば、レーザービームにしか見えません〜 苦笑)
などなど

つまり、ミサイルを発射したらフラグを立てて、その後数サイクルスペースキーを押しても出ないような処理とかが必要です。

あと、ミサイルは論理的に画面上にいくつ存在できるのかを考えておく必要もあります。

何でかというと、当然当たったかどうかの判定とかあるからです。

10発と考えるのであれば、10発のミサイルそれぞれ追っていく必要があるわけです。

ミサイルの移動も座標で管理します。

ミサイル
の移動のときに敵機との座標の重なり具合を見れば、着弾判定ができます。

で、当たったと判定されたら、その処理を行うわけです。

これもカンタンに聞こえますが・・・・

デザイナさんの要望は、

「当たったら爆発の画面が出るんだ」

当然アニメ的発想ですから、爆発のパターンがあるわけです。

爆発は移動しませんから、後からくる機体と当然重なります。

まぁ、カンタンにするために、XOR処理にしちゃいました。

つまり、爆発パターンはドットで描かれ、背景に対してXOR処理をすると反転したドットで表現されます。

これは、後からくる機体と重なると、正しく処理されません。

でも、もとの背景もドット画ですので、多少のゴミが残ってもわからない。

ということでこの処理にしました。(この方が早く処理できますし。)

という感じで全体の技術的構成を進めていきます。

簡単そうに見えるのですが、いろんなケースを地道に洗い出して処理を考えていく。頭の訓練としては最高だと思います。
そのため、ある仕様を言われた瞬間にそのレアケースとかがすぐに頭に浮かぶわけです。






posted by minoru at 21:51 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年08月26日

ゲームプログラマへの道 その6 周辺プログラム

自機をキーで移動、敵の編隊飛行、ミサイルの発射、判定作業・・・

ここまでできてしまえば、ゲームの基本動作としてはほぼ完了です。

あと必要なのは、スコア表示オープニングエンディング演出関係です。

演出関係では音楽とかありますね。

ただここではビープ音的な物しか出せなかったので、単純な音楽を自分で勝手に作曲して組み込みました。

ゲームのタイトルは「シグナス

スコア表示はそれぞれの敵の点数と当たった判定で加算していけば良いわけです。

それを表示します。(実際には、表示用フォントを別に作り、それを表示します。)

パターンの表示は同じくV-RAMに書き込むわけです。

さて、こう書くと順調そうに聞こえますが、バグもあるわけです。

ほとんどが考慮不足ですね。

たとえば・・・・

左右キーで自機を動かすのはいいんですが、左端、あるいは右端に行ってしまったときには、当然止めなければなりません。

そういう判定忘れると、変なところに行っちゃいますね。

あと、無限ループ

ある条件で無限ループにはいってしまったり。

スタックが無限に積まれると・・・・これがメモリリーク

つまり、スタックプログラム領域を破壊してしまうと、暴走です。

こういう細かいミスに対する対応を経験として積み重ねていきます。

当時はデバッガとかありませんから、そういうときには全部自分でブレイクポイントを作って動かすんですね。

メモリ状態を確認して進めていくわけです。

時にはまったくわからないこともあります。

一番やっかいなのは再現ができないとき。ある条件が発生し、なんらかの原因でデータが書き込まれてしまうために時間が経つと暴走するケース。

ありとあらゆることを考えながら進めていくと・・・・次第にバグの状況を見ただけでおおよその原因が読めてくるんです。

まぁ、今回のプログラムはそう難しくはないので、比較的簡単。

あとで紹介するFinal Zoneのプログラムの時は、パフォーマンス追求のため、ありとあらゆる手段を講じていますので、そのときは大変でした。(後日紹介します)

バグ
と言うほどではないですが、敵機が減るとスピードが上がるという現象がありました。

これは理由はカンタン。つまり敵機が減ればそれだけ1サイクルの時間が少なくなるからです。1サイクルとは自機の移動キーセンシング、敵機の移動、ミサイルの発射、判定・・・というサイクルです。

これを防ぐためには、タイマーをきちんと管理することです。

1サイクルの時間を一定にするということです。




posted by minoru at 22:57 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年09月03日

ゲームプログラマへの道 その7 シグナス完成

このゲームの名前は「シグナス」となりました。

で、音がないのも寂しいので、ゲーム開始のファンファーレ的なものを作りました。
「チャッチャチャー チャララララ チャチャチャチャチャ チャッチャチャー」って感じの音楽です〜。

初めてのまともなプログラミングがいきなり売り物ゲームになってしまったわけです。

今思うと、よくもまぁ、これで売り出したものだなぁ・・・というゲームです。

ネットで調べてみました。

重機動戦隊シグナス」ってのがそうかな?
日本ソフト&ハード社。
確かに「the漢字」ってソフトはあったような気がする。
ここ自由が丘にあった会社でしょうか?
であれば、これです。


実は、このとき知り合ったデザイナが後の夢幻戦士ヴァリスとかのデザインをやった人(Hくん)です。(わかる人にはわかるかな?)

さて、ゲーム作れちゃいました。

「なんだぁ、できるじゃん。」

若いというのは恐ろしいものです。

これで気をよくした二人は、

「じゃ、ゲーム会社に行ってみようか?」

てなわけで、ゲーム会社を探します。

で、なんでそこになったのか覚えてないのですが、その会社が「日本テレネット」です。







posted by minoru at 21:45 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年09月06日

ゲームプログラマへの道 その8 日本テレネット

日本テレネットは福島兄弟で経営している会社でした。

さて、開発ですが・・・マンションの一室でやってましたね。

私の最初の仕事は「アメリカントラック」のMSX版の演出です。

具体的にはタコメータアニメーションの動きです。

リアルに見せるために、トップスピードになったときわざとメータを揺らがせたりしてました。わざわざ乱数作ってメータをぶらすんですね。

ここでの開発者は数人。

後のウルフチームの社長のAくん。技術力には定評のあるHさん。
ちょっと抜けた感じのするSくん。68系専門のKさん(別名ホェーK) (あとから後のグローディア社長Iくんが入ってきました。)
あと、デザイナのHくん。

アメリカントラックはゲームプロデューサFさんの作品です。

まぁ、トラックを運転して他の車をはじき飛ばすゲームですね。

ここではDOSとしてCP/Mを使っていました。(と、言っても今の人はわからないでしょうねぇ。)

フロッピーディスクは5インチです。

言語は当然アセンブラ

作る機能はタコメータギアチェンジが自動的に行われるように、動かします。音もそれにあわせて変化。

つまり、キーボードを押しっぱなしにすれば加速するわけですが、そのとき、「ブゥゥゥゥ〜ン、ブゥゥゥゥ〜ン・・・・」とあたかもギアチェンジしているようなエンジン音とそれあわせたタコメータの動きを再現するわけです。

担当部分の入力はアクセルキーのOn/Off情報。

それを見ながらカウントして動かしていきます。

当然、他のゲームの動きもありますから、その全体のサイクルの中に入るわけです。


ゲームプログラミングは大半がV-RAMへの書き込み作業です。

まぁ、画像表示だから当然といえば当然ですね。


あとコンパイラとかはありますが、今のように高機能ではないです。

そもそもメモリ空間が狭いですからデバッガとかもないわけで・・・。

C言語が広まり始めたのもこのころですが、オブジェクトサイズが大きいのでゲームには使えませんでした。
(PC-9801ならできましたけどね。)

当時メガサイズなんて夢の夢。Z80最大直接メモリアドレッシング64KByteです。今じゃ、信じられませんね〜)

先のアメリカントラックのメータ作りはさくっと出来てしまいました。

当時のMSX担当者は舌足らずのSくん。彼に渡して完了!







posted by minoru at 21:52 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年09月23日

ゲームプログラマーへの道 その10

当時はまだ5インチフロッピーディスク全盛時代でした。

さて、皆さん、PCはどうやって起動するか知ってます?

フロッピーディスクにシステムがはいってるとします。

これをPCに挿入し、電源を入れる。

そうするとディスクが回転し、インデックスホールをセンシングします。

これで位置がわかるんですね。

次に読み込まれるのはローダーというプログラム。これは、非常に小さなプログラムで、機能は「読み込み」機能です。

ローダーは必ず決まった場所に入れておきます。これがシステム領域。インデックスホールで場所をセンシングして決まったところを読み込むわけです。

つまり、まず基本機能だけを動かし、そこから本格的にシステムと取り込むんですね。

で、ゲームの場合はOSはいりませんから、そのローダーを書き換えて、メインプログラムを読み込むようにするわけです。

そういえばコピープロテクトのもう一つの方法としてインデックスホールを二つ開けるという方法がありました。

これだと特殊なフロッピーディスクが必要なので、結構強力だった記憶があります。

しかし5インチのフロッピーディスクなんてよく使ってましたね〜。

なんせ、磁性体の円盤があの袋の中で回ってるわけですから。

物理的にも壊れやすいし、実際よくデータ壊れました。

あの当時、フロッピーディスクだけはケチっちゃダメという鉄則がありましたね。

何はともあれ、バックアップバックアップという感じです。

データ壊してショック受けたことも多々あり。

でも、データ壊れても、結構復活は出来るんですね。

ディスクそのままをダンプしてしまうわけです。

今だとツールがありますが、当時はFATが壊れたときでも、セクターを読み出して、復活させたり、直したりしてました。ディスクへの直接書き込みなんても平気でやってましたね〜。

ディスクへのアクセスは確かBIOS使っていた記憶があります。PC88のBIOSコールでほとんどいろいろできるわけです。フロッピーフォーマットなんてほんの数バイトの命令で実行出来てしまいます。




posted by minoru at 20:50 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年09月26日

ゲームプログラマーへの道 その11

さて、アメリカントラックの開発も終わり、一段落です。

では、次に何をしようかという話になりました。

RPG?アクションゲーム?

シューティングゲームだね、やっぱり。

ストーリーがあるのがいいね。マルチエンディング

チーム編成できるとか?そのチーム員それぞれにストーリーがあって、生き残り状況で話しが変わるとか・・・。

というようにAくん、Hくんと私の3人で話を進めていたのがコードネーム「ファイナルゾーン

「どうせやるからにはマシンスペックに挑戦!」

ということになりました。

ソフトウェアで多重重ね合わせをするわけです。しかもフルスクロール。

このメイン部分はAくんの担当です。彼はまず、この多重重ね合わせに挑戦。

Hくんはひたすらキャラおこし。

で、私の担当は、演出全体です。オープニング、エンディング、効果音、音楽、戦闘中の周りの絵(スコアとか武器変更の画面)などなどです。

さて、私もオープニングスクロールをやりますので、この部分から着手です。

PC88ですが、このV−RAMがそのまま画像に一致します。
で、1バイトは8ビット、つまり点で言うと8ドット分。
横方向連続の8ドットがV-RAM1バイトに相当します。
(実際には3色ありますので、3バイト)

これをドット単位の横スムーススクロールをさせるにはローテイトシフトさせるわけです。つまり、ビット単位でずらしていくと言うこと。

サンプルプログラムを作ってみます。

たとえば縦200ドットの絵を横スクロールするには、200回縦方向にローテイトシフトさせる訳です。

普通に考えると200回ループですね。

で、実際に動かしてみると・・・・

お、おそい!

スクロールが「ウネっ、ウネっ」という感じになってしまいました。

「う〜ん、これじゃ遅すぎ」

このループは教科書的には正しいんです。でも、コンピュータがもっとも遅いのは条件判断。200回を数えて判定する部分で遅くなるわけ。

じゃぁ、判定させなければいい。

答えは・・・

200個命令並べるんです。

これをマクロ命令と呼んでいました。実際アセンブラにもその機能があるんですね。

これをやると当然プログラムサイズは大きくなります。でも、処理は速くなるわけです。

マシンサイクルを計算し、もっとも短くなるようにします。

当然メモリに転送するのも遅い、レジスタ内部で処理する方が圧倒的に速いわけです。

さて、いろいろ試してみましたが、フルスクリーンで横スクロールはスペック的に余裕がありません。

でHくんと相談。

「じゃぁ、映画みたいに横長にしちゃえ!」


というアイデアでこのファイナルゾーンオープニングが映画のようになったわけです。

実はデザイン的な理由だけではなく、パフォーマンスも大きく関係しているわけですね。








posted by minoru at 23:21 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年10月01日

ゲームプログラマーへの道 その12 圧縮展開

さて、スクロールテストが終了しました。

マクロ命令のおかげでパフォーマンスも上々。しかし80回ループさせるのではなく、80個命令を書くとは・・・・。

さて、次のテストは圧縮展開ルーチンです。

画像をそのままディスクに入れていたのでは相当のサイズになってしまいます。なので、圧縮するわけです

横スクロールの場合は、縦の列ごとに、縦スクロールの場合は、横の行での圧縮となります。

読み出し、展開しながらのV-RAMへの書き込みだからそうなるんですね。

で、圧縮方法。このころのゲームはビットマップの絵です。で、中間色を出すにはパターン画にするんですね。なので、ビット単位で見るとパターン化されているわけです。(一つ飛びとかそういう感じ。)


ドットが連続する場合もあります。つまりある一定のパターンが何回繰り返されるのか?という圧縮方法をとりました。

たとえば
111110000011110000   (1を点として見てください。)
であれば
1を5回 0を5回 1を4回 0を4回 と数えます。
これが基本です。

一度ディスクから読み出し、メモリ上に展開し、そこから復活させながら描いていくわけです。

まぁ、スクロールの場合、1ビット幅単位の動きさえ高速に動けばなんとかなります。ここは先のマクロ命令でやっちゃうわけです。

このときに、一緒に圧縮プログラムも書いておきます。

絵が仕上がったら必要ですからね。




posted by minoru at 21:51 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年10月07日

ゲームプログラマーへの道 その13 FM音源ドライバー

さて、スクロールの基本はできましたので、次の大仕事です。

PC88-mkIIにはFM音源が入っています。

このFM音源とはYAMAHAの開発した専用音源ICです。

PC88では3音のFM音源を出せるんですね。あと簡単なサウンドジェネレータがついています。ですので合計6音出すことが出来ます。

FM音源の良さは実際の楽器に近い音が出せること。当時はやっていたYAMAHAのDX-7というシンセサイザーではホントピアノの音からストリングなどいろいろ出せました。

で、このFM音源ドライバーを作るのが次のお仕事です。

そもそもFM音源ってのが知らないんですよね。そこからお勉強です。

どうも発信器が複数あって、その組み合わせで大体の音色を作り、後は、音の波形を組み合わせることでいろんな音色を出せると言うことです。

この音の波形というより、楽器特有の音といった方がいいですね。

たとえば、打楽器。これは打った直後に音が立ち上がり、すぐに音は消えます。

ストリング。バイオリンなどは弓で弦をこすりますから、立ち上がりは緩やかです。弓をはずすとすぐに音は消えます。

管楽器。立ち上がりもまろやかですし、消えるのも緩やか。

確か専門用語ではアタック・ディケイ・サステイン・リリースといったような・・・・

この組み合わせで音を作ります。

だいたいお手本がありますので、それを基準に作りました。

そもそも私自身、ピアノを弾きますので音楽にはうるさいです。

演奏に近い物を再現できるようなドライバを目指しました。

クレッシェンドデクレッシェンドリタルダンドなどなど。これらを再現できるようにしました。

クレッシェンドであれば、徐々に音が大きくなるような工夫がされています。

ファイナルゾーンのエンディングのピアノ曲があります。

あれは、この機能を駆使しています。

当時、作曲はDX-7でされていたので、もっとも簡単な方法はMIDIで落とすことなんですね。

でも、私は楽譜からあえて手打ちしました。

つまり、あれは私の演奏なんです。

そのため、ゲーム特有の「のっぺり」した音ではなく、臨場感があるんですね。

その後CDが発売されましたが、こちらは単純にMIDIから落としています。そのためのっぺりした音。

ゲームの方が音が良いのはこのせいです。

その後の日本テレネットのアルバトロスなどにも私のFM音源ドライバーは使われています。ですが、当時のメインプログラマKくん(後のグローディアの社長)は手抜きしてMIDIから落としてました。

まぁ、使いこなすのは難しいですね(笑)



そうそう、当然ですが、これらは割り込み処理でされるんです。

ゲームの音がなっていたらゲームが止まってはお笑いですから(笑)



posted by minoru at 22:28 | Comment(7) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする

2008年10月19日

ゲームプログラマーへの道 その14 ミュージックドライバ

FM音源の扱いもわかり、なんとか動かせるようになりました。

でも、FM音源は3音だけなので、これだけではやはり寂しいです。

ドラムの音が必要です。

てな訳で次の作業が「ドラム音」作りです。

使えるのはPSG(Programmable Sound Generater)のみです。

ピーとかガーとかそういう音がだせます。

これを「アタック、ディケイ、リリース、サスティン」の波形をつけると、いろんな音が作れるわけです。

と、口で言うのはカンタンですが、これだけでドラムの音を作るのは至難の業です。

何度も何度も作っては、確認の作業を繰り返します。

バスドラスネアシンバルの音を作り出します。
(シンバルはハイハット。クローズとオープンの2種類)

ノイズの乗せ方で音の調整をするんですね。

トン、タン、トン、タン、トン、タン、トタチーン という感じの音を作り出します。(最後のチーンがシンバルをたたいた音 笑)

打楽器なのでどれも立ち上がりが速く、ディケイも短い音です。
サスティンもほとんど無いですね。(シンバルだけ残ります。)

試行錯誤の末なんとか満足のいく音に。

ミュージックドライバの方では、FM音源部PSGのドラム部あわせて記述できるように改造です。

合わせて演奏させてみると、相当いい感じです。

やはりドラムの音がはいると全体的にしまりますね。


さて、今回のファイナルゾーンでは、なんと主人公のパワーがなくなったとき(つまり死にそうな時)音楽が変わることになりました。

ピンチの時の音楽というのに変わるわけです。

さて、これをどう変えるのか?


単純にやると、音楽が途中でブチっと切れちゃいます。

これじゃぁ、あまり芸がない・・・


ということで、なんとDJモードを作りました。

DJがレコードをリズムを合わせて切り替えますよね?あのイメージです。


音楽のリズムをそのまま維持し、メロディーラインだけをうまく載せ替えるわけです。

音楽切り替えのフラグが来ても、すぐに変えずにリズムを維持し、音楽の切れ目できちんと変えています。

そのため、ドラムの音はずっと同じ調子でたたいているんですね。リズムは乱れません。

そうとう細かい技です。

実はちゃんとフェイドアウトフェイドインしてるんです。

たぶんこの当時ここまで細かいことしていたゲームは無かったんじゃないかなぁ?





posted by minoru at 23:48 | Comment(0) | TrackBack(0) | ゲームプログラマー | このブログの読者になる | 更新情報をチェックする