スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

階層構造 生成プログラム ~公開~

以前、XファイルのFrameの階層構造を生成するプログラムを作った
と言ったのですが、

プログラムは公開してませんでした。
プログラムに改善の余地がある、と思った為)

で、現在 プログラムを改良して以前より見やすくなったので
公開します。

-------------------------------------------------------
話がそれますが、ゲーム製作の計画・および進捗具合について。
現在は【2】の段階です。

【1】Factoryクラスの生成
【2】Xファイル読み込みクラスの改良   ←Now!
【3】3Dモデルを、境界球生成クラスと組み合わせて表示。
【4】境界球を使って、3Dモデルの当たり判定を実装。


※階層構造生成クラスも、【2】の段階に含まれています。
-------------------------------------------------------


※ヘッダファイルなどを分割すると面倒なので(アップロード的に)
全て、mein関数があるcppファイルに記述してます。
(コードは100行程度なので、問題ないでしょう。)


プログラムの概要

下記の階層構造を読み取る場合は、
FrameA {
FrameB {
FrameC {
}
FrameD {
}
}
FrameE{
}

}


プログラム中では下記のようにします。
	Hierarchy h;

h.AddFrame("FrameA");
h.AddFrame("FrameB");
h.AddFrame("FrameC");
h.AddBracket();
h.AddFrame("FrameD");
h.AddBracket();
h.AddBracket();
h.AddFrame("FrameE");
h.AddBracket();
h.AddBracket();

Frame(フレーム)があれば、  AddFrame(char* Name);
閉じカッコがあれば、 AddBracket(void);
を呼び出すようにすればOKです。

※Xファイルの階層構造を生成する場合は、Xファイル読み込みクラスも作って、
"Frame"を読みこんだらAddFrame(char* Name);を呼ぶ、 みたいにします。

今回は Xファイル読み込みクラスは省略しているので、
直接main関数に記述してます。


階層構造を表示したい場合は、 DispHierarchy(void);を呼び出します。
//前略
h.DispHierarchy();
//後略
この関数を呼べば、内部でなんやかんやして階層構造が表示されます。

【参考画像】
階層構造
↑階層構造を表示してくれている図。




需要があるのかはさっぱり分かりませんが、
vector配列で階層構造を生成したい状況であれば使ってみて下さい。

【ソースコード】text.txt
※バグ、およびその他 疑問点などがあればお知らせください。
とりあえず、テキトーな階層構造を入力した場合の動作は保証できません。


追記:一応動きますが、想定外の事にも耐えられるように改良したいと思います。
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

 突っ込みどころはいろいろあるんですけど、一番は _FRAME構造体の nemeメンバの扱い……名前の保存の仕方がでしょうか。
 char*で受けるのはいいとしても、AddFrameの引数のポインタそのままを持つと、スタックに配置された文字列を受け取った時に悲惨なことになります。

 まぁ元々の用途である Xファイル解析であれば、多分元の Xファイル内の文字列しか指定しないでしょうから、問題はないだろうとは思いますが。

 疑問といえば、何故 _FRAMEクラスを態々 typedefしているのでしょうか?

No title

うわー・・・ 試してみたら
色々と問題が発生しましたv-404

・配列で渡した後、Frameの名前を変えられる
---------------------------------
char ch2[6] = "aiueo";
h.AddFrame(ch2);
ch2[4] = '5';
---------------------------------

・char型のアドレスを渡すと、Frame名が無茶苦茶になる。
---------------------------
char ch = 'a';
h.AddFrame(&ch);
---------------------------
※自分の開発環境では"aフフフフ・┌h・!!"となりました。
メモリの先頭アドレスからナル文字までを文字列として扱うので当然ですね。
ナル文字が無いと、どう認識されるか不明。


色々ありますが、
外部で用意されたアドレスに対してポインタで刺してるから駄目なんですよね。
private属性の意味が皆無です。
(クラスの中に隠蔽する形で保持しておかないと)

STLのstring型だけを引数にとるようにすれば、
とりあえず上記の問題は起こらなくなるかなと。

typedefについては、普通に要らないですね。
C言語を学習した時に、
「typedefを使えば struct ×× という冗長な記述を回避できる!」
というのを参考書で見て、そのまま使ってました。
(まぁ、それでも使い方がおかしかった。)

ともかく、C++では タグ名がそのまま型名になるので、
typedefは全く要らなかったですv-292

>char型のアドレスを渡すと
 さすがにこれは考慮外ですね。

>STLのstring型だけを引数にとるようにすれば
 メンバも std::stringなどにしておくといいでしょうね。

>typedef
>まぁ、それでも使い方がおかしかった
 tpyedefそのものはまぁいいんですけどね。無名じゃないですし。
 強いて言うなら先頭にアンダーバーというのが拙かったです。

No title

アンダーバーは、 あまり適切ではなかったですねv-292
(今回の場合typedefは、無くても問題ないので
typedefを削除して、 直接 構造体の名前を記述するように変更しようと思います)

あと、stringに関してですが、 メンバの方もstd::stringに変更しておこうと思いますv-411
(自分で 文字数+ナル文字分 newをして~ という方式でも良いのですが、
素直にSTLを使うことにします。)

ありがとうございますv-290
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。