Yo.の Win95 Game 開発日誌

96/10月分->

開発日誌 1996/09/30

多忙のため進まず


開発日誌 1996/09/29

いままで鉄球の当たり判定は自分にしかなかったがガムに対しても当たるよう 設定した。

強制移動フロアの効果をガムに対しても与えることができるようにした。 これによって、狭い所へガムを送り込む等のマップを作成可能になった。

面セレクトオプションをつくった。いままで無かったのが不思議といえば不思議。

面を増やした。

気が向いたのでタイムオーバー時に1ミスになるようにした。

版権フリーの効果音集のなかからピックアップして実装した。


開発日誌 1996/09/28

新調した周辺の具合は結構良い。

版権フリーの効果音集を聞きまくる。


開発日誌 1996/09/27

自主休業。開発休みともいう。

秋葉原で版権フリーの効果音集をいくつか入手する。

スピーカーとウーファーを新調。謎の立体サウンドアダプタを衝動買いする。


開発日誌 1996/09/26

フロアチップのレンダリングをいくつか行った。

オプション画面のキー入力処理を一部改善。画面がさびしかったのでキャラを 動かすようにしてみた。


開発日誌 1996/09/25

疲労のため進展があまりない。

トラップの「自動移動フロア」のレンダリングをおこなった。


開発日誌 1996/09/24

ferdia から新フォントが到着、早速組み込む。大きさが変わったためそのまま 組み込んだだけでは文字が重なったりして問題があるため、配置がえを行った。

そろそろアイコンでもつけなきゃな、ということで、早速 256 色アイコンを作成。 なかなか良い。Windows95 ならではの機能だ。


開発日誌 1996/09/23

さて、いろんなページの CG リンクに入っているのにもかかわらず最近作品のアッ プデートがないので さすがに心苦しい面もあって、CG の話でも書くことにする。

