1人でゲームが作れるように修行します。2 (487レス)
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 と書きます。
ポインタにしか通用しませんが。
170
(2): 2011/03/10(木)00:29 ID:BwtNGrdz(1/2) AAS
クラスを前方宣言してみては?
171
(1): 2011/03/10(木)01:22 ID:B4bIYd4z(1) AAS
>>168
なるほど意図が分かり納得しました
相互参照は何だか卵が先か鶏が先かみたいで何となく嫌な感じがしたんですが、それが必要な場合もあるんですね
172: 2011/03/10(木)01:39 ID:BwtNGrdz(2/2) AAS
読み間違えていたので>170は無視してください…
173: SGGK ◆6pZCoAtaxk 2011/03/10(木)23:15 ID:m0PXWZxb(1) AAS
このようなやり方があるとは知りませんでした。
自分の技術不足のため直接的な解決には至りませんでしたが、この方法を試す過程でcppファイルもほぼ別々に分ける事が出来るようになりました。
残っているのは、移動関数クラスの継承クラスの実体を選手関係処理を集めたクラスのcppファイルの中で定義しなければ
エラーになってしまうという点だけ(一行しかない処理なので今は問題視しないつもりです。)なのでソースがすっきりしました!
ありがとうございました!
>>170、172
実は前方宣言もちょっと使っています。今回のプログラム修正は自分にはかなり複雑な内容でした…
>>171
ソースを読もうとすると複数のファイルを行ったり来たりしなくてはならないややこしい構造なのでかなり苦労しました。
これからも頑張ります!
174: SGGK ◆6pZCoAtaxk 2011/03/20(日)08:59 ID:mbRpLbd0(1) AAS
東北地方太平洋沖地震発生から約一週間。
亡くなられた方々のご冥福を祈ると共に被災地の早期復旧復興を願いながら書き込み再開。

>>166
>while文を使う時の条件文にファイルリードの成否判定を入れていたのを試しにはずしてみたら
>エラーは出なくなったけど、選手の表示は無し。
>試しに選手初期化処理直後にブレークポイントを置いて処理を停止させてからデバッガ(使い方自信無し)で見ると、
>どうやら22人分のデータの読み込みがされていない様子。

これは、
while(it!=m_FieldPlayerList.end() || FileRead_eof(f)==0){データ初期値入力}

while(it!=m_FieldPlayerList.end()){データ初期値入力}
にとりあえず変えてみたという意味。
データ初期値入力は、
(*it).setpAnim(&m_FieldPlayerAnim);
のようなやりかたで入力しようとした。
itはイテレータの事で、上記のwhileが真の間は、1ループ毎にitが1ずつ増えて
このitが選手22人分のデータを指し示すような感じだけど上手くいかなかった。
175: STG 2011/03/21(月)00:44 ID:TWP+xA6r(1) AAS
おお、ご無事で何より
176: SGGK ◆6pZCoAtaxk 2011/03/22(火)00:28 ID:yLNIaGwb(1) AAS
STG氏もご無事で何よりです。
災害関係で協力できる事をやりつつ、自分はプログラムをいままで通り続けていくつもりです!
177: SGGK ◆6pZCoAtaxk 2011/03/23(水)23:45 ID:0VAAbS39(1) AAS
これから初期化するということはまだデータを入れるコンテナクラス(配列みたいなもの?自信無しで使ってる)が
22人分用意されてないはずなので、
while(it!=m_FieldPlayerList.end()){データ初期値入力}
では、条件が満たされず、データ初期値入力に進まないような気がした。
試しに
if(it==m_FieldPlayerList.end()){printfDx( "リストが最後 \n") ;}

