1人でゲームが作れるように修行します。2 (487レス)
1-

84
(2): STG 2010/09/16(木)03:35 ID:YtfF1rT+(1) AAS
俺はずっとモデリング勉強&練習…
85
(1): 2010/09/16(木)03:50 ID:OhUUY93b(2/2) AAS
>>84
ガンガレ超ガンガレ
俺もそろそろ頑張ってみるか…
86: SGGK ◆6pZCoAtaxk 2010/09/16(木)23:40 ID:62n4CZRN(1) AAS
>>83
自分はこの板のおかげでゲーム作りへの挑戦は約3年1ヶ月程続いているけど、あまり進んでいないかもしれません。が…頑張ります!。
>>84>>85
お互い頑張りましょ〜!期待してます。
87
(3): SGGK ◆6pZCoAtaxk 2010/09/17(金)00:11 ID:iwt7bbkw(1) AAS
ベクトルの構造体を宣言・定義したから、ボールや選手などのオブジェクトの
座標その他のメンバ変数を初期化するときには、例えば初期化関数の内部で
オブジェクト.x=848;
オブジェクト.y=544;
オブジェクト.z=0;
としていたのを
オブジェクト.構造体変数名 = {848、544、0};
にできるのではと期待して書いてみるとエラーになる。
略)\source\ballcontrol.cpp(45) : error C2059: 構文エラー : '{'
略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '{' の前にありません。
略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '}' の前にありません。

これと同じようなエラーをクラスのオブジェクトでやった経験を思い出し、
オブジェクト.構造体変数名.x=848;
オブジェクト.構造体変数名.y=544;
オブジェクト.構造体変数名.z=0;
と書いたらエラーは出なくなった。
これだけならまだしも関数の引数にも構造体を使おうとしているので、
これもエラーになったらどうしようかと思いつつ、動作している事を優先して作業を進め、 現在のバグは274個。
ネットで調べると自分では構造体を書いたつもりでいても、Cの構造体とC++の構造体には違いがあるらしくて、
自分が見たサイトの説明によれば、

実は、構造体はメンバがデフォルトで公開されているクラスである。
つまり、
"stuct X{" = "class X{ public :"
となる。クラスと構造体の差異はそれだけである。

との事。
Cで書いたベクトルの記事を本で見て、それを今まで書いてたC++のソースに
使おうとしたから、自分の気付かない理由で上手くいってない感じ。
まずは今のままで進めてみて関数にベクトル構造体を引数にしたところでも
問題が出るようなら、また考え直すつもり。
88
(1): 2010/09/17(金)02:15 ID:zNJRouQ+(1) AAS
>>87
見方を変えると「Cの構造体に関数も書けるようにしたものがC++の構造体」とも言えると思う
Cの構造体で出来ることはC++でもそっくりそのまま書けると思うんだけどね

>自分の気付かない理由で上手くいってない感じ。
バグに関して絶対こうだとは言えないが、CとC++の違いが原因ではないような気がするなー
89
(1): 2010/09/17(金)22:28 ID:pd/LBTti(1/2) AAS
>>87

x、y、zを初期化するコンストラクタを定義されていれば
オブジェクト.構造体変数名 = クラス名(848,544,0);
のような代入ができる。

もしくは、構造体変数をセットするメンバ関数を定義してもいいかも。
90
(2): 2010/09/17(金)22:40 ID:pd/LBTti(2/2) AAS
上の補足

コンストラクタを定義していなければ、
オブジェクト.構造体変数名 = {848,544,0};
のような代入もできる。
91
(1): 2010/09/17(金)23:57 ID:iQtTD6+I(1) AAS
>>90
それは初期化時のみじゃない?

struct vector{
int x,y,z;
};