いま制作しているゲームが完成していないのだが、次期作品のためのリソース 集めを開始しなければならないと思っている。ということで、三次元景観シミュレー ションソフト VISTAPRO(日本語版)(http://www.aisoft.co.jp) と地形データ集二編、 および 地形作成ツール VISTAPRO Visual Exploror を購入した。三次元データを作成 する人ならば、一本くらいは景観作成ソフトを持っていても良いだろう。約 2.5万で 上記ソフトとデータが入手可能だ。これはかなり安い買い物。

CG ソフト購入ガイド(日経 CG) 4 K円を立ち読みしてきた。これから CG ソフトを 購入しようとしている人はこの本を参考のために買うと良い。高いソフトは果てしなく 高いし、安いソフトは果てしなく安いことが認識できるだろう。骨格を設定しそれに 従いモーションをつけることができるソフトもあるので目から鱗ですな。 LightWave は筋肉の設定ができるから凄いと思ったが、凄い機能にみあった値段が するのは当然。まだまだ三次元グラフィックスは高嶺(値)の花といったところか。

しかし某ゲーム会社の CG 担当から聞いた話によると、SoftImage を個人で買って 自宅で使っている人もいるようなので世の中わからない。目が飛び出る気分だ。

時代はパーシャルではなくパーティクルだ。パーティクルというのは、髪の毛や雲 光の表現に用いられる手法。非常にわかりやすい例を挙げると、鉄拳2のオープニン グの雲がパーティクル。ニーナの髪の毛もパーティクル。WANG JINREY のエンディン グの酒もパーティクルだ。

時代はモーションキャプチャ、とおもいきや、モーションキャプチャできない 馬など、動物の動きはどうしているのか。これは手で人間が動きをつけているん ですね。風間準のエンディングはモーションをつけるのを手で行ったそうな。

開発の話。効果音のモトネタがないってのはやはり辛いのか。こんどモトネタ CD を漁りにいかなければ。


開発日誌 1996/09/22

起動オプションの追加。タイトルロゴをスキップできるようにした。

強制移動(上下左右)タイルを作る。いままで作り込んできたものをそのまま使えば よいので簡単に実装することができた。

氷と強制移動タイルに効果音をつけたいと思い、mono 氏の WaveMake で 試行錯誤するが、やはり限界があり適切な音は作れなかった。 98 の FM音源の 環境を復活させて c.mos 氏の MET を使ってみるが、ALERT のような音は得意だが 複雑な音になるとうまくいかない。

ferdia から新文字ビットマップが送られてきたので組み込んだ。なかなかよい。


開発日誌 1996/09/21

ここで何度も紹介している WinGL だが、Artifex Association Home Page の Links から飛べるようになったので参照して欲しい。

さて、今日はいくつか進んだ。まず、鉄球が地面についたときに音を出すように した。いまさらだが、全画面のときにマウスカーソルを消した。(ShowCursor(FALSE)) 当然だが、Window モードのときにはマウスカーソルをだす。

さらに、オプション設定画面の背景をスクロールするようにした。ずっと見つめて いると酔う。不自然な動きに酔いやすい体質なのだ。

背景のスクロールは、WinGLOrigin で描画開始位置をずらして行う。ハードウエア スクロールそのままのイメージだ。つまり、ただ単にずらしただけではスクロール させたくない文字やキャラクターまでずりずりとスクロールしていってしまうのだ。 これについての対策は至極簡単。見た目で同じ位置にあればよいのだから、スクロー ルさせたくない表示はスクロールしたぶんだけずらして表示するのだ。 最後に注意しなければならないことは、表示はオリジナル画面サイズ内でクリッピン グが発生するということだ。


開発日誌 1996/09/20

開発休み。同僚の送別会は凄まじい飲み会になった。


開発日誌 1996/09/19

資料(SEGA Saturn のガンダム外伝1) で遊ぶ。動きはよかったがコックピット 視点は食傷ぎみか。プレイヤーの背後の視点も選択できるとよかったのだが。 GAME ARTS のガングリフォンよりも燃えてしまうのはやはり初期ガンダム世代 だからなのであろうと自己分析する。

音リソースはアニメで使用しているものをそのまま使っているように聞こえた。 イメージの再現にも重要なポイントだろう。ああいった音をガシガシつくれる ツールは無いものだろうか。


開発日誌 1996/09/18

GDM-17SE2T が到着する。やはり17 inch トリニトロンは良い。久しぶりに良い 買い物をしたと実感する。フォントをかなり小さくしてもはっきり文字が映るため MSDEV での編集効率が向上した気分になる。

画面上で音が発生した個所にあわせて Pan を振って Wave 再生するようにした。 右の壁にぶつかったら右側で、左の壁でぶつかったら左側で音がするようにしたので (DirectX 使用時) 臨場感が向上。修正は楽だったが修正による効果は大きい。


開発日誌 1996/09/17

メッシュパターンでフェードアウトを作ってみるが、案の定、見栄えが最悪。 やはり ROP でやるしかないか。


開発日誌 1996/09/16

秋葉原で歩き回った疲れが残っていて、一日中寝ていたので進まず。


開発日誌 1996/09/15

CRT、飯山 MF-8615A(94年9月購入)の調子が悪い。最近の CRT は持ちが悪いのか。 突然色が滲んだり、明るくなったりするのは接触不良か。しかし、写らなくなって からではかなりの問題なので、早急に CRT の買い替えをすることにして、秋葉原へと 繰り出す。ferdia の HDD が物理破壊されたので、HDD 物色も兼ねている。 歩き回った結果、SONY のトリニトロン、GDM-17SE2T に決定。ザコンで DDJ と The BASIC、洋雑誌の GAME DEVELOPER(1.8K円) を購入。あいかわらず洋書は日本で 買うと高価だ。はやく年間購読に切り替えなければ。http://www.gdmag.com/ に ソースコード等があり有益な雑誌である。要チェック。

散々歩き回ったので疲れた。


開発日誌 1996/09/14

DAR を複数持つ場合のパレット管理でミスがあった。FullScreen と Window モードの切り替えをする FullscreenMode() の挙動である。

FullscreenMode と Window モードを切り替える際、Canvas.Size(640,480,0) としていた点に問題がある。ここでいう 0 はパレットにする基準のパターン 番号である。DAR を切り替えていたら、この値もそれにあわせなければ ならないのだ。また、複数パレット持つ場合において Fullscreen から Window モードに切り替える際には、パレットのリアライズも同時に行う必要がある。 これを行わないと、色が化ける。

敵の爆発パターンを trueSpace でモデリング & レンダリング。バンプで誤魔化 して形自体は爆発に近いようなものができた。動かしてみたら破片のようだ。 もう少し派手さがあってもバチは当たらないだろう。

新トラップを作成した。またまた trueSpace で鉄球をモデリング & レンダリング した。黒光りするのがいかにもといった雰囲気だ。行く手をはばむものとしては 楽なタイプになるだろう。ゲーム要素のひとつである「下をくぐりぬける」を使う。 マップデータからはまだパラメータを微調整できないので、定期的に動くように 仕組んでマップに仮配置。またしても1面に「試験配置」なので、1面の難易度が 上がってしまったが、今後も作ったトラップは必ず1面に配置する予定。当然のこと ではあるが、リリース時にその面は使用しない。

実際につくってみると、トラップが動いているといないとではだいぶ見栄えが 違うことがわかった。


開発日誌 1996/09/13

疲労と、chat と 月イチのバックアップ作業 & アーカイブ整理のために進展なし。 バックアップ先がパラレル Zip ドライブなので(なぜ)いろいろ面倒なのだ。 ファイルの内容別にディレクトリを分けているのだが、しらない間にダブって 入っていたりしたのでマージした。臨時でコピーしたのがマズかった。 さすがに NetMeeting しながら バックアップ & アーカイブ整理しながら 開発はできん。

ふとこの日誌にイラストいれようかと思ったが、んなもんいれてる暇あったら 開発しろ開発、ってな状態な訳なので描かないことにする。その代わりといっちゃ なんだが、ソースはばしばし入れてく予定。

で、ぜんぜん関係ない話だが、fvwm95 良いっす。会社の X 端末にいれてます。 重たいのがたまにきずだが、重いところまで再現性バッチリなのが good ;-P タスクバーってやっぱり便利。


開発日誌 1996/09/12

メニューのキー入力処理に問題あり。あたりまえの処理をやっていなかっただけの 話なのだが気が付かなかった。メニュー等の場合、キーを押しつづけている状態では 入力を無効とし、「離している状態から押した状態に変化したときのみ入力として 処理」することが定石となっているのだ。

また、その際、「押しつづけている状態が n 秒以上継続」した場合をトリガにし 「一定周期で押している状態を入力として有効」にすればキーリピート機能が実現 するのだが、んなものタイトルのメニューで必要ないのでやらない。無駄無駄。

タイトルロゴを試しに描いてみる。うーん、ドラ○もんを狙ったのだが、 なかなか難しい。タイトルもまだはっきり決まっていないので、そろそろ決めないと いけない。まだ (仮) の状態だし。私としては、(仮) ではなく、現在の暫定タイトル 画面のタイトル名で良いと思っている。キャラクター名を全面に押し出さないものも 良いのではないかと思う今日このごろ。


開発日誌 1996/09/11

DirectDraw Fullscreen モードにおける強制終了現象の問題点が解決した。 Window モード時に hpal を DeleteObject していたが、WinGL は、Window モード でなくてもパレットオブジェクトを再作成するため、Fullscreen モード時に於いても パレットだけは DeleteObject しなければならないのである。

*DAR ファイルの複数読み込み*

  // DAR ファイル 1 の読み込み
  if ( PatEntryDAR( 0, DAR_USER1_TOTAL, hInst, RESOURCE_NAME,
       RESOURCE_TYPE, &hglbTB2 ) < DAR_USER1_TOTAL ) {
    エラー
    return;
  }
  // DAR ファイル 2 の読み込み
  if ( PatEntryDAR( DAR_USER1_TOTAL, DAR_USER2_TOTAL, hInst,
       RESOURCE_NAME2, RESOURCE_TYPE, &hglbTB3 ) < DAR_USER2_TOTAL ) {
    エラー
    return;
  }

*パレット切り替え*

  if (strcmp(dar_resname,resname)!=0) {
    Canvas.Clear();
    strcpy(dar_resname,resname);
    if (DeleteObject(hpal)==TRUE)
      hpal = 0;
    else
      エラー
    if (strcmp(RESOURCE_NAME,resname)==0)
      WinGLSize(&Canvas, Canvas.dx, Canvas.dy, 0,&hpal);
    else if (strcmp(RESOURCE_NAME2,resname)==0)
      WinGLSize(&Canvas, Canvas.dx, Canvas.dy, DAR_USER1_TOTAL,&hpal);
    else
      エラー

    // パレットの realize
    HDC hdc = GetDC();
    if (hpal)
      SelectPalette(hdc,hpal,FALSE);
    BOOL f = RealizePalette(hdc);
    ReleaseDC(hdc);
  }

開発日誌 1996/09/10

Window モードにおける DAR 複数保持とパレットに関する問題はクリアできた かのように見えたが、システムリソースがガンガン減っていくという問題を抱える 結果となる。確かに Window モード時には DeleteObject(hpal) してパレット オブジェクトを開放しているのだが。何故? 現在原因を問い合わせ中 & 調査中。

また、DirectDraw Fullscreen モード時において、アプリケーションが強制終了 してしまう問題がある。これについてもライブラリの範疇なので、問い合わせる しか手だてがない。


開発日誌 1996/09/09

パレットは、WinGLSize(&wingl, wingl.dx, wingl.dy, パレットの基準にする パターン番号,&hpal);のようにすることにより切り替えることができるようだ。 このときウィンドウモードの場合は現在画面に使っているパレットを一旦開放 してから呼び出して、WinGLSizeの後でhpalを画面に反映させるようにしないと 駄目らしい。GWindowの派生クラスで処理している場合はメンバ名はhpal。


開発日誌 1996/09/08

開発とは特に関係がないが、VC++4.0 Standard 版について。std 版っていうのは 最適化コンパイラでは無いのね。昔でいうところの MSC に対する QuickC 的な 位置づけなのであろう。それほど速度を必要としないならばよいのだが、より 速度を必要とする場合には辛い仕様といえるのではないだろうか。もちろん、 std 版を使ってゲームをつくることは可能だから、安いコンパイラでがしがし 経験を積んでいけばよいのだ。

私が使っている WinGL が InsideWindows 1996 年 11 月号で特集されるようだ。 5 千円程度のシェアウエアだが、十分使えるライブラリなのでぜひ使用を お勧めする。

さて ferdia が持ってきたタイトルメニュー用のグラデーションした文字を 使用してみる。うーん、なかなか良いね。この調子で他の文字もつくりたい。

タイトル画面に 236 色、ゲーム中に 236 色使いたいが、現状の WinGL の スペック上、正式手順では出来ないと思われる。現在問い合わせ中。 こちらのプログラムはすでに異なる PALETTE を持つビットマップを扱う様に 対応している。WinGL において、Window モードから Fullscreen モードに 変わる際に DDScreenSurface を取得し直してポインタアドレスが変わる。 その際に WinGL 構造体のパレットも作り直すと思われる。DAR の内部の RGBQUAD[256] を WinGL 構造体の RGBQUAD aColors[256]にコピーしてから HPALETTE を得て、それをScreen DC にセレクト、Realize してやれば良い筈。 だが aColorsは private メンバであるためWinGL構造体の中身を直接触ることは できない。異なる DAR をロードする際に WinGL 構造体のパレットを書き換える 関数があれば正式な手順でパレットの切り替えを行うことができるのだが。


開発日誌 1996/09/07

trueSpace で作っていないリソースを trueSpace で作り直す。レンダリング結果 だけがあり、実際のモデリングデータが喪失しているからだ。結果、前のイメージ とは少し離れてしまったが。背景になる氷も立体で作ってレンダリング。こうなって くると減色が面倒になる。そろそろツールが必要だ。


開発日誌 1996/09/06

多忙のため進展なし。
朝 3 時 に帰宅し、さあこれからと意気込むが疲労のため寝る。


開発日誌 1996/09/05

多忙のため進展なし。


開発日誌 1996/09/04

書き忘れていたが、氷の上専用のビットマップを用意できない場合、 大抵の場合アニメを止めればよいということがわかるだろう。 氷の上で停止している状態ではアニメをやめ、なにかキーを触っていたらアニメ すればいいのだ。

さて、今日はコマンドライン処理を作った。Windows アプリになっても やはりコマンドライン処理をしなければならないというのはなんとも懐かしい 感じがする。実は Windows アプリのコマンドライン処理は初体験。やりかたは 知っていたが処理する必要性がなかっただけなのだが。しかしまあ、 int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw) となっているところの、szCmdLine を処理するだけなのであとは DOS 時代と変わらないので安心だ。わずか数分で実装を完了した。

