3DアクションRPGの製作

1J 丹野治門(亀太郎)
1J 唐澤雄気(PIKO)

第一章 「ゲームの計画と仕様」

[1]はじめに
3DのアクションRPGを作る予定です。
メンバーはいまんとこ3人です。


[2]内容(以下の内容はあくまで理想であり完全に実現される可能性は極めて低
い)
<システム>
成長システムは大学の単位制を基調とし、既存のRPGの優れたシステムを包括
した斬新なものを作ろうと思っています。
(優れた成長システムの例:FF7のマテリアシステム)
戦闘システムは聖剣伝説2と似たようなものになると思いますが、よりアクショ
ン性と戦略性を高めたものにします。

<世界観>
文明レベルは我々の住んでいる世界でいうと第一次大戦前後ぐらいでしょうか。
魔法を使える連中が組織をつくっており、巨大な権力を持っている世界です。
超古代文明も出て来ます。お決まりですね(笑)

<ストーリー>
愛と感動のストーリーになる予定です、当然ギャグもあります。
<登場人物>
いろいろ出て来ます。亀とかも。


[3]製作方法
<開発に使うツール>
GAME本体→VisualC++
各種ツール類→BorlandC++Builder
(マップ製作、キャラアニメーション製作、イベント配置)
モデリング→メタセコイア、六角大王


[4]プログラミングについて
<DirectX8を使用>
三次元処理→Direct3D
効果音(WAVE)→DirectSound
BGM(MIDI)→DirectMusic
ジョイパッド制御→DirectInput
(基本的に全部自前で書きます)

<キャラクタ制御/★完成済>
階層構造とアニメーションを作成するツールを作りました。Direct3D標準Xファイルを読
み込み、階層構造を作れます。後々はXファイルを使用せず、独自のフォーマットを作
る予定です。

<内部マップ制御/★完成済>
人工物マップを作るツールです。あらゆる平面に対応できます。(たぶん)
制御アルゴリズムには一次変換(複素数)や平面方程式など使っています。

<外部マップ制御/☆未完成>
フィールドマップを作るツールです。なめらかの地面を表現します。
三次曲線などを用いて制御を行います。

<イベント制御/☆未完成>
おそらく作るのが最も困難であり、これの出来具合でプロジェクトが成功する
か否か決まります。このツールの役目はマップ上にイベントを配置していくこ
とです(RPGツクールのイベント配置のようなものです)。個々のイベントは簡
単なスクリプトによって制御されます。
例えば
Message "Hello"
move 10 30 10
で、Helloと表示し(10,30,10)に移動するとか。

<その他>
他にも戦闘システムなどいろいろ作らなくてはなりません。
大変です。

第二章 「DirectX8は偉大!」

 ページが少し(というかかなり)余っているので、DirectXの話でもしようかと思います。
DirectXというのはWindows上で高速にゲームを動かすための
API郡(アプリケーションプログラミングインターフェース)です。
まあ、これを使えば誰でもご家庭で3Dゲームやらなにやらを作れてしまうわけです。
(いい時代になったものですね!)Windowsが普及しているのはたぶんDirectXのおかげです。
で、そのDirectXですがGameSDK(DirectX1)として誕生したときから新しい機能を追加していき、
どんどんバージョンアップを重ねています。現在のバージョンは9です。
そろそろファイナルファンタジーにも追いつくかな?といったところです。
現在僕が使っているバージョンは8なので、
DirectX8についての考察(感想)をこれから書いていこうと思います。
 
 僕は最初はDirectX8はあまり好きではありませんでした。
何故かと言うとDirectX7までのものとは全く違っていたからです。
DirectDrawという2D描画機能は廃止されDirect3Dが台頭し、
DirectSoundとDirectMusicが統合されてDirectAudioになったりと、わけのわからない事態になっていたのです。
(でもよく見たらDirectSound8なんてインターフェースもあったり・・ )
しかもカラーキー(抜き色処理)までできなくなっており、その代わりにαブレンディングを用いて
カラーキーを実装していたのです。
・・と、まあとにかくなんか嫌なのでDirectX8は使わないでずっとDirectX7を使っていました。

 初めてDirectX8を使ったのは新しいパソコンを組んで、
DirectX8に対応してるビデオカードを買ったときです。
せっかくDirectX8対応なんだからちょっと試しにやってみるかなと思い
プログラムを組んでみたところ、実はとても素晴らしいものだ
ということがだんだんとわかってきました。
なんといってもまず初期化が楽です。
DirectX7以前はビデオドライバの列挙でコールバック関数を使ったりとかなり面倒ですが、
8ではそれが一切必要ありません。
適当にちょこちょこっとコードを書けばそれで初期化は終わりです。
しかしDirectX8の本当の素晴らしさは、こんなことではありません。
真の素晴らしさは整備されたD3DXライブラリにあると僕は思います。

 D3DXは強力なライブラリです。Xファイルの読み込み、テクスチャの読み込みなどはもちろんのこと
三次元処理に必要なあらゆる算術関数および算術のための構造体を持っています。
ベクトル演算、マトリクスの計算、平面方程式、果てにはクオータニオンまで全てが完備されています。
確かDirectX7にも似たようなライブラリがありましたが、
DirectXのインターフェース郡とは別パックでオマケのような感じでした。
しかしDirectX8では正式にDirectXの一員となっており、当然ながらDirect3Dとの相性は抜群です。

 しかしD3DXにも危険なところがあります。D3DXはほとんどの算術処理をしてくれますが、
プログラマは中でどのような処理が行われているかは知っておく必要があると思うのです。
たとえば、平面方程式を導き出すことについて考えてみましょう。
D3DXでは平面方程式の各係数a,b,c,dを決定する関数をふたつ持っています。
仮にこれを関数A、関数Bとしましょう。関数Aは3つの三次元ベクトル(つまり3つの頂点)から
平面方程式を作ります。
一方、関数Bはひとつの三次元ベクトルとひとつの法線ベクトルから平面方程式を作ります。
さて、どちらの方が処理が速いのしょうか?----おそらく関数Bのほうが速いでしょう。
線形代数で行列やベクトルの計算をやっている方ならすぐにわかるかもしれませんが、
3頂点から平面方程式を出すのはかなり面倒です。
(計算コストが高い!)一方、関数Bでは法線ベクトルが与えられています。
実は平面方程式の係数a,b,cはN=(a,b,c)とするとNはこの平面の法線ベクトルとなっているのです。
これでどう考えても関数Bのほうが関数Aより計算が圧倒的に速いというのがわかっていただけたと思います。
このように内部でどのような処理が行われているか把握していれば、
平面方程式を算出する際にあらかじめ法線ベクトルは求めておいて、
リアルタイムに計算するのは関数Bで行ったほうが良いなどという判断ができます。
このようなことをよく知らないでD3DXの関数を乱用すれば大幅に
プログラムのパフォーマンスが落ちてしまう可能性がありますね。
(まあ、でも実際のところはD3DXライブラリが内部でどんな処理をしているのかは正確にはわかりません)

 というわけで僕は結局何がいいたいかというと、「DirectX8とD3DXライブラリは素晴らしい!!」
ということなのです。
あとはDirectX8の素晴らしいところといえば頂点シェーダとピクセルシェーダなるものがあるらしいですが、
僕は使ったことが無いのでわかりません。
少しアセンブラの知識がいるようなのでよくわからないからやりません(笑)
DirectX9ではもっと簡単に記述できるようになったらしいので今度暇があったら挑戦したいなぁと思います。(完)