ページ 1 / 1
設定データを途中から読み込みたい
Posted: 2011年12月06日(火) 08:44
by 史上最悪のデスペナ
例えばこんなNPC設定用データがあったとします。本来はバイナリデータとして保存するつもりです
コード:
1 134 史上最悪のデスペナ 135.0f 0.0f 43.5f
134 途中から読 0.0f 13.4f 2.2f
167 qazwsxed 3.5f 2.1f 4.2f
2 115 くぁwせdrftgyふじこlp 22.1f 9.9f 66.6f
これを、読み込みたいのですが自キャラの構造体中に
int Type;
int Number;
というものがあるとき、
(Type = 1) && (Number = 134)のとき「史上最悪のデスペナ」と「途中から読」が、
(Type = 1) && (Number = 167)のとき「qazwsxed」が、
(Type = 2) && (Number = 115)のとき「くぁwせdrftgyふじこlp」が読み込まれるようにしたいのですがどうしたらいいでしょうか?
最初は別に作成した変数にいっぺんに全部読み込んじゃってそこから該当するのを目的とする変数にコピーしようかと思ったのですが
もっといい方法を教えてください。
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 09:01
by beatle
テキストファイルだと1行のバイト数が変わりますからね。先頭から読んで行くしかないのではないでしょうか。
バイナリデータで1行分のバイト数が固定されているんだったら、そのバイト数だけどんどんずらしながら検索もできるでしょうけど。
テキストファイルでも、メモリマップドファイルという技術を使えばやりたいことができるかもしれません。
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 09:30
by 史上最悪のデスペナ
beatle さんが書きました:バイナリデータで1行分のバイト数が固定されているんだったら、そのバイト数だけどんどんずらしながら検索もできるでしょうけど。
データの中身の通り、長さの違う文字列が入ってるのでバイト数だけどんどんずらしながら検索が出来ないのではと思ったのですが出来ますか?
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 09:42
by softya(ソフト屋)
チャンク構造と言うデータ構造を取るのがひとつの方法です。
あるいは、文字列を一箇所に固めてファイルの相対位置データとして持つ方法もあります。
ところで、文字列をセーブデータ中に入れるのはあまりよろしくないですが、どうしても文字列で書きだす必要のあるデータですか?
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 09:52
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:ところで、文字列をセーブデータ中に入れるのはあまりよろしくないですが、どうしても文字列で書きだす必要のあるデータですか?
NPCの位置と名前含む属性をデータ化して
キャラ位置に応じて必要なNPCデータを読み込みたいと思ったのです。
チャンク構造はちょっと調べてみます
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 10:41
by softya(ソフト屋)
>NPCの位置と名前含む属性をデータ化してキャラ位置に応じて必要なNPCデータを読み込みたいと思ったのです。
名前とか厄介なデータはプログラム中のテーブル(構造体配列)にあるのでは?
だとしたらセーブデータに保存しておくべきなのはテーブルのインデックス番号と座標など数値データだけで良いのでは?
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 12:20
by パコネコ
特定の行数をロードする関数でも作成したらいい気もします。
(結局よみこむっちゃ読み込みますが...)
'¥n'とかが出るまでループ的なやつで、
全部読み込むよりはましだとは思いましたが...駄目ですか?
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 12:35
by non
どれくらいのデータ量なのでしょうか?全部読んでも、たいしたことないのでは?
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 17:33
by ISLe
セーブデータじゃなくて、NPCをマップに配置するための設定データなのでは?
部分的に更新するのたいへんでしょ。
Re: セーブデータを途中から読み込みたい
Posted: 2011年12月06日(火) 17:38
by naohiro19
boost::serializationを使う方法があります(
参照)。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 08:40
by 史上最悪のデスペナ
パコネコ さんが書きました:特定の行数をロードする関数でも作成したらいい気もします。
(結局よみこむっちゃ読み込みますが...)
'¥n'とかが出るまでループ的なやつで
バイナリデータなので¥nって存在しないと思ったのですが・・・・・・
non さんが書きました:どれくらいのデータ量なのでしょうか?全部読んでも、たいしたことないのでは?
推定最低量は100ステージ*3箇所*5人分、つまり1500人分のデータですね。それのステージ値、箇所識別番号、名前、3次元座標、その他(←まだ未定)
となる予定です。
ISLe さんが書きました:セーブデータじゃなくて、NPCをマップに配置するための設定データなのでは?
確かにそうですね。本文中では全部データとちゃんと述べてますが良く見たらトピック名が「セーブデータ」でした・・・・orz
設定データの間違いです。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 08:50
by softya(ソフト屋)
実際に1500人分もメンテ出来るかどうかは別として、1500x256バイトとしても375kB程度です。全部読み込めるのでは?
あとメンテナンス性を考えて設定データはexcel(openofficeでも可)出力のcsvなどテキストファイルで作られたほうが良いでしょう。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 08:56
by non
後で、バイナリにするのなら、最初からバイナリで作りましょうよ。
バイナリなら、各レコードを固定長フィールドにした方がアクセスが簡単です。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 09:07
by softya(ソフト屋)
non さんが書きました:後で、バイナリにするのなら、最初からバイナリで作りましょうよ。
バイナリなら、各レコードを固定長フィールドにした方がアクセスが簡単です。
バイナリの変換の手間が最終的にバランス調整時に手間や変換漏れなどにつながるので極力避けたほうが良いと思います。
Excel→csv→ゲームプログラム
としておいたほうがメンテナンス性が高いです。
どうしてもバイナリにしたいなら、[固定長部分] [可変長部分(文字列)] とファイルを2つの構造に分けたほうが良いでしょう。固定長部分から可変長部分(文字列)は、ファイル内相対位置でアクセスできるようにします。この場合はExcelから直接バイナリ出力をするVBAマクロを組んだほうが良いでしょうね。
Excel(VBA)→設定バイナリファイル→ゲームプログラム
となります。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 11:22
by パコネコ
>バイナリデータなので¥nって存在しないと思ったのですが・・・・・・
あーそういえばそうですね...読み込み時にバイナリとして読み込むだけだと思ったので、¥nのこってると思ったのですが、勘違いだったようですね。
(バイナリで最後にデータいじったのっていつだっけ?ってぐらい忘れているので、多分関係ない事言ってるかもです...)
すいませんでした。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 11:25
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:Excel→csv→ゲームプログラム
としておいたほうがメンテナンス性が高いです。
分かりました。それで、いっぺんに読み込んじゃうんですね?
みなさんありがとうございました
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 11:31
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:softya(ソフト屋) さんが書きました:Excel→csv→ゲームプログラム
としておいたほうがメンテナンス性が高いです。
分かりました。それで、いっぺんに読み込んじゃうんですね?
みなさんありがとうございました
そういう結論で良いのでしょうか?
あとで思いつきましたが、イベントやNPCや宝箱などなどのデータをまとめて設定するマップツールが必要な気がします。
名前やパラメータはなどはcsv入力で良いでしょうが。
Re: 設定データを途中から読み込みたい
Posted: 2011年12月07日(水) 17:11
by ISLe
わたしは
csv→バイナリ→ゲームプログラム
という作り方しますけど。
たいていPerlスクリプトでバイナリに変換します。
データ型とバイト長を列挙した設定ファイルといっしょに食わせて変換するような汎用ツールを作っておくとあとあと楽ができるかもしれません。