1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
228: SGGK ◆6pZCoAtaxk [sage] 2011/04/25(月) 00:12:59.17 ID:oJBn91bE >>224でも短くなった方だけど、ゲームのメイン処理の先頭にこれを書くのは まだ長いような感じがした。それと、ゲームの時間帯の状態を表す定数と時間のリセットの処理を一緒に書くのも 後々わかりにくくなるような気がした。今はたまたま、この定数の切り替わりが起きる条件と時間のリセットが起きる条件が一緒だから このように書けているだけなので、将来の想定外の変更を考えて分ける事を考えた。 ゲーム時間帯の状態を表す定数を決める関数を>>224の改造で作成。 >>224から時間のリセットの行を削除しただけのもの。 calMatchState()という名前にでもしておく。 そして時間のリセットを行う関数をそのあとに書けばいい。 但し、calMatchState()で先にゲーム時間帯の状態を変更されてしまうので、 状態の切り替わりが検知できるように状態を表す変数をもう一つ用意して現時点のゲーム時間帯の状態を表す定数値を保持しておく。 そうしておけば、直前の関数でゲーム時間帯の状態を表す定数値が変わったら、その値と保持していた値が異なるので、 その時に時間をリセットして、現時点のゲーム時間帯の状態を表す定数値は更新する。 いちおうこれでプログラムは同じように動いてくれた。 時間リセットを判定する関数は以下の様な感じ。 void SoccerGame::calTimeResetState() { if(m_MatchState!=m_MatchState1){ m_Time.resetGameTime(); m_MatchState1=m_MatchState; } } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/228
229: SGGK ◆6pZCoAtaxk [sage] 2011/04/29(金) 23:24:14.14 ID:r0lSNY0W 今、自分に負け気味な感じなのでしばらくダメかもしれない予感…。 いろいろ考えがあり、次は当たり判定をクラスで実装しようとしたけれど、 本当にクラスにした方がいいのか迷う。 当たり判定の関数を持つクラスのオブジェクトを選手やボールのオブジェクトに メンバとして持たせるつもりだけど、時間が掛かりそうな予感。(理由は1行目) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/229
230: 179 ◆SLG//siTD6 [sage] 2011/05/01(日) 01:09:31.11 ID:wJ8tL1/e トリップてすと。 プログラムの方はサボり気味で余りすすんでないけど とりあえずユニットから弾撃てるようにしてみた。 実験的に実装したんで中身がスカスカだけどw >>229 当たり判定はどうするか迷うねぇ こっちも当たり判定はかなりややこしい事になってる・・・w http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/230
231: SGGK ◆6pZCoAtaxk [sage] 2011/05/02(月) 00:20:50.39 ID:iqr3WKp3 >>230 トリップの文字にSLGが入ってる! 当たり判定のクラスは、当たり判定の範囲を示す四角の情報をメンバ変数に持ち、 そのメンバ変数を取り込んで番号を付けるメンバ関数、 当たり判定をしたいオブジェクトの四角情報を取り込み、その情報を基に判定する関数があればいいかなと考えてるけど、 まだ考えてるだけで実装が進んでない状況。ヘッダファイルだけは書いてみたけど、あまり自信無し。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/231
232: SGGK ◆6pZCoAtaxk [sage] 2011/05/08(日) 00:12:20.39 ID:K9cPT3KQ 試行錯誤した挙句自分には>>231を実装するのは無理と判断…。 これをやりたかった理由は、選手のアニメパターンがジャンプしたりキックしたり変化した時にそれぞれに応じた 当たり判定を呼び出せるようなしくみがこの先必要なんじゃないかと思ったからだけど、とりあえず断念。 その他 今日は、ボールをメタセコイアモデルにしていたのをあえて以前の2Dに戻した。 当たり判定は、選手の足元xz平面上に32x32の矩形があるとし、 ボールも同様に8x8の矩形があるとし、これで書いてみる予定。 選手とボールが接触してなくても当たってしまうけど無視! ジャンプしたら判定できなくなるけど、とりあえず最低限の実装を優先。 内容がかなり後退した感じ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/232
233: SGGK ◆6pZCoAtaxk [sage] 2011/05/08(日) 22:55:14.85 ID:MKRAe4w3 今日もあまり進まず。 当たり判定クラスの中に作った矩形当たり判定用メンバ関数は最初は、 bool CollisionCheck::isHit(FieldPlayer *, BallData *);//選手とボールの当たり判定 のようなものを考えていたけど、 bool CollisionCheck::isHit(VECTOR,int,int,VECTOR,int,int);//引数:オブジェクト座標、当たり矩形縦、横、オブジェクト座標、当たり矩形縦、横 に変更してみた。1番目の方は選手とボールにしか使えないけど、2番目のようにすれば汎用性が高いのではと考えたのが理由。 ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。 そのときに何回ループしたらボール停止というのではなく、ボールの速度が少しずつ0に近づき、0になったら停止するようにしたいけど、 物理を忘れてしまってるし、当時の記憶がよみがえったとしても問題は解けなかったと思うので、 紙に点と矢印を書いて、どうするか考えてるところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/233
234: 名前は開発中のものです。 [sage] 2011/05/08(日) 23:55:10.30 ID:45vHEn5A move += f; x += move; 物理は基本的にこれ 力fで加速(減速)して、現在地xから速度move分だけ動く >>233ならf=move/2とか、そんな感じで http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/234
235: 名前は開発中のものです。 [sage] 2011/05/08(日) 23:58:57.92 ID:45vHEn5A すまん訂正、-moveにしないとダメだなw f=-move/2 -moveを使うと常に移動方向と逆向きに力がかかる http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/235
236: 名前は開発中のものです。 [sage] 2011/05/09(月) 00:20:15.21 ID:Q5/CRoYG F=ma v+=aΔt x+=vΔt だろ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/236
237: 名前は開発中のものです。 [sage] 2011/05/09(月) 01:17:50.08 ID:SHBGDval >>236 教科書を丸写しするとそうだな それをプログラム用に単純化したのが>>234 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/237
238: 名前は開発中のものです。 [sage] 2011/05/09(月) 03:49:37.28 ID:FkwWv0YK >>231 ボールとの当たり判定をするなら矩形よりも円(球)の方が自然じゃないでしょうか。 プレイヤー側も球体の集合として定義しておき、 ボール中心とプレイヤー判定球の中心間の距離<ボール半径+プレイヤー判定球の半径 となったら、接触していることになります。 プレイヤー判定球に頭、足、手などの属性をつければ、どこに当たっているかも判定できると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/238
239: 名前は開発中のものです。 [sage] 2011/05/09(月) 03:54:43.87 ID:FkwWv0YK >>233 物理的には、 ・重力 ・跳ね返りによるロス…地面やゴールポストとのバウンドの際、運動エネルギーの一部が消失 ・ころがり摩擦抵抗…ボールが着地しているときのみ ・空気抵抗…ボールの高度に関わらず場の空気の流れ(風)との速度差に応じて加速 風が無い環境なら、極端な例だと紙風船を思い切り投げたときのようになります。 ・ボールのスピン…減速要因ではありませんが空気抵抗による曲げ加速の一種 空気抵抗に配慮するなら合わせて検討してみてください。 などが考えられます。 ちなみに摩擦によるボールの減速については、ボールの速度ベクトル(の水平成分)に対して 1より小さい数(0.995とか)を毎フレームごとに掛けるという簡易な方法でも、それらしく見えると思います。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/239
240: SGGK ◆6pZCoAtaxk [sage] 2011/05/09(月) 23:53:46.13 ID:7TJ8pACL >>234〜>>239 多くのアドバイス、ありがとうございます。全部活用していきます。 >>234,>>235,>>236,>>237 なんとなく分かってきました。 昨日考えていた時は、等加速度αのt秒後の位置xの式が物理の本にあったとして、 これをゲームに応用するには、移動を始めた初期位置と初期速度に対してframetime後、2*frametime後、3*frametime後、…n*frametime後の位置を計算しなくてはと思い悩んでいたけど、 毎フレーム単位毎に常にその時の数値が初期値であると考えてframetime後の数値を計算するならば、公式がそのまま使えそうな感じ。 アドバイスのと同じ内容ですけど、たぶん、 frametime後の位置=現在位置+(現在速度 x frametime)+ ((加速度xframetime)x frametime/2 ) (注:加速度は実際の動きを見ながらマイナスの小さい値を設定) を毎ループ繰り返していけば出来そうな予感。 >>238 前のプログラムが矩形当たり判定で他に判定方法を知らなかったのが理由ですが、 矩形だと斜め45度からボールに近づくと水平に近づくより有利になってしまうし、 円(球)形方式ならその問題もなくて良さそうなのでこれに挑戦してみます。 >>239 今回のプログラムでは、 ・重力、・跳ね返りによるロス、・ころがり摩擦抵抗までを簡易な方法で実装していきたいと思ってます。 いずれは、スピンも表現できるようにして、レベルが上がると2回曲がるシュートが出せるようになる等やってみたいです! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/240
241: SGGK ◆6pZCoAtaxk [sage] 2011/05/11(水) 23:28:32.89 ID:dXE++lT+ すぐには進まないけど、当たり判定用関数の実装終了。 宣言と定義しただけで、まだ実際には使っていないので、バグが出るかもしれない。 選手がボールを蹴れるようにする実装を検討中。 >>233で言ってた >ボールをけるボタンを押したときに選手とボールのあたりが真なら、ボールが一定の速度で移動するようにするつもり。 を実装するにはキック用キーを押した時に選手とボールの座標を取得して当たり判定をして、 当たりなら、例えばボールの状態の変数をセットしてそれに応じてボールの挙動が変化するみたいにすればよさそうだけど、 それをどこに書くかが悩むところで、選手のクラス内にも書けるし、ボールのクラス内でも書けそうな気がする。 でも、今回は選手やボールに関係するオブジェクト、その他のオブジェクトをメンバ変数に持っているSoccerGameクラスの中に メンバ関数calVariousState()を定義して、その中でやってみるつもり。 SoccerGameクラス内のメンバ関数からなら他のメンバになってる選手やボールのオブジェクトとも情報のやりとりが しやすそうだし、既に書いてあるcalMatchState()や calTimeResetState()と似た役割の関数になると思うので書きやすいかもしれない。 calVariousState()の中でいろいろなオブジェクトの状態を表す変数を更新して、その結果が他のオブジェクトに反映されるイメージ。 できるかどうか自信無し…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/241
242: SGGK ◆6pZCoAtaxk [sage] 2011/05/17(火) 22:44:39.91 ID:s8XxjuX7 時間の流れが速すぎて生存報告のみな感じ。 ボールを蹴れるようにするにはあれが必要これが必要と考えていたら 何故かソートのプログラムで悩む。 ソートについては名前は聞いたことある位の認識なのでちょっと調べる必要があって時間かかった。 全部調べるのは無理なので最初に見たバブルソートを使う事にした。 これは時間のかかるソートだという事は調べているときに知ったけど、とりあえずこれでやることにした。 選手とボールの距離を計算してその数値が小さいものから順に並べ替えるんだけど、 選手の情報を格納しているリスト構造のコンテナクラス?の並びは変えないで、 もしソートしたらこの要素は何番目になるという情報を全ての選手のデータに格納できるようにしたかったので、てこずった。 今はやっと方法を思いついたところで、それで上手くいくかどうかによって今後の作業の進み具合も変わりそうな感じ。 やり方は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番目の選手のメンバ変数に保持させておくイメージ。 まだ上手くいくかわからないうちに書いてしまった…(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/242
243: 名前は開発中のものです。 [sage] 2011/05/17(火) 23:03:28.52 ID:z1f8XmMA そんなに難しいことしないで、「選手の情報を格納しているクラス」の”ポインタの配列”をソートすればいいんじゃない? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/243
244: 179 ◆SLG//siTD6 [sage] 2011/05/18(水) 12:20:58.07 ID:5rb+12nD 難しすぎて理解できないぜ・・・w というか、最後3行あたりの用途ならソートしなくても 単純に自分よりボールに近い選手の数を数えればいいんじゃ..? チラ裏: ここ2週間ほど忙しくてプログラムから離れてたらクソースが読めなくなってしまったんだぜ・・・ 誰だこんな汚いソース書いたのは。。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/244
245: SGGK ◆6pZCoAtaxk [sage] 2011/05/18(水) 23:50:48.43 ID:SMykIXyq >>243 アドバイス、ありがとうございます。 242での説明が不足していたせいもあり、実は自分のプログラムは「選手の情報を格納しているクラス」のオブジェクト22個(選手22人分)を 配列に入れているやり方でなくて、例えば、list<FieldPlayer>m_FieldPlayerList のようにFieldPlayer型のオブジェクトをpush_back関数で次々に入れていけるメンバ、m_FieldPlayerListを定義して、 それらの要素にはイテレータ、list<FieldPlayer>::iterator it;のような命令を書いて、このitを++したり、−−したりする方法でアクセスする感じの実装なので、ポインタでのアクセスが出来なさそうです。 でも、「ポインタの配列をソートする」でネット検索すると、「検索結果ロベールのC++教室 - 第28章 たのしいソート5」というページがヒットしたので、これの1から5までを読んで、実装はまだ理解できないけど考え方がなんとなくわかりました。 これと243氏の”ポインタの配列”をソートするやり方を合わせて 「選手の情報を格納しているクラス」内のメンバ変数で順番を知りたいデータ(距離とか)を構造体配列に移して、それにアクセスするポインタ配列を用意し、そのポインタ配列がソートされるといった仕組みを内部に持っている関数、 つまり、選手の番号を入れたらボールの近さが22人中何番目かがリターンされる関数を作ってみようと思います。 >>244 実はまだ考えてないのですが、今わかってる距離の利用法として、ボールに近い選手を両チームから1人ずつ選び頭付近にマークを出すとか、 ボールから7番目以降の距離にいる選手は守りの動きをするなど、1ループで何度かボールとの距離情報が必要になると思われるので、 その都度同じソートをすると時間がかかりそうなので、一度計算したソート結果を選手のオブジェクトのメンバ変数に保持させておこうかなと思ったため>>242のようになってしまってます。 自分も作業からしばらく離れてて、あれッ?と思うほどに読めなくなった事がよくありましたので気持ちがよくわかります。(汗; http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/245
246: 179 ◆SLG//siTD6 [sage] 2011/05/25(水) 02:34:04.49 ID:XYH4jaxx チョイ調べたらイテレータからポインターにぶち込めるみたいだったけど p = &*it みたいな感じで。 >>244 のは、選手数えて保持すればいいんじゃって事・・・w やってる事は選択ソートとあまり変わらないし、保持したところでアクセスにもループいるから微妙っちゃ微妙。 ポインタ配列ソートならp[7] で7番目にアクセスできるから便利だね チラ裏: 何をやろうとしてたか忘れたので とりあえず資源関係を追加してみた。 TOPバーに数個のボタンと資源の残量表示するようにした。 次は資源基地の占領とか作ってみるかなぁ あーでもユニットクラスの再設計もいるような・・・アニメーションクラスも作ってないし・・・orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/246
247: SGGK ◆6pZCoAtaxk [sage] 2011/05/25(水) 23:02:14.26 ID:WTP3xbuq >>246 ありがとうございます。今思うと自分のソースでも (*it).メンバ関数 のように書いてるところもあり、 *it がオブジェクトのような感じなので、それを考えれば p = &*it でやれそうなのにこれは全然思いつかなかった。 ノートに書いて忘れないようにしておきます。 ソートが今丁度出来たところなので、イテレータへのポインタ方式のソースへの適用は次回かそれ以降のソース改良のときに挑戦してみたいと思います。 ソート書くのに時間が掛かってしまい、途中で作業ペースも落ち気味になる。 ゲームスタート直後は選手とボールの距離が同じデータが複数あるので、 例えば1,1,1,1,5,6,7…になるはずのが、4,4,4,4,5,6,7…になってしまい悩んだけど、 番号付けるループ内にbreak文を入れたら直った。 これだけだと説明不足だけど、今回のはものすごく長いので、ソースの次回UPで見てもらえると助かります。 これで>>241まで戻ってボールを蹴る処理の実装に取り組めそうな予感。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/247
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 240 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.017s