1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
298: SGGK ◆6pZCoAtaxk 2011/07/09(土)00:04 ID:HknH7n3m(1) AAS
>>297
ありがとうございます。昨年末頃3Dの本を途中まで読んでて、
それに載っていた座標変換のことを忘れてました。
なのですぐにこれをコードに落とすのはまだ難しいけど、
プログラムのどこかでまた座標変換が必要になる頃には出来るように本を読み直してみます。
座標変換でやる場合、移動量Zを変えた時に注視点をどう変えるとズームになるかがまだ自信ないけど、
本読み直す時に解決出来ればと思ってます。
省4
299: SGGK ◆6pZCoAtaxk 2011/07/10(日)22:33 ID:fCX0gGeR(1) AAS
昨日の書き込みで間違いがあった。
縦回転は、注視点位置ベクトル(x、0、z)から
カメラ位置ベクトルのY成分を0にした (略)
が正解。自分のプログラムは垂直方向がY方向になってるのが理由。
メタセコイア風に画面内のフィールドを動かせるようになったような感じがする。
直接これをゲームに使う事はないかもしれないけど、いろいろ動かして、カメラの位置を検討するのに使えそう。
>>279でやった拡大方法だと、カメラの座標が変わらずに拡大縮小してしまうので、>>276氏の方法に変更。
省1
300: SGGK ◆6pZCoAtaxk 2011/07/17(日)22:29 ID:3PbrHQAt(1) AAS
あまりの暑さなので今日はもう休もうみたいな感じ。
ボールの動きは、ゲーム開始直後に斜め45°で動きだすようにしてみたら動いた。
次は数値は適当だが重力方向の加速度を考慮した式にしてみたところボールは45°の角度で天井に向かってくだけで放物線にならず。
合計数時間は悩んだと思うけど、ループ毎にボール位置しか更新してなかったのが原因とわかる。
速度も加速度の影響で毎ループ変化してるので、速度も毎ループ毎に更新するようにしたら放物線のように動いた。
次は地面やフィールドの端でボールが跳ね返るようにすることに挑戦。
301: SGGK ◆6pZCoAtaxk 2011/08/01(月)00:12 ID:MQtVPARw(1) AAS
時間かかってしまったけど、ボールの跳ね返り実装完了。
ボールの動きは月面歩行みたいなゆったりな動きだけど、これで良しとする。(数値の調整でなんとかできるかも)
179氏>>297のマトリックスを掛けていく方式を意識しつつも、今回も長文プログラムで対応。
(マトリックス作成がまだ自分には理解できてない様なので、勉強しないと無理そうだと今回実感した感じ。)
指定範囲外にボールが出そうになった時に跳ね返らずに壁に沿ってボールが動いたけど、
速度だけ反転して、位置を反転して範囲内に戻してなかったのが原因。
ボールが跳ね返り、跳ね返りの高さが少しずつ小さくなり、最後は転がって止まるようにするのに苦労。
省12
302: SGGK ◆6pZCoAtaxk 2011/08/06(土)23:29 ID:p7p2W50E(1) AAS
やっぱり、簡単にはいかない予感。問題は時間の管理。
ボールがサイドラインを割ったらスローインする場合、
割った瞬間にスローイン位置にボールを復帰させるのは超反応すぎる感じがするので、
スローイン判定が出て、ちょっとボールが転がって、その後スローイン位置にボールが出現するようにしてみたいと思った。
すると、ボールがラインを割ってから、復帰までのわずかな時間をカウントして、その中断時間中はプレイ時間をカウントしないようにするにはどうすればいいんだという悩みが残る。
対象別に専用の時間を用意しなければならないのかと考えてみたが、それは時間測定対象が増えると大変な作業になる。
結構悩んだけど、時間の処理関数をメンバ関数に持つクラスを作って、必要な関数の数だけそのクラスのオブジェクトを作ればいいかもしれないと思った。
省11
303: SGGK ◆6pZCoAtaxk 2011/08/17(水)00:37 ID:gcbpVhmx(1) AAS
AA省
304: SGGK ◆6pZCoAtaxk 2011/08/17(水)23:01 ID:umYfMU6K(1) AAS
(3)については、ボールの移動はそもそもボールクラスのメンバ関数moveの方で計算されるので、
状態がKICKKEDなら動くようになっていて、状態がKICKKEDになってその時の速度を再計算して直後にMOVINGという状態に移ってしまうように書いていた。
つまり、昨日の「ボール状態がKICKKEDか? →YES → ボール移動」とう処理にはいいつまでたっても進まない。
正解は、
ボール状態がMOVINGか? →YES → ライン判定の状態をリセットする
だった。
コーナーキック、ゴールキックもスローインを参考にして実装した。
省7
305: SGGK ◆6pZCoAtaxk 2011/08/19(金)23:52 ID:UUBFLar3(1) AAS
選手を1人だけ移動できるようにした。
今までプログラム内で処理を飛ばしていた部分を飛ばさないようにしただけだけど、
その頃は固定カメラだったので、カメラ座標が変わっても対応できるように修正。
ボールの移動関数のソースをほぼ流用できたので、なんとか出来た。
マウスを選手1人が追いかけ続けるだけだけど、とりあえずはこれで
4番は終了!
306(1): SGGK ◆6pZCoAtaxk 2011/09/03(土)23:32 ID:+c0ztxSK(1) AAS
たまにしか作業してなかったけど、問題があって進まずの状態。
選手とボールの当たり判定があった時にマウスクリックすればボール蹴れるはずが出来ない。
ボールは選手にくっついた状態で選手と一緒に動く。
しかし、なんどもクリックすればボールも少しずつ動く(これも原因不明)。
選手の移動を止めてクリックし続け、当たり判定ゾーンからボールが出ても
何故かボールが選手と同じ速度と方向で動き続ける。
ソースを読んでも原因全く不明。幸いこのボールを蹴る処理を書く前のところまで
省1
307(1): SGGK ◆6pZCoAtaxk 2011/09/11(日)22:22 ID:T1L+oLn6(1/3) AAS
自分は作り始めて先月末で4年が経過してしまった…。
スレタイ通りの状況だけど、きっと何処かで作ってると思いながら、
自分も作業継続!
>306を何とかするために実際は8月30日頃から設計図を書くことにした。
大げさなものではなくてノートに手書きの状態遷移図もどき。
これにより、ボールの状態を
enum BALLSTATE{STOP=1,KICKKED,MOVING}; から、
省7
308: SGGK ◆6pZCoAtaxk 2011/09/11(日)22:33 ID:T1L+oLn6(2/3) AAS
実はボールの動きはかなり不自然な動きになってしまった。
選手の周りを衛星のようになって動く感じ。
Youtu●eでいろんなゲームを参考にしたけど、早すぎて動きのパターンがつかめなかったけど、
最終的にZEROC●Pというゲームを参考にしてみた。
>307で継続と言ったものの、4年でこの進み具合だとあと何年かかるのだろうか?
それ以前に完成出来るのだろうかという不安もあるので、この先どうなるかはやっぱりわかりません!(汗;
309: SGGK ◆6pZCoAtaxk 2011/09/11(日)23:00 ID:T1L+oLn6(3/3) AAS
今日はこれでラスト。
別に伏字にする事もないような気がしてきたので、Youtube、ZEROCUP が正解。
寝ようとしたけど、もう少しだけ作業したらボールをキックできた。
しかし、新しい問題が発生した。
ボールが一度しか蹴れない。
蹴ったボールを拾いにいってもボールが付いてこなくなった。
ボールがラインをはみ出したら試合経過時間が停止し、
省2
310(3): 2011/09/12(月)22:39 ID:Im+6OdM9(1/2) AAS
AA省
311(1): SGGK ◆6pZCoAtaxk 2011/09/12(月)22:48 ID:I4CSS3jX(1/2) AAS
直観的に勢いでなんとか運よく直せた感じ。
1.ボールが一度しか蹴れない。
ボールと選手が当たってPRE_KEEP→KEEPの間は、その選手とボールのあたり判定をキャンセルするフラグを立てていたが、
ボールを蹴った後、そのフラグを戻していなかったので、当たり判定が無効になり、ボールに触れても
状態を変更する命令を実行しなかったから。
2.蹴ったボールを拾いにいってもボールが付いてこなくなった。
1.の理由と同じ。
省9
312(1): 2011/09/12(月)22:53 ID:Im+6OdM9(2/2) AAS
ラインを割ったときには、その時点での(x,y,z)を控えておき、3秒間のカウンタを開始する。
その3秒間も、ボールのループごとの処理は継続する。
3秒たったら、控えておいた位置を復元するとともに、速度はゼロ、フラグは'接地'にセット
スローインしたときは、初速度は違うかもしれないが蹴ったときと同様。
(x,y,z)の控えや3秒カウンタは、ボールとは別のメインのクラスなどで管理するといいと思う。
313: SGGK ◆6pZCoAtaxk 2011/09/12(月)23:12 ID:I4CSS3jX(2/2) AAS
>>310,312
アドバイス、ありがとうございます。
書き込む前にリロードし忘れてしまい、すれ違ってしまいました。(汗;
自分のソースも似た感じの処理になってるようなのですが、
何故か原因不明でどんどん複雑化しているようです。
例えば、切り替えた状態が、知らない間に別のところで切り替えられてしまう…というような感じ。
ここから崩して作り直すのは厳しいので逆にこのまま>>252の
省4
314(1): 2011/09/13(火)19:12 ID:nrv6ZrDs(1) AAS
その残り3つ、急に段差がきつくなってると思う。
無理に進めずに、今までのところをきっちり固めてから進むべきじゃないかな。
315: SGGK ◆6pZCoAtaxk 2011/09/13(火)22:23 ID:UyS152Ji(1) AAS
>>314
書き込みありがとうございます。
AIについては何も勉強してない状態なので、ボール持ってる選手に他の選手が
近づいていくだけで、これがAIという事にしようと考えていましたが、これだけでは物足りないかもしれません。
もう少しAIっぽくしようとすると確かにきついです。
昨日は、崩して作り直すのは難しいと言ったけど、無理せず、部分的でもいいので
ソースを見直して、AIも少し調べてみようと思います。
省4
316(1): 2011/09/14(水)20:07 ID:tc3GEPcb(1/3) AAS
コーディングする気はないけれど>>252を解釈してみる。
まずは「1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく」から。
グラウンドは大きな板ポリゴンにテクスチャを張る方法でも、自分で芝目や白線のポリゴンを描く方法でも
どっちても良いが、ポイントは「ゴールラインの中心に適切な高さのゴールを描いているかに懸かっている。
これは、基本的な座標系の方向とスケールを正しく理解してプログラミングしているかの試金石になる。
グラウンドとゴール一式を3Dモデルとして外部からインポートするという方法も有ると思うが、
その場合でも試験的にゴール枠、ゴールライン、タッチラインにプログラムで赤線を引くなどして、
省9
317(1): 2011/09/14(水)20:42 ID:tc3GEPcb(2/3) AAS
引き続き「2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする」について。
ボールクラスの実装は>>310のとおりで、メソッドは、
(1) ボールの現在位置をセットし、速度は0にする:セットプレイ専用
(2) ループごとに実行する運動方程式の処理
(3) ボールの現在位置を求める
(4) ボールが接触した面があった場合、法線ベクトルを引数に速度を反転させ、反発面上に位置補正する処理
(5) ボールの現在速度を求める
省10
318(1): 2011/09/14(水)21:02 ID:tc3GEPcb(3/3) AAS
連投大丈夫かな?「3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる」
日本サッカー協会の競技規定によると、ボールがラインを完全に割ったらアウトオブプレーとのことなので、
段階1で確認したプログラム上のフィールドサイズと、段階2のメソッド(3)によるボールの(中心の)現在位置と、
おそらく定数となるボールの半径から、インプレーかアウトオブプレーか判定ができる。
アウトの場合、タッチラインを割ったのか、ゴールラインを割ったのか、
またゴールラインの場合は、かごの内か外かまで判定できる。
しかし現時点ではコーナーキック、ゴールキックの区別はできない。
省4
319: 2011/09/15(木)06:32 ID:I5TXtYrP(1/6) AAS
「4.選手をまず1人表示し、動かせるようにする」
選手の3Dモデルデータが必要となるが、とりあえず雪だるまか、こけしか、冷蔵庫で代用することにし、
ここで本質的に重要なのは操作方法の決定とパラメータ調整ではないかと思う。
しかも、単に選手の2次元移動とはいいつつも、実際にはカメラの方向によってプレイヤーが混乱しない
ような工夫が必要なため、快適なプレイ環境を実現する操作方法というのは、実に奥が深いと思われる。
ここの作りこみ次第で、ゲームの面白さが左右されるはず。
しかしとりあえず暫定的なものにしておいて先の段階へ進みたいのであれば、
省4
320(2): SGGK ◆6pZCoAtaxk 2011/09/15(木)06:34 ID:DAY99jiD(1) AAS
>>316,317,318
ありがとうございます。
これから始めようとしているボール関係処理作り直しの参考にさせてもらいます。
「1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく」
いまはメタセコイアっぽい操作でカメラを動かせる段階で止まっていますが、
作業が進めば、自動も考えてみたいです。
「2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする」
省11
321: 2011/09/15(木)07:07 ID:I5TXtYrP(2/6) AAS
「5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする」
先の段階で放置しておいた選手とボールの作用条件について実装する。
選手もボールもともに運動する物体であることから、まずは、
段階2の(3)および(5)で得られるボールの位置および速度を、
判定対象選手のローカル座標系における相対位置、相対速度に変換する。
その上で下記の順に判定、処理を行う
(1) ボールの相対位置が選手に十分近い(距離<ボール半径+体格半径)かつ
省11
322: 2011/09/15(木)07:32 ID:I5TXtYrP(3/6) AAS
>>320
ボールをトラップするも、ドリブルも、パスもシュートも、本質的には
「選手がボールをコントロールできる相対位置・速度条件にいるとき、どのようなコントロールの意思を示すか」
によって、ボールに新しい運動速度を与えるという処理に統一できる。
つまり、選手はボールに対しては速度にしか干渉できないように制限している。
これによって、もし多数の選手が団子状になったとしても、どう転がるかわからなけれど
試合自体は進行可能になると思う。
省2
323: 2011/09/15(木)21:25 ID:I5TXtYrP(4/6) AAS
「6.CPU選手をまずは1人登場させ、動くようにする」
4で書き忘れたけれど選手クラスの定義には、
・現在位置(x,yz)
・向いている方向
・移動速度
・チームの識別符号
など、描画やボールへの干渉判定に必要な状態変数を持たせる。
省15
324: 2011/09/15(木)22:00 ID:I5TXtYrP(5/6) AAS
「7.ポジション別にCPU選手のAIを調整する」
ここまでくると脳内プログラミングでは難しくなってくるが敢えて思考実験を続けてみる。
6での拡張で、個々の選手に対して、
・ボールをコントロールできない状態なら、目的地と方向を指示する
・ボールをコントロールできる状態なら、ボールのキック方向と強さを指示する
の2パターンだけ考えればよくなった。
目的地については、チームで戦うときは必ずしもボールに向かう必要はなく、
省11
325(1): 2011/09/15(木)22:21 ID:I5TXtYrP(6/6) AAS
このあと>>252では仕上げに入っているけれど、補足すべき要素としては、
A.選手同士の接触判定と解決処理
B.最後にボールに触れた選手によるスローイン、ゴール・コーナーキックの判別
C.オフサイドの判定
D.AI実装のための評価関数の充実
などが必要じゃないかと思う。
「8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する」については、
省4
326: SGGK ◆6pZCoAtaxk 2011/09/15(木)23:35 ID:7ihcTlmB(1) AAS
戻ってきたので>>320の続きです。
「3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる」
「4.選手をまず1人表示し、動かせるようにする」
どちらも一応大体は組み込めたような感じです。修正は今後もあると思います。
まだポリゴンキャラはやったことなく、ここで教わったビルボードというのでやってます。
いまの自分のレベルだとポリゴンキャラ実装はかなり先になりそうです…。
「5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする」
省17
327: SGGK ◆6pZCoAtaxk 2011/10/06(木)23:08 ID:9XiSdH1l(1) AAS
選手がボールと当たってたらボールを蹴れるようになるなどの処理を消して、
ボールの移動処理を簡素化してバグが出なくなるまで出来た。
しかし、ボールが表示されない。
とりあえず、マウスクリックでボールを蹴れるところまで戻せるよう頑張るつもり。
328: SGGK ◆6pZCoAtaxk 2011/10/17(月)22:36 ID:PMZ6FiGu(1) AAS
ちょっと停滞している状況にあるけど、まだ諦めてはいない(汗;
ボールが描画されなかった理由は、ボールの座標値に異常な大きさの数値が設定されていた為と思われる。
ソースを目で追うと、座標値計算の途中で0で割ろうとしている箇所があり、そこを直したらボールが表示された。
kick関数は選手のメンバ関数だったのをボールのメンバ関数に移し、左マウスクリックでkick関数を実行するようにしたら、
ボールは動くけどまだおかしい。
ボールは浮かずに常に右側にまっすぐ移動し、ラインを出てもラインアウトの判定がされなくなっている。
直接の原因はまだ不明だけど、ボールのメンバ変数にY軸回転角度と射出角度と速度の絶対値を持たせるように変えたことで、
省1
329: SGGK ◆6pZCoAtaxk 2011/11/06(日)22:32 ID:+A7uxjdP(1) AAS
あれこれ書き直している内にラインアウトの判定がいつの間にか直っていた。
ボールの軌跡がプログラムの意図と無関係な動きをする問題でつまづく。
左マウスをクリックしたときにボールの速度初期値に変更を加える方式だけど、
変更を単純にしてみたり、ボールの状態を一定にしてみてもダメ。
ふと、マウスの状態を決める箇所のプログラムを目で追っていると、
マウスを左クリックした場合、他のマウス操作をするまでずっとその状態がクリックしたままで
プログラム内で保持されている事に気づく。
省4
330: SGGK ◆6pZCoAtaxk 2011/11/07(月)23:05 ID:Ci/pCY6w(1) AAS
次に出た問題はボールを例えば傾斜60度で動かそうとしても動かない問題。
やり方はボールからマウスに向かうベクトルをY軸中心で90度回転する行列で回転させて、
そのベクトルを軸にしてボールからマウスに向かうベクトル(大きさは速度と一致させておく)を60度回転させる。
−60度にしてみたら放物線のように動いた。
なので、上記のやり方の中で、Y軸中心で−90度回転させてから、
そのベクトルを軸にして60度回転させるようにして解決。
マウスクリックでボールを動かせるようになったので、やっと選手で蹴れるかどうかというところまで戻った。
331: 2011/11/08(火)02:48 ID:x9yT+23z(1) AAS
原因がジンバルロックなら一旦クォータニオンを経由させれば回避できるよ
332(1): SGGK ◆6pZCoAtaxk 2011/11/08(火)23:40 ID:3rFIMhjp(1) AAS
見てくれてありがとうございます!
プログラムの方はたぶんその可能性は無さそうな感じです。
プログラムはワールド座標系だけで書いてあり、選手から見た座標系をフィールド基準の座標系に行列一回で変換するような書き方はまだ出来てません。
ジンバルロックとクォータニオンについては難解なので、キーワードとして覚え、プログラムのレベルが上がってきたら挑戦してみたいと思います。
昨日の動作の件は、DXライブラリでの回転の正負方向が分からず、
60度で空中に向かってると思ったら、地中に60度で向かっているようで、
何故かボールが地面で反射せず、地面上を這うような動きになっていたのが原因です。
省1
333: SGGK ◆6pZCoAtaxk 2011/12/31(土)22:10 ID:OIfdTnQa(1) AAS
気付けば今年ももう終わり…。
実はまた転勤の話が出て、その準備の所為で>>332から進んでないけど、それは言い訳だと思い反省…。
本当に無理だと思う状況にならない限りは諦めないでゆっくり細々でも続けるつもり!
334: 2012/01/18(水)00:32 ID:JkO8yqpq(1) AAS
見てるぞ、がんばれ〜。
335: SGGK ◆6pZCoAtaxk 2012/01/21(土)00:43 ID:GhL59l/a(1/2) AAS
ありがとうございます!
まだドリブル実装で止まってますが諦めずに頑張ります。
336(1): SGGK ◆6pZCoAtaxk 2012/01/21(土)01:10 ID:GhL59l/a(2/2) AAS
AA省
337: SGGK ◆6pZCoAtaxk 2012/01/29(日)23:10 ID:IMaOAms7(1) AAS
しばらくプログラムから離れててソースの中身を忘れてるかもしれないのでリハビリ的に短時間作業。
選手の移動関数内には選手がボールを蹴れる当たり判定範囲を円で示す処理があるんだけど、
その処理部分を別の関数を作ってそちらに移して、選手の移動関数内には
その別に作った関数を書けばいいようにした。
これから先、選手の移動関数内にはいろいろな状態を表すフラグが増えてきて
ソースが見づらくなる事が予想されるので、ちょっと整理してみようと思った。
338(1): SGGK ◆6pZCoAtaxk 2012/01/30(月)23:23 ID:9k8tvKVu(1/2) AAS
次は>>116を参考にした処理がプログラム内に散らばっているので、これも整理しようと思う。
昨日と違い面倒なところがあるので時間かかるかもしれない。
昨日のはひとつのクラス内での話なので、一部分の処理を関数として書き直したい場合、
そのクラス内のメンバ関数として定義して使えば動くけど、
今回やろうとしているのは、処理がいろいろなクラスで使われているので、
今考えられるやり方としては、その処理を行う関数をメンバ関数にもつ新しいクラスを作って、
その新しいクラスのオブジェクトを>>116の処理を使っているいろいろなクラス内で定義する。
省1
339: SGGK ◆6pZCoAtaxk 2012/01/30(月)23:29 ID:9k8tvKVu(2/2) AAS
下から2行目は、「定義する」ではなくて「実体化する」と書いた方が良かったかもしれない。
自信ないけど、なんとなく気になったので訂正。(汗;)
340: SGGK ◆6pZCoAtaxk 2012/02/01(水)22:32 ID:3gp/rYmv(1) AAS
>>338で言った関数を作成。
プログラムの一か所を試しにこの関数で置き換えたところ動いた。
他のところの置き換えはその都度やることにして、>>336に戻る。
341(2): SGGK ◆6pZCoAtaxk 2012/02/02(木)22:41 ID:Y5t1e3wS(1) AAS
あれこれ考えたけど良いのが思い浮かばない。
ドリブルの移動関数を別に用意して、選手がボールに当たったらその選手がドリブル権を持っていることにして、
その間はドリブル関数で動くようにして、他の選手がボールに触れたらドリブル権がその選手に移り、
以下同様に繰り返す…というのを考えたが、なんだか以前に失敗したときと同じことになりそうな感じがした。
そこで別の案を偶然思いついた。
22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて
移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。
省6
342(1): SGGK ◆6pZCoAtaxk 2012/02/06(月)23:22 ID:fDWM60Br(1) AAS
上の文の下から2行目のは「staticでprivateだから」の間違いのような気がしてきたけど自信なし。
今は作業を続ける前にボール関係のクラスをプリントアウトして
寝る時にこれを見ながらプログラムの中身を思い出そうとしている最中。
何故、そんな事してるかというと単純に中身を忘れたので思い出す必要があるというのと、
現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数として
ボールのクラスに移して残しておきたいと思ったから。
343: SGGK ◆6pZCoAtaxk 2012/02/13(月)23:48 ID:Z7ePs7lw(1) AAS
ボールクラスの宣言内にボールを蹴ったときの処理をするメンバ関数の名前だけ書き、
その定義をcppファイルに書いた。でも、中身はまだ空の状態。
>>342の「現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数」にしようとすると、
ボールを蹴る関数が、マウスと選手の位置情報を持つ必要があり、ボールを蹴る関数が複雑になるので、
現在マウス左クリックでボールを蹴りだせるようにしている箇所でボールを蹴ろうとする方向とその大きさを計算して、
それをボールを蹴る関数に引数として渡すようにしようと思ったところで終了。
いろいろあってなかなか進まない…orz
344: SGGK ◆6pZCoAtaxk 2012/02/27(月)23:06 ID:7NsJmhpt(1) AAS
>>341の
>22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて
のプログラムを書き、コンパイラが通るところまで出来た。
ドリブルの関数をどうするかについてまだちょっとはっきりしてない感じ。
345: SGGK ◆6pZCoAtaxk 2012/02/28(火)23:55 ID:3O5AYFZZ(1) AAS
>>341の
>移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。
のプログラムを書いた。
選手の移動関数の目標座標がいままではマウスカーソルだったのを選手がボールにタッチした時に目標をボール座標に切り替わるようにしただけ。
ある程度の距離分ボールを蹴りだす処理を書いていないので、ボールにタッチすると同時に選手の動きがその位置で止まってしまう。
346: SGGK ◆6pZCoAtaxk 2012/03/03(土)22:58 ID:7buMobyS(1) AAS
しかし、良く見ると自分の選手がボールにタッチする前から選手全員がボールに向かおうとしてることに気付く。
移動出来る選手は自分が動かす1人だけだけで他選手は足元から移動方向に短い線を引くようにしていたので気付いた。
原因はボールにタッチした場合にボールに向かい、タッチしてない場にマウスカーソルに向かうのを
反対にプログラムしていたから。
次は、それでもボールが蹴れない問題。
it=(*listfp).begin();
while(it!=(*listfp).end()){
省13
347: SGGK ◆6pZCoAtaxk 2012/03/11(日)13:42 ID:Ow6aUl7a(1/2) AAS
ボールが当たり判定に入り、計算されたボール速度がまだ遅いために当たり判定からボールが出ないことによって
速度がどんどん加算されてしまい、当たり判定から出れる速度になる時には大きな速度になっている…などという想像をしてみたが、
確かめる方法が思いつかなかった。
今のプログラムはボールをキックやドリブルするときには、その瞬間のボールの速度に
キックやドリブルの速度を合計するやり方だが、これをやめて、キックやドリブルの瞬間、
つまり当たり判定に触れた時にボールの速度を0にしてからキックやドリブルで設定していた速度で
蹴るようにしたら上手く動いた。
省2
348(1): SGGK ◆6pZCoAtaxk 2012/03/11(日)14:04 ID:Ow6aUl7a(2/2) AAS
しばらくの間、進まなくなるかもしれないので、UP。
外部リンク:ux.getuploader.com のsggk028です。
例えば、shiftキーを押すと選手の移動方向が一定になるようにしてあるけど、
これをドリブル中にやるとドリブルを放棄して選手が一定方向に進んでしまう。
何か新要素をプログラムに加えるたびにあちこち不具合が出てしまい、直すのにものすごく時間がかかってしまう。
あちこちにif文を使ってるので難しい。
まだどちらかといえば初期の段階なのにこれだけ難しくなるということは
省3
349(1): SGGK ◆6pZCoAtaxk 2012/04/15(日)23:49 ID:vuiViXZE(1) AAS
一ヶ月少々経過。時間過ぎるの早すぎる。
読んでいる本の最初の方というのは、第2章だけの44ページ程度のこと。
たぶん8回ぐらいは読んだと思うが、前半がぼんやりと解ったような気持ちになるだけで、後半はまだまだだな〜という感じ。
サンプルソースをダウンロードしておかないと分からない個所がところどころにあり、幸いダウンロードは出来た。
趣味なので諦めずできるときに少しずつゆっくりと…orz
350(1): SGGK ◆6pZCoAtaxk 2012/05/07(月)22:02 ID:Q0zXyG9A(1/3) AAS
外部リンク:ux.getuploader.com に>>348でUPしたSGGK028のクラス図をUP。(正確さに自信は無いけど、ソースを読む参考用)
また1カ月経過しようとしている。
>>349の後、同じ個所を2回読み、合計10回程度は読んだはずなのに駄目そうな感じ。
でも、そう言いつつもさらにもう少し頑張れば分かるかもという気も何故かしている。
ここは気持ちを切り替えて、いったん今やれそうな範囲で進めてみようと思う。
クラス図のUPはその気持ちの表れ。
今、改めてソースを見ると、soccergame.cppの中の処理で
省4
351(1): SGGK ◆6pZCoAtaxk 2012/05/07(月)22:11 ID:Q0zXyG9A(2/3) AAS
そこで考えたのは、
1.ボールの移動目標、
2.選手の移動目標
という2つの変数を用意し、これを状態を表す変数だと考える。
ボールや選手の移動関数はこの2つの中身を見て移動先を知るようにプログラムをもっとわかりやすく書けるのではと思った。
そのための次の作業は、ボールの移動目標、選手の移動目標の状態遷移図を書くこと。
352: SGGK ◆6pZCoAtaxk 2012/05/07(月)22:32 ID:Q0zXyG9A(3/3) AAS
説明不足だったかもしれないので…、
>>350のプログラムの場合、ある場所でフラグをセットして、
そのフラグを別な場所のif文で利用して処理を進めるやり方になり、
これは後々ソースが分かりにくくなるような気がしたので、>>351のようにしてみようと思ったという事。
>>350のリンクで最初のhを取り忘れてしまった。
もしかすると直接クリックしてもアプロダのページにいかないかもしれないので、
アドレスをコピペすればページが見れると思います。
353(1): SGGK ◆6pZCoAtaxk 2012/06/12(火)23:21 ID:LaJwmlYj(1) AAS
生存報告。なかなか作業進まず。
選手の移動目標の状態遷移図は書いてみた。
この遷移を本で見たステートデザインパターンを使ってFieldPlayerクラスの中に実装できないかを思い、
FieldPlayerクラスがPlayerDataクラスを継承しているところにPlayerDataクラスがBaseGameEntityクラスを継承、
つまり継承の継承のように3段階にしたら、
「 クラス、構造体、共用体に既定のコンストラクタがありません 」というエラーが出た。
とりあえず、デフォルトコンストラクタを書いてないクラスがあったので書いてみたらコンパイラを通ったけど、
省1
354(1): 2012/06/15(金)22:27 ID:PTxBNQ6c(1) AAS
ちょっと難しくやろうとしすぎてるのでは?
BetterCな感じで関数型な組み方してとりあえず完成に持っていった方がモチベ維持できるかも
見たところオブジェクト指向に移行しきれてないみたいな感じもあるから継承とか使ってても余計ややこしくなってるだけかも
355(1): 2012/06/16(土)18:28 ID:44+Yj3Br(1) AAS
影ながら応援していたけど
初めから難しい物を作りすぎてるって感じがするなぁ
今までの経験を生かして新たに1から出来るだけシンプルに
ファミコンレベルのサッカーとして動くものを作ってみて
それを改造していく方がいいんじゃないかなと
356(1): SGGK ◆6pZCoAtaxk 2012/06/16(土)20:50 ID:281LS4tC(1/2) AAS
>>354>>355
アドバイス、ありがとうございます!
1人でやってると気付かなくて、言われてみると確かにそうだな〜と思える…、ような感じです。
数年やってもこんな状況なんだから、きっとこの先も完成は難しい。
まずは第一段階として、今までの経験上作業に詰まる原因になりやすかったところ、
例えば、継承やコンテナ、デザインパターンを無くすか減らす事を考え、
クラスの組み方も見直して、選手の可能な操作も減らして、それでも先に進めそうになかったら、
省1
357: SGGK ◆6pZCoAtaxk 2012/06/16(土)23:58 ID:281LS4tC(2/2) AAS
>>353でやろうとしていたステートパターンを中止。
FieldPlayerクラスがPlayerDataクラスを継承していたのをやめて、FieldPlayerクラスに一体化した。
そして選手移動関数の切り替えに使っていたストラテジーパターンの処理も外して、速度一定で歩く関数ひとつにした。
358: SGGK ◆6pZCoAtaxk 2012/06/18(月)23:32 ID:kpasVy0J(1) AAS
Application基底クラスとSoccerGame継承クラスの継承関係もなくして、
SoccerGameクラスに統一。基底クラスの変数があちこちで使われてて、直すのに苦労した。
SoccerGameクラスは印刷するとA4、10ページの分量なので、頭の中を整理中。
359: SGGK ◆6pZCoAtaxk 2012/06/19(火)23:44 ID:M4sPlsXK(1) AAS
SoccerGameクラスのソースが長すぎるので、GameTitleクラス、GamePlayクラス、GameOverクラスを作り、
SoccerGameクラスのソースをこの3つのクラスに振り分けてみた。
この3つのクラスをSoccerGameクラスの中でオブジェクト化すればなんとか出来るかもしれないので、試すつもり。
失敗してもこの直前まではバックアップあるので戻れるから大丈夫w
360(1): 2012/06/20(水)21:56 ID:trY5wmki(1) AAS
最初から作り直した方が早いかもね
361: SGGK ◆6pZCoAtaxk 2012/06/20(水)23:15 ID:/B/K6MdL(1) AAS
>>360
>>356では2段階でやるような気持ちでいたけど、いざやってみると、
クラスのつながりの一番根っこを分解したので結局全部書き直し同然の状態です。(汗)
とりあえず、スタート画面を出す為に、関係ないヘッダファイルやcppファイルはコンパイラから外して作業中…orz
362: SGGK ◆6pZCoAtaxk 2012/06/21(木)23:49 ID:ArXkgTjY(1) AAS
デザインパターン使わないと言ったけど、ちょっとだけ試してみたかった。
本に書いてたステートパターンの中で最初の1番簡単な例を使ってスタート画面を出せた。
でも実はバグの行を//付けて注釈行化して強引に表示させただけなのでまだなんとも言えない。
残りのゲームプレイとゲーム終了画面表示の遷移が出来なければswitch文使った方法に戻る。
あまり時間が無いのでゆっくり作業…。
363: SGGK ◆6pZCoAtaxk 2012/06/26(火)23:26 ID:qwjvXfmc(1) AAS
スタート画面とゲームオーバー画面をキー押しで表示切り替えできた。
ステートパターンの1番簡単な例と言いながらも苦戦した。
以前苦しんだ相互参照、前方宣言が関係してくるパターンだった。
本はその部分は知ってる前提で書いてあるので説明が無かった…orz
ネットも調べて知識を得てから考えた実装が動かず、結局試行錯誤で
インクルードと前方宣言を入れたり消したりして奇跡的に運よく動いた感じ。
せっかく書いたので、もし問題なく動くならこの部分だけはそのままにしておいて、
省6
364: SGGK ◆6pZCoAtaxk 2012/06/27(水)22:59 ID:1q/ptGIo(1) AAS
昨日のプログラムを少し変えた。
1つの状態について1ヘッダーファイル、1cppファイルというのはファイル数が多すぎて分かりずらいのでやめて、
複数の状態を1ヘッダーファイル、1cppファイルにまとめた。
ステートパターンの参考にした本、オライリーのゲームAIプログラミングもそうなっていたし…。
一応、インクルードファイルや前方宣言も本に合わせてみた。
しかし、1か所だけSoccerGameクラスのヘッダーファイルのコンストラクタの行でエラーが出た。
コンストラクタだけ実装(というか定義?)がヘッダーに書いてあったので、
省3
365(2): 2012/06/28(木)21:49 ID:ckB52e4z(1) AAS
SGGK氏には「まとめサイト」を作ることを提案します。
これまでに考えて行ってきたことと、それに対するコメントを対応付けると、
現在のご自身のポテンシャルが見えてくると思います。
また、まとめサイトを持っていたほうが、建設的なコメントが得られるように
なると思いますよ。
366: SGGK ◆6pZCoAtaxk 2012/06/29(金)00:19 ID:0PUJkiiN(1/2) AAS
>>365
な…なるほど!、ありがとうございます。
ゲームが完成するか自信がないため、まとめサイトについては考えてませんでした。
去年9月頃に受けたアドバイスの後半から追いつけなくなってしまってたので、
そういうのもまとめられたらと思います。
367: SGGK ◆6pZCoAtaxk 2012/06/29(金)00:20 ID:0PUJkiiN(2/2) AAS
ホームページは初めてだけど、頑張ってみます。
368: SGGK ◆6pZCoAtaxk 2012/07/09(月)00:12 ID:wFKWfjV1(1) AAS
できるだけ簡略化した状態で作ろうと思い、
今まで使っていたフリー素材はやめて(ラインの座標が正確にわかっていたわけでは無かったから)、
フィールドは緑の板一枚にして、ゴールの絵は無し、ラインを毎ループプログラムで書き、
そのラインも外枠だけにすることを考えた。
緑色のポリゴンの板をとりあえず作成したが、メタセコイアの使い方をすっかり忘れてて苦労した。
今度はこれを画面に表示しようとしたら画面が真っ黒。
フィールドを原点(0,0,0)において、カメラは(0,100、0)で(0,0,0)注視にしたから見えるはずなのに…。
省4
369: SGGK ◆6pZCoAtaxk 2012/07/09(月)23:59 ID:1ssCdaiG(1) AAS
3Dで真上から見れば2Dになるかなという考えがあったから昨日のような事をしてたんだけど、
いろいろ悩んだ結果、2Dに戻ってやり直してみようと思った。
3Dについては、今までいろいろアドバイスもらっているのに止めるのはなんだか申し訳ない気持ちもあるけど、
今年の8月末で5年経つはずだし、まずは形に出来る可能性が少しでも高い方法を選ぼうと思う。
3Dでいろいろ学んだり考えたりした経験もきっと役立つだろうし…。
当時作った2Dスクロールはがくがく振動してたけど、それでも良しとするつもり。
370(1): SGGK ◆6pZCoAtaxk 2012/07/15(日)22:56 ID:UGezkUv1(1) AAS
フィールドの画像データ作成に時間がかかってしまった。
最初はファミコンサッカーのフィールドを意識して奥行を考慮したフィールドにしようと思ったが、これはやめた。
真上から見たフィールドにしたが、ドット絵なので、例えばある点と点を結ぶ直線の太さを4ドットにした時、
どのように書けば良いのかといった事にまで悩んでしまい、一度書きあげたが、なんとなく1〜2ドットずれてるような気がした。
そこで思いついたのが、真上からの絵なのだから1/4だけ書いて、これを3枚コピーして上下左右反転してから結合するというやり方。
幸いそのような機能がついていたので、ようやくフィールドの絵が完成した。
371: SGGK ◆6pZCoAtaxk 2012/07/22(日)23:13 ID:NkhxMf+5(1) AAS
選手の絵を書き直した。
1チーム分の4コマx8方向分、キックの絵を1コマx8枚方向分まで完了。
これがもう1チーム分(色変えるだけでも結構手間な感じ)と
ゴールキーパー2人の移動も今日書いた絵を色変えるだけにして、ボールに飛びつく絵を1コマx8方向分欲しいとして…。
(32+8)x3+8x2=136枚書かなければならない…orz
絵の経験は全く無いので今まで使っていた影絵レベルに色を付けた程度のものになった。
ちなみに使用ツールはフリーソフトのEDGE。
372: SGGK ◆6pZCoAtaxk 2012/07/29(日)23:26 ID:YNDBJ1FS(1) AAS
自分に負けて今週末は残りの絵を用意出来なかった。
それでも何かしようと考え、この前書いたフィールド(今回のは、1280x420ドット)を座標(-320,60)に書いてみたら一応表示できた。
もしかすると(-319,59)かもしれないが、追及はしない…orz
グラフィックデータをロードするときのエラー関係の処理で書いてたC++の文法、throwやcatchの文も思い切ってカットした。
今度は思いつく限りの状態遷移をノートにでも書いてみようかと思う。
例えば、得点表示、時間表示、ボールがラインアウトしたとき、得点時、前半・後半・ハーフタイムの切り替わりの時どうなるかなどの遷移を整理して、それらをどうやってプログラムにまとめるかといった事を考える予定。
ゲームの設計図というものを知らないので、結局我流。
373: SGGK ◆6pZCoAtaxk 2012/07/31(火)22:11 ID:Cy8rBdoX(1) AAS
ゲームが1ループする毎に1ずつ増える変数を宣言・定義した。
この変数は、選手のアニメパターンの何コマ目を表示するかを判断するのに使われる。
「14歳から(略)C++(略)」に書いてあった手法なので特に新しいことはしてない。
つまり、自分はこの方法しか知らない…orz
374(1): SGGK ◆6pZCoAtaxk 2012/08/19(日)21:40 ID:vVyCK6D6(1) AAS
まだクラスを増やさないでテスト的にプログラム中。(作業時間をなかなか確保出来ないので…)
選手の画像データを読み込むところまで書き、バグも出なくなった。
次は、選手をキーボードで8方向移動出来るようにする予定。
今までのマウスカーソルに選手が向かう仕様はやめることにした。
375(1): 2012/08/23(木)21:40 ID:1+Zgsvnu(1) AAS
完全0の状態から小規模の3DMMORPGを作ろうとしてるんだが、勉強とトライアンドエラー続けて10年で稼働まで持っていけるだろうか。
とりあえずC言語の基礎本買ってきた。
376(1): 2012/08/24(金)05:31 ID:ZnGzYILD(1) AAS
努力の仕方次第で10年かからずとも勿論可能だろうけれど、
そのゲームシステムやデザインが10年後通用するものかどうかは解らない。
377: 2012/08/24(金)06:38 ID:RwA1Lyd+(1) AAS
>>376
レスありがとう。
たしかに。進歩するの早いからな…。
最新情報つねに仕入れつつ、とにかく始めてみる。
378(1): SGGK ◆6pZCoAtaxk 2012/08/24(金)22:58 ID:YHdN9J8K(1) AAS
>>375
自分は今年の8月末で5年経過。まだ1本も作ったことが無いのであと5年で出来るかわかりません。
今思えば、平均して1日どの程度の時間やっていたのか、集中力、やり方とかの管理や工夫が足りてなかったかもしれない。
5年やって実際何時間作業したかとか記録してなかったし…orz(今後は時間だけでもメモ!)
平均的にある程度時間を確保して継続して10年やれればなんとかなりそうに思います。
ゲーム用ライブラリは、既存のものが使えれば時間の節約になってさらに良いと思います。
上下前次1-新書関写板覧索設栞歴
あと 109 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.030s