1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
175: STG [sage] 2011/03/21(月) 00:44:40.91 ID:TWP+xA6r おお、ご無事で何より http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/175
176: SGGK ◆6pZCoAtaxk [sage] 2011/03/22(火) 00:28:58.94 ID:yLNIaGwb STG氏もご無事で何よりです。 災害関係で協力できる事をやりつつ、自分はプログラムをいままで通り続けていくつもりです! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/176
177: SGGK ◆6pZCoAtaxk [sage] 2011/03/23(水) 23:45:47.51 ID:0VAAbS39 これから初期化するということはまだデータを入れるコンテナクラス(配列みたいなもの?自信無しで使ってる)が 22人分用意されてないはずなので、 while(it!=m_FieldPlayerList.end()){データ初期値入力} では、条件が満たされず、データ初期値入力に進まないような気がした。 試しに if(it==m_FieldPlayerList.end()){printfDx( "リストが最後 \n") ;} を while文より前の行に入れてみると、画面に「リストが最後」と表示されたので、 そもそもデータが入力されていないとこまでわかり、ふと以前のバックアップを見ると for文のループ22回指定で入力していた。 間違えた方のやり方は既にデータが22人分あり、選手移動処理するときに 22回繰り返す場合に使うやり方だった。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/177
178: SGGK ◆6pZCoAtaxk [sage] 2011/03/24(木) 22:43:11.16 ID: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"); ←正解 現在は、選手画像がマウスカーソルに付いたまま描画される状態なので、 なぜフィールドの初期位置に散らばった状態からマウスカーソルを 追いかける動きにならないのか調べているところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/178
179: 名前は開発中のものです。 [sage] 2011/03/29(火) 00:57:27.76 ID:W5EaQ6/R 久々にまたがんばろうかな っと思ったけど この板すんげぇ過疎ってんのね・・・ このスレにちょいとお邪魔してもいいかな とりあえず2DでSLGぽいのを目指して。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/179
180: SGGK ◆6pZCoAtaxk [sage] 2011/03/29(火) 22:55:26.00 ID:KAewGcjL >>179 よろしくおねがいします。 お互い頑張りましょ〜! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/180
181: SGGK ◆6pZCoAtaxk [sage] 2011/03/29(火) 23:05:44.67 ID:KAewGcjL >>178の問題は解決。 選手の現在位置を表すベクトルに1ループあたりの移動距離分の大きさを持つベクトルを足すべきところを 間違えて、選手の移動目標となるマウスカーソルの位置を表すベクトルに足していたのが原因。 そして現在の問題点は、フィールドと選手の座標にずれがある事。 カメラの注視点を変えて向きを変えるとフィールドはそれに応じて画像が変化するけど、 何故か選手の出てくる場所はフィールドに関係なく毎回同じで変化していない感じ。 しかもマウスの指し示す位置座標もフィールドの変化と連動していないようで毎回同じ状態。 カメラの関数はループ処理の最初に書いてあるのでそのあと描画されるものはすべて カメラの状態に合わせて描画されると思っていたけど、何か勘違いをしている感じ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/181
182: 179 [sage] 2011/03/29(火) 23:53:00.41 ID:W5EaQ6/R >>180 いつまで続くか分かりませんがヨロシクお願いします とりあえずVC++2010Expressインストして 昔の何かのつくりかけのソースをこねくり回してます。。。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/182
183: SGGK ◆6pZCoAtaxk [sage] 2011/03/30(水) 23:05:43.60 ID:oI0LR1GW このスレは次の書き込みが数か月後になっても全然OKなので自分はマイペースでやってます。 進捗が0になると突然書き込み0になったりしますので、その時はスミマセン・・・。 昨日の問題は解決。 原因は、選手の移動関数の最初の行にカメラ関係の関数、 SetCameraPositionAndTarget_UpVecY( VGet(0,680,340), VGet(0.0f,-100.0f,0.0f)); を書いてあったため、これがループの最初に書いてあったSetCameraPositionAndTarget_UpVecY(略)と重複してしまい、 両関数の注視点が異なっていたのでズレが生じた事。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/183
184: 179 [sage] 2011/03/31(木) 00:56:17.41 ID:MmtwFkf5 こっちの場合熱が冷めるとマズイ事になる予感w なので、その前にある程度作れれば・・・と思ったり。 こねくり回したソースはミートソースになってしまった。 食わせたらウィンドウは一応出た。 これでようやく次の作業へ…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/184
185: SGGK ◆6pZCoAtaxk [sage] 2011/03/31(木) 23:16:16.15 ID:K/Mu7f7g こちらは、balldata.h を作成。 2次元でやってた時のヘッダファイルに修正を加えて作成。 メンバ変数をプライベート変数にしてget関数、set関数の宣言まで。 このような修正をボール、ゴール、レーダー関係のファイルに行わなければならず、 残りは全部で8ファイル。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/185
186: 179 [sage] 2011/04/01(金) 00:43:22.10 ID:wHWoDhco なんという手間のかかる作業を。。。 グローバルで適当に書いて放置してる誰かさんとはえらい違いだなぁ ぃゃ直しますよ…後で…イツカ,タブン。 今日の作業:マウスアイコン作って動かせるようにした。 なんかsprintfとかの警告でまくってるけど気にしない。 ユニットとマップの大きさどうしよかな…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/186
187: SGGK ◆6pZCoAtaxk [sage] 2011/04/02(土) 00:05:59.97 ID:7Uv0Gp7Y ファイルを分けているのは14歳シリーズC++本の影響でたまたまこのやり方しか知らないのが理由。 このやり方だとオブジェクトを増やす毎に新しいファイルを増やさなければいけないので大変だけど頑張ってみます。 今日は進捗なし。自信ないけど土日で>>185のファイルを片づけたい。もう4月…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/187
188: 179 [sage] 2011/04/02(土) 01:41:08.85 ID:YKJBI5s3 オブジェクト毎に1ファイルというのはこちらも似たような感じなんですが、 その…GET、SET関数書くのがメンドくてそのままパブリックで書いて直接・・・ なんてダメな事をやってる所を放置したままで・・・w 以下日記:中身の何も無い板ポリユニット表示した。 ちょっとソースを綺麗にしようと思ったら 同じようなクラスが2個出来上がって汚くなった。 どうしてこうなったorz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/188
189: 名前は開発中のものです。 [sage] 2011/04/02(土) 08:01:26.08 ID:0qk/4v/F メンバ変数を読み書きして外で処理するのではなく、 メンバ関数にハンドルを渡して中で処理させる設計に変えるといいんじゃないかな。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/189
190: 179 [sage] 2011/04/02(土) 21:31:56.76 ID: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(); http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/190
191: STG [sage] 2011/04/02(土) 21:33:37.28 ID:piT73rrN Get、Setはほとんど使ってないなぁ 大抵>>189の人のようにメンバ関数からのみアクセスするだけで済むようにしてる クラスが何をしているかと再利用性と扱いと管理が楽になってよい http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/191
192: SGGK ◆6pZCoAtaxk [sage] 2011/04/03(日) 00:07:22.30 ID:1D3iDnp3 自分は>>155からget、set関数方式への書き直しを進行中だけど、書き直しにものすごい時間がかかってます。 そして今更ながらそのように直すメリットを見つけられないような気がしてきて不安だけど、 もうほとんど書き直してしまったし、ソースも多少見やすくなったような感じはするので、このまま頑張ってみます!。 今日は、ボール関係をなんとか実装したけど、ボールはフィールド中央に表示され続けるのみとし、まだ蹴れないようにしておく。 レーダー関係は何故かレーダーが表示されないので、原因を調べているところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/192
193: SGGK ◆6pZCoAtaxk [sage] 2011/04/03(日) 22:57:24.10 ID: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変数を用意して、そこに記憶させた。なんとなくだけど。 とりあえず、いろいろな条件分岐というか状態遷移のようなプログラムを書く直前の状態までを書いたような感じ。 ここまでを一区切りにするつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/193
194: 179 [sage] 2011/04/04(月) 00:25:07.83 ID:1C3wAcIh 最近、処理してから数値返したりする場面が出てきたような気がする が、無駄な関数ががんがん増えてる気がしないでもない。 ソースを綺麗にする作業は挫折しました。。。 >>193 表示したら動かしたくなりませんか…?w テンション上がって強引に動作実装、 →バグだらけ→バグ取りでテンションダウン→汚いソースの出来上がり なんてやってしまうんですが。 日記の(ry ユニットをマウスで移動できるようにした。 マップの大きさをとりあえず適当な数値で仮定して ミニマップレーダーを作ろう…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/194
195: 名前は開発中のものです。 [sage] 2011/04/04(月) 01:24:50.54 ID:zaeNjYQd やっぱりこのスレがいちばん居心地いいなあ 月曜火曜休みなので、この連休は本気出す! 寝て起きたら、もやもやしながらゲームや2chに明け暮れずVisualStudio立ち上げて何か事を起こす! 小難しい本読んでたら、ホントに小難しすぎておもろうてやがて悲し 教科書を超えて念仏レベルで、ただ文字を追いかけてるだけ すべてのメンバ変数privateにして無条件ゲトセトは俺も馬鹿だなと思う。 そんなことするくらいならpublicでいい 利点なんて、挙動不審なときに一括検索で代入してるところ洗い出せるぐらいかなと思ってる http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/195
196: SGGK ◆6pZCoAtaxk [sage] 2011/04/05(火) 00:03:40.76 ID:S0hRYVkN >>194 以前、動くところまで書いたのですが、試合前半後半で選手の向きを入れ替えたりとか いろいろ条件を加えていくうちにソースがわかりにくくなってきた事があったので、 もしまたそうなっても、今の状態からならやり直しやすいだろうと思い、ここを区切りにして保存しておこうと思ってます。 >>195 ともに頑張りましょう! get、set関数の件、たしかにそのとおりで、直すときは検索つかえばいいんだし、これから書く部分はpublicにしてみます。 今日は、プログラムをリリースモードでコンパイルしようとしてバグ。 どうもユニコードとかの文字コードの何かが原因らしいけど、ネット検索で見つけたコンパイラの設定画面が表示されず、 しようがないので、ソース内の”文字”をTEXT(”文字”)にしたという例を真似してみたり、 他にもいろいろやってみた結果、コンパイルは通ったけど、デバッグモードでは22人の選手が表示されるのに、 リリースモードでは2人しか表示されない…。解決には時間かかる予感。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/196
197: 名前は開発中のものです。 [sage] 2011/04/05(火) 02:28:26.89 ID:t5qV24Bh あーそういえばC++は文字列が鬼門だよな UNICODEかSHIFT-JISかっていうのは、要はwcharかcharかって事だ だからwchar〜charを変換する関数作っておくといいかもしれない ちなみに俺は基本的に文字列はstringで扱って wcharとかcharを要求する関数を使う時にstringから渡せるような作りにしてる もうしばらく使ってないから、マクロで組んだか関数だったかは忘れたけど http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/197
198: 名前は開発中のものです。 [sage] 2011/04/05(火) 02:29:52.15 ID:t5qV24Bh あー 使ってないっていうのは、C++触ってないっていう意味ね http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/198
199: SGGK ◆6pZCoAtaxk [sage] 2011/04/06(水) 00:31:39.07 ID:0VHuOF2K な…なるほど、変換する関数が必要となると、それは自分には難易度の高い対策方法なので、もうしばらく考えてみます。 もしかするとコンパイラがこわれてしまったかもしれない様子。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/199
200: 名前は開発中のものです。 [sage] 2011/04/06(水) 01:27:19.44 ID:T5BENq16 >>199 MultiByteToWideChar とか WideCharToMultiByte とかいう WindowsAPI を呼べば SJIS ←→ UNICODE 相互変換はできる http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/200
201: 179 [sage] 2011/04/06(水) 23:50:41.54 ID:Qi29hSL7 VC++のデバック関数でなんか開放忘れのメモリリークを簡単に見つけられるとか WEBに乗ってたのを試したら余裕でリークしてた。。。 直してたら今度はdeleteがエラー出す、なにこのスパイラル 本体が進まない罠 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/201
202: SGGK ◆6pZCoAtaxk [sage] 2011/04/07(木) 00:03:18.39 ID:1CreScRP やっぱり自分は永遠に初心者のようです…。 >>200 MultiByteToWideChar、調べてみました。 引数にコードページというのがあって、いきなりここから躓いてしまうレベルなので、APIの難しさがよくわかりました。 感謝します。いつかもっと勉強してAPIの領域まで入っていけるようになってみたいです。 まず、DXライブラリを疑ってみる。 DXライブラリのホームページを見ると更新履歴に何箇所かユニコードがどうのこうののバグを解決みたいな事が 書いてあったので期待して最新のバージョンにしたけど、こちらのバグは解決できなかった。 文字コード関係とは別に気になっていた現象があったので、今日はこれの解決を試みる。 コンパイラの下の画面にいつごろからか、「コマンド プロンプトで 'VCExpress / resetskippkgs' と入力してください」という文字が表示されるようになって、 でも2D座標系のプログラム書いていた時にはデバッグ、リリースモードどちらもコンパイル出来ていたので気にしていなかった。 でも、もしやと思い、コマンドプロンプトで試したが、VCExpressは外部コマンドでも内部でも無い…みたいなメッセージが出てうまくいかない。 resetskippkgsを検索してもハードディスク内には無い様子。 昨日、コンパイラがこわれてしまったかもしれないと書いたのはこの事。 やむを得ず、VC++2008をアンインストールして、もう一度インストールしてみることにした。 「'VCExpress / resetskippkgs' と入力してください」のメッセージは出なくなった。 コンパイルしてみると今度は、「error LNK2001: 外部シンボル "_main" は未解決です」というエラーメッセージが出た。 これも苦しんだけど、なんとか運よく今日中にクリア出来た。 でも、今度は画面がおかしくなってしまったので、明日頑張ります。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/202
203: SGGK ◆6pZCoAtaxk [sage] 2011/04/07(木) 00:21:04.82 ID:1CreScRP >>201 メモリリークは難しくてわかりませんが、バグの為に本体を進められない気持ちは自分にもよくわかります。 1日ソースから離れてもう一度見るとふと原因が分かったりすることもあるので、お互い頑張っていきましょう! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/203
204: 名前は開発中のものです。 [sage] 2011/04/07(木) 02:08:35.75 ID:ATP6AwEd >>201 さあ早くスマートポインタに移行するんだ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/204
205: SGGK ◆6pZCoAtaxk [sage] 2011/04/08(金) 00:00:34.46 ID:WGj3ab+N 昨日は説明が不足していたので補足。 コンパイラがこわれたのではと思ったのは他にも理由があり、プロジェクトのプロパティ画面が出てこなかった事。 画面を出そうとすると、共通言語ランタイムに問題があるといった感じのメッセージや.NETがどうのこうのというメッセージが出てどうにもならなかったので、 コンパイラのアンインストール、インストールに踏み切った訳。 その結果、プロパティ画面を出せるようになり、14歳シリーズVC++2008編にあるやり方で再設定できるようになった。 設定は文字セットとランタイムライブラリのところ。 文字セットはマルチバイトセットを使用する。 ランタイムライブラリは、Debug構成ではマルチスレッドデバッグ、Release構成ではマルチスレッドにすればOK。本にやり方が書いてなかったら自分は何も出来ない…。 たぶんなんらかの原因で文字セットの設定がユニコードに変えられてしまったのがバグの原因だったのかなと思う。 そして、「error LNK2001: 外部シンボル "_main" は未解決です」が出る件。 これは、プロジェクトを作成するときに設定画面でWin32プロジェクトを選択すべきところを間違えてwin32コンソールアプリケーションを選択したから。 コンソールアプリケーションだとプログラムの始まりはmain関数である必要があるのに自分のソースはWinMainだから、それがエラーになった原因だった。 14歳シリーズの最初の方のページ見て設定したのが間違えた原因。 本の最初の方はコンソールアプリケーションで解説しようとしてたから。そのとおり設定すれば当然間違える。 最後に画面がおかしい件、おかしいというのはフィールド画面に貼ったはずのBMP画像が表示されずに灰色になってしまう状態になってしまってること。 これは、フィールドモデルをメタセコイアで表示させて運よく気が付いた。 原因はフィールドモデルに貼るテクスチャ用BMPファイルの置き場所が実際の場所と異なっていたこと。 何故そうなったかというと、コンパイラをインストールしなおしたときにゲーム作成関係フォルダをどうせだからと思って、 もう少し上の階層に移してしまったから。 これですっきり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/205
206: 179 [sage] 2011/04/09(土) 00:10:09.82 ID:rY2c9kYC >>204 スマートポインターもString系も便利そうだなぁ 次回ソース再構築するときに移行しようと思う 今はちょっとやる気がデナイ…とりあえずメモリリーク直ったぽいし(ぇ >>205 バグ取れるとすっきりするよね こっちもすっきりしたよ。 とりあえずミニマップレーダー表示した。 次は自分の手持ちのユニットリスト作るかな−。 あれ?なんかまわりばっかり作ってる気がするな・・・。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/206
207: SGGK ◆6pZCoAtaxk [sage] 2011/04/10(日) 00:36:34.94 ID:TFhm8weY >>206 お互いバグとれて良かったですね。 プログラムはバグ取れなければ先に進まなくなってしまうのでいつも冷汗です。 今日はファイルをまとめてUP 前から見てる人は知ってるので大丈夫だけど、最近見た人がすごいの作ってると誤解されてると心配なので昔UPしたのもUPしてます。 間違えて変なファイルとか書き込みとかしてるかもしれない… SGGK019 : 2Dで書いていた時の最終版 SGGK020 : 019に体力ゲージ付けた 3D_TEST : >>139で言っていた >それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど ←のテストプログラムの実行ファイル 3D_TEST説明 : >>139で言っていた >それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど ←のそれを表す図 SGGK024 : 今書いてる最新版、選手がマウスカーソルを追いかけるだけ 置き場所 ttp://ux.getuploader.com/sggk/ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/207
208: SGGK ◆6pZCoAtaxk [sage] 2011/04/10(日) 23:13:37.24 ID:Opp/fMA0 今日は進捗無し。来週は現実の方がいろいろあり、作業が進まない予感。 とりあえずの目標は、2D座標系でやったのと同じ事が3D座標系でも出来るようにしたい。 時間、得点表示、前半、ハーフ、後半の切り替え関係などの実装を予定。 2Dの時はメインループの中にそのまま処理を書いてしまったため、メインがすごい長文になり読みにくかったので、 メインからは関数が呼ばれて、その関数の中に色々処理を書くようにしたい。 それと昨年末に読みかけだった3Dの本をもう少し読んでみたい。 今のままだと当たり判定をどうすればよいのかわからないのでそのヒントを探すのが目的。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/208
209: 179 [sage] 2011/04/12(火) 01:29:16.27 ID:iONqvBHy 動かしてみました。普通にもりもり動きましたよ〜 2D版でボール蹴ってゴールまで持っていこうと思ったけど体力切れて動けなくなったw 説明JPGは良く理解できなかったぜ… 日記の裏: 前回ユニットリストを表示させようとかなんとか言ってたけど 気がついたらWINDOWシステムを作っていた 何を言ってるか分からないと思うg(ry なんか難しい…最初から固定表示にしとけば良かったんだ。。。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/209
210: SGGK ◆6pZCoAtaxk [sage] 2011/04/13(水) 05:32:57.65 ID:c5UQB0E3 >>209 使ってみてくれてありがとうございます。 体力ゲージについては今度実装するときには修正してみます。 説明JPGについては今見直してみると説明というよりは説明図だけのような作りになってるので また似た事をやるときがあればもう少し改善しようと思います。 関数はDXライブラリのものを使っていると注意書きしておけば良かったと今反省。 ユニットリストがマウスドラッグ出来るようになってるとか? もしかして他者製ライブラリを使わないAPIいろいろ使うWINDOWSプログラミングで組んでると想像。 >208の「2D座標系でやったのと同じ事が3D座標系でも出来るようにしたい」に向けてちょっと復習。 2Dでやってたプログラムソースは、時間、当たり判定、状態遷移の3つ(まだ他にもあるかもしれない)がソースのあちこちで絡み合いワケがわからなくなってきていたので見やすくしたい。 とりあえず、選手関係のソース見て、どんな位置関係にオブジェクトがあればお互いデータやりとり出来てるとか、関数使わないとアドレス渡せないのかとか、 そういったコピペでやり過ごしてきた部分を見直してみた。 なんとなくこういうのはノート&手書きの方が頭に入りそうな感じがしたので今回はエクセル使わないでノートに手書きでやってみた。 ほんの少しだけ頭の中が整理されたような気がしたので、まず画面に試合経過時間を表示できるようにしたい。 時間は条件分岐に使うので、時間表示を優先したのが理由。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/210
211: 179 [sage] 2011/04/14(木) 01:35:15.18 ID:euSLNc/U アレダデスヨネ、カメラからマウスの座標にレイ飛ばしてYが0になる場所を求めどうのこうのってヤツ。 それが良く分からなかったらから2Dに逃げた(ぉぃ イエ、ハイ、勉強するのが嫌だっただけですゴメンナサイw メニューバーをマウスドラッグで動かせるように〜ってヤツですね WIN APIにその変の便利なのあるかもしれないけどWIN API良く分からないので 自前でメニューバーのボックス(唯のポリゴンの板です)とマウスポインタと当たり判定して マウスクリック中なら移動させるってのをやろうと思った。 一応移動させるのはできたのは出来たけど、 バーどうしが重なったりすると両方動いたり下に潜り込んだり…。 位置固定にして、表示と非表示の切り替えだけにすりゃ良かったナァ、と。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/211
212: SGGK ◆6pZCoAtaxk [sage] 2011/04/14(木) 23:22:03.79 ID:XhLhjLQN WINDOWは難しそうなテーマですね。 画面内のWINDOW全てが奥側から数えて何番目にあるかを記憶してその順番に描画してみるとか。 マウスでクリックしたら奥から一番最後の番号が付けられるとか。 でも複数のWINDOWが重なったらどうすればよいのかわからなくなってくる…。 今日は作業時間ほんのわずか。 2Dの最後のプログラムSGGK019(020はソース見づらいので使わない)のdrawGameMain()関数から抜き出した時間関係の行を使って、 GameTimeクラスを宣言してみた。このクラスのヘッダファイル作成作業がまだまだ途中。 それと>>207でUPした理由の補足 完成度に対する誤解を最小限にしておきたかった他に 自分が何らかの理由により作成続行不可能になった時、たとえわずかでもここで得たものを残しておこうかな〜と思ったこと。 作業を続けてソースが複雑化し、結局やり直すことになった場合、このSGGK024の段階が丁度良いので区切りとして残しておきたかったこと。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/212
213: SGGK ◆6pZCoAtaxk [sage] 2011/04/14(木) 23:30:34.53 ID:XhLhjLQN 最後から2行目は自分のプログラムの進捗的なものがわずかという意味であり、 ここで得たものがわずかという意味では無いので念の為。 ここではいろいろ多く学ばせてもらってますので…(汗; 読み直してあせった。言葉って難しい。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/213
214: SGGK ◆6pZCoAtaxk [sage] 2011/04/15(金) 23:10:40.56 ID:2Uog82ch >>210の試合経過時間は未だ実装出来ず。 結構難しいかもしれない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/214
215: 179 [sage] 2011/04/16(土) 03:34:02.42 ID: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にすれば良い…と。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/215
216: 179 [sage] 2011/04/16(土) 03:42:37.35 ID: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; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/216
217: 名前は開発中のものです。 [sage] 2011/04/16(土) 15:03:11.50 ID:aTo50Zu7 サッカーゲームのような、フレームごとの計算を繰り返していくタイプのプログラムの場合、 経過時間の管理は、実際の(現実世界の)経過時間ではなく、 処理したフレーム数で管理するほうが、合理的な結果が得られると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/217
218: SGGK ◆6pZCoAtaxk [sage] 2011/04/17(日) 00:44:52.38 ID:mWz5D8BJ >>215,216 ありがとうございます。 自分はいままでbackとknowに相当するコードをなぜかソース内の別々の場所に書いてあり、ソースが読みにくくなっていたけど、 これを見て3行続けて書ける事が分かりましたので、早速修正してみます。 今回はメインループ内に書かれるソースコードを減らしてみたくてこの3行に相当する機能をクラス化することに挑戦。 結果、クラス内の行数はかなり増えてしまうけどreleaseモードでは成功。 debugモードでは時間表示が正しくなく、プログラムを終了させると「ヒープが壊れていることが原因として考えられます。」のようなエラーメッセージ。 いちおう半分はうまくいってるので、ゆっくり考えるつもり。 >>217 アドバイスありがとうございます。現時点のプログラムソースでは、 1フレーム計算毎に1ずつ増えていく変数を用意し、これを使って選手のアニメパターンを決定したりしてますが、 上記のdebugモードでの不具合が取れなかった場合、フレームタイムxループ回数を時間に単位変更して画面表示するようなやり方も検討してみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/218
219: SGGK ◆6pZCoAtaxk [sage] 2011/04/17(日) 01:48:23.54 ID:mWz5D8BJ そういえば以前にもdebugモードでダメでreleaseモードではOKというのは、 releaseモードではチェックがされていないだけなので、バグが無いという意味ではないとこのスレで教わったのを思い出す。 まだ、この前UPしたバージョンにちょっと書き足しただけなんだから、 どこかに内容的な間違いがあるはずと思い良く見てみると1か所あったので直してコンパイルしてみたら直った! これがなんでヒープ壊れる事につながっていたのかは結局わからずだけど、 とりあえずすっきり。(寝) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/219
220: SGGK ◆6pZCoAtaxk [sage] 2011/04/17(日) 23:21:42.93 ID: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にしてしまったので、 そこに何か関係があるのかと思ったりもしたけど、上記の方法でバグが出なくなったのでたぶん大丈夫。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/220
221: 179 [sage] 2011/04/18(月) 02:43:15.47 ID: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が固定されてるなら問題は出ないので余り気にする事も無いカモ…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/221
222: 179 [sage] 2011/04/18(月) 02:55:13.67 ID: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ぽいのはなんとか形になった気がする ので次の作業へー フィールドの資源地とか基地ぽいの作るカナー http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/222
223: SGGK ◆6pZCoAtaxk [sage] 2011/04/18(月) 23:13:36.71 ID:kLP7Gc7/ >>221,222 ループが最速で到達した場合というのは想定してなかったので勉強になりました。 ありがとうございました。 今日は次の目標を考えて終了。 次の目標は、前半、ハーフタイム、後半、試合結果表示の4つの状態遷移実装。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/223
224: SGGK ◆6pZCoAtaxk [sage] 2011/04/19(火) 22:59:14.08 ID: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; } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/224
225: SGGK ◆6pZCoAtaxk [sage] 2011/04/20(水) 22:43:09.69 ID:rAZcxTJj でも、もっと良いやり方があるはずなので、 「ゲームプログラム 状態遷移」でネット検索。 以前も挫折したけど、また少しだけ調べてみるつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/225
226: 179@SLG? [sage] 2011/04/23(土) 00:02:41.30 ID:EVcHPUn1 うーん、基地というか資源地ぽいクラスを作ったけど 中身がユニットと変わらない罠・・・ 後、マウスの座標をWINDOWSのアイコンの位置から取るようにしたら なんかバグって座標がずれてたりしたけどなんとか直した。 手間食ったけど、やっとALT+TAB押さないと違うWINDOW行けない仕様から 普通にマウスでいけるようになった(ノ∀`) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/226
227: SGGK ◆6pZCoAtaxk [sage] 2011/04/24(日) 00:01:37.30 ID:rFlUji0A こちらの進捗は調べたり休んだりを繰り返しながら実質何も進まずな状態が続きそうな予感…(汗 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/227
228: SGGK ◆6pZCoAtaxk [sage] 2011/04/25(月) 00:12:59.17 ID:oJBn91bE >>224でも短くなった方だけど、ゲームのメイン処理の先頭にこれを書くのは まだ長いような感じがした。それと、ゲームの時間帯の状態を表す定数と時間のリセットの処理を一緒に書くのも 後々わかりにくくなるような気がした。今はたまたま、この定数の切り替わりが起きる条件と時間のリセットが起きる条件が一緒だから このように書けているだけなので、将来の想定外の変更を考えて分ける事を考えた。 ゲーム時間帯の状態を表す定数を決める関数を>>224の改造で作成。 >>224から時間のリセットの行を削除しただけのもの。 calMatchState()という名前にでもしておく。 そして時間のリセットを行う関数をそのあとに書けばいい。 但し、calMatchState()で先にゲーム時間帯の状態を変更されてしまうので、 状態の切り替わりが検知できるように状態を表す変数をもう一つ用意して現時点のゲーム時間帯の状態を表す定数値を保持しておく。 そうしておけば、直前の関数でゲーム時間帯の状態を表す定数値が変わったら、その値と保持していた値が異なるので、 その時に時間をリセットして、現時点のゲーム時間帯の状態を表す定数値は更新する。 いちおうこれでプログラムは同じように動いてくれた。 時間リセットを判定する関数は以下の様な感じ。 void SoccerGame::calTimeResetState() { if(m_MatchState!=m_MatchState1){ m_Time.resetGameTime(); m_MatchState1=m_MatchState; } } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/228
229: SGGK ◆6pZCoAtaxk [sage] 2011/04/29(金) 23:24:14.14 ID:r0lSNY0W 今、自分に負け気味な感じなのでしばらくダメかもしれない予感…。 いろいろ考えがあり、次は当たり判定をクラスで実装しようとしたけれど、 本当にクラスにした方がいいのか迷う。 当たり判定の関数を持つクラスのオブジェクトを選手やボールのオブジェクトに メンバとして持たせるつもりだけど、時間が掛かりそうな予感。(理由は1行目) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/229
230: 179 ◆SLG//siTD6 [sage] 2011/05/01(日) 01:09:31.11 ID:wJ8tL1/e トリップてすと。 プログラムの方はサボり気味で余りすすんでないけど とりあえずユニットから弾撃てるようにしてみた。 実験的に実装したんで中身がスカスカだけどw >>229 当たり判定はどうするか迷うねぇ こっちも当たり判定はかなりややこしい事になってる・・・w http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/230
231: SGGK ◆6pZCoAtaxk [sage] 2011/05/02(月) 00:20:50.39 ID:iqr3WKp3 >>230 トリップの文字にSLGが入ってる! 当たり判定のクラスは、当たり判定の範囲を示す四角の情報をメンバ変数に持ち、 そのメンバ変数を取り込んで番号を付けるメンバ関数、 当たり判定をしたいオブジェクトの四角情報を取り込み、その情報を基に判定する関数があればいいかなと考えてるけど、 まだ考えてるだけで実装が進んでない状況。ヘッダファイルだけは書いてみたけど、あまり自信無し。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/231
232: SGGK ◆6pZCoAtaxk [sage] 2011/05/08(日) 00:12:20.39 ID:K9cPT3KQ 試行錯誤した挙句自分には>>231を実装するのは無理と判断…。 これをやりたかった理由は、選手のアニメパターンがジャンプしたりキックしたり変化した時にそれぞれに応じた 当たり判定を呼び出せるようなしくみがこの先必要なんじゃないかと思ったからだけど、とりあえず断念。 その他 今日は、ボールをメタセコイアモデルにしていたのをあえて以前の2Dに戻した。 当たり判定は、選手の足元xz平面上に32x32の矩形があるとし、 ボールも同様に8x8の矩形があるとし、これで書いてみる予定。 選手とボールが接触してなくても当たってしまうけど無視! ジャンプしたら判定できなくなるけど、とりあえず最低限の実装を優先。 内容がかなり後退した感じ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/232
233: SGGK ◆6pZCoAtaxk [sage] 2011/05/08(日) 22:55:14.85 ID:MKRAe4w3 今日もあまり進まず。 当たり判定クラスの中に作った矩形当たり判定用メンバ関数は最初は、 bool CollisionCheck::isHit(FieldPlayer *, BallData *);//選手とボールの当たり判定 のようなものを考えていたけど、 bool CollisionCheck::isHit(VECTOR,int,int,VECTOR,int,int);//引数:オブジェクト座標、当たり矩形縦、横、オブジェクト座標、当たり矩形縦、横 に変更してみた。1番目の方は選手とボールにしか使えないけど、2番目のようにすれば汎用性が高いのではと考えたのが理由。 ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。 そのときに何回ループしたらボール停止というのではなく、ボールの速度が少しずつ0に近づき、0になったら停止するようにしたいけど、 物理を忘れてしまってるし、当時の記憶がよみがえったとしても問題は解けなかったと思うので、 紙に点と矢印を書いて、どうするか考えてるところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/233
234: 名前は開発中のものです。 [sage] 2011/05/08(日) 23:55:10.30 ID:45vHEn5A move += f; x += move; 物理は基本的にこれ 力fで加速(減速)して、現在地xから速度move分だけ動く >>233ならf=move/2とか、そんな感じで http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/234
235: 名前は開発中のものです。 [sage] 2011/05/08(日) 23:58:57.92 ID:45vHEn5A すまん訂正、-moveにしないとダメだなw f=-move/2 -moveを使うと常に移動方向と逆向きに力がかかる http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/235
236: 名前は開発中のものです。 [sage] 2011/05/09(月) 00:20:15.21 ID:Q5/CRoYG F=ma v+=aΔt x+=vΔt だろ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/236
237: 名前は開発中のものです。 [sage] 2011/05/09(月) 01:17:50.08 ID:SHBGDval >>236 教科書を丸写しするとそうだな それをプログラム用に単純化したのが>>234 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/237
238: 名前は開発中のものです。 [sage] 2011/05/09(月) 03:49:37.28 ID:FkwWv0YK >>231 ボールとの当たり判定をするなら矩形よりも円(球)の方が自然じゃないでしょうか。 プレイヤー側も球体の集合として定義しておき、 ボール中心とプレイヤー判定球の中心間の距離<ボール半径+プレイヤー判定球の半径 となったら、接触していることになります。 プレイヤー判定球に頭、足、手などの属性をつければ、どこに当たっているかも判定できると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/238
239: 名前は開発中のものです。 [sage] 2011/05/09(月) 03:54:43.87 ID:FkwWv0YK >>233 物理的には、 ・重力 ・跳ね返りによるロス…地面やゴールポストとのバウンドの際、運動エネルギーの一部が消失 ・ころがり摩擦抵抗…ボールが着地しているときのみ ・空気抵抗…ボールの高度に関わらず場の空気の流れ(風)との速度差に応じて加速 風が無い環境なら、極端な例だと紙風船を思い切り投げたときのようになります。 ・ボールのスピン…減速要因ではありませんが空気抵抗による曲げ加速の一種 空気抵抗に配慮するなら合わせて検討してみてください。 などが考えられます。 ちなみに摩擦によるボールの減速については、ボールの速度ベクトル(の水平成分)に対して 1より小さい数(0.995とか)を毎フレームごとに掛けるという簡易な方法でも、それらしく見えると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/239
240: SGGK ◆6pZCoAtaxk [sage] 2011/05/09(月) 23:53:46.13 ID:7TJ8pACL >>234〜>>239 多くのアドバイス、ありがとうございます。全部活用していきます。 >>234,>>235,>>236,>>237 なんとなく分かってきました。 昨日考えていた時は、等加速度αのt秒後の位置xの式が物理の本にあったとして、 これをゲームに応用するには、移動を始めた初期位置と初期速度に対してframetime後、2*frametime後、3*frametime後、…n*frametime後の位置を計算しなくてはと思い悩んでいたけど、 毎フレーム単位毎に常にその時の数値が初期値であると考えてframetime後の数値を計算するならば、公式がそのまま使えそうな感じ。 アドバイスのと同じ内容ですけど、たぶん、 frametime後の位置=現在位置+(現在速度 x frametime)+ ((加速度xframetime)x frametime/2 ) (注:加速度は実際の動きを見ながらマイナスの小さい値を設定) を毎ループ繰り返していけば出来そうな予感。 >>238 前のプログラムが矩形当たり判定で他に判定方法を知らなかったのが理由ですが、 矩形だと斜め45度からボールに近づくと水平に近づくより有利になってしまうし、 円(球)形方式ならその問題もなくて良さそうなのでこれに挑戦してみます。 >>239 今回のプログラムでは、 ・重力、・跳ね返りによるロス、・ころがり摩擦抵抗までを簡易な方法で実装していきたいと思ってます。 いずれは、スピンも表現できるようにして、レベルが上がると2回曲がるシュートが出せるようになる等やってみたいです! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/240
241: SGGK ◆6pZCoAtaxk [sage] 2011/05/11(水) 23:28:32.89 ID:dXE++lT+ すぐには進まないけど、当たり判定用関数の実装終了。 宣言と定義しただけで、まだ実際には使っていないので、バグが出るかもしれない。 選手がボールを蹴れるようにする実装を検討中。 >>233で言ってた >ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。 を実装するにはキック用キーを押した時に選手とボールの座標を取得して当たり判定をして、 当たりなら、例えばボールの状態の変数をセットしてそれに応じてボールの挙動が変化するみたいにすればよさそうだけど、 それをどこに書くかが悩むところで、選手のクラス内にも書けるし、ボールのクラス内でも書けそうな気がする。 でも、今回は選手やボールに関係するオブジェクト、その他のオブジェクトをメンバ変数に持っているSoccerGameクラスの中に メンバ関数calVariousState()を定義して、その中でやってみるつもり。 SoccerGameクラス内のメンバ関数からなら他のメンバになってる選手やボールのオブジェクトとも情報のやりとりが しやすそうだし、既に書いてあるcalMatchState()や calTimeResetState()と似た役割の関数になると思うので書きやすいかもしれない。 calVariousState()の中でいろいろなオブジェクトの状態を表す変数を更新して、その結果が他のオブジェクトに反映されるイメージ。 できるかどうか自信無し…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/241
242: SGGK ◆6pZCoAtaxk [sage] 2011/05/17(火) 22:44:39.91 ID:s8XxjuX7 時間の流れが速すぎて生存報告のみな感じ。 ボールを蹴れるようにするにはあれが必要これが必要と考えていたら 何故かソートのプログラムで悩む。 ソートについては名前は聞いたことある位の認識なのでちょっと調べる必要があって時間かかった。 全部調べるのは無理なので最初に見たバブルソートを使う事にした。 これは時間のかかるソートだという事は調べているときに知ったけど、とりあえずこれでやることにした。 選手とボールの距離を計算してその数値が小さいものから順に並べ替えるんだけど、 選手の情報を格納しているリスト構造のコンテナクラス?の並びは変えないで、 もしソートしたらこの要素は何番目になるという情報を全ての選手のデータに格納できるようにしたかったので、てこずった。 今はやっと方法を思いついたところで、それで上手くいくかどうかによって今後の作業の進み具合も変わりそうな感じ。 やり方は22人分のデータを3つの数値a,b,cを持つ構造体型配列にもたせる。 aには、1、2、3、…、22の数値、bにはボールjとの距離、cの初期値は0にしておく。 bの値で構造体型配列をバブルソートして、隣同士の配列の順番入れ替えが起きたら、それぞれのcの値をプラス1したら一方はマイナス1する。 aの値は入れ替えを何度やってもソート終了まで変更なしのそのまま。 ソートが終わったら、例えばa=1の構造体配列のcが5なら、1+5=6 なので、リスト構造1番目の選手データはボールとの距離でソートしたら、6番目になるというこの6だけを リスト構造の1番目の選手のメンバ変数に保持させておくイメージ。 まだ上手くいくかわからないうちに書いてしまった…(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/242
243: 名前は開発中のものです。 [sage] 2011/05/17(火) 23:03:28.52 ID:z1f8XmMA そんなに難しいことしないで、「選手の情報を格納しているクラス」の”ポインタの配列”をソートすればいいんじゃない? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/243
244: 179 ◆SLG//siTD6 [sage] 2011/05/18(水) 12:20:58.07 ID:5rb+12nD 難しすぎて理解できないぜ・・・w というか、最後3行あたりの用途ならソートしなくても 単純に自分よりボールに近い選手の数を数えればいいんじゃ..? チラ裏: ここ2週間ほど忙しくてプログラムから離れてたらクソースが読めなくなってしまったんだぜ・・・ 誰だこんな汚いソース書いたのは。。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/244
245: SGGK ◆6pZCoAtaxk [sage] 2011/05/18(水) 23:50:48.43 ID:SMykIXyq >>243 アドバイス、ありがとうございます。 242での説明が不足していたせいもあり、実は自分のプログラムは「選手の情報を格納しているクラス」のオブジェクト22個(選手22人分)を 配列に入れているやり方でなくて、例えば、list<FieldPlayer>m_FieldPlayerList のようにFieldPlayer型のオブジェクトをpush_back関数で次々に入れていけるメンバ、m_FieldPlayerListを定義して、 それらの要素にはイテレータ、list<FieldPlayer>::iterator it;のような命令を書いて、このitを++したり、−−したりする方法でアクセスする感じの実装なので、ポインタでのアクセスが出来なさそうです。 でも、「ポインタの配列をソートする」でネット検索すると、「検索結果ロベールのC++教室 - 第28章 たのしいソート5」というページがヒットしたので、これの1から5までを読んで、実装はまだ理解できないけど考え方がなんとなくわかりました。 これと243氏の”ポインタの配列”をソートするやり方を合わせて 「選手の情報を格納しているクラス」内のメンバ変数で順番を知りたいデータ(距離とか)を構造体配列に移して、それにアクセスするポインタ配列を用意し、そのポインタ配列がソートされるといった仕組みを内部に持っている関数、 つまり、選手の番号を入れたらボールの近さが22人中何番目かがリターンされる関数を作ってみようと思います。 >>244 実はまだ考えてないのですが、今わかってる距離の利用法として、ボールに近い選手を両チームから1人ずつ選び頭付近にマークを出すとか、 ボールから7番目以降の距離にいる選手は守りの動きをするなど、1ループで何度かボールとの距離情報が必要になると思われるので、 その都度同じソートをすると時間がかかりそうなので、一度計算したソート結果を選手のオブジェクトのメンバ変数に保持させておこうかなと思ったため>>242のようになってしまってます。 自分も作業からしばらく離れてて、あれッ?と思うほどに読めなくなった事がよくありましたので気持ちがよくわかります。(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/245
246: 179 ◆SLG//siTD6 [sage] 2011/05/25(水) 02:34:04.49 ID:XYH4jaxx チョイ調べたらイテレータからポインターにぶち込めるみたいだったけど p = &*it みたいな感じで。 >>244 のは、選手数えて保持すればいいんじゃって事・・・w やってる事は選択ソートとあまり変わらないし、保持したところでアクセスにもループいるから微妙っちゃ微妙。 ポインタ配列ソートならp[7] で7番目にアクセスできるから便利だね チラ裏: 何をやろうとしてたか忘れたので とりあえず資源関係を追加してみた。 TOPバーに数個のボタンと資源の残量表示するようにした。 次は資源基地の占領とか作ってみるかなぁ あーでもユニットクラスの再設計もいるような・・・アニメーションクラスも作ってないし・・・orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/246
247: SGGK ◆6pZCoAtaxk [sage] 2011/05/25(水) 23:02:14.26 ID:WTP3xbuq >>246 ありがとうございます。今思うと自分のソースでも (*it).メンバ関数 のように書いてるところもあり、 *it がオブジェクトのような感じなので、それを考えれば p = &*it でやれそうなのにこれは全然思いつかなかった。 ノートに書いて忘れないようにしておきます。 ソートが今丁度出来たところなので、イテレータへのポインタ方式のソースへの適用は次回かそれ以降のソース改良のときに挑戦してみたいと思います。 ソート書くのに時間が掛かってしまい、途中で作業ペースも落ち気味になる。 ゲームスタート直後は選手とボールの距離が同じデータが複数あるので、 例えば1,1,1,1,5,6,7…になるはずのが、4,4,4,4,5,6,7…になってしまい悩んだけど、 番号付けるループ内にbreak文を入れたら直った。 これだけだと説明不足だけど、今回のはものすごく長いので、ソースの次回UPで見てもらえると助かります。 これで>>241まで戻ってボールを蹴る処理の実装に取り組めそうな予感。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/247
248: SGGK ◆6pZCoAtaxk [sage] 2011/05/25(水) 23:16:38.45 ID:WTP3xbuq 次回ソースUPの時に同じソースが残ってる自信がないので、簡単に説明。 d[i]がソート後の距離を指すポインタ配列 例えばd[1]には1番ボールと選手の距離が近い値へのポインタが入っていて、 *d[1]で距離を呼び出して、この距離と同じメンバ変数m_DistanceFromBallを持つ選手のオブジェクトがit++を繰り返して見つかったら、 その選手オブジェクトのソートした場合の順番を保持してるメンバ変数m_NumberFromBallにiを入力するアルゴリズム。 breakが無かったら、4,4,4,4,5,6,7…みたいな感じになるけど、以下のソースのようにbreak入れたら 1,1,1,1,5,6,7…みたいになり直った。 なんとか説明できた! it=(*fp).begin(); while(it!=(*fp).end()){ for(i=0;i<=21;i++){ if(*(d[i])==(*it).m_DistanceFromBall){ (*it).m_NumberFromBall=i+1; break; } } it++; } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/248
249: SGGK ◆6pZCoAtaxk [sage] 2011/05/31(火) 23:13:10.10 ID:45bt856E 1週間が早すぎるけどやっぱり進まず。(なかなか早く帰れないし、帰り遅いと疲れてしまって…と言い訳。) 選手がボールを蹴るキーを押したときに選手とボールのあたり判定が真ならボールの状態をKICKEDにして、(←ここまでは書けた。コンパイルは通るようになったけど、動かすと問題でるかもしれない。) ボールの移動関数の方では、ボールの状態がKICKEDになったループの時だけ初速を計算し、状態をMOVINGにして、それ以降は速度0になるまで位置計算を繰り返すにしたいけど、この初速をプログラムのどこで計算するかに迷って時間かかってしまった。 ボールのクラスのメンバ関数でやろうとすると選手のデータを引数にしなければならず面倒に思ったから。 なぜなら初速を変える要因は選手だけでなく地面や壁やゴールバーなどもあるし、そのつどこれらを引数にすると処理が増えて複雑になりそう。 そこでボールデータクラスに初速をメンバ変数として持たせて、選手もボールも扱えるsoccergameクラス内で初速を計算してボールデータのメンバにセットして ボール関数内ではその初速メンバにアクセスして位置を計算してみるようにしようと考えて今日は終了。 たしか今年の8月で4年が経つはずだけどなかなか進まない…。 いっそのことあと1年で完成させる! という無理な目標でも立てて頑張った方がずるずるいかなくていいのかもしれないと変な事考えてしまったりして…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/249
250: 179 ◆SLG//siTD6 [sage] 2011/06/02(木) 04:01:33.97 ID:bbIJXBAa ずるずるでも続いてるならいつか出来上がるさ〜 自分はあきっぽいからずるずる続けられないんだよなぁ すでにちょっと2Dスクロールアクションみたいなの作ってみたいなとか思ったり。 が、とりあえずSLGをそれっぽく完成させてるまで我慢。 段々コードが荒っぽくなってるけどw チラ裏: 中立資源地の占領実装した。敵の資源地とかはまだ。 けど占領しても何も変わらないので自分のものになったか分からない、っていう。 ついでにユニットクラスの再設計?ちょっとコード読みやすくした。 ら、FPSが200→100まで落ち込んだ、HAHAHAワロス・・・ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/250
251: SGGK ◆6pZCoAtaxk [sage] 2011/06/02(木) 23:58:31.42 ID:y33r2mcB 1年での完成はやっぱり無理だとしても諦める事だけは無いようにしたいな〜と思ってます。 自分もコードが早くも分かりにくくなってきてるので、危険な状態かもしれない(汗 選手がボールを蹴れる処理を書き終えてコンパイルしてみたが、 コンパイルは通るようになったものの、選手もボールも画面に表示されずで今日は終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/251
252: 名前は開発中のものです。 [sage] 2011/06/07(火) 00:00:23.92 ID:OJpa3qNa 一気にゲームを完成させるのが難しいなら、要素ごとにマイルストーンを設定するのがいいですよ。 3D見下ろし型サッカーゲームだったら、 1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく。 2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする(物理運動シミュレーション)。 3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる。 4.選手をまず1人表示し、動かせるようにする。 5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする。 6.CPU選手をまずは1人登場させ、動くようにする。 7.ポジション別にCPU選手のAIを調整する。 8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。 の順番がおすすめです。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/252
253: SGGK ◆6pZCoAtaxk [sage] 2011/06/07(火) 23:23:39.99 ID:iMg7vpsC >>252 ありがとうございます。このように全体を先にイメージした方がいろいろ良さそうですね。 今出来てるのは1の一部、4、8の一部ぐらいなので、あまり進んでいない様です。 どのくらい遅れているのかということに気付けるのも大事なので、完成までにやることをイメージしておくことは有効だと思います。 先は長いけれど、ここから頑張ってみます。 ボールを蹴る実装が上手くいかず。 ボール移動関数実行直後にブレーク入れてボールの座標を見ると、(-1.#IND00、-1.#IND00、-1.#IND00)になってた。 ネットで調べたらどこかで0で割ってるところがあるという意味らしい。 最初は気付かなかったが、速度ベクトルの大きさを1にする必要があるためVNorm(速度ベクトル)という関数を使ってた箇所があり、 初期化したときの速度ベクトルは(0,0,0)にしてたので、VNorm(速度ベクトル)の中でたぶん、大きさを1にするためにベクトルをベクトルの大きさで割ってるはずで、 そのベクトルの大きさが0なので、ここが怪しいと思い、VNorm(速度ベクトル)の直後でブレークして、 ボールの座標を見たら、(-1.#IND00、-1.#IND00、-1.#IND00)だった。 ここを直そうと思ったところで終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/253
254: 名前は開発中のものです。 [sage] 2011/06/08(水) 00:39:22.18 ID:j4NqkXuU >>253 >完成までにやることをイメージしておくことは有効だと思います。 全体の把握というか、パーツ毎に分けて作業化するという意味合いが強いと思う 簡単にいうと段階毎に締め切りを設けて、そのスケジュール通りにこなしていけばいつの間にか完成している、という方法 いつか完成すれば(あるいは完成しなくても)いいという人にはあまり効果はない http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/254
255: SGGK ◆6pZCoAtaxk [sage] 2011/06/09(木) 00:10:01.09 ID:HLDcGlpq >>254 自信が無くても締め切りを設けた方が良さそうな気がしてきました。 ありがとうございます。 >>252氏のマイルストーンを参考にして6月23日を目標にしてみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/255
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 232 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.011s