トップページgamedev
332コメント288KB

1人でゲームが作れるように修行します。2

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2010/05/04(火) 00:44:29ID:HN0quC1A
がんばりましょう。

前スレ
1人でゲームが作れるように修行します。
http://pc11.2ch.net/test/read.cgi/gamedev/1006284805/
0125SGGK ◆6pZCoAtaxk 2010/11/11(木) 23:34:05ID:jPJR3Unn
>>124
アドバイス、ありがとうございます。
今度は練習プログラムの修正で確認してみようと思っています。
>>119>>124の両方でやってみるつもり。
マウスが指し示すフィールド上の位置に何かオブジェクト(球体とか)を
表示出来れば上手くいったと考え、この前ベクトル化したプログラムの続きに入る予定。
0126SGGK ◆6pZCoAtaxk 2010/11/13(土) 00:09:26ID:2/KX1c8L
作業時間10分なので何も出来ず…。
とりあえず半径10の球体を(100,0,0)、(0,100,0)、(0,0,100)の順番に表示させてみた。
これによれば、X軸は左方向がプラス、Y軸は上方向がプラス、Z軸は手前方向がプラスになっていたので、
DXライブラリは左手座標系なんだな〜と思ったところで終了。
0127名前は開発中のものです。2010/11/13(土) 16:02:39ID:V7u6UtpM
カメラの向きによるでしょ
0128名前は開発中のものです。2010/11/13(土) 16:11:56ID:V7u6UtpM
あ、座標系か。ゴメン
0129SGGK ◆6pZCoAtaxk 2010/11/15(月) 06:53:14ID:vSKd6IqB
>>127,128
X軸は右方向がプラスの方が確かに分かりやすいのでカメラの位置と向きは変えようと思います。
いろいろ理由があり作業が止まったりしていますが、まだ諦めてはいません。(仮眠しようとしたら朝になってしまったとか…)
今のモデルは、フィールドが511x341(何故この数字にしたか忘れてしまった…)でその中心が原点(0,0,0)、
カメラの位置は(0,340,340)でカメラの注視点が原点(0,0,0)になっています。
作業の前にやっぱり簡単な例を用意して自分で(手作業で)変換行列を考えてみるところまで
やってみた方がいいかもしれないと思い始めてきたので、その作業分だけ進捗が遅れる可能性ありです。
0130SGGK ◆6pZCoAtaxk 2010/11/16(火) 00:25:11ID:MqJY7qc7
今日はエクセルで準備的な作図を途中まで進めて終了。
書いた図が結局役に立たずに時間を無駄にする可能性もあるけどやってみる。
0131SGGK ◆6pZCoAtaxk 2010/12/13(月) 23:37:18ID:X8dPGQWF
む…無駄になってしまった感じ。
図は書いてみたけど、座標変換について結局あまり理解出来てない事がわかった。
悩んだ結果、恥ずかしいほどに簡単な例を用意し、それを図にして考えてみた。
オブジェクト座標からワールド座標への変換はなんとなく分かったような気がしてきた。
カメラ座標への変換(ビュー変換?)については、オブジェクト座標からワールド座標への変換と同じやり方でたぶん出来るだろうということにして省略し、
今は透視変換について考えているところ。
0132SGGK ◆6pZCoAtaxk 2010/12/15(水) 00:31:39ID:KxIpLRHt
やっぱりやめることにした。
わずか一日で目標変更…。
昨日の続きをやるとなれば、また数週間経過しそうでそれでいいのだろうかという不安が急に出てきた。
透視変換についても>108の頃の自分よりは理解してるつもりなので、とりあえずプログラムに戻り、それでダメならまた別の方法を考えよう。
0133SGGK ◆6pZCoAtaxk 2010/12/21(火) 22:35:38ID:Uo1lQ495
変換についてやっぱりやめないで最後まで調べてUpするに方針変更。(葛藤し過ぎ)
できなければ出来たところまでをUpするつもり。
仕事じゃないんだし…、もう少し調べてみても無駄にはならないはず…。
趣味なんだからあまり無駄とか気にしないようにしよう!

今日は>>119氏のアドバイスのテストプログラムの動きの問題について考えてた。
>>120でプログラムが動いていたのは間違いないけど、画面左上に表示される
マウスでポイントした点が画面中のポリゴンと交差したところの点座標や他の情報を
表示している画面の文字がどんどん重なっていき見えなくなる問題が出ていた。
自分のプログラムでは、ClsDrawScreen と ScreenFlip() の間にゲームの中身の処理を
書いてループするようにしなければならないんだけど、テストプログラム用に無駄な箇所を消したり、注釈化していたときに
間違えてClsDrawScreenの行を //ClsDrawScreen のように注釈行化してしまっていたのが原因だとわかる。
気付くのに3日以上かかった(汗;)
ちなみにDXライブラリではClsDrawScreenは今でも使えるけれど、
公式のリファレンスからは削除されていて、代わりにClearDrawScreen()になっているという事をその時知った。
0134SGGK ◆6pZCoAtaxk 2010/12/30(木) 01:05:04ID:8R77hh/I
年末休みだからとはいえさすがにもう寝なくては…。
>>131のカメラ座標への変換がなんとなくやっと理解出来たような感じ。
次は透視変換に挑戦。
ライブラリが無ければ自分は何も出来ないんだから座標変換勉強しても時間の無駄じゃないのか?
…という迷いはあるけど、あともう少しなのでこのまま進めてみるつもり…orz
0135SGGK ◆6pZCoAtaxk 2010/12/30(木) 16:53:47ID:4FkYuEBu
やっと出来た。
間違いや内容不足はあるかもしれないけど、>>129の11月15日頃からの作業がやっと終了…。
1ページ目は結局使わなかった図。
2ページ目以降の8枚が勉強メモ。

ttp://ux.getuploader.com/sggk/

オブジェクト座標系からスクリーン座標系まで勉強.zip
という名前でUP。
0136名前は開発中のものです。2011/01/01(土) 02:34:44ID:iSY3aMmJ
P2_page001〜004を見た。

そもそも何をしたいのか読み取れなかったけれども、
最初の赤枠の大前提については、ボールの位置はワールド座標系で管理して、
必要に応じて選手目線の相対座標(オブジェクト座標)を求める方が簡単じゃないかな。
0137SGGK ◆6pZCoAtaxk 2011/01/01(土) 22:31:50ID:85GGaF9K
見てくれてありがとうございます。

自分はDXライブラリが無ければ何もプログラムできないので、
プログラムに直接影響しない事を調べてもあまり意味が無いのではないかと思う一方で
座標変換には3D入門の基本のような印象を持っていたので、
もし出来るならちょっと調べてみたいと思ったのが原因で1か月以上経過してしまいました…。

赤枠については今見ると自分もそう思います。
ボールに一番近い選手を知りたいなら選手の座標とボールの座標を
フィールド基準の座標系(ワールド座標系)で表して単純に距離計算した方がよさそうです。

