Admin * New entry * Up load * All archives 

C++&DirectXでプチプチゲーム制作をしています。文章力?気合で乗り越えるさ。

 

旧 ゲーム的な何か。

04«1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.»05
このページの記事一覧

    

Posted on --:--:-- «edit»

Category:スポンサー広告

スポンサーサイト 

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

tb: --     com: --

go page top

Posted on 01:39:16 «edit»

Category:プログラミングとか

超簡易スクリプトを作る 

こんにちは。相変わらずSignalです。つい先日、こんな本を読みました。

脳はなぜ「心」を作ったのか

今まで「「私は私である」という意識はどこからくるのだろう?」という疑問を持ちつつ過ごしてきたのですが、意識は私たちの脳が生み出した「実感」にすぎないという意見に感銘を受けました。
クールに工学的な視点から「心」を解き明かそうとした本で、今までの中で最も説得力のある説明をされていました。こういう分野に興味のある方は是非一度読んでみてはいかがでしょうか。

それでは今日の本題ですが、久しぶりに具体的なコードについて考えてみようと思います。
お題は「プログラマ以外が扱えるスクリプトを自作する」です。

まず、ゲーム内のあるファイル(例えばキャラクターの3Dモデル)を使ってそれを表示する場合、
①3Dモデルを入れる変数を用意する
②3Dモデルのデータをその変数にロードする
③それをそのまままたはオブジェクト経由
というステップを踏む必要があります。ただしこの方法の場合、プログラム側で読み込むファイルを逐一指定し、すこし手を加えるだけでもコンパイルという大きな手間が生じてしまいます。

今までは素量も少なかったのでそのままだったのですが、今回モデリング側から「サーキット上に自由にオブジェクトを配置したい」という要望が出たので、
「プログラム担当以外でも自由に読み込むファイルを指定し、それを描画出来るようなプログラムを作る」
ことにしました。

とりあえず完成したものから考えるのが手っ取り早いですね、文法はこんな感じ↓
・ファイル読込部
Model\\,boxtest.x
Model\\,testfloor04.x

・描画スクリプト部
"boxtest.x", 10.0f, 600.0f, 3000.0f, -1500.0f, 0.0f, 0.0f, 0.0f

ファイル読込部は①パス②ファイル名の2段構成。
描画スクリプト部は①ファイル名②スケール(モデルの表示倍率)③XYZ座標④XYZ軸回転の4段構成となっています。
基本的な構造は同じで、要素ごとをカンマで区切り、改行で1単位になります。
今思うとかなり危うい構造ではあるのですが、とりあえずこれで話を進めます。

これをプログラムに読み込むにあたって、まずファイルの中身そのものを取得する必要があります。
方法はいくらでもあると思うのですが、今回はifstreamを使いました。
ifstreamにはGetLine関数という命令があるので、それを使って改行までの中身を一気に取り出しています。

↓描画スクリプト読込のコードはこんな感じ
HRESULT CEasyDrawScript::LoadScript()
{
char str[128], buf[8][30];
char *c, *p;

//3Dモデルファイルの読み込み
ifstream ifs(scriptName);

if(!ifs.is_open()){
MessageBox( NULL, "スクリプトの読み込みに失敗しました。", "Error", MB_OK );
return (E_FAIL);
}

while(ifs.getline(str, sizeof(str), '\n')){
c = str;
for(int i = 0;i < 8;i++){
memset(buf[i], 0, sizeof(buf[i]));
p = buf[i];
while(*c != ',' && *c !='\0'){
if(*c != ' '){
*p = *c;
p++;
}
c++;
}
c++;
}

objList.push_back(CEasyScriptObj(
buf[0], //ファイル名
atof(buf[1]), //スケール
D3DXVECTOR3(atof(buf[2]), atof(buf[3]), atof(buf[4])), //位置
D3DXVECTOR3(atof(buf[5]), atof(buf[6]), atof(buf[7]))));
}

return (S_OK);

}

先ほど4要素といいましたがX,Y,Zは独立なので8個の文字列を用意。
strにまとめて読み込んだ文字列を格納、cに加工前の文字列へのポインタ、pに各要素の文字列を入れるポインタを入れて、順次読み込んでいきます。

カンマか文字列の終点がくれば次の要素へ、その中では空白文字を外す処理を行っています。要らない文字を読み込まないようにすれば必要な部分だけを取り出せますね。

そして読み込んだ各要素は数字なら数字に変換されてvector配列に加えられます。
後はファイル名から描画するモデルを検索して決まった位置に描画出来るようになります。万々歳。

もっともまだエラー処理を加えないといけない部分があったりしますね。
ただ安易に加えるとどうしても汚くなってしまう。うまい方法があるんでしょうか。
まだまだ経験不足の所は多々あります。

大分長くなってしまったので今日はこの辺で。ではでは。

テーマ: プログラミング

ジャンル: コンピュータ

 

茂木健一郎とかも似たようなこと言ってましたね。
心=脳によって作られたもの
っていう一元的な考え方は、
宗教によってはダメらしいデス。

  by handyman

Comment-WRITES

go page top

 この記事に対するコメント 

茂木健一郎とかも似たようなこと言ってましたね。
心=脳によって作られたもの
っていう一元的な考え方は、
宗教によってはダメらしいデス。

2011/02/17 00:41 | URL | handyman #fC.Rinwo  edit

go page top

 コメント投稿 
Secret

go page top

 トラックバック 
トラックバックURL
→http://frontiersman.blog61.fc2.com/tb.php/206-9357579d
この記事にトラックバックする(FC2ブログユーザー)

go page top

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