while文より前の行に入れてみると、画面に「リストが最後」と表示されたので、
そもそもデータが入力されていないとこまでわかり、ふと以前のバックアップを見ると
for文のループ22回指定で入力していた。
間違えた方のやり方は既にデータが22人分あり、選手移動処理するときに
22回繰り返す場合に使うやり方だった。
178
(1): SGGK ◆6pZCoAtaxk 2011/03/24(木)22:43 ID:KuIDadu5(1) AAS
forループでどうやら問題無さそうな感じ。
選手の移動処理も最初何も表示されず悩んだが、どうやら直った感じ。
原因は、ビルボードに使うデータをロードする関数にメタセコイアのデータをロードする関数を
使おうとしていたことと、ビルボードに使うデータはBMPデータなのにそれを忘れてて
メタセコイアで作った平面にBMPデータを張り付けたメタセコイアデータをロードさせようとしていたという
2重の間違いをしてしまっていた事。

gh3d[0] = MV1LoadModel("media\\player11.mqo");  ←1回目の間違い

gh3d[0] = LoadGraph("media\\player11.mqo");  ←2回目の間違い

gh3d[0] = LoadGraph("media\\player11.bmp");  ←正解

現在は、選手画像がマウスカーソルに付いたまま描画される状態なので、
なぜフィールドの初期位置に散らばった状態からマウスカーソルを
追いかける動きにならないのか調べているところ。
179
(15): 2011/03/29(火)00:57 ID:W5EaQ6/R(1/2) AAS
久々にまたがんばろうかな っと思ったけど
この板すんげぇ過疎ってんのね・・・
このスレにちょいとお邪魔してもいいかな

とりあえず2DでSLGぽいのを目指して。
180
(1): SGGK ◆6pZCoAtaxk 2011/03/29(火)22:55 ID:KAewGcjL(1/2) AAS
>>179
よろしくおねがいします。
お互い頑張りましょ〜!
181: SGGK ◆6pZCoAtaxk 2011/03/29(火)23:05 ID:KAewGcjL(2/2) AAS
>>178の問題は解決。
選手の現在位置を表すベクトルに1ループあたりの移動距離分の大きさを持つベクトルを足すべきところを
間違えて、選手の移動目標となるマウスカーソルの位置を表すベクトルに足していたのが原因。

そして現在の問題点は、フィールドと選手の座標にずれがある事。
カメラの注視点を変えて向きを変えるとフィールドはそれに応じて画像が変化するけど、
何故か選手の出てくる場所はフィールドに関係なく毎回同じで変化していない感じ。
しかもマウスの指し示す位置座標もフィールドの変化と連動していないようで毎回同じ状態。
カメラの関数はループ処理の最初に書いてあるのでそのあと描画されるものはすべて
カメラの状態に合わせて描画されると思っていたけど、何か勘違いをしている感じ。
182: 179 2011/03/29(火)23:53 ID:W5EaQ6/R(2/2) AAS
>>180
いつまで続くか分かりませんがヨロシクお願いします

とりあえずVC++2010Expressインストして
昔の何かのつくりかけのソースをこねくり回してます。。。
183: SGGK ◆6pZCoAtaxk 2011/03/30(水)23:05 ID:oI0LR1GW(1) AAS
このスレは次の書き込みが数か月後になっても全然OKなので自分はマイペースでやってます。
進捗が0になると突然書き込み0になったりしますので、その時はスミマセン・・・。

昨日の問題は解決。
原因は、選手の移動関数の最初の行にカメラ関係の関数、
SetCameraPositionAndTarget_UpVecY( VGet(0,680,340), VGet(0.0f,-100.0f,0.0f));
を書いてあったため、これがループの最初に書いてあったSetCameraPositionAndTarget_UpVecY(略)と重複してしまい、
両関数の注視点が異なっていたのでズレが生じた事。
184: 179 2011/03/31(木)00:56 ID:MmtwFkf5(1) AAS
こっちの場合熱が冷めるとマズイ事になる予感w
なので、その前にある程度作れれば・・・と思ったり。