次にやろうとしていることは、選手のデータ作り。
ビルボードの関数で選手を表示するので、メタセコイアで板(面?)のモデルを作り
テクスチャ?を貼りつける作業。2次元のデータのときには選手のアニメパターンを1枚の画像にしていたけど、
今度はそれを切り出して面のモデルに張り付けた3Dデータを何枚か用意する必要があるので、
メタセコイアの使い方を思いだしているところ。(忘れるのがものすごく早いので我ながらつらいw)
0138SGGK ◆6pZCoAtaxk 2011/01/13(木) 23:49:01ID:XHIcVK/b
データはなんとか用意出来た。32ドット四方の面に選手移動アニメの一コマを貼り、
左歩行に2枚、右歩行に2枚、赤選手と青選手があるから(2+2)x2=8個のテクスチャ付き面モデルを作成。
上と下の歩行描写は省くことにした。
テクスチャの貼り方はなんとか分かったけど、今まで使っていた16コマを1枚にしていた2Dデータから
1コマずつ切り出すのに手間取った。
EDGEというソフトを使ってみたが、マウスできちんと32x32で選べない。
なんとなく「edge グリッド表示」でネット検索してみると、「ツクールの素材を作る」という名前で以下がヒット。
ttp://tanktown.web.infoseek.co.jp/tt/g_creat/g_creat/g_creat_graphic01contents.0104.htm
まさにこれが知りたかった事なので作業できた。
余談だけどEDGEは2009年で更新が止まってるようで、競合も多いだろうしフリーだから
モチベーションを保てずにつぶれたのかな?と思ったらなんとiPhoneに場所を移して活動してるらしい事がわかった。
才能ある人はいろいろ出来てうらやましいと思った。
0139SGGK ◆6pZCoAtaxk 2011/01/17(月) 23:51:17ID:Px2vRAS2
>>115で言った
>とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。
については、どうやら出来そうな感じ。

それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど、
テストプログラムでは、試したいDXライブラリの関数をメインループにそのまま書き込んだだけなので、
今までのクラスを使ったやり方に比べ単純な例で試して上手くいったと自分が思っているだけなのかもしれないので、
今度は、今までの2Dで動かしていたプログラムの中身を少しずつ3Dのライブラリ関数に置き換えて
動作を確認していき、これでうまくいくようならUPする予定。

フィールド上の一点を指定する方法については、
>>116氏の7行目の投影変換行列の逆行列を使う方法では、
自分の力不足のため投影変換行列を作れないので断念。
座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。
ライブラリを作れる人はすごいと思った。
>>119氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。
>>124氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。

これでやっと>>65に取り掛かる直前の状況になってきた感じ。(感謝!)
もしうっかりスルーしてしまった項目があった場合、指摘あれば対応します。
0140SGGK ◆6pZCoAtaxk 2011/01/18(火) 23:06:54ID:IAGIcn+p
いざソースを書き直そうとするもののどこから手を付ければ良いのか見当がつかない。(いまさら何を言ってるのかと思われそうだけど…)
今出てる問題は、今までのプログラムにベクトルが使えるようにするために追加したクラス、関数(ベクトル同士の加算、減算とか)が
既に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;
}
0141SGGK ◆6pZCoAtaxk 2011/01/19(水) 23:11:10ID:VXY/IGc8
念の為もうひとつ確認しておこうと思い、テストプログラムでメインループの中に
Zキーを押したら選手のx座標を少しずつ増やしていく処理を追加してみた。
コンパイルして実行してみたら選手の絵がx方向に動いた。
3Dのビルボードの命令で描画した選手でもいままでの2D命令でやったとき同様に動く事が確認できた。

これで多少は安心してソースの書き直しに着手できる…と思う。

0142名前は開発中のものです。2011/01/20(木) 00:55:56ID:yl8ufdN1
C#囓った俺だったら、Vecrot3にToVECTOR()関数を追加するかな
Vector3 a;
VECTOR b = a.ToVECTOR();
って書けるようにする

普段はVector3を使って、必要に応じてVECTORを吐き出すというイメージ
VECTORからVector3への変換はしない、という仕様にした方が多分デバッグは楽になると思う
0143SGGK ◆6pZCoAtaxk 2011/01/20(木) 23:35:43ID:hnrlJRek
アドバイス、ありがとうございます。
確かに変数の型はどちらかに統一しておいた方が良さそうなので注意します。
変数はVector3に統一し、DXライブラリの関数の引数と出力の型がVECTORだった場合には、
引数に関しては、Vector3型をVECTOR型に変換した値を入力して、
VECTOR型出力に関しては、そのつど出力のx,y,z値をVector3型変数に入力すれば、>>140で言った
VECTOR型変数をVector3型に変換する関数は使わなくて済むので、これでやってみます。

今日のプログラム修正は、データのロード部分のみ。少しずつ進めていく予定。
0144SGGK ◆6pZCoAtaxk 2011/02/09(水) 21:46:30ID:iFm8dF3D
修正が思い通りに進まないので悩む。
また以前のようにクラス図の様な図を書いて整理してからソースを修正した方がいいのだろうかと思ったが、
エクセルで書こうとするととても時間が掛かるので、クラス図を書くためのフリーソフトが無いか探してみた。

UMLdraw フリー版とシェア版があり、フリーでは印刷できないので不可。
UMLmemo  フリー、印刷無し、ビットマップ出力ありだけど、書いたテキストの空白が改行マークで埋め尽くされて見づらいので不可。
astah* community 無償版、印刷あるけど大きさの調整不可、使い方が難しいので不可。

無理してastah* communityでクラス図もどきを途中まで書いてなんとなく思い始める。

「頑張ってプログラムソースを書き直した方がいいような気がする。」

この状況になるまで約2週間経過。無駄な事をしてしまったのかも・・・。

今は選手のデータ関係を修正中。
前スレ>>885で選手のデータを入力しやすくするために考えた関数を使わずに
テキストファイルからデータ(初期位置座標など)を読み込めるように出来ないか考えているところ。
14歳シリーズのC(VS2008編)に使えそうな例が載ってたので参考にしてみるつもり。
0145SGGK ◆6pZCoAtaxk 2011/02/11(金) 22:55:49ID:83OV5fAw
テキストファイルからの読み込みをやると言ってすぐ壁に突き当たる。
選手のポジション(FWなど)を列挙型定数にしているけど、これは読み込めないらしい。
全てのデータをテキストファイルから読み込む方法に変える必要はないと思うので、
これについては、選手のゲームスタート直後の座標だけをテキストから読み込めるようにすればいいかなと考えた。

選手のデータ関係の修正作業は途中だけど、ちょっと中止。(方針変更しすぎ・・・)

クラス図を途中まで書いたときに感じた事だけど、状態を表す定数の追加やそれを使った分岐が
ソースを見づらくしており、他にも理由がいろいろあって、このまま気になったところから直してコンパイルしてもたぶん地獄の修正作業になると思った。

全部直してからでないと修正途中でコンパイルしたところでバグしかでないぞと思っていたが、
最低限のファイルだけ残して、残りはとりあえずコンパイルの対象となるフォルダの外に場所を移しておき、
残したファイルだけでコンパイルし動作確認出来たら、移動したファイルをいくつか戻して修正して・・・を繰り返していけばよいのではと思った。

ということで、メインループ関係とフィールド画像関係だけ残して、
メインループ関係のソース内のフィールド以外(選手、ボールなど)に関する記述は//を付けてコメント化してコンパイルされないようにしてみる。

