2006年1月の日記

<2006年02月 2005年12月>

おまえの星

メテオスデータベース更新です。
手持ちのメテオ数と目標メテオ数を入力すると目標値に一番速く近づける惑星を計算してくれます。

そうそう、ミディビ、今度は送信データを見直そうと考えています。
お絵描き掲示板のように投稿した作品を後でまた修正するとなると出来上がったMIDIからでは編集用のデータは作りにくいので簡単に編集用データを復元できるようなデータも一緒に作って保存させたいんですよ。
そのためには2つのファイルのデータとサイズを渡さねばなりません。
必然的にデータ送信は変更せざるを得ないでしょう。

そうそう、音楽つながりで、Bomber丸WorldのBGM作ってました。
まだ途中ですがせっかくなのでアップしておきます。

1138717272.mid

謎の男

最近日記を書くだけ書いてアップするのを忘れがちです。
特に他のコンテンツの更新とかぶっていたりすると一緒にアップしただろうと思い込んで確認を怠ることがあるようです。

ミディビの投稿データを毎回別のファイル名にして保存するようにしました。
過去ログを残すとか、将来掲示板として稼動することを見越して、というよりブラウザのキャッシュ対策だったりします。

ドラクエ8ではラストダンジョンらしき場所に潜入。
なぜか図書館があったり、クレイジーな量のタルがおいてあったり、リレミトで脱出できずにルーラが使えたり、手入れが行き届いていなくてそこいらじゅうボロボロになっていたり、従来のラストダンジョンとは違った雰囲気がありました。

Bomber丸World、マップデータの方式が決まりません。
一つのマップに二つ以上のマップチップ素材があってもかまわない方式でないと困るんですよね。
だけどマップチップ一つ一つに対してどのファイルのどこのデータですというデータを書いていけば面倒なことこの上ないし、できれば番号で管理したいのです。
となれば別のファイルでどのファイルのどのデータかという情報に通し番号を付けてマップデータのほうではその番号に従ってマップを作ればよいのでは?
しかしそうなると番号のつけ方が問題に…。
それはそうと、今日の絵は謎の男仮バージョン。
輪郭に色つけると思ったよりよくなるね。

1138628860.gif

台無し

ミディビ更新ですよ。
で、ためしに一曲作ってみたらキャッシュのせいでうまく保存されたMIDIがならなくて頑張って作ったのが台無しになってしまいましたよ。
アプレット自体に問題はないはずだけど。

騎士団長

マ、マルちゃんすげえ。
暗黒神を支配し利用してやがった。
しかし主人公らが余計な手出しをしたせいで結局ラプちゃん復活。
いや、でも案外これでよかったのかも。
そうでないとマルちゃんがラスボスに…?

ちょっとアクセス解析でディレクトリごとのアクセスの様子を見てみました。

1. /tokio6/ 178,249 28.61%
昔の遺産ですな。ずいぶんと長いこと皆をだましてました。
2. /akiyame/ 67,402 24.35%
飽きる前に忘れ去っているので意外に消えなかったりします。やっぱり繋ハートが強い。
3. /gohma6/ 170,821 23.55%
昔の遺産。どちらかというと馴れ合いサイト。
4. [root directory] 52,815 6.07%
正面玄関。リンク集やブックマーク経由だと大抵一度は通るんですよね。
5. /prog/ 33,910 4.96%
なんだかんだ言ってもメインコンテンツ。更新が少なくてもメインコンテンツ。
6. /diary/ 10,471 3.17%
更新量最大だけあって結構見てくれてますな。おそらくほとんどがリピーター。
7. /game/ 9,526 2.94%
「爆ボンバーマン 攻略」でYahoo!検索1位に君臨するんだから多くても不思議はありません。エアライド関係でも結構来てくれてるんですよね。
8. /dl/ 8,503 2.31%
かつては事実上のメインコンテンツだったのですが…。ページ構成を見直さねば。
9. /cgi/ 17,056 1.51%
この内部に特設サイトを作っていて大きなサイトからリンクしてもらってるので結構人が来てます。
10. /tgscript/ 9,663 0.85%
掲示板ですな。リピーターさんは何も書かないときでも結構見てるものです。
11. /profile/ 906 0.46%
1ページが馬鹿みたいにでかい。それだけ。
13. /ul/ 2,615 0.20%
電子工学系を今後充実させていきたいです。
14. /links/ 1,435 0.18%
どうでもいい。
15. /hpm/ 1,305 0.17%
欠番の12位は実は一代目HPM。だからそれ以上のところにはいきたい。
16. /midib/ 1,134 0.09%
ミディビはまだまだマイナーな様子。やはり必要な機能を早く実装しないと。
17. /support/ 493 0.08%
必要なときに見てもらえればそれで充分なので。
18. /gift/ 15 0.06%
ずたきゅん専用。
ミディビとダウンロードを頑張らねば。

掲示板が文字化けするようだったので直しました。
GBBS時代の文字数を可能な限り少なくする過剰に省略した書き方のせいで文字コードがブラウザに渡されず結果ブラウザだけの判断で最初のTGWSを見て英語らしいと判断されてしまっていたのが原因だったようです。

