1人でゲームが作れるように修行します。2 (487レス)
上下前次1-新
335: SGGK ◆6pZCoAtaxk [sage] 2012/01/21(土) 00:43:07.08 ID:GhL59l/a(1/2) AAS
ありがとうございます!
まだドリブル実装で止まってますが諦めずに頑張ります。
336(1): SGGK ◆6pZCoAtaxk [sage] 2012/01/21(土) 01:10:41.85 ID:GhL59l/a(2/2) AAS
>>6565(4): SGGK ◆6pZCoAtaxk [sage] 2010/08/03(火) 22:32:31 ID:nPEW7e3n(1) AAS
>>51の課題が終了。
ライフ値は、各選手が移動関数を実行した直後に少しずつ減らすようにしておき、
「 現時点のライフ値/最大ライフ値xライフゲージ最大長さ 」を計算して長方形をその長さで描画する。
減り具合は完全ではないけど、今は調整する予定なし。
次の目標
●共通(ゴールキーパー以外)
(実装済)歩く Z+マウス操作
1 走る X+マウス操作
2 進行方向固定 Shiftキー
3 特殊技術(ボールが頭上ならヘディング、足元ならダイビングヘッド) Spaceバー
●ボールキープ時
4 ジャンプ(タックル避けにもなる) C
5 ロングパス 左クリック
6 ショートパス 右クリック
7 シュート 左右同時クリック
8 パス/シュートは,押す長さで強さを調整
●非ボールキープ時
9 タックル 左クリック
10 カット 右クリック
これらの内6個でも実装できれば上出来と考えて挑戦する予定。
期限を決めてやるのは無理そうな感じ…orz
のキー割り当てと異なってくるかもしれないけど、
マウスカーソルに向かって歩く Zキー押し続ける
マウスカーソルに向かって走る Xキー押し続ける
選手の進行方向固定 Shiftキー押し続ける
ドリブル(選手はボールに向かって移動し、ボールに近づくと
ボールをマウスカーソルに向かって蹴る。
これを繰り返す) Dキーを押し続ける
ロングパス ドリブル中にマウス左クリック
これだと、選手の進行方向を固定して進行方向以外に向けて
ノールックっぽくロングパスを出そうとすると、
Z、Dを押しながらマウスを操作しなければならず、操作性が良くないような気がしてきた…。
深夜になってしまった。(汗;
337: SGGK ◆6pZCoAtaxk [sage] 2012/01/29(日) 23:10:06.09 ID:IMaOAms7(1) AAS
しばらくプログラムから離れててソースの中身を忘れてるかもしれないのでリハビリ的に短時間作業。
選手の移動関数内には選手がボールを蹴れる当たり判定範囲を円で示す処理があるんだけど、
その処理部分を別の関数を作ってそちらに移して、選手の移動関数内には
その別に作った関数を書けばいいようにした。
これから先、選手の移動関数内にはいろいろな状態を表すフラグが増えてきて
ソースが見づらくなる事が予想されるので、ちょっと整理してみようと思った。
338(1): SGGK ◆6pZCoAtaxk [sage] 2012/01/30(月) 23:23:48.35 ID:9k8tvKVu(1/2) AAS
次は>>116116(8): 名前は開発中のものです。 [sage] 2010/10/10(日) 07:27:55 ID:iMXoTcjW(1) AAS
一般的な方法としては、
・E=視点座標、つまりカメラの位置をあらわす位置ベクトル
・L=投影面における視点からマウスカーソルまでの半直線ベクトル
から、仮想空間内の任意の物体との交差判定、交差位置特定がきる。
Eは、普通、プログラム上で管理されている。
Lは、FOV(視野錘台)を自分で管理されているなら容易に計算できるが、
投影変換行列の逆行列を使っても計算できると思う(そういう便利な関数があるかもしれない)。
L = Mproj.inv x (mouseX,mouseY,1)T
Mprij.inv = 投影変換行列の逆行列
(mouseX,mouseY,1) = マウスの座標(正規化装置座標系、同次座標表現)
特に、フィールドのような単一平面との交点計算は、
・O=原点(フィールド面上にあること)
・N=フィールドの法線ベクトル(正規化ベクトル)
に対して、Eがフィールドの表面にあると限定した場合、
LとNの内積が0以上の場合、交差しない(マウスカーソルは天空を指している)
さもなければ、
・h= フィールド面からEまでの高さ((E-O)とNの内積)
から、
・t= -h/(LとNの内積)
を求めれば、目的とするフィールド上の点Fは、
・F= E+L*t
のような手順で計算できるはず。
あとは、(F-O)をフィールドの座標軸(X-O)(Y-O)で分解すれば、2次元座標に戻せる。
うろ覚えで書いているので細かい間違いがあるかも知れないが(違ってたら乞指摘)、
ゆっくりでいいんで、参考にしてもらえれば嬉しい。
頑張れ!
を参考にした処理がプログラム内に散らばっているので、これも整理しようと思う。
昨日と違い面倒なところがあるので時間かかるかもしれない。
昨日のはひとつのクラス内での話なので、一部分の処理を関数として書き直したい場合、
そのクラス内のメンバ関数として定義して使えば動くけど、
今回やろうとしているのは、処理がいろいろなクラスで使われているので、
今考えられるやり方としては、その処理を行う関数をメンバ関数にもつ新しいクラスを作って、
その新しいクラスのオブジェクトを>>116の処理を使っているいろいろなクラス内で定義する。
あとはその新しいクラスのオブジェクト経由?で>>116の処理を行うメンバ関数を呼び出せばなんとかできるのではと期待。
339: SGGK ◆6pZCoAtaxk [sage] 2012/01/30(月) 23:29:08.24 ID:9k8tvKVu(2/2) AAS
下から2行目は、「定義する」ではなくて「実体化する」と書いた方が良かったかもしれない。
自信ないけど、なんとなく気になったので訂正。(汗;)
340: SGGK ◆6pZCoAtaxk [sage] 2012/02/01(水) 22:32:47.56 ID:3gp/rYmv(1) AAS
>>338で言った関数を作成。
プログラムの一か所を試しにこの関数で置き換えたところ動いた。
他のところの置き換えはその都度やることにして、>>336に戻る。
341(2): SGGK ◆6pZCoAtaxk [sage] 2012/02/02(木) 22:41:13.33 ID:Y5t1e3wS(1) AAS
あれこれ考えたけど良いのが思い浮かばない。
ドリブルの移動関数を別に用意して、選手がボールに当たったらその選手がドリブル権を持っていることにして、
その間はドリブル関数で動くようにして、他の選手がボールに触れたらドリブル権がその選手に移り、
以下同様に繰り返す…というのを考えたが、なんだか以前に失敗したときと同じことになりそうな感じがした。
そこで別の案を偶然思いついた。
22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて
移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。
そんな変数できるかと思ったがこれも偶然思い出した。
自信は無いけど、静的メンバ変数を宣言して、この変数を外部定義すればよいというところまで調べて思い出した。
なので、今日は
選手クラスにID(←いままで無かった)と静的メンバ変数とそのメンバ変数に読み書きできるように
get、set関数を用意した(メンバ変数がstaticだからこれらの関数が必要だった。)。
上手くいくかどうかは全く未知な状態。
342(1): SGGK ◆6pZCoAtaxk [sage] 2012/02/06(月) 23:22:29.56 ID:fDWM60Br(1) AAS
上の文の下から2行目のは「staticでprivateだから」の間違いのような気がしてきたけど自信なし。
今は作業を続ける前にボール関係のクラスをプリントアウトして
寝る時にこれを見ながらプログラムの中身を思い出そうとしている最中。
何故、そんな事してるかというと単純に中身を忘れたので思い出す必要があるというのと、
現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数として
ボールのクラスに移して残しておきたいと思ったから。
343: SGGK ◆6pZCoAtaxk [sage] 2012/02/13(月) 23:48:23.39 ID:Z7ePs7lw(1) AAS
ボールクラスの宣言内にボールを蹴ったときの処理をするメンバ関数の名前だけ書き、
その定義をcppファイルに書いた。でも、中身はまだ空の状態。
>>342の「現在マウス左クリックでボールを蹴りだせるようにしている箇所を関数」にしようとすると、
ボールを蹴る関数が、マウスと選手の位置情報を持つ必要があり、ボールを蹴る関数が複雑になるので、
現在マウス左クリックでボールを蹴りだせるようにしている箇所でボールを蹴ろうとする方向とその大きさを計算して、
それをボールを蹴る関数に引数として渡すようにしようと思ったところで終了。
いろいろあってなかなか進まない…orz
344: SGGK ◆6pZCoAtaxk [sage] 2012/02/27(月) 23:06:42.46 ID:7NsJmhpt(1) AAS
>>341の
>22人の選手が一つの変数を共有して、ボールに当たった選手はその変数を自分のIDに書き換えて
のプログラムを書き、コンパイラが通るところまで出来た。
ドリブルの関数をどうするかについてまだちょっとはっきりしてない感じ。
345: SGGK ◆6pZCoAtaxk [sage] 2012/02/28(火) 23:55:54.65 ID:3O5AYFZZ(1) AAS
>>341の
>移動処理にきたときにその共有変数を見て、自分のIDと一致した場合、移動関数をドリブル関数にする。
のプログラムを書いた。
選手の移動関数の目標座標がいままではマウスカーソルだったのを選手がボールにタッチした時に目標をボール座標に切り替わるようにしただけ。
ある程度の距離分ボールを蹴りだす処理を書いていないので、ボールにタッチすると同時に選手の動きがその位置で止まってしまう。
346: SGGK ◆6pZCoAtaxk [sage] 2012/03/03(土) 22:58:58.76 ID:7buMobyS(1) AAS
しかし、良く見ると自分の選手がボールにタッチする前から選手全員がボールに向かおうとしてることに気付く。
移動出来る選手は自分が動かす1人だけだけで他選手は足元から移動方向に短い線を引くようにしていたので気付いた。
原因はボールにタッチした場合にボールに向かい、タッチしてない場にマウスカーソルに向かうのを
反対にプログラムしていたから。
次は、それでもボールが蹴れない問題。
it=(*listfp).begin();
while(it!=(*listfp).end()){
押してるキーで移動関数(歩く・走る)を切り替える
}
++it;
}
この1行を忘れてた → it=(*listfp).begin();
while(it!=(*listfp).end()){
ボールにタッチすると判定用変数を選手IDに上書きして、選手の移動目標をボールにして、ボールを蹴る。
}
++it;
}
しかし、ボールの動きが良くない。
最初は選手がボールを押してるような感じでずるずる動いたかと思うと
次の瞬間、勢いよく蹴ってしまう。
347: SGGK ◆6pZCoAtaxk [sage] 2012/03/11(日) 13:42:44.02 ID:Ow6aUl7a(1/2) AAS
ボールが当たり判定に入り、計算されたボール速度がまだ遅いために当たり判定からボールが出ないことによって
速度がどんどん加算されてしまい、当たり判定から出れる速度になる時には大きな速度になっている…などという想像をしてみたが、
確かめる方法が思いつかなかった。
今のプログラムはボールをキックやドリブルするときには、その瞬間のボールの速度に
キックやドリブルの速度を合計するやり方だが、これをやめて、キックやドリブルの瞬間、
つまり当たり判定に触れた時にボールの速度を0にしてからキックやドリブルで設定していた速度で
蹴るようにしたら上手く動いた。
これだと神がかりなトラップになるけど、ゲームなのでとりあえず今はこれでよしとした。
でも、選手にボールがぶつかった時のはねかえり表現ができなくなるので、いつかプログラムを書き直す可能性もある。
348(1): SGGK ◆6pZCoAtaxk [sage] 2012/03/11(日) 14:04:38.88 ID:Ow6aUl7a(2/2) AAS
しばらくの間、進まなくなるかもしれないので、UP。
外部リンク:ux.getuploader.com のsggk028です。
例えば、shiftキーを押すと選手の移動方向が一定になるようにしてあるけど、
これをドリブル中にやるとドリブルを放棄して選手が一定方向に進んでしまう。
何か新要素をプログラムに加えるたびにあちこち不具合が出てしまい、直すのにものすごく時間がかかってしまう。
あちこちにif文を使ってるので難しい。
まだどちらかといえば初期の段階なのにこれだけ難しくなるということは
何かテクニックが必要なのかもしれないので、ちょっと調べてみるつもり。
以前このスレで紹介してもらったゲームAIプログラミングの最初の方だけ読んでみようと思うけど、
前読んだ時もあまりよくわからなかったので、もし駄目だったら、このUPがラストの可能性あり…orz
349(1): SGGK ◆6pZCoAtaxk [sage] 2012/04/15(日) 23:49:55.88 ID:vuiViXZE(1) AAS
一ヶ月少々経過。時間過ぎるの早すぎる。
読んでいる本の最初の方というのは、第2章だけの44ページ程度のこと。
たぶん8回ぐらいは読んだと思うが、前半がぼんやりと解ったような気持ちになるだけで、後半はまだまだだな〜という感じ。
サンプルソースをダウンロードしておかないと分からない個所がところどころにあり、幸いダウンロードは出来た。
趣味なので諦めずできるときに少しずつゆっくりと…orz
350(1): SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:02:50.51 ID:Q0zXyG9A(1/3) AAS
外部リンク:ux.getuploader.com に>>348でUPしたSGGK028のクラス図をUP。(正確さに自信は無いけど、ソースを読む参考用)
また1カ月経過しようとしている。
>>349の後、同じ個所を2回読み、合計10回程度は読んだはずなのに駄目そうな感じ。
でも、そう言いつつもさらにもう少し頑張れば分かるかもという気も何故かしている。
ここは気持ちを切り替えて、いったん今やれそうな範囲で進めてみようと思う。
クラス図のUPはその気持ちの表れ。
今、改めてソースを見ると、soccergame.cppの中の処理で
選手のメンバ変数 m_MouseTargetが shiftキーを押したらfalse 、
押さなければ true になるようにし、選手移動関数では、m_MouseTargetを見て、
falseならば、その時点の選手移動方向をマウスカーソルに向かって更新しないことで一定方向に進み、
その間はフリーになったマウスカーソルに向かってボールを蹴れるようにしてある。
351(1): SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:11:35.39 ID:Q0zXyG9A(2/3) AAS
そこで考えたのは、
1.ボールの移動目標、
2.選手の移動目標
という2つの変数を用意し、これを状態を表す変数だと考える。
ボールや選手の移動関数はこの2つの中身を見て移動先を知るようにプログラムをもっとわかりやすく書けるのではと思った。
そのための次の作業は、ボールの移動目標、選手の移動目標の状態遷移図を書くこと。
352: SGGK ◆6pZCoAtaxk [sage] 2012/05/07(月) 22:32:50.84 ID:Q0zXyG9A(3/3) AAS
説明不足だったかもしれないので…、
>>350のプログラムの場合、ある場所でフラグをセットして、
そのフラグを別な場所のif文で利用して処理を進めるやり方になり、
これは後々ソースが分かりにくくなるような気がしたので、>>351のようにしてみようと思ったという事。
>>350のリンクで最初のhを取り忘れてしまった。
もしかすると直接クリックしてもアプロダのページにいかないかもしれないので、
アドレスをコピペすればページが見れると思います。
353(1): SGGK ◆6pZCoAtaxk [sage] 2012/06/12(火) 23:21:21.15 ID:LaJwmlYj(1) AAS
生存報告。なかなか作業進まず。
選手の移動目標の状態遷移図は書いてみた。
この遷移を本で見たステートデザインパターンを使ってFieldPlayerクラスの中に実装できないかを思い、
FieldPlayerクラスがPlayerDataクラスを継承しているところにPlayerDataクラスがBaseGameEntityクラスを継承、
つまり継承の継承のように3段階にしたら、
「 クラス、構造体、共用体に既定のコンストラクタがありません 」というエラーが出た。
とりあえず、デフォルトコンストラクタを書いてないクラスがあったので書いてみたらコンパイラを通ったけど、
選手が真っ直ぐ動くだけでマウスについて行かなくなった。そろそろ限界かもしれない…。
354(1): 名前は開発中のものです。 [sage] 2012/06/15(金) 22:27:24.54 ID:PTxBNQ6c(1) AAS
ちょっと難しくやろうとしすぎてるのでは?
BetterCな感じで関数型な組み方してとりあえず完成に持っていった方がモチベ維持できるかも
見たところオブジェクト指向に移行しきれてないみたいな感じもあるから継承とか使ってても余計ややこしくなってるだけかも
355(1): 名前は開発中のものです。 [sage] 2012/06/16(土) 18:28:14.57 ID:44+Yj3Br(1) AAS
影ながら応援していたけど
初めから難しい物を作りすぎてるって感じがするなぁ
今までの経験を生かして新たに1から出来るだけシンプルに
ファミコンレベルのサッカーとして動くものを作ってみて
それを改造していく方がいいんじゃないかなと
356(1): SGGK ◆6pZCoAtaxk [sage] 2012/06/16(土) 20:50:48.24 ID:281LS4tC(1/2) AAS
>>354>>355
アドバイス、ありがとうございます!
1人でやってると気付かなくて、言われてみると確かにそうだな〜と思える…、ような感じです。
数年やってもこんな状況なんだから、きっとこの先も完成は難しい。
まずは第一段階として、今までの経験上作業に詰まる原因になりやすかったところ、
例えば、継承やコンテナ、デザインパターンを無くすか減らす事を考え、
クラスの組み方も見直して、選手の可能な操作も減らして、それでも先に進めそうになかったら、
第二段階として、さらに簡略化して1から組み直していこうと思います。
357: SGGK ◆6pZCoAtaxk [sage] 2012/06/16(土) 23:58:57.88 ID:281LS4tC(2/2) AAS
>>353でやろうとしていたステートパターンを中止。
FieldPlayerクラスがPlayerDataクラスを継承していたのをやめて、FieldPlayerクラスに一体化した。
そして選手移動関数の切り替えに使っていたストラテジーパターンの処理も外して、速度一定で歩く関数ひとつにした。
358: SGGK ◆6pZCoAtaxk [sage] 2012/06/18(月) 23:32:07.93 ID:kpasVy0J(1) AAS
Application基底クラスとSoccerGame継承クラスの継承関係もなくして、
SoccerGameクラスに統一。基底クラスの変数があちこちで使われてて、直すのに苦労した。
SoccerGameクラスは印刷するとA4、10ページの分量なので、頭の中を整理中。
359: SGGK ◆6pZCoAtaxk [sage] 2012/06/19(火) 23:44:58.47 ID:M4sPlsXK(1) AAS
SoccerGameクラスのソースが長すぎるので、GameTitleクラス、GamePlayクラス、GameOverクラスを作り、
SoccerGameクラスのソースをこの3つのクラスに振り分けてみた。
この3つのクラスをSoccerGameクラスの中でオブジェクト化すればなんとか出来るかもしれないので、試すつもり。
失敗してもこの直前まではバックアップあるので戻れるから大丈夫w
上下前次1-新書関写板覧索設栞歴
あと 128 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.030s