こねくり回したソースはミートソースになってしまった。
食わせたらウィンドウは一応出た。
これでようやく次の作業へ…。
185
(2): SGGK ◆6pZCoAtaxk 2011/03/31(木)23:16 ID:K/Mu7f7g(1) AAS
こちらは、balldata.h を作成。
2次元でやってた時のヘッダファイルに修正を加えて作成。
メンバ変数をプライベート変数にしてget関数、set関数の宣言まで。
このような修正をボール、ゴール、レーダー関係のファイルに行わなければならず、
残りは全部で8ファイル。
186: 179 2011/04/01(金)00:43 ID:wHWoDhco(1) AAS
なんという手間のかかる作業を。。。
グローバルで適当に書いて放置してる誰かさんとはえらい違いだなぁ
ぃゃ直しますよ…後で…イツカ,タブン。

今日の作業:マウスアイコン作って動かせるようにした。
なんかsprintfとかの警告でまくってるけど気にしない。
ユニットとマップの大きさどうしよかな…。
187: SGGK ◆6pZCoAtaxk 2011/04/02(土)00:05 ID:7Uv0Gp7Y(1) AAS
ファイルを分けているのは14歳シリーズC++本の影響でたまたまこのやり方しか知らないのが理由。
このやり方だとオブジェクトを増やす毎に新しいファイルを増やさなければいけないので大変だけど頑張ってみます。

今日は進捗なし。自信ないけど土日で>>185のファイルを片づけたい。もう4月…。
188: 179 2011/04/02(土)01:41 ID:YKJBI5s3(1/2) AAS
オブジェクト毎に1ファイルというのはこちらも似たような感じなんですが、
その…GET、SET関数書くのがメンドくてそのままパブリックで書いて直接・・・
なんてダメな事をやってる所を放置したままで・・・w

以下日記:中身の何も無い板ポリユニット表示した。
ちょっとソースを綺麗にしようと思ったら
同じようなクラスが2個出来上がって汚くなった。
どうしてこうなったorz
189
(1): 2011/04/02(土)08:01 ID:0qk/4v/F(1) AAS
メンバ変数を読み書きして外で処理するのではなく、
メンバ関数にハンドルを渡して中で処理させる設計に変えるといいんじゃないかな。
190: 179 2011/04/02(土)21:31 ID:YKJBI5s3(2/2) AAS
class HUMAN_UNIT
{
public:
void Damage(int point);
  void Heal(int point);
private:
int hp;
};
void HUMAN_UNIT::Damage(int point)
{
hp -= point;
return;
}
void HUMAN_UNIT::Heal(int point)
{
hp += point;
return;
}

ハンドルとか良く分かって無いですが、こういう事?
んでも↓みたいな事やるときにhp取り出すのがめんどくて
ついpublicに置いてしまう…w

HUMAN_UNIT yuusya , souryo;
if(yuusya.hp > souryo.hp)souryo.Heal();
if(yuusya.hp < souryo.hp)yuusya.Heal();
191: STG 2011/04/02(土)21:33 ID:piT73rrN(1) AAS
Get、Setはほとんど使ってないなぁ
大抵>>189の人のようにメンバ関数からのみアクセスするだけで済むようにしてる
クラスが何をしているかと再利用性と扱いと管理が楽になってよい
192: SGGK ◆6pZCoAtaxk 2011/04/03(日)00:07 ID:1D3iDnp3(1) AAS
自分は>>155からget、set関数方式への書き直しを進行中だけど、書き直しにものすごい時間がかかってます。
そして今更ながらそのように直すメリットを見つけられないような気がしてきて不安だけど、
もうほとんど書き直してしまったし、ソースも多少見やすくなったような感じはするので、このまま頑張ってみます!。

今日は、ボール関係をなんとか実装したけど、ボールはフィールド中央に表示され続けるのみとし、まだ蹴れないようにしておく。
レーダー関係は何故かレーダーが表示されないので、原因を調べているところ。
1-
あと 295 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.016s