ミディビの開発やってます。
アンケートの結果多くの人がアプレット実行可能な環境でないこと、たとえ実行できても正しく音が鳴るとは限らないことがわかったのでそっち方面に改良を加えています。
それに伴いアンケートのほうは終了させました。

何あの犬?
ただの羽生えた犬じゃん。
なんであんな犬畜生ごときに聖堂騎士団が勝てないの?
弱くて話にならないよ。
強い武具をここの所買えない状態が続いていたのに、アイテムの用意も忘れてきたというのに、何あの弱さ。
犬。
で今度はマルちゃんですかい?
今回のイベントではみんな行動がおかしいよ。

エイリアス

Bomber丸Worldのアニメーション機能に新たにエイリアス機能を付け加えました。
この機能は簡単に言えば、指定されたポーズが存在しなかったときに別のポーズに読み替える機能で、例えば、LookUpがStopにエイリアスされていれば、実際にLookUpがあればそのままLookUpを、なければ代わりにStopを表示させる機能です。
一部のキャラにだけあるポーズとかがあって、さすがにそういうのを全部のキャラについて作るのは骨が折れるので、全キャラ共通設定であまり使われないポーズを予めエイリアスしておいて、後から個別に指定していけばあるキャラだけポーズの種類が多くなるといったことをデータの指定だけでできてしまうのです。
もっとも、更にごく一部のキャラは専用のプログラムを組んでポーズを追加しているものもありますが。
あと、セーブデータの使用についても考え中です。
今考えているのはそれぞれのデータに名前をつけて管理する方法で、理屈の上ではキャラクターのステータスやイベント情報などを全て一括して同じ方式で記録できるはずなんです。

1138285237.png

目撃者

ふにゃさんに新たな機能をつけました。
元々実装が困難だと思ってつけていなかったのですが、設定で機能を有効にし、なおかつポーズ時のみ表示にしたらたとえ処理速度が追いつかなくても一回だけなので問題ないと考え、思い切って付けてみました。
でも設定が出るのは条件を満たさないといけないです。
その条件は秘密です。

1138199865.png

どいてどいてェ!

ドラクエ8でやっとのことでストーリーに関係のあるところを見つけましたよ。
そこは人間と魔物とエルフが共存する集落、トロデ王も久しぶりに嬉しそうです。
でも馬は共存していないらしく馬姫は外で待っているようです。

Bomber丸Worldの高さマップとキャラマップについて考えてます。
高さマップ、自分の立っている高さと移動先の高さが著しく違えば移動不可能。
自分の立っている高さというのは、自分の足元にある高さ情報の中で最も高い部分の高さで、移動先の高さのうち自分の高さから遠いほうと自分の高さの差が一定値を超えると移動不可能となります。
キャラマップ、それはキャラがどこにいるか、ではなくその場所に何のキャラがいるか、というデータで、あるキャラが移動しようとしたとき、移動先のキャラマップに何らかのキャラが登録されていると移動できません。
だからその場合は、相手キャラにそこをどくよう通知して、どいて進める状態になったら自分が改めて進みます。
これらを総合すると、次のようになります。
まず、移動先の高さを調べる。
移動先の高さが移動可能な範囲内であれば、移動先のキャラを調べる。
キャラがいた場合、移動して欲しいと通知を出し、どいてくれた場合移動できる。
ちなみに、どくという作業もまた移動を伴うので、どくほうのキャラも同じ方法で移動を試みます。

やっぱり絵を描けるようになるには模写からはじめたほうがよいと思い、パネポンのキャラを一名描いてみました。
しかし豊かな髪が風にたなびくようなキャラだというのに私が描くとどんな風にもびくともしないロウ細工のようになってしまいます。

1138112994.gif

やりこみマスターの知恵

ドラクエ8、ストーリーのほうはいまだ進みません。
ついこないだまでストーリー進行が速すぎるぐらいの勢いだったのでこれを機会に昔急ぎすぎて取り逃していた宝箱回収の旅に出かけています。
そんな中微妙にストーリーが進みそうで進まないような微妙で小さなイベントが続く中、ベルガラックのバニーショーだったかなんだか(昼なので開かれていなかった)のフロアで、マスターにカジノのいい情報をもらいました。
そして冗談半分で言われたとおりにやってみると、スロットで777が大当たりっ!!!
パルミドで40ゴールドで買ったコイン2枚が100枚のコインに化け、仲良し兄妹の手助けをして600枚のコインを手に入れ、それを元手に8400枚のコインを稼ぎ、これでついに104500枚!!ぼろ儲けじゃ。
早速はぐれメタルよろいを2つもらい、残高4500。

名前の問題

Bomber丸World、画像リソース管理システムをテンプレートにして画像以外にも使えるようにしました。
で、さしあたり画像リソースとアニメーションデータに対して作ってみたわけです。
しかしこれ、ファイルを開くとき基準にするフォルダもクラス名ごとに共有してしまうため単純にアニメーションとはいってもマップチップ用のものとキャラクター用のものなどがあったりして、ファイルのあるフォルダが違ったりするのでフォルダの数だけ同じ内容のクラスを作らないといけないんですよね。
まあこれは単純に元のクラスを継承するだけして内容は一つも変えないようにすれば名前変えという目的が達成できるわけですが。
それにしても、templateでstaticって使いにくいね。

