1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
抽出解除 レス栞
245: SGGK ◆6pZCoAtaxk [sage] 2011/05/18(水) 23:50:48.43 ID:SMykIXyq(1) AAS
>>243243(1): 名前は開発中のものです。 [sage] 2011/05/17(火) 23:03:28.52 ID:z1f8XmMA(1) AAS
そんなに難しいことしないで、「選手の情報を格納しているクラス」の”ポインタの配列”をソートすればいいんじゃない?
アドバイス、ありがとうございます。
242での説明が不足していたせいもあり、実は自分のプログラムは「選手の情報を格納しているクラス」のオブジェクト22個(選手22人分)を
配列に入れているやり方でなくて、例えば、list<FieldPlayer>m_FieldPlayerList のようにFieldPlayer型のオブジェクトをpush_back関数で次々に入れていけるメンバ、m_FieldPlayerListを定義して、
それらの要素にはイテレータ、list<FieldPlayer>::iterator it;のような命令を書いて、このitを++したり、−−したりする方法でアクセスする感じの実装なので、ポインタでのアクセスが出来なさそうです。
でも、「ポインタの配列をソートする」でネット検索すると、「検索結果ロベールのC++教室 - 第28章 たのしいソート5」というページがヒットしたので、これの1から5までを読んで、実装はまだ理解できないけど考え方がなんとなくわかりました。
これと243氏の”ポインタの配列”をソートするやり方を合わせて
「選手の情報を格納しているクラス」内のメンバ変数で順番を知りたいデータ(距離とか)を構造体配列に移して、それにアクセスするポインタ配列を用意し、そのポインタ配列がソートされるといった仕組みを内部に持っている関数、
つまり、選手の番号を入れたらボールの近さが22人中何番目かがリターンされる関数を作ってみようと思います。
>>244244(2): 179 ◆SLG//siTD6 [sage] 2011/05/18(水) 12:20:58.07 ID:5rb+12nD(1) AAS
難しすぎて理解できないぜ・・・w
というか、最後3行あたりの用途ならソートしなくても
単純に自分よりボールに近い選手の数を数えればいいんじゃ..?
チラ裏:
ここ2週間ほど忙しくてプログラムから離れてたらクソースが読めなくなってしまったんだぜ・・・
誰だこんな汚いソース書いたのは。。
実はまだ考えてないのですが、今わかってる距離の利用法として、ボールに近い選手を両チームから1人ずつ選び頭付近にマークを出すとか、
ボールから7番目以降の距離にいる選手は守りの動きをするなど、1ループで何度かボールとの距離情報が必要になると思われるので、
その都度同じソートをすると時間がかかりそうなので、一度計算したソート結果を選手のオブジェクトのメンバ変数に保持させておこうかなと思ったため>>242242(1): SGGK ◆6pZCoAtaxk [sage] 2011/05/17(火) 22:44:39.91 ID:s8XxjuX7(1) AAS
時間の流れが速すぎて生存報告のみな感じ。
ボールを蹴れるようにするにはあれが必要これが必要と考えていたら
何故かソートのプログラムで悩む。
ソートについては名前は聞いたことある位の認識なのでちょっと調べる必要があって時間かかった。
全部調べるのは無理なので最初に見たバブルソートを使う事にした。
これは時間のかかるソートだという事は調べているときに知ったけど、とりあえずこれでやることにした。
選手とボールの距離を計算してその数値が小さいものから順に並べ替えるんだけど、
選手の情報を格納しているリスト構造のコンテナクラス?の並びは変えないで、
もしソートしたらこの要素は何番目になるという情報を全ての選手のデータに格納できるようにしたかったので、てこずった。
今はやっと方法を思いついたところで、それで上手くいくかどうかによって今後の作業の進み具合も変わりそうな感じ。
やり方は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番目の選手のメンバ変数に保持させておくイメージ。
まだ上手くいくかわからないうちに書いてしまった…(汗;
のようになってしまってます。
自分も作業からしばらく離れてて、あれッ?と思うほどに読めなくなった事がよくありましたので気持ちがよくわかります。(汗;
313: SGGK ◆6pZCoAtaxk [sage] 2011/09/12(月) 23:12:56.43 ID:I4CSS3jX(2/2) AAS
>>310,312310(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)に初速度を与え、'浮いている'状態にするだけ。
312(1): 名前は開発中のものです。 [sage] 2011/09/12(月) 22:53:19.97 ID:Im+6OdM9(2/2) AAS
ラインを割ったときには、その時点での(x,y,z)を控えておき、3秒間のカウンタを開始する。
その3秒間も、ボールのループごとの処理は継続する。
3秒たったら、控えておいた位置を復元するとともに、速度はゼロ、フラグは'接地'にセット
スローインしたときは、初速度は違うかもしれないが蹴ったときと同様。
(x,y,z)の控えや3秒カウンタは、ボールとは別のメインのクラスなどで管理するといいと思う。
アドバイス、ありがとうございます。
書き込む前にリロードし忘れてしまい、すれ違ってしまいました。(汗;
自分のソースも似た感じの処理になってるようなのですが、
何故か原因不明でどんどん複雑化しているようです。
例えば、切り替えた状態が、知らない間に別のところで切り替えられてしまう…というような感じ。
ここから崩して作り直すのは厳しいので逆にこのまま>>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.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。
の順番がおすすめです。
の
6.CPU選手をまずは1人登場させ、動くようにする。
7.ポジション別にCPU選手のAIを調整する。
8.タイム、スコア、勝敗、タイトル画面などの装飾要素を実装する。
を目指してソースをupできるようにして、そこからソースの見直しをしてみたいと思います。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.487s*