void main(){
vector a = { 1,2,3 }; //ok
a = { 4,5,6 }; //エラー
}
92
(2): SGGK ◆6pZCoAtaxk 2010/09/18(土)01:00 ID:wU0YURT9(1) AAS
ありがとうございます。今日は調べるだけで終了でした…。
>>88
たしかにバグの原因がCとC++の違いだと思い込んでしまうと他の原因の可能性を見落としやすくなりそうなので気をつけます。
>>89
今のソースではベクトル関係がクラスでなく構造体で表現されていてコンストラクタについてはまだ考えてませんでした。
バグが結局取り切れなかった場合、勉強しなおしてベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>90
コンストラクタの定義はしてないのですが、何故かエラーになってしまうので、
今は以下に書くとりあえず的なやり方でエラーを回避してます。
>>91
「構造体の初期化」で検索したところ、とあるサイトにそのような感じの
「構造体変数の初期化は、変数の宣言時には常に行うことが出来る点に注意しよう。」とあり、これを参考に以下のようにしてます。

ベクトル関係のヘッダファイルで
struct Vector3{float x,y,z;};

あるオブジェクトの初期化用関数の内部では昨日のやり方から少し変更して、

Vector3 a1={848,544,0};
fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1;

と書いてもバグが出ないのでこれでやってみようと思います。
今日は調べただけなので、バグは減ってないけど、全部取れるまで頑張ってみます。
93
(1): 2010/09/18(土)01:45 ID:ZJvrb5gA(1/3) AAS
>>92
>ベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>87は自分で書いててよく分かってないみたいだけど、classとstructは根本的には同じもの

struct Vector3{
Vector3(float x_, float y_, float z_): x(x_), y(y_), z(z_){}
float x,y,z;
};

void main(){
Vector3 a(1,2,3);
cout << a.x << " : " << a.y << " : " << a.z << endl;
a = Vector3(4,5,6);
cout << a.x << " : " << a.y << " : " << a.z << endl;
}
94
(1): 2010/09/18(土)01:56 ID:ZJvrb5gA(2/3) AAS
>>92
>Vector3 a1={848,544,0};
>fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1;
ちょっとこのレスで、代入のコストが気になったんで検証してみた

struct A{
A(){}
A(int x_, int y_, int z_): x(x_), y(y_), z(z_){}
int x,y,z;
};
struct B{
B(){}
B(int x_, int y_, int z_): x(x_), y(y_), z(z_){}
int x,y,z;
void operator=(B &val){
x=val.x; y=val.y; z=val.z;
}
};

AとBの違いはoperator=を使用してるかどうかだけ
A a,b;
a = b;
こんな感じでただ代入するだけの式を、それぞれ100万回ずつ実行
結果は予想外にもBの方が7倍も遅かった(単位はミリ秒)
A 5
B 35

そこで試しに、構造体に「double a[256];」を追加して実行
今度はBは変わらず、Aが極端に遅くなった
A 255
B 36
95
(1): 2010/09/18(土)02:09 ID:ZJvrb5gA(3/3) AAS
最初Bの方が遅かったのは、operator=のオーバーロード
つまり関数オーバーヘッド分の差が出たのだろう

変数を増やすとAが遅くなるのは、ほぼ間違いなくコピーコンストラクタが発生してるからだろう
ここら辺は言語仕様のレベルでBのような代入にしてくれてもいいような気がするなー

ま、結論としてはoperator=は弄らない方が速い
96
(1): SGGK ◆6pZCoAtaxk 2010/09/20(月)00:00 ID:y8zi6Evk(1) AAS
>>93>>94>>95
詳細な解説に感謝します。
自分にはまだ難しすぎるのですが、「c++  構造体の代入 問題点」で検索してみたところ、
以下のHPがこれらを理解するのに参考になり(理解は出来ず雰囲気だけなんとなく自分に伝わったような感じ。)、
リンク先はpdfなので要注意かもしれませんが、
外部リンク[pdf]:ist.ksc.kwansei.ac.jp
の12〜13ページあたりで、C++にはいろいろな種類のコンストラクタがあり、
結果は同じようでもその書き方によっては、コンストラクタが多く呼び出されて処理に時間がかかるらしい。
あと>>94のコンストラクタの書き方が見たことない書き方だったけど、
ちょうど17ページにある説明と似てるので、これかな?と思ってみたりで勉強になりました。