ドラクエ8でついにバトルロードランクBを勝ち抜きました!
そして第2チームをもてるようになったのですが名前には少し苦労しました。
第1チームの「エデンのせんしたち」のような印象的でモンスターチームの名前にできて9文字でどこかで聞いた事のある名前にしたかったのです。
「あくりょうのかみがみ」ダメ。
「げこげこまんだら」ダメ。
「ほしふりのほこら」ダメ。
「ウルトラマンタロウ」ダメ。
「てんくうのはなよめ」ダメ。
「デビルメイクライ」ダメ。
で結局、「デビルメイクライ」のエンディングで出てきた名前「デビルネバークライ」が字数的にも内容的にもよさそうだったのでそれに決まりになりました。

アホのゲモン

ふにゃふにゃ、整理をつけるため改めて途中まで用意していたデータを見ていたら、作りかけのボス音楽を発見。
はっきり言って、作っているときから納得行かない出来で、今は恥ずかしくて聞くことすらもためらっていたのですが、今改めて聞いてみると、確かに展開はめちゃくちゃだし曲全体としてみれば聞けたものじゃなかったけど、中心となっているメロディだけは中々怪しい雰囲気が出てよかったんですよ。
調を無視した、しいて言うなら出鱈目な12音階だというのに、それなりにきっちり曲になっていたりするから驚きです。
で、これは何とかアレンジすればまた使えるんじゃないかと思って作り直そうとしたけど見事玉砕。
もはや理論を知らなかった頃の出鱈目な感性は戻ってこない。

ドラクエ8、アホのゲモン倒しました。
レティスはあの程度敵ではない(相手にならないほど弱い、という意味ね)といっていたのですが、なるほど確かに話にならないザコで、さっき覚えたばかりのヤン様(ヤンガス)のおじさま呼び(おっさん呼び)を試しうちした後、やはり覚えたばかりのハーゴンのギガスラッシュをハイテンション状態で発動させて技のかっこよさを堪能して、さあこれから反撃だと思ったらいともあっさりとアホゲモン死亡。
すんません。正直、隣の本物のザコ2匹のほうがまともだったんですが(もっとも、メダパニを食らってゲモンに攻撃したりしていたが)。
すんません。正直、最強モンスターチームを出すまでもありませんでした(もっとも、出した瞬間隣にいるザコにバシルーラで吹っ飛ばされて終わりなのですが)。
そして負けた往生際の悪いゲモンは…(ネタバレにより省略)。
だけど結果的にはそのとんでもない行動が帰って都合がよかったようで。
ゲモン、とことんアホです。救いようのないアホです。

Bomber丸Worldのマップチップの実現の仕方を考えていました。
アニメーション定義ファイルで定義できるのはあくまでも名前と描画に必要なデータの対応、そのグラフィックがどんな意味を持つかまでは規定しないのです。
であるからして、グラフィックを用意した後改めて別のファイルでマップチップの情報を記載してグラフィックとリンクするという形がよさそうです。

ヘルプ

ふにゃさんのヘルプ作ってます。はい。
正直、バージョン1.00はバグだらけだったので下手にヘルプを作って使わせるようにしなくてよかったと思ったりしています。
でもあれですわ。ゲームプレイとエディットに関する重要なバグは一通り潰したのでこれで心置きなくヘルプが作れますわ。
しかしHTMLヘルプってJavaScriptがうまく動かないな…。
JSでコンテンツの一部を動的に作成してHTMLヘルプとWWWの両方に対応させたかったのですが目論見が外れました。

バグだらけじゃないか

はいはいはい~。ふにゃさんのバグを一覧にしてみたら結構沢山あるじゃないの。
そして自分で直せそうなものと直せないもの、直す気のないものなどに分けて、バージョンごとに記録してみました。
もっとも、今は先日公開した1.00と今作っている1.01しかないのですが。
せっかくなのでこういったバグや機能などのバージョンごとの変遷を表にしたページを作ってみました。
ちょっとこれはメタセコイアのページの影響受けてます。
そして、過去のバージョンの機能が見られるのなら過去のバージョンもダウンロードできるのが自然だろうというわけで、試験的に過去のバージョンもおくことにして見ました。
正直、今作っているバージョン1.01はほとんどバグフィックスのみなので過去のバージョンを導入する利益はほぼ皆無なのですが。

Bomber丸Worldです

しかし簡単なアルゴリズムでできると思っていたけど思ったよりコード量が長くなってしまった。
しかも最初間違えてZeroMemoryしちゃったためにSTLのvectorが使う直前になって中身がなくなってしまって、読み込みそのものは正しいはずなのに必ずメモリエラーが起こるという事態になっていました。
もちろんこう書いているからには既に直しているのですが。
ほかにもいろいろ細かいところで間違いなどがあったのですがとりあえず今のところ困った誤動作はほぼ起こっていません。
ついでに画像リソースがいつの間にか解放されなくなっていたバグを修正。