その状態でフィールドが画面に表示されるまでを目標にしてみる。
0146SGGK ◆6pZCoAtaxk 2011/02/14(月) 00:35:14ID:hwQDV7I3
11,12,13日の3連休では無理だった。(作業時間もすごく短いので・・・)
エラーの数は、20個→8個→30個と変わり、結局増えてしまった。
ゲームのループとそこから呼び出す関数はそんなに変更ないけど、
そこから先は思った以上に作り直しに近い感じなってしまった。
まだ先だけど、状態管理の定数を使った分岐処理もできればメインループの外に出したい。

一つの値があったとして、その値が自作のVector3型だったり、
ある時はDXライブラリのVECTOR型だったりするため、変換の方向を
Vector3 → VECTOR のみにしてソースを直すつもりだったのが想像以上に難しそうで、
プログラムソースもほとんど書き直しに近い感じになりそうなので、
この際思い切ってVECTOR型に統一して、ベクトル関係演算用関数については、
自作ではなくDXライブラリの関数を使って書き直していくやり方にしてみる・・・に方向修正。
0147SGGK ◆6pZCoAtaxk 2011/02/15(火) 23:25:56ID:mNvxRe1H
やっとフィールドの表示が出来た。
今まではソースを書きかえる時に元のソースの先頭に//を付けてコメント化して、
いざという時に前の状態に戻しやすくできるようにしていたけど、これをやめて
コメントを減らしてソースを見やすくするようにした。
戻りたいときにはバックアップのソースを見ればいいのだから。
バックアップはコンパイルした時に出来るファイルを含め全部保存していたが、
考えてみるとプログラムソース(ヘッダファイルとCPPファイル)だけを保存しておけばよかった。
数年やってて気付かなかった・・・。
0148名前は開発中のものです。2011/02/17(木) 01:19:58ID:s7Rh9Whn
パージョン管理ツールを使うと躊躇なく修正できるよ
subversionがおすすめ
0149SGGK ◆6pZCoAtaxk 2011/02/18(金) 00:25:58ID:0vaBqQnH
>>148
パージョン管理ツールの存在を知りませんでしたので勉強になりました。
「subversion ゲームプログラム」で検索してみるとかなり難しいツールのようです。
難しくてもインストールして触るところまではネットで調べて試してみようと思います。
ありがとうございました。

現在の進捗は、選手関係のファイルをコンパイル対象の場所に戻して、
>145でやりかけてた選手の初期化関係を修正中。
0150名前は開発中のものです。2011/02/24(木) 13:41:44.03ID:UHwXurlZ
ふと、このスレのこと思い出して帰ってきたけど
まだSGGK氏が頑張っててちょっと感動した
0151STG2011/02/24(木) 23:36:06.07ID:x+thpv+K
当分書き込んでないけど俺もいるぜー。3Dモデル全般の勉強でなかなか進まない
SGGK氏がんばってるなー
0152SGGK ◆6pZCoAtaxk 2011/02/25(金) 23:02:15.17ID:uikGAaqm
>>150
思い出して戻ってきてくれる人がいる事に感動です!
まだまだ頑張ります!
>>151
お久しぶりです!
お互い目標目指して頑張っていきましょう〜!!
0153SGGK ◆6pZCoAtaxk 2011/02/27(日) 00:13:37.96ID:wy4sbNmV
subversionの件、自分には難しすぎた感じ・・・。
でも、インストールして触るところまではなんとか出来た。

subversionで検索するとapachをPCにインストールして色々と準備設定が必要らしく、
これの設定の意味が全くわからず断念しかける。apachはサーバーのプログラムらしい。
VisualSVN-Serverというのも出てきて試そうとしたらポートの設定を求める項目があり、
理解せずに設定してパソコンを壊してしまうと大変なので断念。
「subversion apadh無し」とか「subversion サーバー無し」で検索するが、自分に分かりそうなページはヒットしない。
2、3日諦めてて、ふと「subversion ローカル」でやってみた。
TortoiseSVNというのがあるらしい。これはサーバに対するクライアント?のソフトらしく(←自信無し)、
これ単体でも自分のPCでバージョン管理が出来るらしい。
とりあえずホームページを探してTortoiseSVN本体(種類がいくつかありどれにすればよいのか迷ったがなんとか見つけた。)と日本語化ツールをダウンロードしてインストールした。
あとは説明ホームページを探して、リポジトリの作成、バージョン管理したいファイルのあるフォルダをリポジトリにインポートして、実際の作業を行いたいフォルダへ
リポジトリの内容をSVNチェックアウトする。
そして作業が終わったらSVNコミットするとリポジトリで変更が反映されてバージョン管理される・・・ところまで理解(自信無し)。
0154SGGK ◆6pZCoAtaxk 2011/02/27(日) 20:58:42.55ID:wy4sbNmV
しかし、このようなツールに即適応出来ないとなると、自分の目標である
オンライン3D対戦サッカーゲームの完成はいつになるのだろうかとふと思った。
バージョン管理ツールはサーバーに関する知識がある程度なければ操作の意味が理解できない感じ。
いまはこういうツールの存在を認識するに留め、出来る範囲で対応するしかなさそう・・・。
でも、ツールの難しさ→サーバーの勉強も早めに始める必要ありそう→急がないと10年頑張っても出来ないかもしれない
という危機感につながったので、とにかく諦めないようにしたい・・・。
0155SGGK ◆6pZCoAtaxk 2011/02/27(日) 22:11:45.89ID:wy4sbNmV
ソースを修正していて思ったが、C++で書いたプログラムは保守性が良くて再利用性にも優れてるような事を
どこかで聞いた記憶があるけど、そうなっている感じがしない。
たぶん自分の書き方に問題があるので、この機会に少しでも変えてみようと思った。

1.クラスのメンバ変数をpublicにして直接読み書きしていた。(変数毎に関数を書くのが大変だし、いちいち関数を使っていたら、その分処理速度が遅くなるのではと思った。)
  これを次のようにする。
  privateのメンバ変数にして変数毎にget関数、set関数を作ってこの関数を経由してアクセスする方法にする。
  そうすれば、例えば、座標系をx,y,zで管理していたのをVECTOR構造体に変更した場合でも
  get関数、set関数の修正で済む場合もあるので、修正に有利だし、
  get関数、set関数が書かれている場所を見れば、クラスのつながりも見えやすくなりそう。

2.get関数、set関数のような変数の取得、設定しかしない関数は行数が短いので、
  定義をヘッダファイルに書いていたが、定義はすべてcppファイルにまとめて見やすくする。
  それが出来ない例外もあった記憶があるけど、その場合は仕方ないのでヘッダファイルに書く。

3.変数の命名規則を考え、それに従った変数名を付ける。
  但し、最低限の規則にしておき、不完全でもあまり気にしないようにする。
  プログラムの修正が今より少しでもやりやすくなればいいのだから。
  今考えてるのは、メンバ変数は単語の区切りだけ大文字にして書く。
  メンバ関数も同じだけど、最初の文字だけは小文字にする。
  そして、メンバ変数の先頭には、m_ を付ける。
  メンバ変数で静的変数なら、ms_ を付ける。
  メンバ変数でポインタなら、mp_ を付ける。