バグの方は、126個まで減少。
97: SGGK ◆6pZCoAtaxk 2010/09/20(月)23:18 ID:L4tJFEVm(1) AAS
今日もあまり作業出来てないけど、バグの残り36個。
98: SGGK ◆6pZCoAtaxk 2010/09/21(火)23:17 ID:48pAG2m3(1) AAS
やっとバグが0個になった。エラーメッセージが0個になったと言う方が正しい表現に近いかもしれない。
しかし、画面でスタート直後にボールに近い選手が通常よりも早いスピードで画面外に出ていくような動きをして、
画面端に到達してそこから動かなくなる問題が出た。
やっぱり出た。エラーメッセージの出ないバグが…。
もしも、>>96のようなコンストラクタがどうのこうのが理由で動かないとなるとやっかいな予感。
自分は>>96はもちろんのこと今までに難しいといったところはなかなか理解が出来てないから…。
99: SGGK ◆6pZCoAtaxk 2010/09/22(水)23:13 ID:gcFU0B9v(1) AAS
バグはまだ取れない。
選手が画面やレーダーに表示されてるという事は、画面の表示範囲を決めてるカメラ関係のところに原因があるという可能性はなさそう。
選手の座標を計算してる箇所を調べる。今書いてる計算式は、説明を省くのでわかりにくいけど、以下のような内容。

fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq));

Application::frametimeの中身が気になったので、printfDx( " frametime = %f \n" , frametime ) ;で調べると、
15.100000と表示された。もう一回やり直すと15.633333と出た。
このframetimeは、dxライブラリのGetNowCount()を毎ループに1回計算し、
ループ前後の差を30回足して、それを30で割った平均値を意味してる。
調べるまで忘れてたけど、GetNowCount()の単位はミリ秒なので、先ほどの式では、1フレームで15ドット近い移動量になっているだろうから、
1秒が約60hzのパソコンだと1秒で1000ドット近く移動するはずなので、昨日の早すぎる移動スピードの原因だけはわかった。
とりあえず、
fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq/1000));
のように書き直したら、選手がほとんど動かないけど、単位の間違いが原因だとわかった。
選手がボールに向かってくれない原因は未解決。
100: SGGK ◆6pZCoAtaxk 2010/09/23(木)21:24 ID:3ixO7vXf(1/2) AAS
選手がボールに向かわないバグが解決した。
選手とボールの距離とそのx、y成分を計算するために座標の引き算をしたが、
選手座標 − ボール座標としてたのが間違い。
ボール座標 − 選手座標が正解。
でも何故かこれでもバグは解消されなかった。
本当の原因は、

違う場所を直していた。

