1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
302: SGGK ◆6pZCoAtaxk [sage] 2011/08/06(土) 23:29:11.60 ID:p7p2W50E やっぱり、簡単にはいかない予感。問題は時間の管理。 ボールがサイドラインを割ったらスローインする場合、 割った瞬間にスローイン位置にボールを復帰させるのは超反応すぎる感じがするので、 スローイン判定が出て、ちょっとボールが転がって、その後スローイン位置にボールが出現するようにしてみたいと思った。 すると、ボールがラインを割ってから、復帰までのわずかな時間をカウントして、その中断時間中はプレイ時間をカウントしないようにするにはどうすればいいんだという悩みが残る。 対象別に専用の時間を用意しなければならないのかと考えてみたが、それは時間測定対象が増えると大変な作業になる。 結構悩んだけど、時間の処理関数をメンバ関数に持つクラスを作って、必要な関数の数だけそのクラスのオブジェクトを作ればいいかもしれないと思った。 実は3D座標系でやってる今のプログラムは上記とは異なる理由から運よく時間関係をクラス化してたのでなんとかなるかもしれない。 2Dの時はこのクラスが無かった…というか思いつかなくて、3Dにするときに色々考えて、ソースを短くしたいという理由から時間関係をクラスにしていた。 時間のクラスには、 void countGameTime();//時間をカウントする。 void resetGameTime();//カウントを0にリセットする void displayGameTime();//時間を画面表示 のメンバ関数があるけど、新たに void tempStopGameTime();//カウントを一時停止する void restartGameTime();//一時停止からカウント再開 を書き加える予定。 上手くいくか確認してから書いた方がいいかもしれないけど、書いてみた。(後で作業を振り返れるし。) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/302
303: SGGK ◆6pZCoAtaxk [sage] 2011/08/17(水) 00:37:25.52 ID:gcbpVhmx >>252 >3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる。 1週間位で出来ないかなと思ったけど無理だった。 テクニックを持っていないので、if文と状態を表す変数で対応しようとしたらソースがぐちゃぐちゃになってしまった。 ノートに手書きで処理の流れを書いてからプログラムを書いてみたけど、多数の問題が発生。 一つずつ直していき、直してしまったらどんな問題だったのか思い出せないのもあったりする。 覚えている問題は、 (1)テキスト文字が表示されない。 (2)スローイン位置に復帰させたボールをけっても動かない。 (3)ボールを蹴れるようになったけど、その後再度ボールがラインを割っても何故か今度はスローインの処理に移らない。 原因と解決法 (1)原因:「ThrowIn!」のテキストがグラフィックの裏に表示されていた。(フィールドを回転できるようにしていなかったら気付かなかったかもしれない。) 解決法:フィールドを書いてからテキストを表示すればいいけど、やり方を変えて、drawText()というメンバ関数を作り、これをメインループの最後の方に置く、 元々テキスト描画命令を書いていたところではフラグをセットして、drawText()内に移したテキスト描画命令はフラグがセットなら命令実行するようにした。 (2)原因:3秒経過した?→YES→ボールをライン際にセット → ボール状態をSTOP → ボール状態がKICKKEDか? →YES → ボール移動 という処理にしていたが、これだと、マウスクリックでボールの状態がKICKKEDになっても直前でSTOPに状態が変わるので、ボール状態がKICKKEDか? → NO となって動かない。 解決法:かなり悩んだけど、3秒経過した?→YES→m_Set01==falseか?→YES→ボールをライン際にセット → ボール状態をSTOP →m_Set01=true;→ ボール状態がKICKKEDか? →YES → ボール移動 にしたら動いた。 (3)←まだ原因不明。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/303
304: SGGK ◆6pZCoAtaxk [sage] 2011/08/17(水) 23:01:09.88 ID:umYfMU6K (3)については、ボールの移動はそもそもボールクラスのメンバ関数moveの方で計算されるので、 状態がKICKKEDなら動くようになっていて、状態がKICKKEDになってその時の速度を再計算して直後にMOVINGという状態に移ってしまうように書いていた。 つまり、昨日の「ボール状態がKICKKEDか? →YES → ボール移動」とう処理にはいいつまでたっても進まない。 正解は、 ボール状態がMOVINGか? →YES → ライン判定の状態をリセットする だった。 コーナーキック、ゴールキックもスローインを参考にして実装した。 これで、 >3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる。 得点以外は実装完了。 次は、 4.選手をまず1人表示し、動かせるようにする。 5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする。 を一緒にやる時に得点実装する予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/304
305: SGGK ◆6pZCoAtaxk [sage] 2011/08/19(金) 23:52:19.80 ID:UUBFLar3 選手を1人だけ移動できるようにした。 今までプログラム内で処理を飛ばしていた部分を飛ばさないようにしただけだけど、 その頃は固定カメラだったので、カメラ座標が変わっても対応できるように修正。 ボールの移動関数のソースをほぼ流用できたので、なんとか出来た。 マウスを選手1人が追いかけ続けるだけだけど、とりあえずはこれで 4番は終了! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/305
306: SGGK ◆6pZCoAtaxk [sage] 2011/09/03(土) 23:32:25.11 ID:+c0ztxSK たまにしか作業してなかったけど、問題があって進まずの状態。 選手とボールの当たり判定があった時にマウスクリックすればボール蹴れるはずが出来ない。 ボールは選手にくっついた状態で選手と一緒に動く。 しかし、なんどもクリックすればボールも少しずつ動く(これも原因不明)。 選手の移動を止めてクリックし続け、当たり判定ゾーンからボールが出ても 何故かボールが選手と同じ速度と方向で動き続ける。 ソースを読んでも原因全く不明。幸いこのボールを蹴る処理を書く前のところまで 戻れたので、もう一度書き直してみる予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/306
307: SGGK ◆6pZCoAtaxk [sage] 2011/09/11(日) 22:22:25.77 ID:T1L+oLn6 自分は作り始めて先月末で4年が経過してしまった…。 スレタイ通りの状況だけど、きっと何処かで作ってると思いながら、 自分も作業継続! >306を何とかするために実際は8月30日頃から設計図を書くことにした。 大げさなものではなくてノートに手書きの状態遷移図もどき。 これにより、ボールの状態を enum BALLSTATE{STOP=1,KICKKED,MOVING}; から、 enum MOVE_STATE{STOP=1,FREE,PRE_KEEP,KEEP};に変更してみた。 kickは選手のメンバ関数にした。 なんとなくだけど、当たり判定関数の引数を増やして、そこにフラグ値を入れて 当たり判定の有効無効を切り替えるようにした。 ボールの移動関数はほとんど書き直しになってしまい、試行錯誤の結果、 ボールが選手に付いていくようにはなった。 まだキック関数はうまく動作してくれない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/307
308: SGGK ◆6pZCoAtaxk [sage] 2011/09/11(日) 22:33:24.95 ID:T1L+oLn6 実はボールの動きはかなり不自然な動きになってしまった。 選手の周りを衛星のようになって動く感じ。 Youtu●eでいろんなゲームを参考にしたけど、早すぎて動きのパターンがつかめなかったけど、 最終的にZEROC●Pというゲームを参考にしてみた。 >307で継続と言ったものの、4年でこの進み具合だとあと何年かかるのだろうか? それ以前に完成出来るのだろうかという不安もあるので、この先どうなるかはやっぱりわかりません!(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/308
309: SGGK ◆6pZCoAtaxk [sage] 2011/09/11(日) 23:00:52.21 ID:T1L+oLn6 今日はこれでラスト。 別に伏字にする事もないような気がしてきたので、Youtube、ZEROCUP が正解。 寝ようとしたけど、もう少しだけ作業したらボールをキックできた。 しかし、新しい問題が発生した。 ボールが一度しか蹴れない。 蹴ったボールを拾いにいってもボールが付いてこなくなった。 ボールがラインをはみ出したら試合経過時間が停止し、 ボールをフィールドに投げ込むまでの経過時間表示はされるが、 ボールが復帰位置に表示されない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/309
310: 名前は開発中のものです。 [sage] 2011/09/12(月) 22:39:19.48 ID:Im+6OdM9 失礼ながら、無駄に複雑にしすぎてるような気がするね。 基本的にボールの状態変数は、(x,y,z)、(vx,vy,vz)だけあればいい。 それと便宜的に(接地 or浮いている)フラグをつけてもいい。 初期値はそれぞれ、ボールの初期位置、速度は0、フラグは'接地'状態。 ボールのループごとの処理はこんな感じ。 if(浮いている){ 垂直方向の重力加速度を速度に加算 速度を位置に加算 if(速度が下向きで垂直座標が地面より下){ 位置を地表に補正 垂直方向の速度に -0.9とか反発係数を配慮した値を掛ける 垂直速度が小さくなったら、'接地'状態とする } }else{ 水平方向の速度に0.99など転がり摩擦係数を意識した値を掛ける } 水平方向の速度を水平位置に加算 蹴った瞬間、(vx,vy,vz)に初速度を与え、'浮いている'状態にするだけ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/310
311: SGGK ◆6pZCoAtaxk [sage] 2011/09/12(月) 22:48:41.39 ID:I4CSS3jX 直観的に勢いでなんとか運よく直せた感じ。 1.ボールが一度しか蹴れない。 ボールと選手が当たってPRE_KEEP→KEEPの間は、その選手とボールのあたり判定をキャンセルするフラグを立てていたが、 ボールを蹴った後、そのフラグを戻していなかったので、当たり判定が無効になり、ボールに触れても 状態を変更する命令を実行しなかったから。 2.蹴ったボールを拾いにいってもボールが付いてこなくなった。 1.の理由と同じ。 3.ボールがラインをはみ出したら試合経過時間が停止し、ボールをフィールドに投げ込むまでの経過時間表示はされるが、ボールが復帰位置に表示されない。 ラインのはみ出し判定処理の内部でボールの復帰位置をセットしていたが、 セットするだけではその位置に表示されるわけではない。 enum MOVE_STATE{STOP=1,FREE,PRE_KEEP,KEEP};という4つの状態をボールに設定していたけど、 これらは同時には存在しない状態なのでswitch〜case文にしておいて、 それぞれのcaseの最後でその時点のボール位置を確定して、switch文を抜けてから 描画関数にボール位置を渡していた。ちなみに変数はstaticにしたらswitchを抜けても保持されているみたいな感じ。(自信なし) ところが何故かcase STOPのところだけ、位置を確定する命令を書き忘れていたので、 case FREEの時の確定位置が変数に残っていて、こちらの位置で表示されてしまったのが理由。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/311
312: 名前は開発中のものです。 [sage] 2011/09/12(月) 22:53:19.97 ID:Im+6OdM9 ラインを割ったときには、その時点での(x,y,z)を控えておき、3秒間のカウンタを開始する。 その3秒間も、ボールのループごとの処理は継続する。 3秒たったら、控えておいた位置を復元するとともに、速度はゼロ、フラグは'接地'にセット スローインしたときは、初速度は違うかもしれないが蹴ったときと同様。 (x,y,z)の控えや3秒カウンタは、ボールとは別のメインのクラスなどで管理するといいと思う。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/312
313: SGGK ◆6pZCoAtaxk [sage] 2011/09/12(月) 23:12:56.43 ID:I4CSS3jX >>310,312 アドバイス、ありがとうございます。 書き込む前にリロードし忘れてしまい、すれ違ってしまいました。(汗; 自分のソースも似た感じの処理になってるようなのですが、 何故か原因不明でどんどん複雑化しているようです。 例えば、切り替えた状態が、知らない間に別のところで切り替えられてしまう…というような感じ。 ここから崩して作り直すのは厳しいので逆にこのまま>>252の 6.CPU選手をまずは1人登場させ、動くようにする。 7.ポジション別にCPU選手のAIを調整する。 8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。 を目指してソースをupできるようにして、そこからソースの見直しをしてみたいと思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/313
314: 名前は開発中のものです。 [sage] 2011/09/13(火) 19:12:35.87 ID:nrv6ZrDs その残り3つ、急に段差がきつくなってると思う。 無理に進めずに、今までのところをきっちり固めてから進むべきじゃないかな。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/314
315: SGGK ◆6pZCoAtaxk [sage] 2011/09/13(火) 22:23:15.13 ID:UyS152Ji >>314 書き込みありがとうございます。 AIについては何も勉強してない状態なので、ボール持ってる選手に他の選手が 近づいていくだけで、これがAIという事にしようと考えていましたが、これだけでは物足りないかもしれません。 もう少しAIっぽくしようとすると確かにきついです。 昨日は、崩して作り直すのは難しいと言ったけど、無理せず、部分的でもいいので ソースを見直して、AIも少し調べてみようと思います。 現時点では、直したばかりのボール移動部分をさらに見直すつもり。 今の段階でも、選手が停止した状態ではボールが蹴れないとか、 ボールがマウス方向に飛ばないとか、クリックしてもすぐに蹴れないなどの不具合が出ているので、 ここはもう一度作り直した方がよさそうな気がした。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/315
316: 名前は開発中のものです。 [sage] 2011/09/14(水) 20:07:55.18 ID:tc3GEPcb コーディングする気はないけれど>>252を解釈してみる。 まずは「1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく」から。 グラウンドは大きな板ポリゴンにテクスチャを張る方法でも、自分で芝目や白線のポリゴンを描く方法でも どっちても良いが、ポイントは「ゴールラインの中心に適切な高さのゴールを描いているかに懸かっている。 これは、基本的な座標系の方向とスケールを正しく理解してプログラミングしているかの試金石になる。 グラウンドとゴール一式を3Dモデルとして外部からインポートするという方法も有ると思うが、 その場合でも試験的にゴール枠、ゴールライン、タッチラインにプログラムで赤線を引くなどして、 平面の座方形の向きと、プログラム内でのフィールドのスケールを視覚的に確認しておくことは必須。 また、当然その様子は透視投影画像で自由にカメラ位置を変えて確認すべきなのだが、 そんなことはライブラリに専用関数が用意されているので、むしろ0番目的な段階の話だと言える。 数字キーを押したら例えばコーナーポストの外からゴール上空を注視する景色になるとか、 いつでも任意のカメラ位置から任意の地点を注視できるように、フレームワークに組み込んでおきたい。 おそらく3Dのサッカーゲームでユーザがプレイヤーに指示を与えながら マウスでカメラも操作しろというのは無理だと思うので、完成度が上がってきたころには 自動カメラワークのアルゴリズムを検討することいなる。 ただし、現時点では切り替え式で十分。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/316
317: 名前は開発中のものです。 [sage] 2011/09/14(水) 20:42:28.24 ID:tc3GEPcb 引き続き「2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする」について。 ボールクラスの実装は>>310のとおりで、メソッドは、 (1) ボールの現在位置をセットし、速度は0にする:セットプレイ専用 (2) ループごとに実行する運動方程式の処理 (3) ボールの現在位置を求める (4) ボールが接触した面があった場合、法線ベクトルを引数に速度を反転させ、反発面上に位置補正する処理 (5) ボールの現在速度を求める (6) ボールに初速度を与える:キック時専用 (7) 現在位置にボールを描画する とする。(4)の反発は、まずは地面で、次にゴールポストとクロスバーにも反応するようにしておきたい。 とりあえずテスト用には、右クリックでセンターマークに(1)ボールをセット、 左クリックで最初は固定方向でも良いので(6)ボールに初期値を与える機能を呼び出す。 ポイントは、キックによる初速度、重力加速度定数、転がり減衰係数、反発係数などの物理パラメータを しっかりチューニングし、気持ちよくプレイできるバランスを見つけることに尽きる。 ちなみにメンバ変数はprivateにし、不用意に外部からフラグ操作しないこと。今後もおそらくその必要はないはず。 >>311によると「当たり判定をキャンセルするフラグ」のような意味不明なフラグを導入しているようだが、 物理的にナンセンスで実際バグの元にもなっている。発想を切り替えなければならない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/317
318: 名前は開発中のものです。 [sage] 2011/09/14(水) 21:02:28.23 ID:tc3GEPcb 連投大丈夫かな?「3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる」 日本サッカー協会の競技規定によると、ボールがラインを完全に割ったらアウトオブプレーとのことなので、 段階1で確認したプログラム上のフィールドサイズと、段階2のメソッド(3)によるボールの(中心の)現在位置と、 おそらく定数となるボールの半径から、インプレーかアウトオブプレーか判定ができる。 アウトの場合、タッチラインを割ったのか、ゴールラインを割ったのか、 またゴールラインの場合は、かごの内か外かまで判定できる。 しかし現時点ではコーナーキック、ゴールキックの区別はできない。 アウトオブプレーを検出したらフレームワーク側でホイッスルを鳴らすなり何か表示するなどの演出を始めても良いが、 ボールの物理シミュレーションメソッド(2)は呼び続けておくのが好ましい。 演出が終わったら復帰処理となるが、タッチラインを割ったときなら飛び出た位置あたりからスローインだし、 コーナーキック、ゴールキック、あるいは得点後はセットプレー扱いなので再開位置は自動的に決まるはず。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/318
319: 名前は開発中のものです。 [sage] 2011/09/15(木) 06:32:14.49 ID:I5TXtYrP 「4.選手をまず1人表示し、動かせるようにする」 選手の3Dモデルデータが必要となるが、とりあえず雪だるまか、こけしか、冷蔵庫で代用することにし、 ここで本質的に重要なのは操作方法の決定とパラメータ調整ではないかと思う。 しかも、単に選手の2次元移動とはいいつつも、実際にはカメラの方向によってプレイヤーが混乱しない ような工夫が必要なため、快適なプレイ環境を実現する操作方法というのは、実に奥が深いと思われる。 ここの作りこみ次第で、ゲームの面白さが左右されるはず。 しかしとりあえず暫定的なものにしておいて先の段階へ進みたいのであれば、 カメラ位置をセンターラインの延長上空、注視点をセンターマークにし、フィールド全体が見渡せる画面とし、 選手はカーソルキーかゲームパッドで移動するようなオーソドックスな方法で構わない。 この段階において、プレイヤーはフィールドの中だけ移動できるように境界条件処理をしておくと良い。 また、ボールとの関わりについては、少なくともこの段階では相互にまったく干渉しないことも確認しておく。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/319
320: SGGK ◆6pZCoAtaxk [sage] 2011/09/15(木) 06:34:11.75 ID:DAY99jiD >>316,317,318 ありがとうございます。 これから始めようとしているボール関係処理作り直しの参考にさせてもらいます。 「1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく」 いまはメタセコイアっぽい操作でカメラを動かせる段階で止まっていますが、 作業が進めば、自動も考えてみたいです。 「2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする」 基本的には>>310氏の案の様にいこうと今考え始めてたところで、法線による反発は将来の課題にしようと思います。 自分はZEROCUPの操作にこだわりすぎてたようで、ZEROCUPは選手がボールにあたると ボールが選手に対してシューティングゲームのオプションのように動くので、 このボールキープ時のボールの動きは別のアルゴリズムに切り替えないと自分には無理で、 キープ中は当たり判定をOFFにしないと毎ループキープ状態への切り替え初期化がされてしまうといった事情が重なり、 だんだん複雑になっていったのだと思います。 ただ、ボールの移動処理をシンプル化しようとした時、選手がボールに当たった時に 選手の移動方向にボールが蹴られる方式では、ドリブルしながら選手の移動方向を変えようとすると、 選手がボールに当たる瞬間に方向を変えなければ、今のマウスカーソルに選手が向かう方式では 方向変更ができないと思い、これが悩みになってました。 一応、ZEROCUPにこだわらない案も考えてみたので戻ってきたら続きを書いてみたいと思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/320
321: 名前は開発中のものです。 [sage] 2011/09/15(木) 07:07:32.22 ID:I5TXtYrP 「5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする」 先の段階で放置しておいた選手とボールの作用条件について実装する。 選手もボールもともに運動する物体であることから、まずは、 段階2の(3)および(5)で得られるボールの位置および速度を、 判定対象選手のローカル座標系における相対位置、相対速度に変換する。 その上で下記の順に判定、処理を行う (1) ボールの相対位置が選手に十分近い(距離<ボール半径+体格半径)かつ 相対速度ベクトルが選手側に向かってきている場合、 ボールがコントロールできない位置で単純に当たったものとみなし、 メソッド2の(4)による反射処理を行う。法線はワールド座標系に逆変換すること。 その際、選手自身の移動速度の法線方向成分を加味するため、 反発係数は1.0を超えることも有り得る。 (2) ボールの相対位置が選手正面の特定領域内にあり、 かつ選手がコントロールする意思を持った状態の場合、 その意思に従いトラップするなりキックするなりでボールの相対速度を決め、 ボールメソッド2(6)を呼び出す。 その際も、選手ローカル座標からワールド座標系に戻してから渡す。 いずれでもなければ、選手はボールに干渉しない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/321
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 166 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.013s