1137503895.png

アニメーション定義ファイル仕様書

うん、キャラグラフィック、マップキャラだけでなく一般的に広く応用できるんじゃないかと思ったので若干内容を変更して仕様を定めてみました。
開発室に詳しく載せてます。
うん、なんか他のゲームでも使えそうだ。
そもそも今回は珍しく部品から作っているので他のゲームにも使いまわしやすいようにできているんですよね(というより「他のゲーム」が他でもないBomber丸Worldなのですよ)。
極力入力の手間を省く(データ量が手動入力するには多すぎる)ためかなり省略表現に強い作りになっていたりします。
1コマだけのアニメーションとすれば静止画にもなりますしアニメデータそのものは描画を担うわけではなくいつどこの画像を表示するかという情報を管理しているだけなので、描画する側でその情報の解釈を変えてやればマップチップにもマップキャラにも顔グラフィックにも戦闘グラフィックにも特殊エフェクトにも使えるようになります。

キャラ定義ファイル

Bomber丸World、キャラグラフィックにはキャラごとに定義ファイルを用意して、それぞれのポーズ名と、そのポーズごとにどの画像を使うか(正確には画像のどの位置を切り取って使うか)、どのようなアニメーションをするか、どの程度ランダムに揺らぎを与えるか、などをデータとして定めておきます。
これにより、例えばふにゃの場合、「立っているポーズ」でたまに瞬きもしていたりしますし、キャラ一般の場合、「歩いているポーズ」で歩くアニメーションをキャラごとに定めたりできるわけですよ。
基本的にキャラグラフィック定義ファイルの書き方は、
「要素名 値1 値2 ~ "ポーズ名1" "ポーズ名2" ~」
てな感じで、要素名と値をクオーテーションで囲まずに必要数だけ書いた後、クオーテーションで囲んだポーズ名をずらずらと連ねてゆきます。
ポーズはキャラごとに任意に追加することが可能で、必須要素以外はイベントによりポーズを指定することで使います。
必須のポーズは"StopFront" "StopRight" "StopBack" "StopLeft" "WalkFront" "WalkRight" "WalkBack" "WalkLeft"の8つで、つまり、歩いていないときと歩いているとき、ということです。
ちなみに、"Common"というポーズもあって、これはポーズを定義したときに一部の要素が抜けていたりすると"Common"と同じ値だとみなされるようになっています。

ミディビアンケート中間発表

6票 編集画面すら出てこない
2票 ピアノ部分クリックで音がなり、演奏によっても音が出た
2票 ピアノ部分クリックでは音がならず、演奏では音が出た
0票 ピアノ部分クリックで音がなったが、演奏では音が出なかった
0票 どちらでも音は出なかった

「編集画面すら出てこない」ってのは問題外で考慮しないけど一応確認のため、と思って項目に入れてたんですが6割もいちゃ無視できませんね。
どうも最近のパソコンにはJREは標準では入っていないようです。
JREのダウンロードページへのリンクが必須ですね。
そして2位の「ピアノ部分クリックで音がなり、演奏によっても音が出た」というのは理想的ですが、「ピアノ部分クリックでは音がならず、演奏では音が出た」がいる以上無視するわけにはいきません(何より自分もその一人ですし)。
「ピアノ部分クリックでは音がならず、演奏では音が出た」は簡単な方法でピアノからも音が出せるようになります。
「ピアノ部分クリックで音がなったが、演奏では音が出なかった」でも音が出るようにはできますが難しいので正直いなくてよかったと思います。
「どちらでも音は出なかった」は残念ながらどうしようもないです。
いなかったのが幸い。