という事だった。
自分のプログラムは移動関数を4種類用意してあり、
1.その場停止
2.マウスに向かう
3.ボールに向かう
4.指定したX、Y座標の位置に向かう
なんだけど、いつからか4番の関数だけ使えば十分だろうと思い、
4の関数にマウス座標やボール座標を渡していた。
でも、そのことを忘れていて、ボールに向かわないバグだから
ボールに向かう関数を直さねばと思い、その関数だけを直していた。
昨日スピードのバグが直ったのは、その時だけたまたまPC画面が小さくてプログラム行が下がっていたのに気付かず4番の関数を書き直していたのだろうと思われる。
ある意味1日で気付けたのは運が良かったのかもしれない…。
101: SGGK ◆6pZCoAtaxk 2010/09/23(木)21:46 ID:3ixO7vXf(2/2) AAS
プログラムにベクトルの表現を取り入れる作業は一区切り付いたけど、
これはあくまで>>65の目標に取り組めるようにするための準備段階なので、
次は画面関係の修正に挑戦する予定。
まだ方法を考えてる段階なので簡単には進みそうにない予感。
少し斜めから見たフィールド画像でプレイできるようにするのが目標だけど、
ネットではパースというキーワードで検索するものの即取り入れ可能な事を書いてるホームページにはまだ出会えていない。
他には動画サイトで昔のサッカーゲームの画像を見て、参考に出来るところが無いか調査中。
102
(3): SGGK ◆6pZCoAtaxk 2010/09/25(土)00:13 ID:Q7QeFJjp(1) AAS
パース、その他いろいろなキーワードで検索したが見つからず。
いますぐどこかの3Dライブラリを理解できるレベルではないのでかなり困った状況。
大体イラスト関係のホームページがよくヒットして消失点という言葉が出てきて、
これを考えればフィールドの形を遠近法的な台形形状に書くことは出来るだろうけど、
例えばその台形のフィールドに奥行きと高さ方向にメッシュを入れる時、何を基準にすればよいのかを詳しく説明してるところを見つけられず、
結局参考にならなかった。奥行きのメッシュは遠くになるにつれて間隔が狭くなると思うけど、それを決定する基準がわからないという意味。
そしてしばらくまた探していると、とあるホームページで人間の目は並行ではなく放射状にものを見ているとの記述があり、
これが参考になりそうなので、方法を考えているところ。
103
(2): 2010/09/25(土)00:26 ID:j8zDlksV(1) AAS
>>102
3Dライブラリを使うのが結局は楽だよ
(描画効率を無視するとして)
フィールドのモデルとプレイヤーのモデルを配置
カメラ位置・方向を決定したら draw 一発
難しい事を考えなくて済む
104
(2): 2010/09/25(土)00:50 ID:Djp6Vs3v(1) AAS
>>102
確かに3Dライブラリを教科書どおりに使えば簡単にできることだけど
敢えて自力で計算してみようというなら
「透視投影変換」、「同次座標表現」で検索するといいかも。
105: SGGK ◆6pZCoAtaxk 2010/09/26(日)01:06 ID:CCDwSOVy(1) AAS
ありがとうございます。ちょっと考えてみます。
>>103
3Dの勉強を全くしていない状態なので、知識のない自分には3Dライブラリを使うのは無理かと思ってたけど、
すぐに諦める前にもう少しだけ調べてみようと思います。
>>104
「透視投影変換」、「同次座標表現」のキーワード、感謝します。パース等ではなかなか役立つホームページがヒットしなかったので…。
すぐには理解できないけど、検索結果のホームページの内容の方が自分の思いつきより洗練されてるので、3Dライブラリ使用が無理な場合、次の手段として挑戦しようと思います。

とりあえずDXライブラリで出来ないか考えてみる事にした。
ホームぺージから最新版をダウンロードしたら、3.04だった。
いままでのは2.25、リファレンスの球を表示する部分を丸ごとコピペしてコンパイルしたら
球が表示されたので、もし2Dとソースが共存できるなら今までのプログラムを3Dライブラリで丸ごと書き直さなくてもすむかもしれないと思って終了。
106
(1): SGGK ◆6pZCoAtaxk 2010/09/29(水)23:24 ID:ixkP0mUb(1) AAS
DXライブラリ3Dでプログラムを組むための参考になりそうなホームページがどうも無さそうなので、
DXライブラリ置き場ホームページに行き、サンプルプログラムの

32.3Dアクション基本  を見るが複雑すぎて今は無理と判断。
31.迷路を3Dで表示   も難しいが、プログラムのソースにあるカメラの命令のリファレンスを見てみるもののやっぱりよくわからない。

>>102で言ってた2Dだけで自分で計算するか悩んだが、その前にあと一つ試せる方法があったのでやってみた。
今まで書いてたプログラムの状態や画面の遷移、得点、時間表示などを削除し、
3D円錐の描画命令をコピペし、上記で言ってたカメラの命令をコピペしてみたら描画された。
最初からプログラムを作り直さなくても3D命令のテストが出来たのは運が良かったかもしれない。
カメラの関数の引数を変えると円錐の向き大きさも変化したが、座標系がよくわからないので、
何故このように見えるのかが今はまだわからない。
カメラ関数の引数を変えても2Dの選手やフィールドの絵には変化が無かった。
もしかすると結局はすべて3Dのライブラリ関数で書き直すしかないのかもしれないと思って終了。
107
(1): 2010/09/29(水)23:40 ID:UzXxGPtF(1) AAS
>>106
2Dの絵がすでにあるならビルボードでググってみるとよろしかろう
108
(1): SGGK ◆6pZCoAtaxk 2010/10/01(金)00:18 ID:EHwgOhQ3(1) AAS
>>107
ありがとうございます。3Dを不勉強なので、ビルボードも知りませんでした。
フィールドを3Dで表示して選手を2Dにして遠くにいる選手の画像は2Dのライブラリ関数で縮小表示できれば3Dらしくなるのではと自分はいままで思っていて、
しかしその縮小比率をどのように計算すれば良いのかが悩みどころでしたが、ビルボード関係を調べて何ができるのか読んでみると、
厚みのない画像でも3D空間の物体扱いにできてカメラ関数があればフィールドと一緒に選手も3D視できそうな気がしてきたので作業が進んだら挑戦してみたいと思います。