ふと思い付いて氷と逆さ氷柱を使ったテクニカルな面を作ってみる。 これによってタイムトライアル面クリアアクション的な構成も可能であるという ことを示すことができた。学習効果もあるのでなかなかよろしい。 しかし今日作った面は難易度がそれなりに高いものになってしまった。

現在、面データはオンメモリだが、将来的には専用エディタでエディット 可能なデータにする必要がある。とりあえずテキストのスクリプトを コンパイルするツールでなんとかなるか?

敵を倒したあとの爽快感が無い。というのも、現状は敵が音を少し鳴らして 消滅するのみだからである。爆発のような効果を考えている。


開発日誌 1996/09/03

仕事で遅くなって開始が遅れた。本当は帰れる身分じゃないんだが。 さて、以前に作り込みしておいた「氷の上移動」の仕組みをトラップにバインド。 これにより、面構成にバリエーションができた。もっとトラップを増やさなければ。 元アイデアの半分も実装できていないのが現状だ。

「氷の上の移動」を実装する方法は次の2点。キャラの速度を通常よりも上げる ということと、減速までの時間を伸ばすということだ。これでそれらしく見える。 あとは、その時間と速度の組み合わせを如何に調整するかにかかっている。 滑っていることを示すビットマップを容易するともっと感じがでるかもしれない。