結論。
編集画面すら出ない人のためにJREダウンロードページ(http://java.com/ja/download/)へのリンクをつける。
そしてピアノロールから音が出ない人でもちゃんと音が鳴るように改善する。

Bomber丸WorldのグラフィックエンジンはほぼyaneDIBだけなのでさらりと実装。
しかしマップの実装に苦戦中!
なんせアニメーションして高低差もあってデータ的に前後関係を作らなくても(例えばRPGツクールやSFCのRPGなどでは「手前」にあるマップチップを「上」に置くことで見た目に正しくしている)自然な形のマップデータを与えればただしい前後関係で表示されるマップを作らなきゃならないんですから!
アニメは余裕ですが高低差と前後関係は結構悩みどころです。
高低差があれば当然高いほうを後から描くのですが、じゃあ前後関係との兼ね合いはどうなる?ってこと。
自然な形のマップデータにより、一つのマップチップの大きさが任意に変えられるようになるため、スクリーン座標でZソートして描画するとデータ的には前にあるのに後ろに描画されてしまったりすることがあるのですよ(ビルボーディングと同じ問題)。
だからマップ座標でZ(奥行き)ソートしたものを更にY(高さ)ソートすれば理想的にはうまいこと表示されるはずなのですが、それにキャラを乗せると、キャラの奥行き方向の幅によりあるZ座標の範囲でまた前後関係の誤認が起こるのですよ(ビルボーディングと似た問題)。
そのため、奥行き方向の幅を補正するために画像データに近い段階でZ方向にオフセットをかけてやり、誤認される範囲を少なくし、更にゲーム的に移動範囲に制限を設け、残った誤認が起こる範囲に入れないようにするのです。
これでおそらく見た目に問題となる範囲では前後関係の誤認は起こりえないでしょう。

それと、ぜひ付けたい映像表現が、ちびロボ!にあった、主人公が物陰に隠れるとそのシルエットが最前面に浮き出て見えるという表現。
これ、ちびロボほどじゃないにしても小さくてすぐ物陰に入って見えなくなってしまう主人公たちには必須なのだと思うのですよ。
実装はどうやればいいかな…。後で考えておこう。

色のない世界

レ、レティス強っ!
どうせ異世界とやらでレティスと対決でしょ?
なんて軽い気持ちで行ったら攻撃力、防御力ともに桁外れの強さ!
例のアポロンたちの最強モンスターチームをけしかけたらたいしたダメージを与えることもできず瀕死になって退却。
普段はどんな相手にでも余裕で150以上のダメージを与えていくアポロンの攻撃で70前後のダメージしか与えられないし、普段はどんなに強い攻撃を受けても60程度のダメージまでしか受けなかったでんすけが一発で180を超えるダメージ!
これで1ターン2回行動でもされた日にゃもう逃げ帰るしかありませんわなこりゃ。
そんな相手にその後モンスターチーム抜きで戦わなきゃならないんですから大変です。
主人公ハーゴンの攻撃がたった18のダメージ。
そんな情けないダメージはゼシカと出会う前にとっくに卒業してたはずなんですが。
そんなものだからククールの攻撃はわずか4のダメージ。
メタルじゃない相手にダメージ一桁ですよ!
涙が出てきます。
そんなことだから主砲ヤンガスの渾身の一撃も80前後のダメージどまり、ゼシカが最近覚えたメラゾーマも40程度のダメージのみ。
そしてHP・守備力共に最強のヤンガスが体力を充分残していたはずなのに1ターンで瞬殺されてしまったときには勝てる相手ではないと覚悟しましたね。
補助呪文も全く効きませんでしたし、まともなダメージを与えようとテンションをため始めたら絶妙のタイミングでいてつく波動!
全滅を確信したワレワレはせめて死ぬ前に少しでもダメージを、と、残る力全てを攻撃に集中して戦いました。
倒れる仲間、MPが残る限りザオリクで呼び戻すククール、こまめにベホマズンを唱えていたのに結局瞬殺されてしまったハーゴン、そして次の瞬間、ヤンガスの攻撃。

「レティスをやっつけた!」

1万を超える経験値。
ぶっ倒れたままのハーゴン。
進むイベント。
まだ倒れたままのハーゴン。
本当はワレワレが戦ったよりはるかに強いレティス。
自動で生き返らないハーゴン。
人質、もとい卵質をとられているレティス。
聞いてないハーゴン。
卵奪還に向かうことになったワレワレ。
イベントに完全に取り残された主人公ハーゴン。
ハーゴン…。

爆ボンのグリーンガーデンのページを少し更新しました。
パワーの取り方について質問があったのでその答えを。

なんとずさんな!

見ての通りふにゃふにゃ、最後の更新です。
シークレットを大放出して終了!
と思って添付のドキュメントを書き換えようと開いたら別の更新内容が1.06の場所に書かれているではありませんか。
なんと、更新していたにもかかわらず公開するのを忘れていたのです!
そして圧縮前の最後の確認で、アーカイブに入れるファイルだけを専用のフォルダに移動して実行。
BGM音程ずれてるし音量もめちゃくちゃ!
改良されたバージョンのBGMじゃなかったんです!
なんと、BGM改良するだけしておいて配布用データに反映するのを忘れていたのです。
まあともかく、忘れてたのをいろいろ追加して更新完了、開発終了です。
あのボスが出てくることのできるバージョンは今後やる気があれば作りましょう。

ぎゃっはっはっは!

笑いが止まらん!
ドラクエ8で・・・ドラクエ8で!!
新たなレシピ発見!!
なんとなくふざけていろんなもの放り込んだらできてしまった!!!
とりあえずレシピ表風味に表すと次のような感じ。
究極のチーズ=チーズ+カビ+うんこ!!

そういえば今日は読売テレビの見学に行きました。
滞りなく終わったことだけ言っておきます。

うぷぷぷ・・・トーポ可哀想やわ。

3Dの結末

どないしよー。
それでDirectDrawとDirect3Dでやってみようと思ったんだけど3D部分にドット絵を置いたらやっぱりドット抜けが起こって元の木阿弥なのです。
じゃあそもそも3Dでやりたかったことって何だったのか。
まずマップの前後関係のためのZバッファはZソートによって完全に無意味になっています。
エレコやギャモンは、正直、ポリゴンでさえあればなんだっていいし、アクセラレータを使わずとも自前の計算で充分何とかなるポリゴン数に収まるはずなのでこの点でもあまり意味はないわけです。
そしてDirectDrawだけではできないこと、半透明処理…やねさん、またライブラリ貸してもらいます。

バージョンダウン

えっとですね、描画エンジン、マップ表示の段階が出来上がりました。
結果はというと・・・・
・・・・
・・・・
惨憺たる結果でした。全くお話にもなりません。
ハードウェア的な相性もあるのでしょうが、これではドット絵など使えたものではありません。
とにかく今わかったことは、DirectX8はドット絵の描画にはとても使えたものじゃないということ。
おそらくDirectX9でも10でも同じことでしょう。
将来この問題が改善されるとしても私はもうそんなものに興味はありません。
逆にバージョンを下げてDirectX7を使えばDirectDrawというドット絵に特化したコンポーネントがあります。
そしてDirectDrawはDirect3Dの描画先として使うこともできます。
バージョンを落として不自由なことはありません。
プレイできる層が増え、更に表現力まで高まるのなら、それを使わない手はないでしょう。

ちなみに画像はDirect3D8で小さなドット絵を貼り付けたポリゴンを等倍でレンダリングした結果を拡大表示させたものです。
小さくレンダリングした時点でドットが潰れ、更に拡大表示する段階で画像が大きく歪んでしまっています。

1136812679.png

再利用性

もう言ったと思いますが、Bomber丸Worldのグラフィックは2Dに見せかけた3Dにしています。
そして今日作ったのはテクスチャ管理システム。
今回はRPGである都合上、画像をふんだんに使いますので、その画像を効率よく処理する仕組みが必要というわけです。
3Dで作るということで画像の表示はポリゴンにテクスチャを貼って表示させるわけですが、RPGのマップだと同じマップチップをいろんなところで表示したり、戦闘画面では同じ種類の敵が複数登場したりと、同じ画像が複数の場所で使われるケースが多いため、使う数だけ同じ画像のテクスチャを作っていては無駄であり、特にマップチップだと同じテクスチャ(それも結構でかいやつ)が何百枚と作られて、まともに動かせる状態ではなくなってしまいます。
だから、同じ画像のテクスチャを作ろうとしたときは前に作ったテクスチャを代わりに使うようにするわけですが、RPGでは場面の切り替わりと共にさっきまで沢山使われていた画像が今度は全く使われなくなるというケースもあり、逆にもう使われなくなった画像はどんどん破棄していく仕組みが必要なわけです。
ちなみにふにゃさんでは画像再利用をマップキャラ(ふにゃやギヤバネなど)に使っていたのですが、画像のサイズは高が知れているし、どのキャラもその後近いうちに再び使われる可能性が高いということで、読み込み時間を減らすため、破棄するのは絶対に使われなくなってから、つまり、ゲーム全体の終了時のみになっていたりします。
話を戻しますと、幸いにしてDirectXの全てのインターフェースはそのための参照カウントシステムを持っているため、ファイル名とテクスチャを関連付けてリスト(実際にはSTLのmap)に記憶しておき、あるファイルのテクスチャを使うときはリストからファイル名に対応するテクスチャを探し出し、見つかったらテクスチャの参照カウントを1増やしてからそのポインタを確保しておき、見つからなかったらテクスチャを作成した上でリストに追加、逆に使い終わったときは必ずリストにあるはずのテクスチャを探し出して参照カウントを1減らし、0になったらテクスチャを破棄(これは自動で行われる)した上で、リストからもテクスチャの情報を削除。
これで、常に必要な分のテクスチャだけがメモリ上に置いてあるということになります。
もしかしたらこういうことはDirectXが勝手にやってくれてて自分は無駄なことをやっているだけという可能性もありますが、まあそれにしても無駄はリスクに比べればそう大きなものでもないのでよしとしましょう。

人物を描いてみた

以前の日記に書いたドットを潰さないレンダリング方法、あれ別に3Dでなくとも2Dでも高さ成分を真正面から見た高さの8割になるように、奥行きを真上から見た奥行きの6割になるようにドット絵で描けば縦・横・高さの比率が正しいドット絵として立派に成立するじゃないですか!
というわけでそういう描き方をしたマップチップでマップを描くプログラムを作ろうとしていたのですが何をどう間違えたのかマップチップを作っているうちにマップ上に配置する人物キャラを描きだしてしまいました。
元々人物のデッサンなんて小学校以来やってはいないしましてや37度から直立姿勢の人を描くなんてことは一度もなかったので、とりあえず理論的に正しい人物を描こうと身長別-男女のボディサイズ平均を見て数値を見ながら描いていったのですがどうにも日本人の体は細長すぎるようだったので、今度はメタセコイアに入っていた人物の3Dモデルを37度の角度から見下ろした画像から輪郭抽出してそれを参考にしながら描いてみたら結構自然な感じになりました。
しかし謎の男のつもりで描いていたのですが、暗いね。

1136645637.gif

また作り直すぜ!!

というわけで。はい。以前のプロジェクトは完全に破棄しました。
Bomber丸Worldはまた最初から作り直しですが今度こそは最後まで行きますよ。
何とか今までのゲーム作りなどで、ずぼらで面倒くさがり屋の私にでも完成させることができるプログラミング手法はある程度修得したつもりです。
だけどDirectXの講座サイト見ながらやってたら早くも挫折気味だぜい!
とりあえず紹介ページも更新してます。描画手順など。
そういえばマップチップの大きさなんかも決めたりしたです。
今回決めた描画手順に適合してなおかつグラフィックが破綻しない大きさを考えると幅25x奥行き15x高さ20というマップチップのサイズが計算されたデス。
見下ろし角度およそ37度でございます。

そうそう、ミディビに関するアンケート作りました。
ミディビの「実際に使ってみる(テスト中)」から動作確認アンケートに答えてください。
ほんとこれ切実です。実態を把握できないと進めるに進められません。

音が鳴らない

ミディビさっぱりうまくいきませんよ。
どうして全てが正常の値を示しているのに音だけが鳴らないんでしょう。
同じことを別の方法で実現するコードで書いてみても結局はやっていることは同じなので結果も同じだし、よもやと思ってこれを作り始めた頃に参考にしたアプレットを開いてみたら今はならないんですよ。
ということはブラウザ側の問題、Javaのアップデートがいけなかったのでしょうか。
しかしだからといってJavaをダウングレードしろとユーザーに求めるわけにもいかないし、ここまで来て開発を中止する気もさらさらないし、どうすればよいのでしょうか。
一応、演奏機能を使えば音は鳴る、つまり、Sequencerは正常に音を出してくれるので、最悪一音出すだけのSequenceを作ってSequencerに渡せばよいのですがこれはあくまで最後の手段として取っておきたいのです。
もっとも、過去の経験からするとあっけなく最後の手段に打って出ることになりそうですが。

どうにもふにゃさんのエディタが使いにくいようだったのでまずちらつきをなくす方面で改良を加えてみました。
それとやっぱり、ゲーム内のキャラの中には、ギヤバネのようにあたれば吹っ飛ぶというわかりやすいものだけでなく温度変化ゾーンなどの特殊なものもあったり、キャラ同士の相性などもあったりと、必ずしも感覚的にわかりやすいものばかりではないので、ヘルプがある程度必要そうな気がしてきました。

Bomber丸Worldのグラフィック、要するに3Dに見えなきゃいいんだ、ってことで、ドットを潰さない3Dのレンダリング方法を考えています。

1136473028.png

やっぱり2D

弟によると、最近はフリーゲームでも猫も杓子も3Dで、よほどうまくない限り3Dは売りにはならず、むしろ下手な3D化はかえって悪印象だそうです。
実を言うと2Dでもっとも難しいと考えていたのは主人公たちのキャラクターデザインだったのですが、16ドットだとか32ドットだとか、2^nの数字に無駄にこだわることさえなければそれなりに描けそうな気がしてきました。
他には扉などが難しそうな気もするけど何とかしましょう。
だけどドット絵にするにしても描画には3Dを使いますよ。

ドラクエ8では犬が6人目の賢者を殺害。
もうここまで来ると賢者が皆殺しにされてラスボスが復活することは見えてしまっているのでなんだか張り合いがなくなっています。
スカウトモンスターもアポロンはおろかドランゴやでんすけすらも超えるものがおらずさびしい限りです。

ドルマゲスに勝った

Bomber丸World、当初2Dのドット絵で作る予定でしたが3Dで作ることにしました。
理由は、ドット絵を用意するのが難しそうだったことと、頭の中で浮かんでいるゲームのシーンは横から見たアングルだったり斜めから見たアングルだったりして、そのシーンをうまく俯瞰視点に直す自信がなかったからです。
それと、ドット絵を既に作ってしまった部分もあったり、場所や状況によって表現方法を変えてみようというのもあり、ドット絵レンダラーも使えたりするんじゃないかな、と思ったりしています。

今日悲しいドルちゃんとの決着が付きました。今回も例によって隠しています。
前回の教訓もあるので今回は魔力を惜しまず使ってドルちゃん部屋へ。
ドルちゃん戦も前回の教訓から余裕のあるうちに回復、特にあのあとベホマラーを覚えたのでククールは毎ターンベホマラーを唱えるくらいの勢いで回復させました。
そして今回の最大のポイントは、最初のターンにいきなり例のモンスターチーム召喚。
するとあっという間に分裂したドルマゲスCを撃破。
バトルロードBランクに歯が立たなかったとはいえモンスターチーム、やはり桁違いの強さです。
ドルちゃんを二人に減らしたところでモンスターチーム退場。
ちょっと回復を急ぎすぎのような気がしたので作戦変更し、ククールは2ターンに1回の回復に。
これで無事ドルマゲスを倒したのですがこの後先ほどの作戦変更に助けられることになります。
そう、ドルちゃんは変身するのです!ラスボスでもないくせに!!
変身ドルちゃんは分身こそしないものの攻撃力が二倍以上になっていますし1ターン2~3回行動の上無駄に笑ってターン消費しないのでかなりの強敵になっています。
それと、重要イベントボスなのでやたらとでかく表示されます。まさにどアップです。
今回の戦いもモンスターチームが使えるので早速召喚。
さすがにここまで来るとモンスターチームでも強烈な打撃を与えにくくはなっていますがずいぶんと助けにはなりました。
いてつく波動による呪文&テンションリセットがあるしアポロン戦ほどシビアな戦いでもないので仲間には作戦を与えてAI戦闘にします。
作戦はククールは命大事に、ほかはバイキルトやベホイミを期待してバッチリ頑張れ、です。
連続攻撃により時々仲間が倒れますがククール+ハーゴン(何度も言うが主人公につけた名だ)のザオラルで蘇生。
ゼシカのメラミとヤンガスの攻撃が主戦力なので倒れたらすぐに蘇生です。
そして回復の要のククールが倒れたのですが戦いは終盤になってMPも少ないし今は生き返らせる余裕がないと判断したため放置。
回復をハーゴンのベホマズンとヤンガスのベホイミ(ベホマズンまでの時間稼ぎ)に絞ります。
この戦法に切り替えたおかげでゼシカが1ターン長生きしました。つまりゼシカは死にました。
これでハーゴンとヤンガスの二人きり。奇しくも冒険を始めた頃のパーティに戻りました。
しかしこの時点で戦況は既に絶望的でした。
ヤンガスにかかった強化呪文は全てかき消され、ハーゴンは既にベホマズンを唱えるだけの魔力が残っていなく、しかし回復しなければ全滅は免れない状況でした。
つまり、ベホマでどちらかを回復し、生き延びさせるしかなかったのです。
私はヤンガスに全てを託しました。
ハーゴンが生き延びたとして毎ターンベホマを唱えてMP切れを起こして全滅するのが関の山でしょうし、運良くヤンガスを助けたターンを生き延びれば自分も回復する見込みがあったのです。
ハーゴンは、ベホマを唱えた後、あっけなく死にました。あとはヤンガスが死ぬまで叩くのみです。遺言で作戦をガンガンいこうぜにしておきました。

ドルちゃんとヤンちゃんの差しの勝負、狂った道化師とむさい山賊のデスマッチ、軍配は山賊ヤンガスに上がりました。
その後何の説明もなく全員生き返り、ゼシカがドルマゲスのもっていた杖を手にとって…おっと、この先もまた隠すことにします。
まあ、予想が付くと思いますが、ゼシカもドルちゃん化します。
ドルちゃんの後を継ぎ関所を破壊し賢者を殺しに行くゼシカ、そんなゼシカを戦って止めるのですがドルちゃんと比べてはるかに弱いです。
ベギラゴンやマヒャドも形ばかりで威力がありませんし(本来のゼシカならテンションをためて一撃必殺級のイオラを使うはずだが)、せっかくの1ターン2回行動もどうしようもない雑魚のシャドーを呼ぶのに費やしてしまい、HPが高まっている以外は事実上本来のゼシカよりもむしろ劣っています。
そして結界の力によりゼシカが正気に戻った後は今度は犬がドルちゃん化します。

さて、今後は犬を追いかけて北へ行くこととなりますがどうなることやら…。

ドルマゲスに負けた

ドラクエ8やってました。
今日は色々とストーリー的に進展がありまして。
ついに愛しのドルちゃんと直接対決ですよ。
以下ネタバレゆえ隠してます。ブラウザによっては隠れませんが。
まず戦闘が始まるとドルちゃんはいきなり三人に分裂します。
そう、ドルはドルでもドルイドのように!
そういえばスーパーマリオRPGのヤリちゃんも分裂してました。
使う技は無数のムチを出したり瓦を飛ばしてきたりと、独特でありながら迫力のない技ばかりです。
やはり最大の敵らしいかっちょいい攻撃は本当のラスボスのお楽しみでしょうか。
そしてまたダメージも決して大きくはなかったのですが何しろ数が数なので地味に体力が削られてゆき気付けば手遅れです。
最近の魔王の基本技、怪しく光る目もあるので要注意です。
これのせいでベホマズンが間に合わず全滅しました。

あと、全滅しておいてからこんなことを言うのもなんですけど、ダンジョンの奥のボスと戦うときは大抵回復ポイントがあるのですがこれはボス戦のために体力を温存しつつ来た人に対して失礼だと思うのです。
特に今回はゼシカが体力を温存するように行っていたのでぎりぎりまでMPを使わず今まで錬金釜で作っておいた回復アイテムを惜しみなく使ってきていたのでかなり悔しい思いをしました。
あの万能ぐすりさえ残っていれば勝てる可能性が少しでもあったというのに!!
あと、ゼシカのインテリハットを賢者のローブにしてしまったのは大失敗でした。
そのおかげでククールが不必要に強くなり、ゼシカが二段階ぐらい前の弱い防具を身に付けなければならなくなったのです。
ククールめ。最近強くなりすぎだ。

あけましておメテオス

ふにゃさん完成しました。
最後の最後で色々バグが出てきて大変でした。
ステージは元々一日で作り上げるつもりだったのでその点は大丈夫です。

今年最初にやったゲームはメテオスです。
グラビトールで連戦連敗。ウララララ。

<2006年02月 2005年12月>