今日はホームページで3D関係を巡回したのみ。
3D空間からPC上のゲーム画面への座標変換を行うには、いろいろな行列を何度か掛ける必要があるとか、座標系の種類の説明がいろいろ。
これを理解してプログラムを書けるようになるにはどう考えても数カ月から…いや下手すれば数年かかるんじゃないかと感じた。
しかし、一方で昨日のDXライブラリのサンプル 32.3Dアクション基本 のソースを見る限りでは、行列を何回も掛けているような処理の記述は見当たらない。(探し下手で自分が見つけられていないだけかもしれないが…)
もしかすると、3D空間内にモデルを配置してカメラ関数の引数をセットすれば3D視できるその中に既にそういった計算が見えないところで行われてるのかもしれない。(これが>>103氏、>>104氏の言っていた事かもしれない)
とりあえずなんだかわからない状態だけど、なんらかのモデルを用意して、それを読み込んで画面に表示することに挑戦してみたい。
109
(1): SGGK ◆6pZCoAtaxk 2010/10/04(月)23:34 ID:OotJcuep(1) AAS
DXライブラリのサンプルプログラムで拡張子mqoというのがあり、メタセコイアのファイルのことだとわかったので、
金曜日の夜にメタセコイアR2.4(フリーの方)をインストールした。
モデルをつくる技術が無いので、面→基本図形で面を生成し、材質設定で緑色を指定するにたどりつくまででもかなりの時間がかかった。
サンプルプログラムのやり方を真似してこの平面モデルのmqoファイルを読み込み、表示させようとしたが、
最初は全く表示されず、表示されても白黒だったりしたが、ファイル作るところからやり直してみたら今度は表示された。
結局原因は不明。次は今までの選手の2D画像を平面モデルに張り付けられるのかに挑戦。
110
(1): 2010/10/06(水)18:41 ID:WfQHbqcm(1) AAS
>>109
頑張れ!
111: SGGK ◆6pZCoAtaxk 2010/10/07(木)00:39 ID:uuBtJJiv(1) AAS
>>110
今は全ての作業が試行錯誤なので遅くなっているけど頑張ります!

選手の画像を1コマ切り取り、同じサイズの平面をメタセコイアで作成して
その平面に選手の画像を貼ろうとしたが失敗。
この処理はUVマップと呼ばれてるらしいが、とりあえず貼り付けをやめてxz面に垂直なただの平面を作り、
フィールドの次に描画させようとしたら表示されず。
何回かやり直していたら、フィールドと小さな平面が表示されたところで終了。(原因不明)
112: SGGK ◆6pZCoAtaxk 2010/10/07(木)23:46 ID:IVAUpJqc(1) AAS
フィールドの平面モデルにネットのフリー素材のフィールド画像を張り付けてみようとしたら何故か出来た。
UVマッピングとかいまだに解ってないので偶然できただけ。
ビルボードで選手を描画するのは難しい事がわかってきた。
DrawBillboard3D関数が使えるかなと思ってリファレンスを見たら、画像のサイズは自分で入力しなければならないので、
この関数仕様だと、いろんな位置や角度で見たときの選手がどの程度の大きさで見えてるかを自分で計算出来る必要があり、これを実現するのは難しいと思った。
すぐ諦めるのはどうかと思いつつも、最初に諦めてたモデルを配置してカメラ関数で見てもらうやり方を検討することにして今日は終了。
とりあえずは、選手を円筒か何か簡単なモデルで表現して配置してどのように見えるかを目標にする。
113
(1): 2010/10/08(金)00:25 ID:lwTrudzA(1) AAS
>いろんな位置や角度で見たときの選手がどの程度の大きさで見えてるかを自分で計算出来る必要があり
DXライブラリ使った事ないので的外れかもしれないけど
こういうのって普通ビュー変換で処理されるんじゃないのか
1-
あと 374 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.023s