1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
316(1): 名前は開発中のものです。 [sage] 2011/09/14(水) 20:07:55.18 ID:tc3GEPcb(1/3) AAS
コーディングする気はないけれど>>252252(7): 名前は開発中のものです。 [sage] 2011/06/07(火) 00:00:23.92 ID:OJpa3qNa(1) AAS
一気にゲームを完成させるのが難しいなら、要素ごとにマイルストーンを設定するのがいいですよ。
3D見下ろし型サッカーゲームだったら、
1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく。
2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする(物理運動シミュレーション)。
3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる。
4.選手をまず1人表示し、動かせるようにする。
5.選手とボールの接触判定をし、マウスクリックの代わりに選手が蹴るようにする。
6.CPU選手をまずは1人登場させ、動くようにする。
7.ポジション別にCPU選手のAIを調整する。
8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。
の順番がおすすめです。
を解釈してみる。
まずは「1.グラウンドとゴールを描画する。カメラを動かしたいのならその動かし方も決めて調整しておく」から。
グラウンドは大きな板ポリゴンにテクスチャを張る方法でも、自分で芝目や白線のポリゴンを描く方法でも
どっちても良いが、ポイントは「ゴールラインの中心に適切な高さのゴールを描いているかに懸かっている。
これは、基本的な座標系の方向とスケールを正しく理解してプログラミングしているかの試金石になる。
グラウンドとゴール一式を3Dモデルとして外部からインポートするという方法も有ると思うが、
その場合でも試験的にゴール枠、ゴールライン、タッチラインにプログラムで赤線を引くなどして、
平面の座方形の向きと、プログラム内でのフィールドのスケールを視覚的に確認しておくことは必須。
また、当然その様子は透視投影画像で自由にカメラ位置を変えて確認すべきなのだが、
そんなことはライブラリに専用関数が用意されているので、むしろ0番目的な段階の話だと言える。
数字キーを押したら例えばコーナーポストの外からゴール上空を注視する景色になるとか、
いつでも任意のカメラ位置から任意の地点を注視できるように、フレームワークに組み込んでおきたい。
おそらく3Dのサッカーゲームでユーザがプレイヤーに指示を与えながら
マウスでカメラも操作しろというのは無理だと思うので、完成度が上がってきたころには
自動カメラワークのアルゴリズムを検討することいなる。
ただし、現時点では切り替え式で十分。
317(1): 名前は開発中のものです。 [sage] 2011/09/14(水) 20:42:28.24 ID:tc3GEPcb(2/3) AAS
引き続き「2.ボールを配置し、試験的にマウスでクリックすると蹴ったように動くようにする」について。
ボールクラスの実装は>>310310(3): 名前は開発中のものです。 [sage] 2011/09/12(月) 22:39:19.48 ID:Im+6OdM9(1/2) AAS
失礼ながら、無駄に複雑にしすぎてるような気がするね。
基本的にボールの状態変数は、(x,y,z)、(vx,vy,vz)だけあればいい。
それと便宜的に(接地 or浮いている)フラグをつけてもいい。
初期値はそれぞれ、ボールの初期位置、速度は0、フラグは'接地'状態。
ボールのループごとの処理はこんな感じ。
if(浮いている){
垂直方向の重力加速度を速度に加算
速度を位置に加算
if(速度が下向きで垂直座標が地面より下){
位置を地表に補正
垂直方向の速度に -0.9とか反発係数を配慮した値を掛ける
垂直速度が小さくなったら、'接地'状態とする
}
}else{
水平方向の速度に0.99など転がり摩擦係数を意識した値を掛ける
}
水平方向の速度を水平位置に加算
蹴った瞬間、(vx,vy,vz)に初速度を与え、'浮いている'状態にするだけ。
のとおりで、メソッドは、
(1) ボールの現在位置をセットし、速度は0にする:セットプレイ専用
(2) ループごとに実行する運動方程式の処理
(3) ボールの現在位置を求める
(4) ボールが接触した面があった場合、法線ベクトルを引数に速度を反転させ、反発面上に位置補正する処理
(5) ボールの現在速度を求める
(6) ボールに初速度を与える:キック時専用
(7) 現在位置にボールを描画する
とする。(4)の反発は、まずは地面で、次にゴールポストとクロスバーにも反応するようにしておきたい。
とりあえずテスト用には、右クリックでセンターマークに(1)ボールをセット、
左クリックで最初は固定方向でも良いので(6)ボールに初期値を与える機能を呼び出す。
ポイントは、キックによる初速度、重力加速度定数、転がり減衰係数、反発係数などの物理パラメータを
しっかりチューニングし、気持ちよくプレイできるバランスを見つけることに尽きる。
ちなみにメンバ変数はprivateにし、不用意に外部からフラグ操作しないこと。今後もおそらくその必要はないはず。
>>311311(1): SGGK ◆6pZCoAtaxk [sage] 2011/09/12(月) 22:48:41.39 ID:I4CSS3jX(1/2) AAS
直観的に勢いでなんとか運よく直せた感じ。
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の時の確定位置が変数に残っていて、こちらの位置で表示されてしまったのが理由。
によると「当たり判定をキャンセルするフラグ」のような意味不明なフラグを導入しているようだが、
物理的にナンセンスで実際バグの元にもなっている。発想を切り替えなければならない。
318(1): 名前は開発中のものです。 [sage] 2011/09/14(水) 21:02:28.23 ID:tc3GEPcb(3/3) AAS
連投大丈夫かな?「3.ラインを割った状態(スローイン、コーナーキック、ゴールキック、得点)を判定し、復帰処理をつくる」
日本サッカー協会の競技規定によると、ボールがラインを完全に割ったらアウトオブプレーとのことなので、
段階1で確認したプログラム上のフィールドサイズと、段階2のメソッド(3)によるボールの(中心の)現在位置と、
おそらく定数となるボールの半径から、インプレーかアウトオブプレーか判定ができる。
アウトの場合、タッチラインを割ったのか、ゴールラインを割ったのか、
またゴールラインの場合は、かごの内か外かまで判定できる。
しかし現時点ではコーナーキック、ゴールキックの区別はできない。
アウトオブプレーを検出したらフレームワーク側でホイッスルを鳴らすなり何か表示するなどの演出を始めても良いが、
ボールの物理シミュレーションメソッド(2)は呼び続けておくのが好ましい。
演出が終わったら復帰処理となるが、タッチラインを割ったときなら飛び出た位置あたりからスローインだし、
コーナーキック、ゴールキック、あるいは得点後はセットプレー扱いなので再開位置は自動的に決まるはず。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.018s