1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
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
322: 名前は開発中のものです。 [sage] 2011/09/15(木) 07:32:47.70 ID:I5TXtYrP >>320 ボールをトラップするも、ドリブルも、パスもシュートも、本質的には 「選手がボールをコントロールできる相対位置・速度条件にいるとき、どのようなコントロールの意思を示すか」 によって、ボールに新しい運動速度を与えるという処理に統一できる。 つまり、選手はボールに対しては速度にしか干渉できないように制限している。 これによって、もし多数の選手が団子状になったとしても、どう転がるかわからなけれど 試合自体は進行可能になると思う。 先着選手にボールが帰属(優先キープ)してしまうようなルールだと、ゲーム性が変わってくると思うけれど、 格闘よりもフィールド戦略を主にするなら、それもありかと思う。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/322
323: 名前は開発中のものです。 [sage] 2011/09/15(木) 21:25:19.83 ID:I5TXtYrP 「6.CPU選手をまずは1人登場させ、動くようにする」 4で書き忘れたけれど選手クラスの定義には、 ・現在位置(x,yz) ・向いている方向 ・移動速度 ・チームの識別符号 など、描画やボールへの干渉判定に必要な状態変数を持たせる。 それを少し拡張して、 ・目標位置 ・目標方向 をメンバに加え、 「現在位置が目標位置から遠ければ、 向いている方向を目標位置の方向に1フレーム期間で回れる角度だけ補正し、 移動速度も制限速度内で目標位置の方向に加速する。 目標位置い近くなったら、 向いている方向を目標方向に近づけるとともに、 目的地で静止できるように減速する」 というような処理関数を作ってみる。 すると、CPU選手には「ボールを相手ゴールに向かってコントロールできる位置と方向」を与えれば、 毎フレームごとにボールに向かって突進するはず。 ボールがコントロール可能な状態(5の(2))になったなら、敵ゴールに向かってボールを蹴り出すが、 小さくければおそらくドリブルっぽくなるだろうし、ゴールに十分近づいたら強く蹴ってシュートにすればいい。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/323
324: 名前は開発中のものです。 [sage] 2011/09/15(木) 22:00:59.48 ID:I5TXtYrP 「7.ポジション別にCPU選手のAIを調整する」 ここまでくると脳内プログラミングでは難しくなってくるが敢えて思考実験を続けてみる。 6での拡張で、個々の選手に対して、 ・ボールをコントロールできない状態なら、目的地と方向を指示する ・ボールをコントロールできる状態なら、ボールのキック方向と強さを指示する の2パターンだけ考えればよくなった。 目的地については、チームで戦うときは必ずしもボールに向かう必要はなく、 むしろパス回しを活用していかに早く安全に敵陣深く攻め込めるかを考えた配置に なるよう、監督になった気分でそれぞれの選手に指示するべきである。 具体的には、選手間の位置関係から、ボールをコントロールできる(可能性が最も高い)選手から、 最前線の選手までの経路探索アルゴリズムを応用しつつ、個々の選手がより有利な位置に 移動するような評価関数などを駆使して、ということになりそうだが、脳内シミュレーションでは無理っぽい。 なお、選手への指示に上の2パターンを出せば、あとは自動で動いてくれるようにしたので、 ゲームパッドで選手ひとりを直接動かす操作方法は、この段階でデバッグ機能として卒業したい。 その代わりに、プレイヤーもマウスなどを使って、「どのプレイヤーをどこへ動かす」という指示を リアルタイムに出せるインタフェースを作っておく。 こうなると完全にサッカーチームの監督ごっこというゲームシステムが固まってくる。 もしくは、ジョイパッド操作は、チーム内で一人だけ動きが違う「キーパー」操作に割り当てても良いかも。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/324
325: 名前は開発中のものです。 [sage] 2011/09/15(木) 22:21:08.89 ID:I5TXtYrP このあと>>252では仕上げに入っているけれど、補足すべき要素としては、 A.選手同士の接触判定と解決処理 B.最後にボールに触れた選手によるスローイン、ゴール・コーナーキックの判別 C.オフサイドの判定 D.AI実装のための評価関数の充実 などが必要じゃないかと思う。 「8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する」については、 まあ、そのまんま好きなように作りこめば良い。 長々書いたけれど一応これで脳内では完成したつもり。 本当に実装できるか確かめていないので何の保証もないけれど、 なにか一部でも参考になれば嬉しいので自由に使ってくださいな。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/325
326: SGGK ◆6pZCoAtaxk [sage] 2011/09/15(木) 23:35:53.55 ID:7ihcTlmB 戻ってきたので>>320の続きです。 「3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる」 「4.選手をまず1人表示し、動かせるようにする」 どちらも一応大体は組み込めたような感じです。修正は今後もあると思います。 まだポリゴンキャラはやったことなく、ここで教わったビルボードというのでやってます。 いまの自分のレベルだとポリゴンキャラ実装はかなり先になりそうです…。 「5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする」 しばらくの間は、この段階で頑張る事になると思います。 選手自身のボール反射は全く考えてなかったので、それ以外のキック、ドリブルなどの書き直しが 上手く出来たら、挑戦してみます。 「6.CPU選手をまずは1人登場させ、動くようにする」 方向をメンバに持たすのを考えてませんでした。 ポリゴンキャラじゃないので、絵的に表現させるのはまだまだ無理なので、 足元に矢印を表す直線を書いて向きを表現しようと思います。 「7.ポジション別にCPU選手のAIを調整する」 ここは未知の領域なのでまだ先ですが、この段階までこれたら参考にしたいと思います。 >>325も含めて多くの助言、ありがとうございました。 回答できなかった部分も今後の進捗に合わせて細部に取り込んでいこうと思います! それと、ZEROCUPにこだわらない案 ドリブルキーを押すと選手とボールの位置関係と、蹴りたい方向を考慮して 選手があるていどオートで動く。 例えば、まっすぐドリブル中に90度右に動くようにマウスカーソルを動かした時に 丁度ボールを蹴りだしてしまったら、そのボールまで選手が動き、そこでマウスカーソル方向に蹴って、 選手もマウスカーソル方向に動くようになるという感じ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/326
327: SGGK ◆6pZCoAtaxk [sage] 2011/10/06(木) 23:08:47.15 ID:9XiSdH1l 選手がボールと当たってたらボールを蹴れるようになるなどの処理を消して、 ボールの移動処理を簡素化してバグが出なくなるまで出来た。 しかし、ボールが表示されない。 とりあえず、マウスクリックでボールを蹴れるところまで戻せるよう頑張るつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/327
328: SGGK ◆6pZCoAtaxk [sage] 2011/10/17(月) 22:36:26.10 ID:PMZ6FiGu ちょっと停滞している状況にあるけど、まだ諦めてはいない(汗; ボールが描画されなかった理由は、ボールの座標値に異常な大きさの数値が設定されていた為と思われる。 ソースを目で追うと、座標値計算の途中で0で割ろうとしている箇所があり、そこを直したらボールが表示された。 kick関数は選手のメンバ関数だったのをボールのメンバ関数に移し、左マウスクリックでkick関数を実行するようにしたら、 ボールは動くけどまだおかしい。 ボールは浮かずに常に右側にまっすぐ移動し、ラインを出てもラインアウトの判定がされなくなっている。 直接の原因はまだ不明だけど、ボールのメンバ変数にY軸回転角度と射出角度と速度の絶対値を持たせるように変えたことで、 まだ気付いていない未修正のところがあるからだと考えてる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/328
329: SGGK ◆6pZCoAtaxk [sage] 2011/11/06(日) 22:32:37.41 ID:+A7uxjdP あれこれ書き直している内にラインアウトの判定がいつの間にか直っていた。 ボールの軌跡がプログラムの意図と無関係な動きをする問題でつまづく。 左マウスをクリックしたときにボールの速度初期値に変更を加える方式だけど、 変更を単純にしてみたり、ボールの状態を一定にしてみてもダメ。 ふと、マウスの状態を決める箇所のプログラムを目で追っていると、 マウスを左クリックした場合、他のマウス操作をするまでずっとその状態がクリックしたままで プログラム内で保持されている事に気づく。 そこを直したら、ボールの軌跡が直った。 前バージョンのプログラムでは何故問題なかったのか不思議だが、時間も無いのでこのまますすめることにした。 ボールの動きをバグ探しの為にかなり単純化してしまったので、 これを戻す過程でまた別のバグが出るかもしれない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/329
330: SGGK ◆6pZCoAtaxk [sage] 2011/11/07(月) 23:05:47.86 ID:Ci/pCY6w 次に出た問題はボールを例えば傾斜60度で動かそうとしても動かない問題。 やり方はボールからマウスに向かうベクトルをY軸中心で90度回転する行列で回転させて、 そのベクトルを軸にしてボールからマウスに向かうベクトル(大きさは速度と一致させておく)を60度回転させる。 −60度にしてみたら放物線のように動いた。 なので、上記のやり方の中で、Y軸中心で−90度回転させてから、 そのベクトルを軸にして60度回転させるようにして解決。 マウスクリックでボールを動かせるようになったので、やっと選手で蹴れるかどうかというところまで戻った。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/330
331: 名前は開発中のものです。 [sage] 2011/11/08(火) 02:48:47.25 ID:x9yT+23z 原因がジンバルロックなら一旦クォータニオンを経由させれば回避できるよ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/331
332: SGGK ◆6pZCoAtaxk [sage] 2011/11/08(火) 23:40:07.79 ID:3rFIMhjp 見てくれてありがとうございます! プログラムの方はたぶんその可能性は無さそうな感じです。 プログラムはワールド座標系だけで書いてあり、選手から見た座標系をフィールド基準の座標系に行列一回で変換するような書き方はまだ出来てません。 ジンバルロックとクォータニオンについては難解なので、キーワードとして覚え、プログラムのレベルが上がってきたら挑戦してみたいと思います。 昨日の動作の件は、DXライブラリでの回転の正負方向が分からず、 60度で空中に向かってると思ったら、地中に60度で向かっているようで、 何故かボールが地面で反射せず、地面上を這うような動きになっていたのが原因です。 次の予定はドリブル実装に挑戦! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/332
333: SGGK ◆6pZCoAtaxk [sage] 2011/12/31(土) 22:10:55.60 ID:OIfdTnQa 気付けば今年ももう終わり…。 実はまた転勤の話が出て、その準備の所為で>>332から進んでないけど、それは言い訳だと思い反省…。 本当に無理だと思う状況にならない限りは諦めないでゆっくり細々でも続けるつもり! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/333
334: 名前は開発中のものです。 [sage] 2012/01/18(水) 00:32:02.30 ID:JkO8yqpq 見てるぞ、がんばれ〜。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/334
335: SGGK ◆6pZCoAtaxk [sage] 2012/01/21(土) 00:43:07.08 ID:GhL59l/a ありがとうございます! まだドリブル実装で止まってますが諦めずに頑張ります。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/335
336: SGGK ◆6pZCoAtaxk [sage] 2012/01/21(土) 01:10:41.85 ID:GhL59l/a >>65のキー割り当てと異なってくるかもしれないけど、 マウスカーソルに向かって歩く Zキー押し続ける マウスカーソルに向かって走る Xキー押し続ける 選手の進行方向固定 Shiftキー押し続ける ドリブル(選手はボールに向かって移動し、ボールに近づくと ボールをマウスカーソルに向かって蹴る。 これを繰り返す) Dキーを押し続ける ロングパス ドリブル中にマウス左クリック これだと、選手の進行方向を固定して進行方向以外に向けて ノールックっぽくロングパスを出そうとすると、 Z、Dを押しながらマウスを操作しなければならず、操作性が良くないような気がしてきた…。 深夜になってしまった。(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/336
337: SGGK ◆6pZCoAtaxk [sage] 2012/01/29(日) 23:10:06.09 ID:IMaOAms7 しばらくプログラムから離れててソースの中身を忘れてるかもしれないのでリハビリ的に短時間作業。 選手の移動関数内には選手がボールを蹴れる当たり判定範囲を円で示す処理があるんだけど、 その処理部分を別の関数を作ってそちらに移して、選手の移動関数内には その別に作った関数を書けばいいようにした。 これから先、選手の移動関数内にはいろいろな状態を表すフラグが増えてきて ソースが見づらくなる事が予想されるので、ちょっと整理してみようと思った。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/337
338: SGGK ◆6pZCoAtaxk [sage] 2012/01/30(月) 23:23:48.35 ID:9k8tvKVu 次は>>116を参考にした処理がプログラム内に散らばっているので、これも整理しようと思う。 昨日と違い面倒なところがあるので時間かかるかもしれない。 昨日のはひとつのクラス内での話なので、一部分の処理を関数として書き直したい場合、 そのクラス内のメンバ関数として定義して使えば動くけど、 今回やろうとしているのは、処理がいろいろなクラスで使われているので、 今考えられるやり方としては、その処理を行う関数をメンバ関数にもつ新しいクラスを作って、 その新しいクラスのオブジェクトを>>116の処理を使っているいろいろなクラス内で定義する。 あとはその新しいクラスのオブジェクト経由?で>>116の処理を行うメンバ関数を呼び出せばなんとかできるのではと期待。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/338
339: SGGK ◆6pZCoAtaxk [sage] 2012/01/30(月) 23:29:08.24 ID:9k8tvKVu 下から2行目は、「定義する」ではなくて「実体化する」と書いた方が良かったかもしれない。 自信ないけど、なんとなく気になったので訂正。(汗;) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/339
340: SGGK ◆6pZCoAtaxk [sage] 2012/02/01(水) 22:32:47.56 ID:3gp/rYmv >>338で言った関数を作成。 プログラムの一か所を試しにこの関数で置き換えたところ動いた。 他のところの置き換えはその都度やることにして、>>336に戻る。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/340
341: SGGK ◆6pZCoAtaxk [sage] 2012/02/02(木) 22:41:13.33 ID:Y5t1e3wS あれこれ考えたけど良いのが思い浮かばない。 ドリブルの移動関数を別に用意して、選手がボールに当たったらその選手がドリブル権を持っていることにして、 その間はドリブル関数で動くようにして、他の選手がボールに触れたらドリブル権がその選手に移り、 以下同様に繰り返す…というのを考えたが、なんだか以前に失敗したときと同じことになりそうな感じがした。 そこで別の案を偶然思いついた。 22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて 移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。 そんな変数できるかと思ったがこれも偶然思い出した。 自信は無いけど、静的メンバ変数を宣言して、この変数を外部定義すればよいというところまで調べて思い出した。 なので、今日は 選手クラスにID(←いままで無かった)と静的メンバ変数とそのメンバ変数に読み書きできるように get、set関数を用意した(メンバ変数がstaticだからこれらの関数が必要だった。)。 上手くいくかどうかは全く未知な状態。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/341
342: SGGK ◆6pZCoAtaxk [sage] 2012/02/06(月) 23:22:29.56 ID:fDWM60Br 上の文の下から2行目のは「staticでprivateだから」の間違いのような気がしてきたけど自信なし。 今は作業を続ける前にボール関係のクラスをプリントアウトして 寝る時にこれを見ながらプログラムの中身を思い出そうとしている最中。 何故、そんな事してるかというと単純に中身を忘れたので思い出す必要があるというのと、 現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数として ボールのクラスに移して残しておきたいと思ったから。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/342
343: SGGK ◆6pZCoAtaxk [sage] 2012/02/13(月) 23:48:23.39 ID:Z7ePs7lw ボールクラスの宣言内にボールを蹴ったときの処理をするメンバ関数の名前だけ書き、 その定義をcppファイルに書いた。でも、中身はまだ空の状態。 >>342の「現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数」にしようとすると、 ボールを蹴る関数が、マウスと選手の位置情報を持つ必要があり、ボールを蹴る関数が複雑になるので、 現在マウス左クリックでボールを蹴りだせるようにしている箇所でボールを蹴ろうとする方向とその大きさを計算して、 それをボールを蹴る関数に引数として渡すようにしようと思ったところで終了。 いろいろあってなかなか進まない…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/343
344: SGGK ◆6pZCoAtaxk [sage] 2012/02/27(月) 23:06:42.46 ID:7NsJmhpt >>341の >22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて のプログラムを書き、コンパイラが通るところまで出来た。 ドリブルの関数をどうするかについてまだちょっとはっきりしてない感じ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/344
345: SGGK ◆6pZCoAtaxk [sage] 2012/02/28(火) 23:55:54.65 ID:3O5AYFZZ >>341の >移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。 のプログラムを書いた。 選手の移動関数の目標座標がいままではマウスカーソルだったのを選手がボールにタッチした時に目標をボール座標に切り替わるようにしただけ。 ある程度の距離分ボールを蹴りだす処理を書いていないので、ボールにタッチすると同時に選手の動きがその位置で止まってしまう。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/345
346: SGGK ◆6pZCoAtaxk [sage] 2012/03/03(土) 22:58:58.76 ID:7buMobyS しかし、良く見ると自分の選手がボールにタッチする前から選手全員がボールに向かおうとしてることに気付く。 移動出来る選手は自分が動かす1人だけだけで他選手は足元から移動方向に短い線を引くようにしていたので気付いた。 原因はボールにタッチした場合にボールに向かい、タッチしてない場にマウスカーソルに向かうのを 反対にプログラムしていたから。 次は、それでもボールが蹴れない問題。 it=(*listfp).begin(); while(it!=(*listfp).end()){ 押してるキーで移動関数(歩く・走る)を切り替える } ++it; } この1行を忘れてた → it=(*listfp).begin(); while(it!=(*listfp).end()){ ボールにタッチすると判定用変数を選手IDに上書きして、選手の移動目標をボールにして、ボールを蹴る。 } ++it; } しかし、ボールの動きが良くない。 最初は選手がボールを押してるような感じでずるずる動いたかと思うと 次の瞬間、勢いよく蹴ってしまう。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/346
347: SGGK ◆6pZCoAtaxk [sage] 2012/03/11(日) 13:42:44.02 ID:Ow6aUl7a ボールが当たり判定に入り、計算されたボール速度がまだ遅いために当たり判定からボールが出ないことによって 速度がどんどん加算されてしまい、当たり判定から出れる速度になる時には大きな速度になっている…などという想像をしてみたが、 確かめる方法が思いつかなかった。 今のプログラムはボールをキックやドリブルするときには、その瞬間のボールの速度に キックやドリブルの速度を合計するやり方だが、これをやめて、キックやドリブルの瞬間、 つまり当たり判定に触れた時にボールの速度を0にしてからキックやドリブルで設定していた速度で 蹴るようにしたら上手く動いた。 これだと神がかりなトラップになるけど、ゲームなのでとりあえず今はこれでよしとした。 でも、選手にボールがぶつかった時のはねかえり表現ができなくなるので、いつかプログラムを書き直す可能性もある。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/347
348: SGGK ◆6pZCoAtaxk [sage] 2012/03/11(日) 14:04:38.88 ID:Ow6aUl7a しばらくの間、進まなくなるかもしれないので、UP。 ttp://ux.getuploader.com/sggk/ のsggk028です。 例えば、shiftキーを押すと選手の移動方向が一定になるようにしてあるけど、 これをドリブル中にやるとドリブルを放棄して選手が一定方向に進んでしまう。 何か新要素をプログラムに加えるたびにあちこち不具合が出てしまい、直すのにものすごく時間がかかってしまう。 あちこちにif文を使ってるので難しい。 まだどちらかといえば初期の段階なのにこれだけ難しくなるということは 何かテクニックが必要なのかもしれないので、ちょっと調べてみるつもり。 以前このスレで紹介してもらったゲームAIプログラミングの最初の方だけ読んでみようと思うけど、 前読んだ時もあまりよくわからなかったので、もし駄目だったら、このUPがラストの可能性あり…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/348
349: SGGK ◆6pZCoAtaxk [sage] 2012/04/15(日) 23:49:55.88 ID:vuiViXZE 一ヶ月少々経過。時間過ぎるの早すぎる。 読んでいる本の最初の方というのは、第2章だけの44ページ程度のこと。 たぶん8回ぐらいは読んだと思うが、前半がぼんやりと解ったような気持ちになるだけで、後半はまだまだだな〜という感じ。 サンプルソースをダウンロードしておかないと分からない個所がところどころにあり、幸いダウンロードは出来た。 趣味なので諦めずできるときに少しずつゆっくりと…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/349
350: SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:02:50.51 ID:Q0zXyG9A http://ux.getuploader.com/sggk/index/1/date/desc に>>348でUPしたSGGK028のクラス図をUP。(正確さに自信は無いけど、ソースを読む参考用) また1カ月経過しようとしている。 >>349の後、同じ個所を2回読み、合計10回程度は読んだはずなのに駄目そうな感じ。 でも、そう言いつつもさらにもう少し頑張れば分かるかもという気も何故かしている。 ここは気持ちを切り替えて、いったん今やれそうな範囲で進めてみようと思う。 クラス図のUPはその気持ちの表れ。 今、改めてソースを見ると、soccergame.cppの中の処理で 選手のメンバ変数 m_MouseTargetが shiftキーを押したらfalse 、 押さなければ true になるようにし、選手移動関数では、m_MouseTargetを見て、 falseならば、その時点の選手移動方向をマウスカーソルに向かって更新しないことで一定方向に進み、 その間はフリーになったマウスカーソルに向かってボールを蹴れるようにしてある。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/350
351: SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:11:35.39 ID:Q0zXyG9A そこで考えたのは、 1.ボールの移動目標、 2.選手の移動目標 という2つの変数を用意し、これを状態を表す変数だと考える。 ボールや選手の移動関数はこの2つの中身を見て移動先を知るようにプログラムをもっとわかりやすく書けるのではと思った。 そのための次の作業は、ボールの移動目標、選手の移動目標の状態遷移図を書くこと。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/351
352: SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:32:50.84 ID:Q0zXyG9A 説明不足だったかもしれないので…、 >>350のプログラムの場合、ある場所でフラグをセットして、 そのフラグを別な場所のif文で利用して処理を進めるやり方になり、 これは後々ソースが分かりにくくなるような気がしたので、>>351のようにしてみようと思ったという事。 >>350のリンクで最初のhを取り忘れてしまった。 もしかすると直接クリックしてもアプロダのページにいかないかもしれないので、 アドレスをコピペすればページが見れると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/352
353: SGGK ◆6pZCoAtaxk [sage] 2012/06/12(火) 23:21:21.15 ID:LaJwmlYj 生存報告。なかなか作業進まず。 選手の移動目標の状態遷移図は書いてみた。 この遷移を本で見たステートデザインパターンを使ってFieldPlayerクラスの中に実装できないかを思い、 FieldPlayerクラスがPlayerDataクラスを継承しているところにPlayerDataクラスがBaseGameEntityクラスを継承、 つまり継承の継承のように3段階にしたら、 「 クラス、構造体、共用体に既定のコンストラクタがありません 」というエラーが出た。 とりあえず、デフォルトコンストラクタを書いてないクラスがあったので書いてみたらコンパイラを通ったけど、 選手が真っ直ぐ動くだけでマウスについて行かなくなった。そろそろ限界かもしれない…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/353
354: 名前は開発中のものです。 [sage] 2012/06/15(金) 22:27:24.54 ID:PTxBNQ6c ちょっと難しくやろうとしすぎてるのでは? BetterCな感じで関数型な組み方してとりあえず完成に持っていった方がモチベ維持できるかも 見たところオブジェクト指向に移行しきれてないみたいな感じもあるから継承とか使ってても余計ややこしくなってるだけかも http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/354
355: 名前は開発中のものです。 [sage] 2012/06/16(土) 18:28:14.57 ID:44+Yj3Br 影ながら応援していたけど 初めから難しい物を作りすぎてるって感じがするなぁ 今までの経験を生かして新たに1から出来るだけシンプルに ファミコンレベルのサッカーとして動くものを作ってみて それを改造していく方がいいんじゃないかなと http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/355
356: SGGK ◆6pZCoAtaxk [sage] 2012/06/16(土) 20:50:48.24 ID:281LS4tC >>354,>>355 アドバイス、ありがとうございます! 1人でやってると気付かなくて、言われてみると確かにそうだな〜と思える…、ような感じです。 数年やってもこんな状況なんだから、きっとこの先も完成は難しい。 まずは第一段階として、今までの経験上作業に詰まる原因になりやすかったところ、 例えば、継承やコンテナ、デザインパターンを無くすか減らす事を考え、 クラスの組み方も見直して、選手の可能な操作も減らして、それでも先に進めそうになかったら、 第二段階として、さらに簡略化して1から組み直していこうと思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/356
357: SGGK ◆6pZCoAtaxk [sage] 2012/06/16(土) 23:58:57.88 ID:281LS4tC >>353でやろうとしていたステートパターンを中止。 FieldPlayerクラスがPlayerDataクラスを継承していたのをやめて、FieldPlayerクラスに一体化した。 そして選手移動関数の切り替えに使っていたストラテジーパターンの処理も外して、速度一定で歩く関数ひとつにした。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/357
358: SGGK ◆6pZCoAtaxk [sage] 2012/06/18(月) 23:32:07.93 ID:kpasVy0J Application基底クラスとSoccerGame継承クラスの継承関係もなくして、 SoccerGameクラスに統一。基底クラスの変数があちこちで使われてて、直すのに苦労した。 SoccerGameクラスは印刷するとA4、10ページの分量なので、頭の中を整理中。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/358
359: SGGK ◆6pZCoAtaxk [sage] 2012/06/19(火) 23:44:58.47 ID:M4sPlsXK SoccerGameクラスのソースが長すぎるので、GameTitleクラス、GamePlayクラス、GameOverクラスを作り、 SoccerGameクラスのソースをこの3つのクラスに振り分けてみた。 この3つのクラスをSoccerGameクラスの中でオブジェクト化すればなんとか出来るかもしれないので、試すつもり。 失敗してもこの直前まではバックアップあるので戻れるから大丈夫w http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/359
360: 名前は開発中のものです。 [sage] 2012/06/20(水) 21:56:07.67 ID:trY5wmki 最初から作り直した方が早いかもね http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/360
361: SGGK ◆6pZCoAtaxk [sage] 2012/06/20(水) 23:15:46.22 ID:/B/K6MdL >>360 >>356では2段階でやるような気持ちでいたけど、いざやってみると、 クラスのつながりの一番根っこを分解したので結局全部書き直し同然の状態です。(汗) とりあえず、スタート画面を出す為に、関係ないヘッダファイルやcppファイルはコンパイラから外して作業中…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/361
362: SGGK ◆6pZCoAtaxk [sage] 2012/06/21(木) 23:49:12.39 ID:ArXkgTjY デザインパターン使わないと言ったけど、ちょっとだけ試してみたかった。 本に書いてたステートパターンの中で最初の1番簡単な例を使ってスタート画面を出せた。 でも実はバグの行を//付けて注釈行化して強引に表示させただけなのでまだなんとも言えない。 残りのゲームプレイとゲーム終了画面表示の遷移が出来なければswitch文使った方法に戻る。 あまり時間が無いのでゆっくり作業…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/362
363: SGGK ◆6pZCoAtaxk [sage] 2012/06/26(火) 23:26:56.00 ID:qwjvXfmc スタート画面とゲームオーバー画面をキー押しで表示切り替えできた。 ステートパターンの1番簡単な例と言いながらも苦戦した。 以前苦しんだ相互参照、前方宣言が関係してくるパターンだった。 本はその部分は知ってる前提で書いてあるので説明が無かった…orz ネットも調べて知識を得てから考えた実装が動かず、結局試行錯誤で インクルードと前方宣言を入れたり消したりして奇跡的に運よく動いた感じ。 せっかく書いたので、もし問題なく動くならこの部分だけはそのままにしておいて、 またバグ出たら、ifかswitchでやるしかない…orz これ以降、遷移をさせたい処理が出てきたら、それはもちろんifかswitchでやるつもり(苦笑) 数年続けてきて自分には無理だという事がやっとわかった感じ。 やらないで諦めるよりは、やってみて気付いたんだから、よしとしよう! とりあえずはファミコンサッカーを目標にしよう!(これすら出来るか怪しいかもしれない…) 空き時間ができたら作業を少しでも続ける気はあるので、がんばろう〜!…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/363
364: SGGK ◆6pZCoAtaxk [sage] 2012/06/27(水) 22:59:33.76 ID:1q/ptGIo 昨日のプログラムを少し変えた。 1つの状態について1ヘッダーファイル、1cppファイルというのはファイル数が多すぎて分かりずらいのでやめて、 複数の状態を1ヘッダーファイル、1cppファイルにまとめた。 ステートパターンの参考にした本、オライリーのゲームAIプログラミングもそうなっていたし…。 一応、インクルードファイルや前方宣言も本に合わせてみた。 しかし、1か所だけSoccerGameクラスのヘッダーファイルのコンストラクタの行でエラーが出た。 コンストラクタだけ実装(というか定義?)がヘッダーに書いてあったので、 この定義部分だけをcppファイルに移したらコンパイル出来た。 とりあえず、この書き方で進めよう。 タイトル、ゲームオーバー画面が出せたので、次はメインのゲーム部分を書く予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/364
365: 名前は開発中のものです。 [sage] 2012/06/28(木) 21:49:03.02 ID:ckB52e4z SGGK氏には「まとめサイト」を作ることを提案します。 これまでに考えて行ってきたことと、それに対するコメントを対応付けると、 現在のご自身のポテンシャルが見えてくると思います。 また、まとめサイトを持っていたほうが、建設的なコメントが得られるように なると思いますよ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/365
366: SGGK ◆6pZCoAtaxk [sage] 2012/06/29(金) 00:19:39.71 ID:0PUJkiiN >>365 な…なるほど!、ありがとうございます。 ゲームが完成するか自信がないため、まとめサイトについては考えてませんでした。 去年9月頃に受けたアドバイスの後半から追いつけなくなってしまってたので、 そういうのもまとめられたらと思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/366
367: SGGK ◆6pZCoAtaxk [sage] 2012/06/29(金) 00:20:46.65 ID:0PUJkiiN ホームページは初めてだけど、頑張ってみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/367
368: SGGK ◆6pZCoAtaxk [sage] 2012/07/09(月) 00:12:38.91 ID:wFKWfjV1 できるだけ簡略化した状態で作ろうと思い、 今まで使っていたフリー素材はやめて(ラインの座標が正確にわかっていたわけでは無かったから)、 フィールドは緑の板一枚にして、ゴールの絵は無し、ラインを毎ループプログラムで書き、 そのラインも外枠だけにすることを考えた。 緑色のポリゴンの板をとりあえず作成したが、メタセコイアの使い方をすっかり忘れてて苦労した。 今度はこれを画面に表示しようとしたら画面が真っ黒。 フィールドを原点(0,0,0)において、カメラは(0,100、0)で(0,0,0)注視にしたから見えるはずなのに…。 ふと、カメラ座標を(100、100、0)にしてみたら一部が見えた。一応データは読めてるようだ。 メタセコイアで作った時の座標系やDXライブラリの座標系についていろいろ忘れてしまってるようだ…orz ホームページは作業始めるまでにはかなり時間かかりそうだけど、あきらめずにやるつもり。 FC2で練習する計画。一応グーグルにホームページの登録はしてみた。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/368
369: SGGK ◆6pZCoAtaxk [sage] 2012/07/09(月) 23:59:59.89 ID:1ssCdaiG 3Dで真上から見れば2Dになるかなという考えがあったから昨日のような事をしてたんだけど、 いろいろ悩んだ結果、2Dに戻ってやり直してみようと思った。 3Dについては、今までいろいろアドバイスもらっているのに止めるのはなんだか申し訳ない気持ちもあるけど、 今年の8月末で5年経つはずだし、まずは形に出来る可能性が少しでも高い方法を選ぼうと思う。 3Dでいろいろ学んだり考えたりした経験もきっと役立つだろうし…。 当時作った2Dスクロールはがくがく振動してたけど、それでも良しとするつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/369
370: SGGK ◆6pZCoAtaxk [sage] 2012/07/15(日) 22:56:50.87 ID:UGezkUv1 フィールドの画像データ作成に時間がかかってしまった。 最初はファミコンサッカーのフィールドを意識して奥行を考慮したフィールドにしようと思ったが、これはやめた。 真上から見たフィールドにしたが、ドット絵なので、例えばある点と点を結ぶ直線の太さを4ドットにした時、 どのように書けば良いのかといった事にまで悩んでしまい、一度書きあげたが、なんとなく1〜2ドットずれてるような気がした。 そこで思いついたのが、真上からの絵なのだから1/4だけ書いて、これを3枚コピーして上下左右反転してから結合するというやり方。 幸いそのような機能がついていたので、ようやくフィールドの絵が完成した。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/370
371: SGGK ◆6pZCoAtaxk [sage] 2012/07/22(日) 23:13:51.85 ID:NkhxMf+5 選手の絵を書き直した。 1チーム分の4コマx8方向分、キックの絵を1コマx8枚方向分まで完了。 これがもう1チーム分(色変えるだけでも結構手間な感じ)と ゴールキーパー2人の移動も今日書いた絵を色変えるだけにして、ボールに飛びつく絵を1コマx8方向分欲しいとして…。 (32+8)x3+8x2=136枚書かなければならない…orz 絵の経験は全く無いので今まで使っていた影絵レベルに色を付けた程度のものになった。 ちなみに使用ツールはフリーソフトのEDGE。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/371
372: SGGK ◆6pZCoAtaxk [sage] 2012/07/29(日) 23:26:09.03 ID:YNDBJ1FS 自分に負けて今週末は残りの絵を用意出来なかった。 それでも何かしようと考え、この前書いたフィールド(今回のは、1280x420ドット)を座標(-320,60)に書いてみたら一応表示できた。 もしかすると(-319,59)かもしれないが、追及はしない…orz グラフィックデータをロードするときのエラー関係の処理で書いてたC++の文法、throwやcatchの文も思い切ってカットした。 今度は思いつく限りの状態遷移をノートにでも書いてみようかと思う。 例えば、得点表示、時間表示、ボールがラインアウトしたとき、得点時、前半・後半・ハーフタイムの切り替わりの時どうなるかなどの遷移を整理して、それらをどうやってプログラムにまとめるかといった事を考える予定。 ゲームの設計図というものを知らないので、結局我流。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/372
373: SGGK ◆6pZCoAtaxk [sage] 2012/07/31(火) 22:11:31.45 ID:Cy8rBdoX ゲームが1ループする毎に1ずつ増える変数を宣言・定義した。 この変数は、選手のアニメパターンの何コマ目を表示するかを判断するのに使われる。 「14歳から(略)C++(略)」に書いてあった手法なので特に新しいことはしてない。 つまり、自分はこの方法しか知らない…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/373
374: SGGK ◆6pZCoAtaxk [sage] 2012/08/19(日) 21:40:11.74 ID:vVyCK6D6 まだクラスを増やさないでテスト的にプログラム中。(作業時間をなかなか確保出来ないので…) 選手の画像データを読み込むところまで書き、バグも出なくなった。 次は、選手をキーボードで8方向移動出来るようにする予定。 今までのマウスカーソルに選手が向かう仕様はやめることにした。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/374
375: 名前は開発中のものです。 [sage] 2012/08/23(木) 21:40:24.24 ID:1+Zgsvnu 完全0の状態から小規模の3DMMORPGを作ろうとしてるんだが、勉強とトライアンドエラー続けて10年で稼働まで持っていけるだろうか。 とりあえずC言語の基礎本買ってきた。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/375
376: 名前は開発中のものです。 [sage] 2012/08/24(金) 05:31:27.52 ID:ZnGzYILD 努力の仕方次第で10年かからずとも勿論可能だろうけれど、 そのゲームシステムやデザインが10年後通用するものかどうかは解らない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/376
377: 名前は開発中のものです。 [sage] 2012/08/24(金) 06:38:37.94 ID:RwA1Lyd+ >>376 レスありがとう。 たしかに。進歩するの早いからな…。 最新情報つねに仕入れつつ、とにかく始めてみる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/377
378: SGGK ◆6pZCoAtaxk [sage] 2012/08/24(金) 22:58:53.06 ID:YHdN9J8K >>375 自分は今年の8月末で5年経過。まだ1本も作ったことが無いのであと5年で出来るかわかりません。 今思えば、平均して1日どの程度の時間やっていたのか、集中力、やり方とかの管理や工夫が足りてなかったかもしれない。 5年やって実際何時間作業したかとか記録してなかったし…orz(今後は時間だけでもメモ!) 平均的にある程度時間を確保して継続して10年やれればなんとかなりそうに思います。 ゲーム用ライブラリは、既存のものが使えれば時間の節約になってさらに良いと思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/378
379: 名前は開発中のものです。 [sage] 2012/08/25(土) 07:20:40.77 ID:uvPogsDK >>378 アドバイスありがとうございます。 作業工程管理って大事なのですね。 基礎を勉強しつつ、完成までに何が必要かを調べて、いつまでにこれができるようにするみたいな逆算は必要かもですね。 ライブラリもちと調べてみます! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/379
380: SGGK ◆6pZCoAtaxk [sage] 2012/09/20(木) 22:13:17.22 ID:qj08WVBT 確認し忘れてしまいましたが、 もしも学生で、しかも受験生だったりする場合は、勉強に100%専念した方がいいです。 約1ヶ月経ってしまってるけど、ちょっと気になったので…(汗;) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/380
381: SGGK ◆6pZCoAtaxk [sage] 2012/09/20(木) 22:29:34.23 ID:qj08WVBT >>374から進まず…orz 選手の8方向移動を通常ならifかswitch文で条件分岐して、 押したキーに応じて選手の座標に数値を足し引きするだけなんだけど、 そこを関数にして、その関数を関数ポインタとかいうのを使ってうまくまとめられないかと思ってしまった。 しかし、ネットで書き方を調べてるとC言語でいう関数とC++のメンバ関数でのやり方に違いがあるようで、 なんとか空のメンバ関数を定義して関数ポインタを用意するところまでコンパイラが通るようにはなったけど、 結局、ifやswitch文が無くなるような書き方には出来なかったので、ここまでやって断念してしまった。 この作業にかなりタイムロスした。(汗;) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/381
382: SGGK ◆6pZCoAtaxk [sage] 2012/09/20(木) 22:47:31.90 ID:qj08WVBT そして今度は選手のクラス、FieldPlayerクラスを作ってから作業した方がやりやすそうだと思い、以下のエラーが発生。 (略) #include "fieldplayer.h" class SoccerGame; (略)で、 error C2236: 予期しない 'class' 'SoccerGame' です。';' が入力されていることを確認してください。 これは、fieldplayer.hの中に書いてあるFieldPlayerクラスの宣言の最後の}の次に;を付け忘れたのが原因だと分かった。。 しかし、修正しても同じエラーメッセージが出続けて先に進まなくなった。 数日悩み、VC++の画面での修正内容が実際のfieldplayer.h内部には書き込まれていなかったのが原因だとわかった。 fieldplayer.hをメモ帳で開いてみて気がついた。 何故そうなったかは分からないが、VC++で書いたプログラムが保存されるsourceフォルダがあり、 自分はfieldplayer.hをVC++画面メニューから作ってソリューションエクスプローラに登録した後、 fieldplayer.hが何故かsourceフォルダの外に作られていた事に後で気づき、fieldplayer.hをドラッグ&ドロップして sourceフォルダにいれようとしたら、偶然前のプログラムの同じ名前のfieldplayer.hが残っていたので上書きした事を思い出した。 この作業が何らかの影響を与えていたのかもしれない。 ソリューションエクスプローラからfieldplayer.hを外して、追加→既存の項目で再度sourceフォルダ内のfieldplayer.hを登録したら プログラムのエラーが出なくなり動くようになった。 これだけで約一カ月経過…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/382
383: 名前は開発中のものです。 [sage] 2012/10/08(月) 22:33:19.85 ID:t0Dt0rCo 頑張れ〜 おれもほぼ一人でRPGっぽいの作ってる。 いまマップエディタってくらい初歩的なとこ。 SGGK氏のレス全部読んでないしどんな感じかわからないけど、 サッカーだったかAIのサンプルで実例で学ぶAI入門みたいな本がある。既出だったらごめん サンプルが↓のurlの一番下にあるファイルの4章にサッカーのボール追いかけるのがあるよ。 http://www.jblearning.com/Catalog/9781556220784/student/ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/383
384: SGGK ◆6pZCoAtaxk [sage] 2012/10/09(火) 21:25:42.44 ID:H1xyTP7b >>383 リンク紹介ありがとうございます。お互い頑張りましょ〜! 実はこれの2章だけを以前に読んでみたことがあり、その時は1/3〜1/2位しか分からなかったので、 現在停止中ですが、今のプログラムが出来たら、また頑張って読んでみようと思っています。 リンクの方もダウンロードしてみました。 早く4章のサンプルのように画面を動かせるところまで行きたいです。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/384
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 103 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s