1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
140(1): SGGK ◆6pZCoAtaxk 2011/01/18(火)23:06 ID:IAGIcn+p(1) AAS
いざソースを書き直そうとするもののどこから手を付ければ良いのか見当がつかない。(いまさら何を言ってるのかと思われそうだけど…)
今出てる問題は、今までのプログラムにベクトルが使えるようにするために追加したクラス、関数(ベクトル同士の加算、減算とか)が
既にDXライブラリに用意されていて、当然DXライブラリの方が関数の種類も多い。
かといって今まで書いた自分のベクトル用関数もソースのあちこちに散っているので、
これをいますぐDXライブラリの関数に置き換えるのは数カ月単位の時間を要するのは確実。
とりあえず、
自分の書いたクラスVector3 ←中身はx,y,zだけ
DXライブラリの構造体VECTOR ←中身は不明だけど、リファレンスを見てるとx,y,zが含まれているようだ。
の型を持つ変数同士を変換する事が出来れば、自分の書いた関数、DXライブラリの関数のどちらでも使えるのではないかと予想。
一応、以下のような感じで書いてみた。まだ書いただけなので使えるかどうかは今後の進捗次第。
//Vector3型変数をVECTOR型に変換する関数。
VECTOR Vector3_To_VECTOR(Vector3 a){
VECTOR result;
result.x = a.x;
result.y = a.y;
result.z = a.z;
return result;
}
//VECTOR型変数をVector3型に変換する関数。
Vector3 VECTOR_To_Vector3(VECTOR a){
Vector3 result;
result.x = a.x;
result.y = a.y;
result.z = a.z;
return result;
}
141: SGGK ◆6pZCoAtaxk 2011/01/19(水)23:11 ID:VXY/IGc8(1) AAS
念の為もうひとつ確認しておこうと思い、テストプログラムでメインループの中に
Zキーを押したら選手のx座標を少しずつ増やしていく処理を追加してみた。
コンパイルして実行してみたら選手の絵がx方向に動いた。
3Dのビルボードの命令で描画した選手でもいままでの2D命令でやったとき同様に動く事が確認できた。
これで多少は安心してソースの書き直しに着手できる…と思う。
142: 2011/01/20(木)00:55 ID:yl8ufdN1(1) AAS
C#囓った俺だったら、Vecrot3にToVECTOR()関数を追加するかな
Vector3 a;
VECTOR b = a.ToVECTOR();
って書けるようにする
普段はVector3を使って、必要に応じてVECTORを吐き出すというイメージ
VECTORからVector3への変換はしない、という仕様にした方が多分デバッグは楽になると思う
143: SGGK ◆6pZCoAtaxk 2011/01/20(木)23:35 ID:hnrlJRek(1) AAS
アドバイス、ありがとうございます。
確かに変数の型はどちらかに統一しておいた方が良さそうなので注意します。
変数はVector3に統一し、DXライブラリの関数の引数と出力の型がVECTORだった場合には、
引数に関しては、Vector3型をVECTOR型に変換した値を入力して、
VECTOR型出力に関しては、そのつど出力のx,y,z値をVector3型変数に入力すれば、>>140で言った
VECTOR型変数をVector3型に変換する関数は使わなくて済むので、これでやってみます。
今日のプログラム修正は、データのロード部分のみ。少しずつ進めていく予定。
144: SGGK ◆6pZCoAtaxk 2011/02/09(水)21:46 ID:iFm8dF3D(1) AAS
修正が思い通りに進まないので悩む。
また以前のようにクラス図の様な図を書いて整理してからソースを修正した方がいいのだろうかと思ったが、
エクセルで書こうとするととても時間が掛かるので、クラス図を書くためのフリーソフトが無いか探してみた。
UMLdraw フリー版とシェア版があり、フリーでは印刷できないので不可。
UMLmemo フリー、印刷無し、ビットマップ出力ありだけど、書いたテキストの空白が改行マークで埋め尽くされて見づらいので不可。
astah* community 無償版、印刷あるけど大きさの調整不可、使い方が難しいので不可。
無理してastah* communityでクラス図もどきを途中まで書いてなんとなく思い始める。
「頑張ってプログラムソースを書き直した方がいいような気がする。」
この状況になるまで約2週間経過。無駄な事をしてしまったのかも・・・。
今は選手のデータ関係を修正中。
前スレ>>885で選手のデータを入力しやすくするために考えた関数を使わずに
テキストファイルからデータ(初期位置座標など)を読み込めるように出来ないか考えているところ。
14歳シリーズのC(VS2008編)に使えそうな例が載ってたので参考にしてみるつもり。
145(1): SGGK ◆6pZCoAtaxk 2011/02/11(金)22:55 ID:83OV5fAw(1) AAS
テキストファイルからの読み込みをやると言ってすぐ壁に突き当たる。
選手のポジション(FWなど)を列挙型定数にしているけど、これは読み込めないらしい。
全てのデータをテキストファイルから読み込む方法に変える必要はないと思うので、
これについては、選手のゲームスタート直後の座標だけをテキストから読み込めるようにすればいいかなと考えた。
選手のデータ関係の修正作業は途中だけど、ちょっと中止。(方針変更しすぎ・・・)
クラス図を途中まで書いたときに感じた事だけど、状態を表す定数の追加やそれを使った分岐が
ソースを見づらくしており、他にも理由がいろいろあって、このまま気になったところから直してコンパイルしてもたぶん地獄の修正作業になると思った。
全部直してからでないと修正途中でコンパイルしたところでバグしかでないぞと思っていたが、
最低限のファイルだけ残して、残りはとりあえずコンパイルの対象となるフォルダの外に場所を移しておき、
残したファイルだけでコンパイルし動作確認出来たら、移動したファイルをいくつか戻して修正して・・・を繰り返していけばよいのではと思った。
ということで、メインループ関係とフィールド画像関係だけ残して、
メインループ関係のソース内のフィールド以外(選手、ボールなど)に関する記述は//を付けてコメント化してコンパイルされないようにしてみる。
その状態でフィールドが画面に表示されるまでを目標にしてみる。
146: SGGK ◆6pZCoAtaxk 2011/02/14(月)00:35 ID:hwQDV7I3(1) AAS
11,12,13日の3連休では無理だった。(作業時間もすごく短いので・・・)
エラーの数は、20個→8個→30個と変わり、結局増えてしまった。
ゲームのループとそこから呼び出す関数はそんなに変更ないけど、
そこから先は思った以上に作り直しに近い感じなってしまった。
まだ先だけど、状態管理の定数を使った分岐処理もできればメインループの外に出したい。
一つの値があったとして、その値が自作のVector3型だったり、
ある時はDXライブラリのVECTOR型だったりするため、変換の方向を
Vector3 → VECTOR のみにしてソースを直すつもりだったのが想像以上に難しそうで、
プログラムソースもほとんど書き直しに近い感じになりそうなので、
この際思い切ってVECTOR型に統一して、ベクトル関係演算用関数については、
自作ではなくDXライブラリの関数を使って書き直していくやり方にしてみる・・・に方向修正。
147: SGGK ◆6pZCoAtaxk 2011/02/15(火)23:25 ID:mNvxRe1H(1) AAS
やっとフィールドの表示が出来た。
今まではソースを書きかえる時に元のソースの先頭に//を付けてコメント化して、
いざという時に前の状態に戻しやすくできるようにしていたけど、これをやめて
コメントを減らしてソースを見やすくするようにした。
戻りたいときにはバックアップのソースを見ればいいのだから。
バックアップはコンパイルした時に出来るファイルを含め全部保存していたが、
考えてみるとプログラムソース(ヘッダファイルとCPPファイル)だけを保存しておけばよかった。
数年やってて気付かなかった・・・。
148(1): 2011/02/17(木)01:19 ID:s7Rh9Whn(1) AAS
パージョン管理ツールを使うと躊躇なく修正できるよ
subversionがおすすめ
149: SGGK ◆6pZCoAtaxk 2011/02/18(金)00:25 ID:0vaBqQnH(1) AAS
>>148
パージョン管理ツールの存在を知りませんでしたので勉強になりました。
「subversion ゲームプログラム」で検索してみるとかなり難しいツールのようです。
難しくてもインストールして触るところまではネットで調べて試してみようと思います。
ありがとうございました。
現在の進捗は、選手関係のファイルをコンパイル対象の場所に戻して、
>145でやりかけてた選手の初期化関係を修正中。
150(1): 2011/02/24(木)13:41 ID:UHwXurlZ(1) AAS
ふと、このスレのこと思い出して帰ってきたけど
まだSGGK氏が頑張っててちょっと感動した
151(1): STG 2011/02/24(木)23:36 ID:x+thpv+K(1) AAS
当分書き込んでないけど俺もいるぜー。3Dモデル全般の勉強でなかなか進まない
SGGK氏がんばってるなー
152: SGGK ◆6pZCoAtaxk 2011/02/25(金)23:02 ID:uikGAaqm(1) AAS
>>150
思い出して戻ってきてくれる人がいる事に感動です!
まだまだ頑張ります!
>>151
お久しぶりです!
お互い目標目指して頑張っていきましょう〜!!
153: SGGK ◆6pZCoAtaxk 2011/02/27(日)00:13 ID:wy4sbNmV(1/3) AAS
subversionの件、自分には難しすぎた感じ・・・。
でも、インストールして触るところまではなんとか出来た。
subversionで検索するとapachをPCにインストールして色々と準備設定が必要らしく、
これの設定の意味が全くわからず断念しかける。apachはサーバーのプログラムらしい。
VisualSVN-Serverというのも出てきて試そうとしたらポートの設定を求める項目があり、
理解せずに設定してパソコンを壊してしまうと大変なので断念。
「subversion apadh無し」とか「subversion サーバー無し」で検索するが、自分に分かりそうなページはヒットしない。
2、3日諦めてて、ふと「subversion ローカル」でやってみた。
TortoiseSVNというのがあるらしい。これはサーバに対するクライアント?のソフトらしく(←自信無し)、
これ単体でも自分のPCでバージョン管理が出来るらしい。
とりあえずホームページを探してTortoiseSVN本体(種類がいくつかありどれにすればよいのか迷ったがなんとか見つけた。)と日本語化ツールをダウンロードしてインストールした。
あとは説明ホームページを探して、リポジトリの作成、バージョン管理したいファイルのあるフォルダをリポジトリにインポートして、実際の作業を行いたいフォルダへ
リポジトリの内容をSVNチェックアウトする。
そして作業が終わったらSVNコミットするとリポジトリで変更が反映されてバージョン管理される・・・ところまで理解(自信無し)。
154: SGGK ◆6pZCoAtaxk 2011/02/27(日)20:58 ID:wy4sbNmV(2/3) AAS
しかし、このようなツールに即適応出来ないとなると、自分の目標である
オンライン3D対戦サッカーゲームの完成はいつになるのだろうかとふと思った。
バージョン管理ツールはサーバーに関する知識がある程度なければ操作の意味が理解できない感じ。
いまはこういうツールの存在を認識するに留め、出来る範囲で対応するしかなさそう・・・。
でも、ツールの難しさ→サーバーの勉強も早めに始める必要ありそう→急がないと10年頑張っても出来ないかもしれない
という危機感につながったので、とにかく諦めないようにしたい・・・。
155(3): SGGK ◆6pZCoAtaxk 2011/02/27(日)22:11 ID:wy4sbNmV(3/3) AAS
ソースを修正していて思ったが、C++で書いたプログラムは保守性が良くて再利用性にも優れてるような事を
どこかで聞いた記憶があるけど、そうなっている感じがしない。
たぶん自分の書き方に問題があるので、この機会に少しでも変えてみようと思った。
1.クラスのメンバ変数をpublicにして直接読み書きしていた。(変数毎に関数を書くのが大変だし、いちいち関数を使っていたら、その分処理速度が遅くなるのではと思った。)
これを次のようにする。
privateのメンバ変数にして変数毎にget関数、set関数を作ってこの関数を経由してアクセスする方法にする。
そうすれば、例えば、座標系をx,y,zで管理していたのをVECTOR構造体に変更した場合でも
get関数、set関数の修正で済む場合もあるので、修正に有利だし、
get関数、set関数が書かれている場所を見れば、クラスのつながりも見えやすくなりそう。
2.get関数、set関数のような変数の取得、設定しかしない関数は行数が短いので、
定義をヘッダファイルに書いていたが、定義はすべてcppファイルにまとめて見やすくする。
それが出来ない例外もあった記憶があるけど、その場合は仕方ないのでヘッダファイルに書く。
3.変数の命名規則を考え、それに従った変数名を付ける。
但し、最低限の規則にしておき、不完全でもあまり気にしないようにする。
プログラムの修正が今より少しでもやりやすくなればいいのだから。
今考えてるのは、メンバ変数は単語の区切りだけ大文字にして書く。
メンバ関数も同じだけど、最初の文字だけは小文字にする。
そして、メンバ変数の先頭には、m_ を付ける。
メンバ変数で静的変数なら、ms_ を付ける。
メンバ変数でポインタなら、mp_ を付ける。
これでやってみる。
156(1): 2011/02/28(月)22:34 ID:g0je8oOR(1) AAS
メンバ変数をクラス外から頻繁にアクセスしなければいけないというのなら、
クラスの設計自体を見直すべきかもしれないよ。
もちろんケースバイケースだけど。
157: SGGK ◆6pZCoAtaxk 2011/02/28(月)22:47 ID:ard6obcB(1/2) AAS
今回のプログラム修正は前回と違って、warningが出ないようにしたい。(前回あまりにもたくさん出てきたので諦めてしまった。)
warning C4290: C++ の例外の指定は無視されます。関数が __declspec(nothrow) でないことのみ表示されます。
上記のwarningメッセージは、プログラムソースの例えば、void loadFiles()throw(int);と書いた行のような場所で多数出た。
エラー処理の命令でtry{この中でエラー出たら何かをthrowする。}catch(){左の()内とthrowされた値が同じ時に処理する内容をここに書く}というのがあって、
その最初の{}の中には関数を入れる事も出来て、その関数の中からエラー時にthrowすることも出来る。
つまり外に向けてthrow出来る関数を宣言するときにthrow(int);(注:この例ではthrowされる値の型はint型になる)を横に付けるらしい。
でも、VS2008では、この仕様をフォローしてないので、throwされる型は指定できない。
warning C4290: はそういう事を言っているらしい。
このwarningが出ないようにするには、
#pragma warning( disable : 4290 )
を書いてやればよいとの事。
たしかに出なくなった!
158: SGGK ◆6pZCoAtaxk 2011/02/28(月)22:54 ID:ard6obcB(2/2) AAS
>>156
偶然同じ時間帯に書き込みしてた様です。指摘ありがとうございます。
今のプログラムはかなりごちゃごちゃして修正するたびに時間が掛かるようになってきたので、
もう少しクラス分けしてプログラムを見やすくしたいけど、どう分けるかは実はやってみないと分からないという状態ですが頑張ります!
159(1): 2011/03/01(火)22:55 ID:Ux3/NF8u(1) AAS
なんか切磋琢磨な感じがいいね。
影ながら応援してます(`・ω・´)ノ
160(1): SGGK ◆6pZCoAtaxk 2011/03/01(火)23:31 ID:huwPkO/S(1) AAS
>>159
しばらくの間は今までのプログラムの書き換え作業のような感じになるけど、
やれるところまでは頑張ってみようと思ってます!
今までは1つのファイルに複数のクラスの宣言を書いていたのを、
1クラスにつき1ファイルに変えようとしたためか、ファイルがどんどん増え、
しかもほぼ全てのメンバ変数にget、set関数を用意するので作業量が膨大になりそうな感じ・・・。
161: SGGK ◆6pZCoAtaxk 2011/03/03(木)22:36 ID:dBNi9i4V(1) AAS
class FieldControl
{
(略)
FieldData m_Field;//クラスFieldDataの型を持つオブジェクトm_Field
AnimDraw m_FieldAnim;//クラスAnimDrawの型を持つオブジェクトm_FieldAnim
(略)
};
のようなクラスがあり、m_Fieldの中にm_FieldAnimのアドレスを記憶しているポインタmp_Animがあり、
m_FieldAnimの中にはdraw()関数があるとしたら、
m_FieldAnim.draw();//方法1
m_Field.mp_Anim->draw();//方法2
は同じ事をしているらしい。
方法2のように書くべきところを方法1のような書き方をしていたのがわかって気になったので自分用メモ。
>>155の書き換えを進めていてフィールド表示は出来た。
今は選手関係の処理に着手中だけど、ここからは選手人数分のループや選手の移動関数などが絡んできて時間がかかりそうな予感。
一日の作業時間はとても短いので・・・。
162: SGGK ◆6pZCoAtaxk 2011/03/06(日)15:46 ID:CeMkUuli(1) AAS
>>155や>>160の変更を同時にやろうとして収拾がつかなくなってきた。
>>160の>1クラスにつき1ファイルに変えようとした・・・のが良くなかったかもしれない。
クラスにあるメンバ関数をcppファイルの中で定義しようとしたときに、そのクラスのヘッダファイルに無い他のクラスのメンバ変数が含まれていたら
その含まれていないクラスのヘッダファイルをインクルードしたり、または前方宣言とかいうのを書いたりするんだけど、いまいちよく理解しないでやってるからなのか
どうもその辺が原因になってるような気がする。
それと移動処理のクラスは外部変数的な感じで外部に実体を定義するんだけど、
これも思い通りに出来ていないような気がする。ちゃんと書いたつもりなのに定義が無いといった意味合いのエラーが出る。
しかもアサーションがどうのこうのというエラーまで出てしまった(たしか1年ほど前にも似たエラーが出て大変だった)ので、
ここはいったん選手関係のファイルをひっこめて、もう一度フィールドの表示をさせるところまで戻して、
次に選手の画像データロード、選手の初期値テキストファイル読み込みの部分だけをコンパイル対象に戻して
動作が確認できるまでを頑張ってみる。
163(1): SGGK ◆6pZCoAtaxk 2011/03/07(月)22:53 ID:A2V6WI7O(1/2) AAS
エラーメッセージが出なくなった。
問題となっていた部分はいわゆるクラス同士が相互参照していて、どちらかのクラスが宣言や定義されていないと矛盾してしまうんだけど、
先に宣言するべきクラスもその後に宣言されるクラスが宣言されていないと宣言できないという問題。
これがよくわからなくて後宣言のクラスがクラス名くらいの簡単な場合は前方宣言を使い、
後宣言のクラスの関数まで記述されているときは、前に宣言しておくべきクラスのヘッダファイルを置けばいいような感じで理解してみるものの自信無し。
結局、処理を順番に見ていきこの行では何が決まっていないと不具合になるか考えて順番に設定していき、
なんとかクリアできた。(自信無し)
そのかわり、cppファイルは両方のクラスを一緒にせざるを得なかった。
でもこれでは将来、あのクラスの定義はどのファイルに書いたのか分からなくなるので、
空のcppファイルをつくり、その中に注釈行で、ここに書くべきcppファイルの中身はどこのcppファイルに書かれたのかを記述しておいた。
それにしてもエラーが出ないのも変なので、メインループの選手画像データロード、選手の初期化あたりを調べてみる予定。
164: SGGK ◆6pZCoAtaxk 2011/03/07(月)23:18 ID:A2V6WI7O(2/2) AAS
今見たら、先頭に//が付いて注釈行になっていた。
画像データロードの注釈化を解除してコンパイルしたらエラー無し。
だからといって安心とは限らないけど次にいく。
選手の初期化でエラー、アサーションとかイテレータがどうのこうのというメッセージ。
明日はここからということで・・・(寝)
165(1): 2011/03/07(月)23:44 ID:XFYVl8h4(1) AAS
>あのクラスの定義はどのファイルに書いたのか分からなくなるので
クラスビュー(ソリューションエクスプローラのタブを切り替える)を使えば、
関数、変数の宣言箇所もしくは定義箇所が引き出せるよ。
166(1): SGGK ◆6pZCoAtaxk 2011/03/08(火)23:20 ID:pzJV24Q0(1) AAS
>>165
クラスビュー、使えました。クラスが一覧されて、ソース内の関数名をマウス右クリックメニューで定義を書いた場所に移動してくれるので便利です。
これがあれば、空のcppファイルを用意して定義先を書くような事をしなくて済みます。ありがとうございました!
今日は選手の初期化でエラーの件がまだ上手くいかず、選手22人分のデータ読み込みで
while文を使う時の条件文にファイルリードの成否判定を入れていたのを試しにはずしてみたら
エラーは出なくなったけど、選手の表示は無し。
試しに選手初期化処理直後にブレークポイントを置いて処理を停止させてからデバッガ(使い方自信無し)で見ると、
どうやら22人分のデータの読み込みがされていない様子。
167(1): 2011/03/09(水)04:35 ID:WaGJIOge(1) AAS
>>163についてちょっと気になったので質問させて下さい
クラス同士が相互参照という事ですが、なぜそんな構造になってしまったんですか?
168(1): SGGK ◆6pZCoAtaxk 2011/03/09(水)23:02 ID:u9XYEX3Y(1) AAS
>>167
これは書籍(14歳シリーズ)を参考に書いた処理で、
今も自信ないけど、以下の様な感じで相互参照のクラスが出来てしまってます。
選手22人分の移動関数をループから同じ書き方で呼び出しても、
異なる移動関数を選択できるようにしたいという目的があり、まず移動関数を持つ基底クラスを作成。
その基底クラスの継承クラス内で移動関数をオーバーライドしてその関数を呼び出せれば様々な移動関数を使えるはず。
継承クラスのオブジェクトのポインタを格納するための「 基底クラスのポインタ型を持つメンバ変数を選手のデータ内に持たせ 」て、
そのポインタから移動関数を呼べば良い。
選手のオブジェクトからそのポインタを使って移動関数を呼ぶ時に選手のアドレス(thisポインタ?)を引数に持たせてやり、「 移動関数はそのthisポインタから選手の座標などのデータを呼び出し、更新する」。
上記の「」のところで、
選手のクラスは移動関数のクラスのポインタをデータに持つためには、選手のクラスが宣言される前に移動関数のクラスが定義されてなくてはならないし、
移動関数のクラスが選手のオブジェクトのポインタを通して選手のデータを使うには、移動関数の宣言より先に、選手のクラスが宣言されていないと選手の座標データを使った関数の中身が書けない。
・・・というのが相互参照になった理由です。
169: 2011/03/09(水)23:20 ID:Vm9YGKI1(1) AAS
宣言前のクラスのポインタをメンバ変数として宣言したければ、
class CclassA{
class CclassB *pB;
};
class CclassB{
;
};
というように、クラス名の前に class と書きます。
ポインタにしか通用しませんが。
上下前次1-新書関写板覧索設栞歴
あと 318 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.012s