1人でゲームが作れるように修行します。2
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2010/05/04(火) 00:44:29ID:HN0quC1A前スレ
1人でゲームが作れるように修行します。
http://pc11.2ch.net/test/read.cgi/gamedev/1006284805/
0152SGGK ◆6pZCoAtaxk
2011/02/25(金) 23:02:15.17ID:uikGAaqm思い出して戻ってきてくれる人がいる事に感動です!
まだまだ頑張ります!
>>151
お久しぶりです!
お互い目標目指して頑張っていきましょう〜!!
0153SGGK ◆6pZCoAtaxk
2011/02/27(日) 00:13:37.96ID:wy4sbNmVでも、インストールして触るところまではなんとか出来た。
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どこかで聞いた記憶があるけど、そうなっている感じがしない。
たぶん自分の書き方に問題があるので、この機会に少しでも変えてみようと思った。
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:ard6obcBwarning 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偶然同じ時間帯に書き込みしてた様です。指摘ありがとうございます。
今のプログラムはかなりごちゃごちゃして修正するたびに時間が掛かるようになってきたので、
もう少しクラス分けしてプログラムを見やすくしたいけど、どう分けるかは実はやってみないと分からないという状態ですが頑張ります!
0159名前は開発中のものです。
2011/03/01(火) 22:55:52.67ID:Ux3/NF8u影ながら応援してます(`・ω・´)ノ
0160SGGK ◆6pZCoAtaxk
2011/03/01(火) 23:31:52.52ID:huwPkO/Sしばらくの間は今までのプログラムの書き換え作業のような感じになるけど、
やれるところまでは頑張ってみようと思ってます!
今までは1つのファイルに複数のクラスの宣言を書いていたのを、
1クラスにつき1ファイルに変えようとしたためか、ファイルがどんどん増え、
しかもほぼ全てのメンバ変数にget、set関数を用意するので作業量が膨大になりそうな感じ・・・。
0161SGGK ◆6pZCoAtaxk
2011/03/03(木) 22:36:53.71ID:dBNi9i4V{
(略)
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>>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クラスビュー、使えました。クラスが一覧されて、ソース内の関数名をマウス右クリックメニューで定義を書いた場所に移動してくれるので便利です。
これがあれば、空のcppファイルを用意して定義先を書くような事をしなくて済みます。ありがとうございました!
今日は選手の初期化でエラーの件がまだ上手くいかず、選手22人分のデータ読み込みで
while文を使う時の条件文にファイルリードの成否判定を入れていたのを試しにはずしてみたら
エラーは出なくなったけど、選手の表示は無し。
試しに選手初期化処理直後にブレークポイントを置いて処理を停止させてからデバッガ(使い方自信無し)で見ると、
どうやら22人分のデータの読み込みがされていない様子。
0167名前は開発中のものです。
2011/03/09(水) 04:35:12.92ID:WaGJIOgeクラス同士が相互参照という事ですが、なぜそんな構造になってしまったんですか?
0168SGGK ◆6pZCoAtaxk
2011/03/09(水) 23:02:50.72ID:u9XYEX3Yこれは書籍(14歳シリーズ)を参考に書いた処理で、
今も自信ないけど、以下の様な感じで相互参照のクラスが出来てしまってます。
選手22人分の移動関数をループから同じ書き方で呼び出しても、
異なる移動関数を選択できるようにしたいという目的があり、まず移動関数を持つ基底クラスを作成。
その基底クラスの継承クラス内で移動関数をオーバーライドしてその関数を呼び出せれば様々な移動関数を使えるはず。
継承クラスのオブジェクトのポインタを格納するための「 基底クラスのポインタ型を持つメンバ変数を選手のデータ内に持たせ 」て、
そのポインタから移動関数を呼べば良い。
選手のオブジェクトからそのポインタを使って移動関数を呼ぶ時に選手のアドレス(thisポインタ?)を引数に持たせてやり、「 移動関数はそのthisポインタから選手の座標などのデータを呼び出し、更新する」。
上記の「」のところで、
選手のクラスは移動関数のクラスのポインタをデータに持つためには、選手のクラスが宣言される前に移動関数のクラスが定義されてなくてはならないし、
移動関数のクラスが選手のオブジェクトのポインタを通して選手のデータを使うには、移動関数の宣言より先に、選手のクラスが宣言されていないと選手の座標データを使った関数の中身が書けない。
・・・というのが相互参照になった理由です。
0169名前は開発中のものです。
2011/03/09(水) 23:20:56.09ID:Vm9YGKI1class CclassA{
class CclassB *pB;
};
class CclassB{
;
};
というように、クラス名の前に class と書きます。
ポインタにしか通用しませんが。
0170名前は開発中のものです。
2011/03/10(木) 00:29:29.25ID:BwtNGrdz0171名前は開発中のものです。
2011/03/10(木) 01:22:06.48ID:B4bIYd4zなるほど意図が分かり納得しました
相互参照は何だか卵が先か鶏が先かみたいで何となく嫌な感じがしたんですが、それが必要な場合もあるんですね
0172名前は開発中のものです。
2011/03/10(木) 01:39:30.03ID:BwtNGrdz0173SGGK ◆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人分のデータを指し示すような感じだけど上手くいかなかった。
0175STG
2011/03/21(月) 00:44:40.91ID:TWP+xA6r0176SGGK ◆6pZCoAtaxk
2011/03/22(火) 00:28:58.94ID:yLNIaGwb災害関係で協力できる事をやりつつ、自分はプログラムをいままで通り続けていくつもりです!
0177SGGK ◆6pZCoAtaxk
2011/03/23(水) 23:45:47.51ID:0VAAbS3922人分用意されてないはずなので、
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選手の移動処理も最初何も表示されず悩んだが、どうやら直った感じ。
原因は、ビルボードに使うデータをロードする関数にメタセコイアのデータをロードする関数を
使おうとしていたことと、ビルボードに使うデータは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ぽいのを目指して。
0181SGGK ◆6pZCoAtaxk
2011/03/29(火) 23:05:44.67ID:KAewGcjL選手の現在位置を表すベクトルに1ループあたりの移動距離分の大きさを持つベクトルを足すべきところを
間違えて、選手の移動目標となるマウスカーソルの位置を表すベクトルに足していたのが原因。
そして現在の問題点は、フィールドと選手の座標にずれがある事。
カメラの注視点を変えて向きを変えるとフィールドはそれに応じて画像が変化するけど、
何故か選手の出てくる場所はフィールドに関係なく毎回同じで変化していない感じ。
しかもマウスの指し示す位置座標もフィールドの変化と連動していないようで毎回同じ状態。
カメラの関数はループ処理の最初に書いてあるのでそのあと描画されるものはすべて
カメラの状態に合わせて描画されると思っていたけど、何か勘違いをしている感じ。
0182179
2011/03/29(火) 23:53:00.41ID:W5EaQ6/Rいつまで続くか分かりませんがヨロシクお願いします
とりあえずVC++2010Expressインストして
昔の何かのつくりかけのソースをこねくり回してます。。。
0183SGGK ◆6pZCoAtaxk
2011/03/30(水) 23:05:43.60ID:oI0LR1GW進捗が0になると突然書き込み0になったりしますので、その時はスミマセン・・・。
昨日の問題は解決。
原因は、選手の移動関数の最初の行にカメラ関係の関数、
SetCameraPositionAndTarget_UpVecY( VGet(0,680,340), VGet(0.0f,-100.0f,0.0f));
を書いてあったため、これがループの最初に書いてあったSetCameraPositionAndTarget_UpVecY(略)と重複してしまい、
両関数の注視点が異なっていたのでズレが生じた事。
0184179
2011/03/31(木) 00:56:17.41ID:MmtwFkf5なので、その前にある程度作れれば・・・と思ったり。
こねくり回したソースはミートソースになってしまった。
食わせたらウィンドウは一応出た。
これでようやく次の作業へ…。
0185SGGK ◆6pZCoAtaxk
2011/03/31(木) 23:16:16.15ID:K/Mu7f7g2次元でやってた時のヘッダファイルに修正を加えて作成。
メンバ変数をプライベート変数にしてget関数、set関数の宣言まで。
このような修正をボール、ゴール、レーダー関係のファイルに行わなければならず、
残りは全部で8ファイル。
0186179
2011/04/01(金) 00:43:22.10ID:wHWoDhcoグローバルで適当に書いて放置してる誰かさんとはえらい違いだなぁ
ぃゃ直しますよ…後で…イツカ,タブン。
今日の作業:マウスアイコン作って動かせるようにした。
なんかsprintfとかの警告でまくってるけど気にしない。
ユニットとマップの大きさどうしよかな…。
0187SGGK ◆6pZCoAtaxk
2011/04/02(土) 00:05:59.97ID:7Uv0Gp7Yこのやり方だとオブジェクトを増やす毎に新しいファイルを増やさなければいけないので大変だけど頑張ってみます。
今日は進捗なし。自信ないけど土日で>>185のファイルを片づけたい。もう4月…。
0188179
2011/04/02(土) 01:41:08.85ID:YKJBI5s3その…GET、SET関数書くのがメンドくてそのままパブリックで書いて直接・・・
なんてダメな事をやってる所を放置したままで・・・w
以下日記:中身の何も無い板ポリユニット表示した。
ちょっとソースを綺麗にしようと思ったら
同じようなクラスが2個出来上がって汚くなった。
どうしてこうなったorz
0189名前は開発中のものです。
2011/04/02(土) 08:01:26.08ID:0qk/4v/Fメンバ関数にハンドルを渡して中で処理させる設計に変えるといいんじゃないかな。
0190179
2011/04/02(土) 21:31:56.76ID:YKJBI5s3{
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();
0191STG
2011/04/02(土) 21:33:37.28ID:piT73rrN大抵>>189の人のようにメンバ関数からのみアクセスするだけで済むようにしてる
クラスが何をしているかと再利用性と扱いと管理が楽になってよい
0192SGGK ◆6pZCoAtaxk
2011/04/03(日) 00:07:22.30ID:1D3iDnp3そして今更ながらそのように直すメリットを見つけられないような気がしてきて不安だけど、
もうほとんど書き直してしまったし、ソースも多少見やすくなったような感じはするので、このまま頑張ってみます!。
今日は、ボール関係をなんとか実装したけど、ボールはフィールド中央に表示され続けるのみとし、まだ蹴れないようにしておく。
レーダー関係は何故かレーダーが表示されないので、原因を調べているところ。
0193SGGK ◆6pZCoAtaxk
2011/04/03(日) 22:57:24.10ID:FQAs1SPdネットで検索してみると、異常な数値がセットされないようにset関数の中でチェックしたり、
get、set関数のどちらかをあえて書かない事でプライベート変数を書き込み専用、読み込み専用にすることも可能といったメリットがあるとの話。
自分の場合、今までx、y座標を別々の変数にしてたときは、(オブジェクト).x のようにしてたのが、途中でVECTOR構造体を使おうということになって、
そうなると今までのソースを(オブジェクト).x から(オブジェクト).(構造体変数).x に全部書き変えなければならなくて面倒だったので、
これが、(オブジェクト).getX() にしてあったら、getX()の中身を return x から return(構造体変数).x にするだけで済んだのでは?との思いがあって、
同じような事がそう何度も出てくるとは思わないけど、get、set関数に変えてみたという話。
完全に直しきれたかどうかは自信なし。
なんとか>>185の修正が終わった。
但し、ボールは中央表示のみで蹴れない。
選手もマウスカーソルを追うのみ。
画面は固定。
レーダーが最初画面に表示されなかった原因は分からなかった。
レーダーの座標はベクトルのx,yだけを変数記憶用に使おうとしていたけど、
あえてやめて、以前のx、yの2変数を用意して、そこに記憶させた。なんとなくだけど。
とりあえず、いろいろな条件分岐というか状態遷移のようなプログラムを書く直前の状態までを書いたような感じ。
ここまでを一区切りにするつもり。
0194179
2011/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以前、動くところまで書いたのですが、試合前半後半で選手の向きを入れ替えたりとか
いろいろ条件を加えていくうちにソースがわかりにくくなってきた事があったので、
もしまたそうなっても、今の状態からならやり直しやすいだろうと思い、ここを区切りにして保存しておこうと思ってます。
>>195
ともに頑張りましょう!
get、set関数の件、たしかにそのとおりで、直すときは検索つかえばいいんだし、これから書く部分はpublicにしてみます。
今日は、プログラムをリリースモードでコンパイルしようとしてバグ。
どうもユニコードとかの文字コードの何かが原因らしいけど、ネット検索で見つけたコンパイラの設定画面が表示されず、
しようがないので、ソース内の”文字”をTEXT(”文字”)にしたという例を真似してみたり、
他にもいろいろやってみた結果、コンパイルは通ったけど、デバッグモードでは22人の選手が表示されるのに、
リリースモードでは2人しか表示されない…。解決には時間かかる予感。
0197名前は開発中のものです。
2011/04/05(火) 02:28:26.89ID:t5qV24BhUNICODEか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:T5BENq16MultiByteToWideChar とか WideCharToMultiByte とかいう WindowsAPI を呼べば
SJIS ←→ UNICODE 相互変換はできる
0201179
2011/04/06(水) 23:50:41.54ID:Qi29hSL7WEBに乗ってたのを試したら余裕でリークしてた。。。
直してたら今度は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メモリリークは難しくてわかりませんが、バグの為に本体を進められない気持ちは自分にもよくわかります。
1日ソースから離れてもう一度見るとふと原因が分かったりすることもあるので、お互い頑張っていきましょう!
0204名前は開発中のものです。
2011/04/07(木) 02:08:35.75ID:ATP6AwEdさあ早くスマートポインタに移行するんだ
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ファイルの置き場所が実際の場所と異なっていたこと。
何故そうなったかというと、コンパイラをインストールしなおしたときにゲーム作成関係フォルダをどうせだからと思って、
もう少し上の階層に移してしまったから。
これですっきり。
0206179
2011/04/09(土) 00:10:09.82ID:rY2c9kYCスマートポインターもString系も便利そうだなぁ
次回ソース再構築するときに移行しようと思う
今はちょっとやる気がデナイ…とりあえずメモリリーク直ったぽいし(ぇ
>>205
バグ取れるとすっきりするよね
こっちもすっきりしたよ。
とりあえずミニマップレーダー表示した。
次は自分の手持ちのユニットリスト作るかな−。
あれ?なんかまわりばっかり作ってる気がするな・・・。
0207SGGK ◆6pZCoAtaxk
2011/04/10(日) 00:36:34.94ID:TFhm8weYお互いバグとれて良かったですね。
プログラムはバグ取れなければ先に進まなくなってしまうのでいつも冷汗です。
今日はファイルをまとめて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の本をもう少し読んでみたい。
今のままだと当たり判定をどうすればよいのかわからないのでそのヒントを探すのが目的。
0209179
2011/04/12(火) 01:29:16.27ID:iONqvBHy2D版でボール蹴ってゴールまで持っていこうと思ったけど体力切れて動けなくなったw
説明JPGは良く理解できなかったぜ…
日記の裏:
前回ユニットリストを表示させようとかなんとか言ってたけど
気がついたらWINDOWシステムを作っていた
何を言ってるか分からないと思うg(ry
なんか難しい…最初から固定表示にしとけば良かったんだ。。。
0210SGGK ◆6pZCoAtaxk
2011/04/13(水) 05:32:57.65ID:c5UQB0E3使ってみてくれてありがとうございます。
体力ゲージについては今度実装するときには修正してみます。
説明JPGについては今見直してみると説明というよりは説明図だけのような作りになってるので
また似た事をやるときがあればもう少し改善しようと思います。
関数はDXライブラリのものを使っていると注意書きしておけば良かったと今反省。
ユニットリストがマウスドラッグ出来るようになってるとか?
もしかして他者製ライブラリを使わないAPIいろいろ使うWINDOWSプログラミングで組んでると想像。
>208の「2D座標系でやったのと同じ事が3D座標系でも出来るようにしたい」に向けてちょっと復習。
2Dでやってたプログラムソースは、時間、当たり判定、状態遷移の3つ(まだ他にもあるかもしれない)がソースのあちこちで絡み合いワケがわからなくなってきていたので見やすくしたい。
とりあえず、選手関係のソース見て、どんな位置関係にオブジェクトがあればお互いデータやりとり出来てるとか、関数使わないとアドレス渡せないのかとか、
そういったコピペでやり過ごしてきた部分を見直してみた。
なんとなくこういうのはノート&手書きの方が頭に入りそうな感じがしたので今回はエクセル使わないでノートに手書きでやってみた。
ほんの少しだけ頭の中が整理されたような気がしたので、まず画面に試合経過時間を表示できるようにしたい。
時間は条件分岐に使うので、時間表示を優先したのが理由。
0211179
2011/04/14(木) 01:35:15.18ID:euSLNc/Uそれが良く分からなかったらから2Dに逃げた(ぉぃ
イエ、ハイ、勉強するのが嫌だっただけですゴメンナサイw
メニューバーをマウスドラッグで動かせるように〜ってヤツですね
WIN APIにその変の便利なのあるかもしれないけどWIN API良く分からないので
自前でメニューバーのボックス(唯のポリゴンの板です)とマウスポインタと当たり判定して
マウスクリック中なら移動させるってのをやろうと思った。
一応移動させるのはできたのは出来たけど、
バーどうしが重なったりすると両方動いたり下に潜り込んだり…。
位置固定にして、表示と非表示の切り替えだけにすりゃ良かったナァ、と。
0212SGGK ◆6pZCoAtaxk
2011/04/14(木) 23:22:03.79ID:XhLhjLQN画面内のWINDOW全てが奥側から数えて何番目にあるかを記憶してその順番に描画してみるとか。
マウスでクリックしたら奥から一番最後の番号が付けられるとか。
でも複数のWINDOWが重なったらどうすればよいのかわからなくなってくる…。
今日は作業時間ほんのわずか。
2Dの最後のプログラムSGGK019(020はソース見づらいので使わない)のdrawGameMain()関数から抜き出した時間関係の行を使って、
GameTimeクラスを宣言してみた。このクラスのヘッダファイル作成作業がまだまだ途中。
それと>>207でUPした理由の補足
完成度に対する誤解を最小限にしておきたかった他に
自分が何らかの理由により作成続行不可能になった時、たとえわずかでもここで得たものを残しておこうかな〜と思ったこと。
作業を続けてソースが複雑化し、結局やり直すことになった場合、このSGGK024の段階が丁度良いので区切りとして残しておきたかったこと。
0213SGGK ◆6pZCoAtaxk
2011/04/14(木) 23:30:34.53ID:XhLhjLQNここで得たものがわずかという意味では無いので念の為。
ここではいろいろ多く学ばせてもらってますので…(汗;
読み直してあせった。言葉って難しい。
0215179
2011/04/16(土) 03:34:02.42ID:WryT+KpSとりあえずの×ボタンは簡単に実装できたけど、
消したのを表示するのは作ってない罠
経過時間は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にすれば良い…と。
0216179
2011/04/16(土) 03:42:37.35ID:WryT+KpS//初期化
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ありがとうございます。
自分はいままでbackとknowに相当するコードをなぜかソース内の別々の場所に書いてあり、ソースが読みにくくなっていたけど、
これを見て3行続けて書ける事が分かりましたので、早速修正してみます。
今回はメインループ内に書かれるソースコードを減らしてみたくてこの3行に相当する機能をクラス化することに挑戦。
結果、クラス内の行数はかなり増えてしまうけどreleaseモードでは成功。
debugモードでは時間表示が正しくなく、プログラムを終了させると「ヒープが壊れていることが原因として考えられます。」のようなエラーメッセージ。
いちおう半分はうまくいってるので、ゆっくり考えるつもり。
>>217
アドバイスありがとうございます。現時点のプログラムソースでは、
1フレーム計算毎に1ずつ増えていく変数を用意し、これを使って選手のアニメパターンを決定したりしてますが、
上記のdebugモードでの不具合が取れなかった場合、フレームタイムxループ回数を時間に単位変更して画面表示するようなやり方も検討してみます。
0219SGGK ◆6pZCoAtaxk
2011/04/17(日) 01:48:23.54ID:mWz5D8BJreleaseモードではチェックがされていないだけなので、バグが無いという意味ではないとこのスレで教わったのを思い出す。
まだ、この前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にしてしまったので、
そこに何か関係があるのかと思ったりもしたけど、上記の方法でバグが出なくなったのでたぶん大丈夫。
0221179
2011/04/18(月) 02:43:15.47ID:OTLjhXG7最初のループ部分でバグった値を入れないようにするためです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が固定されてるなら問題は出ないので余り気にする事も無いカモ…。
0222179
2011/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/ループが最速で到達した場合というのは想定してなかったので勉強になりました。
ありがとうございました。
今日は次の目標を考えて終了。
次の目標は、前半、ハーフタイム、後半、試合結果表示の4つの状態遷移実装。
0224SGGK ◆6pZCoAtaxk
2011/04/19(火) 22:59:14.08ID:Y5+hNJcpでも、これに選手の前半後半の攻撃方向入れ替えや得点表示などを組み込むとなると混乱しそうな予感。
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;
}
0225SGGK ◆6pZCoAtaxk
2011/04/20(水) 22:43:09.69ID:rAZcxTJj「ゲームプログラム 状態遷移」でネット検索。
以前も挫折したけど、また少しだけ調べてみるつもり。
0226179@SLG?
2011/04/23(土) 00:02:41.30ID:EVcHPUn1中身がユニットと変わらない罠・・・
後、マウスの座標をWINDOWSのアイコンの位置から取るようにしたら
なんかバグって座標がずれてたりしたけどなんとか直した。
手間食ったけど、やっとALT+TAB押さないと違うWINDOW行けない仕様から
普通にマウスでいけるようになった(ノ∀`)
0227SGGK ◆6pZCoAtaxk
2011/04/24(日) 00:01:37.30ID:rFlUji0A0228SGGK ◆6pZCoAtaxk
2011/04/25(月) 00:12:59.17ID:oJBn91bEまだ長いような感じがした。それと、ゲームの時間帯の状態を表す定数と時間のリセットの処理を一緒に書くのも
後々わかりにくくなるような気がした。今はたまたま、この定数の切り替わりが起きる条件と時間のリセットが起きる条件が一緒だから
このように書けているだけなので、将来の想定外の変更を考えて分ける事を考えた。
ゲーム時間帯の状態を表す定数を決める関数を>>224の改造で作成。
>>224から時間のリセットの行を削除しただけのもの。
calMatchState()という名前にでもしておく。
そして時間のリセットを行う関数をそのあとに書けばいい。
但し、calMatchState()で先にゲーム時間帯の状態を変更されてしまうので、
状態の切り替わりが検知できるように状態を表す変数をもう一つ用意して現時点のゲーム時間帯の状態を表す定数値を保持しておく。
そうしておけば、直前の関数でゲーム時間帯の状態を表す定数値が変わったら、その値と保持していた値が異なるので、
その時に時間をリセットして、現時点のゲーム時間帯の状態を表す定数値は更新する。
いちおうこれでプログラムは同じように動いてくれた。
時間リセットを判定する関数は以下の様な感じ。
void SoccerGame::calTimeResetState()
{
if(m_MatchState!=m_MatchState1){
m_Time.resetGameTime();
m_MatchState1=m_MatchState;
}
}
0229SGGK ◆6pZCoAtaxk
2011/04/29(金) 23:24:14.14ID:r0lSNY0Wいろいろ考えがあり、次は当たり判定をクラスで実装しようとしたけれど、
本当にクラスにした方がいいのか迷う。
当たり判定の関数を持つクラスのオブジェクトを選手やボールのオブジェクトに
メンバとして持たせるつもりだけど、時間が掛かりそうな予感。(理由は1行目)
0230179 ◆SLG//siTD6
2011/05/01(日) 01:09:31.11ID:wJ8tL1/eプログラムの方はサボり気味で余りすすんでないけど
とりあえずユニットから弾撃てるようにしてみた。
実験的に実装したんで中身がスカスカだけどw
>>229
当たり判定はどうするか迷うねぇ
こっちも当たり判定はかなりややこしい事になってる・・・w
0231SGGK ◆6pZCoAtaxk
2011/05/02(月) 00:20:50.39ID:iqr3WKp3トリップの文字にSLGが入ってる!
当たり判定のクラスは、当たり判定の範囲を示す四角の情報をメンバ変数に持ち、
そのメンバ変数を取り込んで番号を付けるメンバ関数、
当たり判定をしたいオブジェクトの四角情報を取り込み、その情報を基に判定する関数があればいいかなと考えてるけど、
まだ考えてるだけで実装が進んでない状況。ヘッダファイルだけは書いてみたけど、あまり自信無し。
0232SGGK ◆6pZCoAtaxk
2011/05/08(日) 00:12:20.39ID:K9cPT3KQこれをやりたかった理由は、選手のアニメパターンがジャンプしたりキックしたり変化した時にそれぞれに応じた
当たり判定を呼び出せるようなしくみがこの先必要なんじゃないかと思ったからだけど、とりあえず断念。
その他
今日は、ボールをメタセコイアモデルにしていたのをあえて以前の2Dに戻した。
当たり判定は、選手の足元xz平面上に32x32の矩形があるとし、
ボールも同様に8x8の矩形があるとし、これで書いてみる予定。
選手とボールが接触してなくても当たってしまうけど無視!
ジャンプしたら判定できなくなるけど、とりあえず最低限の実装を優先。
内容がかなり後退した感じ。
0233SGGK ◆6pZCoAtaxk
2011/05/08(日) 22:55:14.85ID:MKRAe4w3当たり判定クラスの中に作った矩形当たり判定用メンバ関数は最初は、
bool CollisionCheck::isHit(FieldPlayer *, BallData *);//選手とボールの当たり判定
のようなものを考えていたけど、
bool CollisionCheck::isHit(VECTOR,int,int,VECTOR,int,int);//引数:オブジェクト座標、当たり矩形縦、横、オブジェクト座標、当たり矩形縦、横
に変更してみた。1番目の方は選手とボールにしか使えないけど、2番目のようにすれば汎用性が高いのではと考えたのが理由。
ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。
そのときに何回ループしたらボール停止というのではなく、ボールの速度が少しずつ0に近づき、0になったら停止するようにしたいけど、
物理を忘れてしまってるし、当時の記憶がよみがえったとしても問題は解けなかったと思うので、
紙に点と矢印を書いて、どうするか考えてるところ。
0234名前は開発中のものです。
2011/05/08(日) 23:55:10.30ID:45vHEn5Ax += move;
物理は基本的にこれ
力fで加速(減速)して、現在地xから速度move分だけ動く
>>233ならf=move/2とか、そんな感じで
0235名前は開発中のものです。
2011/05/08(日) 23:58:57.92ID:45vHEn5Af=-move/2
-moveを使うと常に移動方向と逆向きに力がかかる
0236名前は開発中のものです。
2011/05/09(月) 00:20:15.21ID:Q5/CRoYGv+=aΔt
x+=vΔt
だろ
0237名前は開発中のものです。
2011/05/09(月) 01:17:50.08ID:SHBGDval教科書を丸写しするとそうだな
それをプログラム用に単純化したのが>>234
0238名前は開発中のものです。
2011/05/09(月) 03:49:37.28ID:FkwWv0YKボールとの当たり判定をするなら矩形よりも円(球)の方が自然じゃないでしょうか。
プレイヤー側も球体の集合として定義しておき、
ボール中心とプレイヤー判定球の中心間の距離<ボール半径+プレイヤー判定球の半径
となったら、接触していることになります。
プレイヤー判定球に頭、足、手などの属性をつければ、どこに当たっているかも判定できると思います。
0239名前は開発中のものです。
2011/05/09(月) 03:54:43.87ID:FkwWv0YK物理的には、
・重力
・跳ね返りによるロス…地面やゴールポストとのバウンドの際、運動エネルギーの一部が消失
・ころがり摩擦抵抗…ボールが着地しているときのみ
・空気抵抗…ボールの高度に関わらず場の空気の流れ(風)との速度差に応じて加速
風が無い環境なら、極端な例だと紙風船を思い切り投げたときのようになります。
・ボールのスピン…減速要因ではありませんが空気抵抗による曲げ加速の一種
空気抵抗に配慮するなら合わせて検討してみてください。
などが考えられます。
ちなみに摩擦によるボールの減速については、ボールの速度ベクトル(の水平成分)に対して
1より小さい数(0.995とか)を毎フレームごとに掛けるという簡易な方法でも、それらしく見えると思います。
0240SGGK ◆6pZCoAtaxk
2011/05/09(月) 23:53:46.13ID:7TJ8pACL多くのアドバイス、ありがとうございます。全部活用していきます。
>>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回曲がるシュートが出せるようになる等やってみたいです!
0241SGGK ◆6pZCoAtaxk
2011/05/11(水) 23:28:32.89ID:dXE++lT+宣言と定義しただけで、まだ実際には使っていないので、バグが出るかもしれない。
選手がボールを蹴れるようにする実装を検討中。
>>233で言ってた
>ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。
を実装するにはキック用キーを押した時に選手とボールの座標を取得して当たり判定をして、
当たりなら、例えばボールの状態の変数をセットしてそれに応じてボールの挙動が変化するみたいにすればよさそうだけど、
それをどこに書くかが悩むところで、選手のクラス内にも書けるし、ボールのクラス内でも書けそうな気がする。
でも、今回は選手やボールに関係するオブジェクト、その他のオブジェクトをメンバ変数に持っているSoccerGameクラスの中に
メンバ関数calVariousState()を定義して、その中でやってみるつもり。
SoccerGameクラス内のメンバ関数からなら他のメンバになってる選手やボールのオブジェクトとも情報のやりとりが
しやすそうだし、既に書いてあるcalMatchState()や calTimeResetState()と似た役割の関数になると思うので書きやすいかもしれない。
calVariousState()の中でいろいろなオブジェクトの状態を表す変数を更新して、その結果が他のオブジェクトに反映されるイメージ。
できるかどうか自信無し…。
0242SGGK ◆6pZCoAtaxk
2011/05/17(火) 22:44:39.91ID: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番目の選手のメンバ変数に保持させておくイメージ。
まだ上手くいくかわからないうちに書いてしまった…(汗;
0243名前は開発中のものです。
2011/05/17(火) 23:03:28.52ID:z1f8XmMA0244179 ◆SLG//siTD6
2011/05/18(水) 12:20:58.07ID:5rb+12nDというか、最後3行あたりの用途ならソートしなくても
単純に自分よりボールに近い選手の数を数えればいいんじゃ..?
チラ裏:
ここ2週間ほど忙しくてプログラムから離れてたらクソースが読めなくなってしまったんだぜ・・・
誰だこんな汚いソース書いたのは。。
0245SGGK ◆6pZCoAtaxk
2011/05/18(水) 23:50:48.43ID:SMykIXyqアドバイス、ありがとうございます。
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のようになってしまってます。
自分も作業からしばらく離れてて、あれッ?と思うほどに読めなくなった事がよくありましたので気持ちがよくわかります。(汗;
0246179 ◆SLG//siTD6
2011/05/25(水) 02:34:04.49ID:XYH4jaxxp = &*it みたいな感じで。
>>244 のは、選手数えて保持すればいいんじゃって事・・・w
やってる事は選択ソートとあまり変わらないし、保持したところでアクセスにもループいるから微妙っちゃ微妙。
ポインタ配列ソートならp[7] で7番目にアクセスできるから便利だね
チラ裏:
何をやろうとしてたか忘れたので
とりあえず資源関係を追加してみた。
TOPバーに数個のボタンと資源の残量表示するようにした。
次は資源基地の占領とか作ってみるかなぁ
あーでもユニットクラスの再設計もいるような・・・アニメーションクラスも作ってないし・・・orz
0247SGGK ◆6pZCoAtaxk
2011/05/25(水) 23:02:14.26ID:WTP3xbuqありがとうございます。今思うと自分のソースでも (*it).メンバ関数 のように書いてるところもあり、
*it がオブジェクトのような感じなので、それを考えれば p = &*it でやれそうなのにこれは全然思いつかなかった。
ノートに書いて忘れないようにしておきます。
ソートが今丁度出来たところなので、イテレータへのポインタ方式のソースへの適用は次回かそれ以降のソース改良のときに挑戦してみたいと思います。
ソート書くのに時間が掛かってしまい、途中で作業ペースも落ち気味になる。
ゲームスタート直後は選手とボールの距離が同じデータが複数あるので、
例えば1,1,1,1,5,6,7…になるはずのが、4,4,4,4,5,6,7…になってしまい悩んだけど、
番号付けるループ内にbreak文を入れたら直った。
これだけだと説明不足だけど、今回のはものすごく長いので、ソースの次回UPで見てもらえると助かります。
これで>>241まで戻ってボールを蹴る処理の実装に取り組めそうな予感。
0248SGGK ◆6pZCoAtaxk
2011/05/25(水) 23:16:38.45ID:WTP3xbuqd[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++;
}
0249SGGK ◆6pZCoAtaxk
2011/05/31(火) 23:13:10.10ID:45bt856E選手がボールを蹴るキーを押したときに選手とボールのあたり判定が真ならボールの状態をKICKEDにして、(←ここまでは書けた。コンパイルは通るようになったけど、動かすと問題でるかもしれない。)
ボールの移動関数の方では、ボールの状態がKICKEDになったループの時だけ初速を計算し、状態をMOVINGにして、それ以降は速度0になるまで位置計算を繰り返すにしたいけど、この初速をプログラムのどこで計算するかに迷って時間かかってしまった。
ボールのクラスのメンバ関数でやろうとすると選手のデータを引数にしなければならず面倒に思ったから。
なぜなら初速を変える要因は選手だけでなく地面や壁やゴールバーなどもあるし、そのつどこれらを引数にすると処理が増えて複雑になりそう。
そこでボールデータクラスに初速をメンバ変数として持たせて、選手もボールも扱えるsoccergameクラス内で初速を計算してボールデータのメンバにセットして
ボール関数内ではその初速メンバにアクセスして位置を計算してみるようにしようと考えて今日は終了。
たしか今年の8月で4年が経つはずだけどなかなか進まない…。
いっそのことあと1年で完成させる!
という無理な目標でも立てて頑張った方がずるずるいかなくていいのかもしれないと変な事考えてしまったりして…。
0250179 ◆SLG//siTD6
2011/06/02(木) 04:01:33.97ID:bbIJXBAa自分はあきっぽいからずるずる続けられないんだよなぁ
すでにちょっと2Dスクロールアクションみたいなの作ってみたいなとか思ったり。
が、とりあえずSLGをそれっぽく完成させてるまで我慢。
段々コードが荒っぽくなってるけどw
チラ裏:
中立資源地の占領実装した。敵の資源地とかはまだ。
けど占領しても何も変わらないので自分のものになったか分からない、っていう。
ついでにユニットクラスの再設計?ちょっとコード読みやすくした。
ら、FPSが200→100まで落ち込んだ、HAHAHAワロス・・・
0251SGGK ◆6pZCoAtaxk
2011/06/02(木) 23:58:31.42ID:y33r2mcB自分もコードが早くも分かりにくくなってきてるので、危険な状態かもしれない(汗
選手がボールを蹴れる処理を書き終えてコンパイルしてみたが、
コンパイルは通るようになったものの、選手もボールも画面に表示されずで今日は終了。
0252名前は開発中のものです。
2011/06/07(火) 00:00:23.92ID:OJpa3qNa3D見下ろし型サッカーゲームだったら、
1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく。
2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする(物理運動シミュレーション)。
3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる。
4.選手をまず1人表示し、動かせるようにする。
5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする。
6.CPU選手をまずは1人登場させ、動くようにする。
7.ポジション別にCPU選手のAIを調整する。
8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。
の順番がおすすめです。
■ このスレッドは過去ログ倉庫に格納されています