これでやってみる。
0156名前は開発中のものです。2011/02/28(月) 22:34:38.63ID:g0je8oOR
メンバ変数をクラス外から頻繁にアクセスしなければいけないというのなら、
クラスの設計自体を見直すべきかもしれないよ。
もちろんケースバイケースだけど。
0157SGGK ◆6pZCoAtaxk 2011/02/28(月) 22:47:24.76ID:ard6obcB
今回のプログラム修正は前回と違って、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 )
を書いてやればよいとの事。

たしかに出なくなった!
0158SGGK ◆6pZCoAtaxk 2011/02/28(月) 22:54:11.50ID:ard6obcB
>>156
偶然同じ時間帯に書き込みしてた様です。指摘ありがとうございます。
今のプログラムはかなりごちゃごちゃして修正するたびに時間が掛かるようになってきたので、
もう少しクラス分けしてプログラムを見やすくしたいけど、どう分けるかは実はやってみないと分からないという状態ですが頑張ります!
0159名前は開発中のものです。2011/03/01(火) 22:55:52.67ID:Ux3/NF8u
なんか切磋琢磨な感じがいいね。
影ながら応援してます(`・ω・´)ノ
0160SGGK ◆6pZCoAtaxk 2011/03/01(火) 23:31:52.52ID:huwPkO/S
>>159
しばらくの間は今までのプログラムの書き換え作業のような感じになるけど、
やれるところまでは頑張ってみようと思ってます!

今までは1つのファイルに複数のクラスの宣言を書いていたのを、
1クラスにつき1ファイルに変えようとしたためか、ファイルがどんどん増え、
しかもほぼ全てのメンバ変数にget、set関数を用意するので作業量が膨大になりそうな感じ・・・。
0161SGGK ◆6pZCoAtaxk 2011/03/03(木) 22:36:53.71ID:dBNi9i4V
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の書き換えを進めていてフィールド表示は出来た。
今は選手関係の処理に着手中だけど、ここからは選手人数分のループや選手の移動関数などが絡んできて時間がかかりそうな予感。
一日の作業時間はとても短いので・・・。
0162SGGK ◆6pZCoAtaxk 2011/03/06(日) 15:46:57.88ID:CeMkUuli
>>155>>160の変更を同時にやろうとして収拾がつかなくなってきた。
>>160の>1クラスにつき1ファイルに変えようとした・・・のが良くなかったかもしれない。
クラスにあるメンバ関数をcppファイルの中で定義しようとしたときに、そのクラスのヘッダファイルに無い他のクラスのメンバ変数が含まれていたら
その含まれていないクラスのヘッダファイルをインクルードしたり、または前方宣言とかいうのを書いたりするんだけど、いまいちよく理解しないでやってるからなのか
どうもその辺が原因になってるような気がする。
それと移動処理のクラスは外部変数的な感じで外部に実体を定義するんだけど、
これも思い通りに出来ていないような気がする。ちゃんと書いたつもりなのに定義が無いといった意味合いのエラーが出る。
しかもアサーションがどうのこうのというエラーまで出てしまった(たしか1年ほど前にも似たエラーが出て大変だった)ので、
ここはいったん選手関係のファイルをひっこめて、もう一度フィールドの表示をさせるところまで戻して、
次に選手の画像データロード、選手の初期値テキストファイル読み込みの部分だけをコンパイル対象に戻して
動作が確認できるまでを頑張ってみる。
0163SGGK ◆6pZCoAtaxk 2011/03/07(月) 22:53:38.07ID:A2V6WI7O
エラーメッセージが出なくなった。
問題となっていた部分はいわゆるクラス同士が相互参照していて、どちらかのクラスが宣言や定義されていないと矛盾してしまうんだけど、
先に宣言するべきクラスもその後に宣言されるクラスが宣言されていないと宣言できないという問題。
これがよくわからなくて後宣言のクラスがクラス名くらいの簡単な場合は前方宣言を使い、
後宣言のクラスの関数まで記述されているときは、前に宣言しておくべきクラスのヘッダファイルを置けばいいような感じで理解してみるものの自信無し。
結局、処理を順番に見ていきこの行では何が決まっていないと不具合になるか考えて順番に設定していき、
なんとかクリアできた。(自信無し)
そのかわり、cppファイルは両方のクラスを一緒にせざるを得なかった。
でもこれでは将来、あのクラスの定義はどのファイルに書いたのか分からなくなるので、
空のcppファイルをつくり、その中に注釈行で、ここに書くべきcppファイルの中身はどこのcppファイルに書かれたのかを記述しておいた。

それにしてもエラーが出ないのも変なので、メインループの選手画像データロード、選手の初期化あたりを調べてみる予定。
0164SGGK ◆6pZCoAtaxk 2011/03/07(月) 23:18:19.01ID:A2V6WI7O
今見たら、先頭に//が付いて注釈行になっていた。
画像データロードの注釈化を解除してコンパイルしたらエラー無し。
だからといって安心とは限らないけど次にいく。
選手の初期化でエラー、アサーションとかイテレータがどうのこうのというメッセージ。
明日はここからということで・・・(寝)
0165名前は開発中のものです。2011/03/07(月) 23:44:02.03ID:XFYVl8h4
>あのクラスの定義はどのファイルに書いたのか分からなくなるので

クラスビュー(ソリューションエクスプローラのタブを切り替える)を使えば、
関数、変数の宣言箇所もしくは定義箇所が引き出せるよ。
0166SGGK ◆6pZCoAtaxk 2011/03/08(火) 23:20:28.47ID:pzJV24Q0
>>165
クラスビュー、使えました。クラスが一覧されて、ソース内の関数名をマウス右クリックメニューで定義を書いた場所に移動してくれるので便利です。
これがあれば、空のcppファイルを用意して定義先を書くような事をしなくて済みます。ありがとうございました!

今日は選手の初期化でエラーの件がまだ上手くいかず、選手22人分のデータ読み込みで
while文を使う時の条件文にファイルリードの成否判定を入れていたのを試しにはずしてみたら
エラーは出なくなったけど、選手の表示は無し。
試しに選手初期化処理直後にブレークポイントを置いて処理を停止させてからデバッガ(使い方自信無し)で見ると、
どうやら22人分のデータの読み込みがされていない様子。
0167名前は開発中のものです。2011/03/09(水) 04:35:12.92ID:WaGJIOge
>>163についてちょっと気になったので質問させて下さい
クラス同士が相互参照という事ですが、なぜそんな構造になってしまったんですか?
0168SGGK ◆6pZCoAtaxk 2011/03/09(水) 23:02:50.72ID:u9XYEX3Y
>>167
これは書籍(14歳シリーズ)を参考に書いた処理で、
今も自信ないけど、以下の様な感じで相互参照のクラスが出来てしまってます。

選手22人分の移動関数をループから同じ書き方で呼び出しても、
異なる移動関数を選択できるようにしたいという目的があり、まず移動関数を持つ基底クラスを作成。
その基底クラスの継承クラス内で移動関数をオーバーライドしてその関数を呼び出せれば様々な移動関数を使えるはず。
継承クラスのオブジェクトのポインタを格納するための「 基底クラスのポインタ型を持つメンバ変数を選手のデータ内に持たせ 」て、
そのポインタから移動関数を呼べば良い。
選手のオブジェクトからそのポインタを使って移動関数を呼ぶ時に選手のアドレス(thisポインタ?)を引数に持たせてやり、「 移動関数はそのthisポインタから選手の座標などのデータを呼び出し、更新する」。

上記の「」のところで、
選手のクラスは移動関数のクラスのポインタをデータに持つためには、選手のクラスが宣言される前に移動関数のクラスが定義されてなくてはならないし、
移動関数のクラスが選手のオブジェクトのポインタを通して選手のデータを使うには、移動関数の宣言より先に、選手のクラスが宣言されていないと選手の座標データを使った関数の中身が書けない。

・・・というのが相互参照になった理由です。
0169名前は開発中のものです。2011/03/09(水) 23:20:56.09ID:Vm9YGKI1
宣言前のクラスのポインタをメンバ変数として宣言したければ、

class CclassA{
  class CclassB *pB;
};

class CclassB{
;
};

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

>>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人分のデータを指し示すような感じだけど上手くいかなかった。
0175STG2011/03/21(月) 00:44:40.91ID:TWP+xA6r
おお、ご無事で何より
0176SGGK ◆6pZCoAtaxk 2011/03/22(火) 00:28:58.94ID:yLNIaGwb
STG氏もご無事で何よりです。
災害関係で協力できる事をやりつつ、自分はプログラムをいままで通り続けていくつもりです!
0177SGGK ◆6pZCoAtaxk 2011/03/23(水) 23:45:47.51ID:0VAAbS39
これから初期化するということはまだデータを入れるコンテナクラス(配列みたいなもの?自信無しで使ってる)が
22人分用意されてないはずなので、
while(it!=m_FieldPlayerList.end()){データ初期値入力}
では、条件が満たされず、データ初期値入力に進まないような気がした。
試しに
if(it==m_FieldPlayerList.end()){printfDx( "リストが最後 \n") ;}

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

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

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

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

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

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

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

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

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

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

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

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

以下日記:中身の何も無い板ポリユニット表示した。
ちょっとソースを綺麗にしようと思ったら
同じようなクラスが2個出来上がって汚くなった。
どうしてこうなったorz
0189名前は開発中のものです。2011/04/02(土) 08:01:26.08ID:0qk/4v/F
メンバ変数を読み書きして外で処理するのではなく、
メンバ関数にハンドルを渡して中で処理させる設計に変えるといいんじゃないかな。
01901792011/04/02(土) 21:31:56.76ID:YKJBI5s3
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();
0191STG2011/04/02(土) 21:33:37.28ID:piT73rrN
Get、Setはほとんど使ってないなぁ
大抵>>189の人のようにメンバ関数からのみアクセスするだけで済むようにしてる
クラスが何をしているかと再利用性と扱いと管理が楽になってよい
0192SGGK ◆6pZCoAtaxk 2011/04/03(日) 00:07:22.30ID:1D3iDnp3
自分は>>155からget、set関数方式への書き直しを進行中だけど、書き直しにものすごい時間がかかってます。
そして今更ながらそのように直すメリットを見つけられないような気がしてきて不安だけど、
もうほとんど書き直してしまったし、ソースも多少見やすくなったような感じはするので、このまま頑張ってみます!。

今日は、ボール関係をなんとか実装したけど、ボールはフィールド中央に表示され続けるのみとし、まだ蹴れないようにしておく。
レーダー関係は何故かレーダーが表示されないので、原因を調べているところ。
0193SGGK ◆6pZCoAtaxk 2011/04/03(日) 22:57:24.10ID:FQAs1SPd
昨日はget、set関数方式のメリットを見つける自信が無いような事を書いてしまったけど、
ネットで検索してみると、異常な数値がセットされないようにset関数の中でチェックしたり、
get、set関数のどちらかをあえて書かない事でプライベート変数を書き込み専用、読み込み専用にすることも可能といったメリットがあるとの話。
自分の場合、今までx、y座標を別々の変数にしてたときは、(オブジェクト).x のようにしてたのが、途中でVECTOR構造体を使おうということになって、
そうなると今までのソースを(オブジェクト).x から(オブジェクト).(構造体変数).x に全部書き変えなければならなくて面倒だったので、
これが、(オブジェクト).getX() にしてあったら、getX()の中身を return x から return(構造体変数).x にするだけで済んだのでは?との思いがあって、
同じような事がそう何度も出てくるとは思わないけど、get、set関数に変えてみたという話。
完全に直しきれたかどうかは自信なし。

なんとか>>185の修正が終わった。
但し、ボールは中央表示のみで蹴れない。
選手もマウスカーソルを追うのみ。
画面は固定。
レーダーが最初画面に表示されなかった原因は分からなかった。
レーダーの座標はベクトルのx,yだけを変数記憶用に使おうとしていたけど、
あえてやめて、以前のx、yの2変数を用意して、そこに記憶させた。なんとなくだけど。
とりあえず、いろいろな条件分岐というか状態遷移のようなプログラムを書く直前の状態までを書いたような感じ。
ここまでを一区切りにするつもり。
01941792011/04/04(月) 00:25:07.83ID:1C3wAcIh
最近、処理してから数値返したりする場面が出てきたような気がする
が、無駄な関数ががんがん増えてる気がしないでもない。
ソースを綺麗にする作業は挫折しました。。。

>>193
表示したら動かしたくなりませんか…?w
テンション上がって強引に動作実装、
→バグだらけ→バグ取りでテンションダウン→汚いソースの出来上がり
なんてやってしまうんですが。

日記の(ry
ユニットをマウスで移動できるようにした。
マップの大きさをとりあえず適当な数値で仮定して
ミニマップレーダーを作ろう…。
0195名前は開発中のものです。2011/04/04(月) 01:24:50.54ID:zaeNjYQd
やっぱりこのスレがいちばん居心地いいなあ
月曜火曜休みなので、この連休は本気出す!
寝て起きたら、もやもやしながらゲームや2chに明け暮れずVisualStudio立ち上げて何か事を起こす!

小難しい本読んでたら、ホントに小難しすぎておもろうてやがて悲し
教科書を超えて念仏レベルで、ただ文字を追いかけてるだけ


すべてのメンバ変数privateにして無条件ゲトセトは俺も馬鹿だなと思う。
そんなことするくらいならpublicでいい
利点なんて、挙動不審なときに一括検索で代入してるところ洗い出せるぐらいかなと思ってる
0196SGGK ◆6pZCoAtaxk 2011/04/05(火) 00:03:40.76ID:S0hRYVkN
>>194
以前、動くところまで書いたのですが、試合前半後半で選手の向きを入れ替えたりとか
いろいろ条件を加えていくうちにソースがわかりにくくなってきた事があったので、
もしまたそうなっても、今の状態からならやり直しやすいだろうと思い、ここを区切りにして保存しておこうと思ってます。
>>195
ともに頑張りましょう!

get、set関数の件、たしかにそのとおりで、直すときは検索つかえばいいんだし、これから書く部分はpublicにしてみます。

今日は、プログラムをリリースモードでコンパイルしようとしてバグ。
どうもユニコードとかの文字コードの何かが原因らしいけど、ネット検索で見つけたコンパイラの設定画面が表示されず、
しようがないので、ソース内の”文字”をTEXT(”文字”)にしたという例を真似してみたり、
他にもいろいろやってみた結果、コンパイルは通ったけど、デバッグモードでは22人の選手が表示されるのに、
リリースモードでは2人しか表示されない…。解決には時間かかる予感。
0197名前は開発中のものです。2011/04/05(火) 02:28:26.89ID:t5qV24Bh
あーそういえばC++は文字列が鬼門だよな
UNICODEかSHIFT-JISかっていうのは、要はwcharかcharかって事だ
だからwchar〜charを変換する関数作っておくといいかもしれない

ちなみに俺は基本的に文字列はstringで扱って
wcharとかcharを要求する関数を使う時にstringから渡せるような作りにしてる
もうしばらく使ってないから、マクロで組んだか関数だったかは忘れたけど
0198名前は開発中のものです。2011/04/05(火) 02:29:52.15ID:t5qV24Bh
あー
使ってないっていうのは、C++触ってないっていう意味ね
0199SGGK ◆6pZCoAtaxk 2011/04/06(水) 00:31:39.07ID:0VHuOF2K
な…なるほど、変換する関数が必要となると、それは自分には難易度の高い対策方法なので、もうしばらく考えてみます。
もしかするとコンパイラがこわれてしまったかもしれない様子。
0200名前は開発中のものです。2011/04/06(水) 01:27:19.44ID:T5BENq16
>>199
MultiByteToWideChar とか WideCharToMultiByte とかいう WindowsAPI を呼べば
SJIS ←→ UNICODE 相互変換はできる
02011792011/04/06(水) 23:50:41.54ID:Qi29hSL7
VC++のデバック関数でなんか開放忘れのメモリリークを簡単に見つけられるとか
WEBに乗ってたのを試したら余裕でリークしてた。。。
直してたら今度はdeleteがエラー出す、なにこのスパイラル
本体が進まない罠
0202SGGK ◆6pZCoAtaxk 2011/04/07(木) 00:03:18.39ID:1CreScRP
やっぱり自分は永遠に初心者のようです…。

>>200 MultiByteToWideChar、調べてみました。
引数にコードページというのがあって、いきなりここから躓いてしまうレベルなので、APIの難しさがよくわかりました。
感謝します。いつかもっと勉強してAPIの領域まで入っていけるようになってみたいです。

まず、DXライブラリを疑ってみる。
DXライブラリのホームページを見ると更新履歴に何箇所かユニコードがどうのこうののバグを解決みたいな事が
書いてあったので期待して最新のバージョンにしたけど、こちらのバグは解決できなかった。
文字コード関係とは別に気になっていた現象があったので、今日はこれの解決を試みる。
コンパイラの下の画面にいつごろからか、「コマンド プロンプトで 'VCExpress / resetskippkgs' と入力してください」という文字が表示されるようになって、
でも2D座標系のプログラム書いていた時にはデバッグ、リリースモードどちらもコンパイル出来ていたので気にしていなかった。
でも、もしやと思い、コマンドプロンプトで試したが、VCExpressは外部コマンドでも内部でも無い…みたいなメッセージが出てうまくいかない。
resetskippkgsを検索してもハードディスク内には無い様子。
昨日、コンパイラがこわれてしまったかもしれないと書いたのはこの事。
やむを得ず、VC++2008をアンインストールして、もう一度インストールしてみることにした。
「'VCExpress / resetskippkgs' と入力してください」のメッセージは出なくなった。
コンパイルしてみると今度は、「error LNK2001: 外部シンボル "_main" は未解決です」というエラーメッセージが出た。
これも苦しんだけど、なんとか運よく今日中にクリア出来た。
でも、今度は画面がおかしくなってしまったので、明日頑張ります。
0203SGGK ◆6pZCoAtaxk 2011/04/07(木) 00:21:04.82ID:1CreScRP
>>201
メモリリークは難しくてわかりませんが、バグの為に本体を進められない気持ちは自分にもよくわかります。
1日ソースから離れてもう一度見るとふと原因が分かったりすることもあるので、お互い頑張っていきましょう!
0204名前は開発中のものです。2011/04/07(木) 02:08:35.75ID:ATP6AwEd
>>201
さあ早くスマートポインタに移行するんだ
0205SGGK ◆6pZCoAtaxk 2011/04/08(金) 00:00:34.46ID:WGj3ab+N
昨日は説明が不足していたので補足。
コンパイラがこわれたのではと思ったのは他にも理由があり、プロジェクトのプロパティ画面が出てこなかった事。
画面を出そうとすると、共通言語ランタイムに問題があるといった感じのメッセージや.NETがどうのこうのというメッセージが出てどうにもならなかったので、
コンパイラのアンインストール、インストールに踏み切った訳。
その結果、プロパティ画面を出せるようになり、14歳シリーズVC++2008編にあるやり方で再設定できるようになった。
設定は文字セットとランタイムライブラリのところ。
文字セットはマルチバイトセットを使用する。
ランタイムライブラリは、Debug構成ではマルチスレッドデバッグ、Release構成ではマルチスレッドにすればOK。本にやり方が書いてなかったら自分は何も出来ない…。

たぶんなんらかの原因で文字セットの設定がユニコードに変えられてしまったのがバグの原因だったのかなと思う。

そして、「error LNK2001: 外部シンボル "_main" は未解決です」が出る件。
これは、プロジェクトを作成するときに設定画面でWin32プロジェクトを選択すべきところを間違えてwin32コンソールアプリケーションを選択したから。
コンソールアプリケーションだとプログラムの始まりはmain関数である必要があるのに自分のソースはWinMainだから、それがエラーになった原因だった。
14歳シリーズの最初の方のページ見て設定したのが間違えた原因。
本の最初の方はコンソールアプリケーションで解説しようとしてたから。そのとおり設定すれば当然間違える。

最後に画面がおかしい件、おかしいというのはフィールド画面に貼ったはずのBMP画像が表示されずに灰色になってしまう状態になってしまってること。
これは、フィールドモデルをメタセコイアで表示させて運よく気が付いた。
原因はフィールドモデルに貼るテクスチャ用BMPファイルの置き場所が実際の場所と異なっていたこと。
何故そうなったかというと、コンパイラをインストールしなおしたときにゲーム作成関係フォルダをどうせだからと思って、
もう少し上の階層に移してしまったから。

これですっきり。
02061792011/04/09(土) 00:10:09.82ID:rY2c9kYC
>>204
スマートポインターもString系も便利そうだなぁ
次回ソース再構築するときに移行しようと思う
今はちょっとやる気がデナイ…とりあえずメモリリーク直ったぽいし(ぇ

>>205
バグ取れるとすっきりするよね
こっちもすっきりしたよ。


とりあえずミニマップレーダー表示した。
次は自分の手持ちのユニットリスト作るかな−。
あれ?なんかまわりばっかり作ってる気がするな・・・。
0207SGGK ◆6pZCoAtaxk 2011/04/10(日) 00:36:34.94ID:TFhm8weY
>>206
お互いバグとれて良かったですね。
プログラムはバグ取れなければ先に進まなくなってしまうのでいつも冷汗です。

今日はファイルをまとめてUP
前から見てる人は知ってるので大丈夫だけど、最近見た人がすごいの作ってると誤解されてると心配なので昔UPしたのもUPしてます。
間違えて変なファイルとか書き込みとかしてるかもしれない…

SGGK019 : 2Dで書いていた時の最終版
SGGK020 : 019に体力ゲージ付けた
3D_TEST : >>139で言っていた >それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど ←のテストプログラムの実行ファイル 
3D_TEST説明 : >>139で言っていた >それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど ←のそれを表す図
SGGK024 : 今書いてる最新版、選手がマウスカーソルを追いかけるだけ

置き場所
ttp://ux.getuploader.com/sggk/
0208SGGK ◆6pZCoAtaxk 2011/04/10(日) 23:13:37.24ID:Opp/fMA0
今日は進捗無し。来週は現実の方がいろいろあり、作業が進まない予感。
とりあえずの目標は、2D座標系でやったのと同じ事が3D座標系でも出来るようにしたい。
時間、得点表示、前半、ハーフ、後半の切り替え関係などの実装を予定。
2Dの時はメインループの中にそのまま処理を書いてしまったため、メインがすごい長文になり読みにくかったので、
メインからは関数が呼ばれて、その関数の中に色々処理を書くようにしたい。
それと昨年末に読みかけだった3Dの本をもう少し読んでみたい。
今のままだと当たり判定をどうすればよいのかわからないのでそのヒントを探すのが目的。
02091792011/04/12(火) 01:29:16.27ID:iONqvBHy
動かしてみました。普通にもりもり動きましたよ〜
2D版でボール蹴ってゴールまで持っていこうと思ったけど体力切れて動けなくなったw
説明JPGは良く理解できなかったぜ…


日記の裏:
前回ユニットリストを表示させようとかなんとか言ってたけど
気がついたらWINDOWシステムを作っていた
何を言ってるか分からないと思うg(ry

なんか難しい…最初から固定表示にしとけば良かったんだ。。。
0210SGGK ◆6pZCoAtaxk 2011/04/13(水) 05:32:57.65ID:c5UQB0E3
>>209
使ってみてくれてありがとうございます。
体力ゲージについては今度実装するときには修正してみます。
説明JPGについては今見直してみると説明というよりは説明図だけのような作りになってるので
また似た事をやるときがあればもう少し改善しようと思います。
関数はDXライブラリのものを使っていると注意書きしておけば良かったと今反省。

ユニットリストがマウスドラッグ出来るようになってるとか?
もしかして他者製ライブラリを使わないAPIいろいろ使うWINDOWSプログラミングで組んでると想像。

>208の「2D座標系でやったのと同じ事が3D座標系でも出来るようにしたい」に向けてちょっと復習。
2Dでやってたプログラムソースは、時間、当たり判定、状態遷移の3つ(まだ他にもあるかもしれない)がソースのあちこちで絡み合いワケがわからなくなってきていたので見やすくしたい。
とりあえず、選手関係のソース見て、どんな位置関係にオブジェクトがあればお互いデータやりとり出来てるとか、関数使わないとアドレス渡せないのかとか、
そういったコピペでやり過ごしてきた部分を見直してみた。
なんとなくこういうのはノート&手書きの方が頭に入りそうな感じがしたので今回はエクセル使わないでノートに手書きでやってみた。
ほんの少しだけ頭の中が整理されたような気がしたので、まず画面に試合経過時間を表示できるようにしたい。
時間は条件分岐に使うので、時間表示を優先したのが理由。
02111792011/04/14(木) 01:35:15.18ID:euSLNc/U
アレダデスヨネ、カメラからマウスの座標にレイ飛ばしてYが0になる場所を求めどうのこうのってヤツ。
それが良く分からなかったらから2Dに逃げた(ぉぃ
イエ、ハイ、勉強するのが嫌だっただけですゴメンナサイw


メニューバーをマウスドラッグで動かせるように〜ってヤツですね
WIN APIにその変の便利なのあるかもしれないけどWIN API良く分からないので
自前でメニューバーのボックス(唯のポリゴンの板です)とマウスポインタと当たり判定して
マウスクリック中なら移動させるってのをやろうと思った。

一応移動させるのはできたのは出来たけど、
バーどうしが重なったりすると両方動いたり下に潜り込んだり…。
位置固定にして、表示と非表示の切り替えだけにすりゃ良かったナァ、と。
0212SGGK ◆6pZCoAtaxk 2011/04/14(木) 23:22:03.79ID:XhLhjLQN
WINDOWは難しそうなテーマですね。
画面内のWINDOW全てが奥側から数えて何番目にあるかを記憶してその順番に描画してみるとか。
マウスでクリックしたら奥から一番最後の番号が付けられるとか。
でも複数のWINDOWが重なったらどうすればよいのかわからなくなってくる…。

今日は作業時間ほんのわずか。
2Dの最後のプログラムSGGK019(020はソース見づらいので使わない)のdrawGameMain()関数から抜き出した時間関係の行を使って、
GameTimeクラスを宣言してみた。このクラスのヘッダファイル作成作業がまだまだ途中。

それと>>207でUPした理由の補足
完成度に対する誤解を最小限にしておきたかった他に
自分が何らかの理由により作成続行不可能になった時、たとえわずかでもここで得たものを残しておこうかな〜と思ったこと。
作業を続けてソースが複雑化し、結局やり直すことになった場合、このSGGK024の段階が丁度良いので区切りとして残しておきたかったこと。
0213SGGK ◆6pZCoAtaxk 2011/04/14(木) 23:30:34.53ID:XhLhjLQN
最後から2行目は自分のプログラムの進捗的なものがわずかという意味であり、
ここで得たものがわずかという意味では無いので念の為。
ここではいろいろ多く学ばせてもらってますので…(汗;
読み直してあせった。言葉って難しい。
0214SGGK ◆6pZCoAtaxk 2011/04/15(金) 23:10:40.56ID:2Uog82ch
>>210の試合経過時間は未だ実装出来ず。
結構難しいかもしれない。
02151792011/04/16(土) 03:34:02.42ID:WryT+KpS
IF文とboolフラグのオンパレードになってきた…orz
とりあえずの×ボタンは簡単に実装できたけど、
消したのを表示するのは作ってない罠


経過時間は1フレーム毎の時間を求めてカウンタに足していくか引いてくか
するのがいいんじゃないカナー
gettimeとかの関数で取り出したのをそのまま使うと
ポーズとかややこしい事になりそうw

static int frame_time , time_know, time_back = GetNowCount(); //初期化

if(time_back != know_time;)time_back = time_know;
time_know = GetNowCount();
frame_time = time_back - time_know;

この3行を毎回回しとけばframe_time が求められるので、後は試合時間にframe_time を足してくだけ。
試合停止中は足さなければ良い。
リセットするときは試合時間を0にすれば良い…と。
02161792011/04/16(土) 03:42:37.35ID:WryT+KpS
あ、初期化ミス…↓こうでしたorz

//初期化
static int frame_time = 0
static inttime_know = GetNowCount() - 1;
static inttime_back = GetNowCount() - 1;

//1フレームの時間を求める処理
if(time_back != know_time;)time_back = time_know;
time_know = GetNowCount();
frame_time = time_back - time_know;
0217名前は開発中のものです。2011/04/16(土) 15:03:11.50ID:aTo50Zu7
サッカーゲームのような、フレームごとの計算を繰り返していくタイプのプログラムの場合、
経過時間の管理は、実際の(現実世界の)経過時間ではなく、
処理したフレーム数で管理するほうが、合理的な結果が得られると思います。
0218SGGK ◆6pZCoAtaxk 2011/04/17(日) 00:44:52.38ID:mWz5D8BJ
>>215,216
ありがとうございます。
自分はいままでbackとknowに相当するコードをなぜかソース内の別々の場所に書いてあり、ソースが読みにくくなっていたけど、
これを見て3行続けて書ける事が分かりましたので、早速修正してみます。

今回はメインループ内に書かれるソースコードを減らしてみたくてこの3行に相当する機能をクラス化することに挑戦。
結果、クラス内の行数はかなり増えてしまうけどreleaseモードでは成功。
debugモードでは時間表示が正しくなく、プログラムを終了させると「ヒープが壊れていることが原因として考えられます。」のようなエラーメッセージ。
いちおう半分はうまくいってるので、ゆっくり考えるつもり。

>>217
アドバイスありがとうございます。現時点のプログラムソースでは、
1フレーム計算毎に1ずつ増えていく変数を用意し、これを使って選手のアニメパターンを決定したりしてますが、
上記のdebugモードでの不具合が取れなかった場合、フレームタイムxループ回数を時間に単位変更して画面表示するようなやり方も検討してみます。
0219SGGK ◆6pZCoAtaxk 2011/04/17(日) 01:48:23.54ID:mWz5D8BJ
そういえば以前にもdebugモードでダメでreleaseモードではOKというのは、
releaseモードではチェックがされていないだけなので、バグが無いという意味ではないとこのスレで教わったのを思い出す。

まだ、この前UPしたバージョンにちょっと書き足しただけなんだから、
どこかに内容的な間違いがあるはずと思い良く見てみると1か所あったので直してコンパイルしてみたら直った!
これがなんでヒープ壊れる事につながっていたのかは結局わからずだけど、
とりあえずすっきり。(寝)
0220SGGK ◆6pZCoAtaxk 2011/04/17(日) 23:21:42.93ID:VrjRr7OP
昨日は起きていたのがいつもより遅かったので書けなかったけど、
昨日の間違いというのは、メインループ内のゲーム処理関数の最初の行に書いた2行の順序が逆だったこと。
(間違い)
m_Time.countGameTime();
if(m_Time.m_GameTimeState==CONTINUE){m_Time.displayGameTime();}
(正解)
if(m_Time.m_GameTimeState==CONTINUE){m_Time.displayGameTime();}
m_Time.countGameTime();

時間の測定はループ1回毎に時間を測定して、前回のループでの測定値との差を毎回足していくんだけど、
1回目のループでは前回のループの測定値がまだ存在しないので、差を計算しては困るので、
時間クラスに2つの状態STARTとCONTINUEという定数を定義しておいて、
初期値はSTARTにしておき、STARTの場合には差を計算しない。CONTINUEなら差を計算する。
1回目のループではSTARTなので時間の測定だけして、差は計算しない。そして状態をCONTINUEに変更する。
そしたら2回目のループ以降は差を計算してくれる。
間違いの例だと1行目で状態がCONTINUEに変更されてるので、まだ差を計算してないのに時間を画面に表示しようとしてしまう。
正解例の順にするとバグが出なくなった。
実は>>216で初期化値がGetNowCount() - 1となっている理由がわからなくて全部0にしてしまったので、
そこに何か関係があるのかと思ったりもしたけど、上記の方法でバグが出なくなったのでたぶん大丈夫。
02211792011/04/18(月) 02:43:15.47ID:OTLjhXG7
最初の初期化で GetNowCount() - 1 を入れてるのは
最初のループ部分でバグった値を入れないようにするためですw
なのでGetNowCount() を取っちゃうと当然バグります
-1 は入れなくてもいいのですが最初のループに最速で到達しても1msを返すように設定してあるだけです

初期値に0を入れてしまうと
if(time_back != know_time;)time_back = time_know; //一回目は0 と 0 の比較になるので変化無し
time_know = GetNowCount();            //know が xxxxxxxxxxくらい?の数値になる
frame_time = time_back - time_know;        //一回目はbackは0のままなので -xxxxxxxxxx桁くらいの数値が引かれてフレームタイムが-値でバグる

プログラム開始から終了までずっと測ってる前提で作ったので(タイトル画面等でも測定だけしてる)
ある部分だけ測るという場合はフラグ管理する、初期化を呼び出す等必要ですねぇ

ここまで書いてあれなんですが>>217さんの言う通り
経過時間 += 17ms 等で固定した方がいいかも知れないで
まぁFPSが固定されてるなら問題は出ないので余り気にする事も無いカモ…。
02221792011/04/18(月) 02:55:13.67ID:OTLjhXG7
あれ?
式間違ってるじゃん・・・/(^o^)\
ゴメンナサイ3行目 backとknow逆デシタ

f(time_back != know_time;)time_back = time_know; //一回目は0 と 0 の比較になるので変化無し
time_know = GetNowCount();            //know が xxxxxxxxxxくらい?の数値になる
frame_time = time_know - time_back;        //一回目はbackは0のままなので xxxxxxxxxx - 0 でxxxxxxxxxくらいの値がフレームタイムに入る


ついでにちら裏:
WINDOWぽいのはなんとか形になった気がする
ので次の作業へー
フィールドの資源地とか基地ぽいの作るカナー
0223SGGK ◆6pZCoAtaxk 2011/04/18(月) 23:13:36.71ID:kLP7Gc7/
>>221,222
ループが最速で到達した場合というのは想定してなかったので勉強になりました。
ありがとうございました。

今日は次の目標を考えて終了。
次の目標は、前半、ハーフタイム、後半、試合結果表示の4つの状態遷移実装。
0224SGGK ◆6pZCoAtaxk 2011/04/19(火) 22:59:14.08ID:Y5+hNJcp
状態遷移は以下のような感じで実装。SGGK_019のソースの頃に比べれば短くなった感じ。
でも、これに選手の前半後半の攻撃方向入れ替えや得点表示などを組み込むとなると混乱しそうな予感。

switch (m_MatchState) {
case FIRST_HALF:
if(m_Time.m_TotalGameTime >= FIRST_HALF_GAME_TIME){
m_MatchState=HALF_TIME;
m_Time.resetGameTime();
}
break;
case HALF_TIME:
if(m_Time.m_TotalGameTime >= HALF_GAME_TIME){
m_MatchState=SECOND_HALF;
m_Time.resetGameTime();
}
break;
case SECOND_HALF:
if(m_Time.m_TotalGameTime >= SECOND_HALF_GAME_TIME){
m_MatchState=RESULT_DISPLAY;
m_Time.resetGameTime();
}
break;
case RESULT_DISPLAY:
if(m_Time.m_TotalGameTime >= RESULT_DISPLAY_TIME){
setGameState(GAME_OVER);
m_Time.resetGameTime();
}
break;
default:
break;
}
■ このスレッドは過去ログ倉庫に格納されています