さっそくマップに組みこみ試行。なかなか良い感じだ。ビットマップは ferdia から 送られてきたものを使用。めだつ位に色数を減らしたのでオリジナルの面影が 無いのは問題だ。減色の際にもっと色数を使っても良いかもしれない。 氷をマップしてみたが、管理するトラップの数は 32 個では足りない。

今回、背景に関してマップは存在しない。(たとえそれが壁であっても)全て オブジェクトで管理している。当たり判定が楽であるということ、管理が統一 できるのでプログラムも統一できる。速度的にはマップ方式と比較しても 多少問題があるのだが、現在目立った問題にはなっていない。数が少ないため マップの更新、比較と、座標比較との処理差が目立つほどに大きく開かないからだ。


開発日誌 1996/09/02

今日はタイトル絵のアイデアを練り直していたのでプログラム的には進歩無し。 絵柄はあまり変えないほうがよさそうだという結論に至る。

タイトル絵とゲーム中のパレットを分けようと思ったがうまくいかない。 どうしたものか。タイトル絵は 16 色+α程度に押さえておくのがよいのか? とりあえず trueColor でサササと描いたものをサクっと減色した。


開発日誌 1996/09/01

NIFTY-Serve にアクセスすると、WinGL0.11b βが binary mail で来ていた。 これ以前に密かに WinGLBlt をテストしていたのだが全員に配布されたようだ。 早速最新に入れ換えてビルド。おお、うまく動くようだ。2 枚の WinGL 構造体を 使って WinGLBlt を使う場合において、注意が必要なのは、アイコン化された 状態から復帰した場合と、全画面、ウインドウ表示の切り替えを行った場合だ。 これらのケースにおいて、WinGL 構造体の持つビデオメモリの内容は以前の内容を 保持していない。結局 DirectDraw Surface そのものであるため、仕方が無い。 よって、WinGL 構造体に対し、アプリケーション側から再度描画を行う必要がある。 対応は簡単だが後回しにしている。

trueSpace でトラップ(逆さ氷柱)を作った。適度なパースにするのがちょっと 面倒。もともとパース崩壊している表現方法をとっているのが問題ではあるのだが。

逆さ氷柱にヒットするとプレイヤー1ミスになる仕様でとりあえず作った。楽々。 これを2つならべるとジャンプのタイミングによってはミスになるので効果的だ。 いくつまでトラップを表示させるかで悩んだが、あまりトラップつけてもしかたが ないので 1 画面中に 32 個までとした。これでも多い位だ。また、このトラップ のための効果音を作成した。あくまで暫定だが、無いよりもイメージを出しやすい からだ。

敵を倒したあとコインが出て、それを取れるようにした。処理的には非常に簡単 なものだ。スコア仕様はすでにつくってあったのでそれに準拠した得点制度にした。

敵を倒したときにスコア表示するが、最後の敵のときにスコアが一瞬しか出ない。 クリア条件に「スコア表示が消えるまで」というのも追加した。

敵を倒した場合、コインを取った場合のスコア表示の際、画面からはみ出ない ように処理した。当然の処理だが忘れていた。