1人でゲームが作れるように修行します。2 (487レス)
1人でゲームが作れるように修行します。2 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
64: SGGK ◆6pZCoAtaxk [sage] 2010/07/28(水) 23:06:54 ID:6+SmVQnU 3D、色々な事が出来そうですね。 自分もサッカーゲームの3D化を目指して開発を急ぎたいです。 >>51の課題に挑戦。 ソースはまだ書いてないけど、選手クラスにライフ値を記録するためのメンバ変数を追加して、 選手の描画関数を実行するときに選手の座標を基準にDXライブラリの四角形描画関数を2回使重ね書きして実現できないかなと脳内設計。 ライフ値をソースのどこでどのくらい減らせばいいのかを検討中。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/64
65: SGGK ◆6pZCoAtaxk [sage] 2010/08/03(火) 22:32:31 ID:nPEW7e3n >>51の課題が終了。 ライフ値は、各選手が移動関数を実行した直後に少しずつ減らすようにしておき、 「 現時点のライフ値/最大ライフ値xライフゲージ最大長さ 」を計算して長方形をその長さで描画する。 減り具合は完全ではないけど、今は調整する予定なし。 次の目標 ●共通(ゴールキーパー以外) (実装済)歩く Z+マウス操作 1 走る X+マウス操作 2 進行方向固定 Shiftキー 3 特殊技術(ボールが頭上ならヘディング、足元ならダイビングヘッド) Spaceバー ●ボールキープ時 4 ジャンプ(タックル避けにもなる) C 5 ロングパス 左クリック 6 ショートパス 右クリック 7 シュート 左右同時クリック 8 パス/シュートは,押す長さで強さを調整 ●非ボールキープ時 9 タックル 左クリック 10 カット 右クリック これらの内6個でも実装できれば上出来と考えて挑戦する予定。 期限を決めてやるのは無理そうな感じ…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/65
66: STG [sage] 2010/08/28(土) 03:50:26 ID:gP4FgSvi そして誰もいなくなった Blenderの仕様でいろいろ不都合が出てきたのでメタセコイアにのりかえ中 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/66
67: SGGK ◆6pZCoAtaxk [sage] 2010/08/29(日) 22:43:31 ID:HGm0TpTI >>66 アクセス規制が続いていて、実は現在も書き込めない状態でご無沙汰してました。 メタセコイアはフリー版あるらしいので、ドットが不得意な自分もいつかは触ってみたいソフトです。 3〜4週間の2chアクセス規制が頻繁にあり過ぎて製作活動ペースが落ちてくるので(言い訳)、 運営の思う壷かもしれないけど、試しにp2とやらで今日から1年間だけ書き込めるようにしてみた。 肝心の進捗の方は思わしくなく、>65の目標をみると、今のゲーム画面は視点がおかしいので悩む。 フィールドは真上から見てるのに、選手は真横から見た絵になっている。 蹴ったボールをいずれは曲線を描くようにしたいけど、この画面ではそれを表現するのが難しい事に気づく。 そしてボールの座標は(x,y)だけでは足りなくて(x、y、z)にしておかなければな後々不便な事になるような気がしてきた。 これはベクトルの表現を取り入れたプログラムに書き直しておいた方がいいかなと思い始めたところ、 偶然手元に「14歳からはじめるわくわくC言語プログラミング教室VS2008編」という本があり、 運よくこれの第3章がベクトルの説明をしていたので、読んでみることにした。 もう少しで読み終わるけど、解り辛い…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/67
68: SGGK ◆6pZCoAtaxk [sage] 2010/08/30(月) 23:32:27 ID:0WWGfdkP 昨日の書き込みを見て、思う壺という言い方が紛らわしい表現になりそうなので消したくなってきた。(赤面) 書き込み規制の原因は荒らしをする人にあるわけだから。 とりあえず3章だけを読み終えた。 明日も時間が出来ればベクトルを取り入れたプログラムに書きなおしてみる予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/68
69: SGGK ◆6pZCoAtaxk [sage] 2010/08/31(火) 23:49:31 ID:5x9cPfBx ソースをコピーして数字を一個上げた名前に変更してから作業を始めようとしたけど早速悩む。 参考にした本はCで書いてるので、C++でオブジェクトを複数種類作っているようなプログラムにどうすれば使えるか思いつかない。 とりあえず、「C++、移動、クラス、ベクトル」で検索してみたけど、いまひとつ。 C++には、例えば ベクトル+ベクトルの結果がベクトルになるような意味を持てるように + の意味を定義しなおす機能があるようなので、これかなと思ったけど、あまりにも内容が難しいので、諦める。 次に考えたのは、例えば vector3.h のような名前でヘッダーファイルを作り、その中に struct Vector3{ float x,y; //とりあえずz無し }; と書いておいて、ベクトルの必要なクラスの定義があるヘッダーファイルに #include "vector3.h" すれば外部の関数扱いになってすべてのクラスから使えるんじゃないかなと思った。 確認のために#include "vector3.h"したあるクラスの定義の中で、 Vector3 POSITION_XY={1,1}; としてみたらエラーになるので真っ青になる。(他にもう方法が思いつかないから) しかし、 Vector3 POSITION_XY; と書き直したら、コンパイラが通った。 クラスの定義の中では初期値を書けないのをすっかり忘れていた。 思い出せたのは運が良かった。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/69
70: SGGK ◆6pZCoAtaxk [sage] 2010/09/02(木) 23:42:53 ID:N3a4x6pe とりあえずベクトル関係の変数と関数を宣言したヘッダーファイル、vector3.hと それらの変数や関数を定義したファイル、vector3.cppを作成してみた。 とは言うものの、中身は変数を3つ持つ構造体とその構造体の型を持つ変数を引数にもつ関数で 関数は、 ベクトル=ベクトル+ベクトル 微小時間後の位置を示すベクトル=現在の位置を示すベクトル+微小時間xその時点での速度を表すベクトル の2式だけ。 この微小時間がいわゆるフレームタイムであり、今までのプログラムだと メインループ関数の中で、DXライブラリのScreenFlip()関数を30回ループしてその平均を フレームタイムとしてる。ScreenFlip()関数は画面のリフレッシュレートとやらと同期して動くらしいので そういうやり方でフレームタイムが計算できるらしい。 でも、これだとメインループ関数の外側で宣言・定義されてる微小時間後の位置を示すベクトルを計算するための 関数に必要な微小時間(フレームタイム)が読み取れないと予想。 とりあえず、30回ループする部分を関数にして、vector3.h、vector3.cppで宣言・定義して、 その30回ループする部分を関数にしたのをメインループで呼び出してなんとかできないかと思ったところで終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/70
71: 名前は開発中のものです。 [sage] 2010/09/04(土) 10:45:00 ID:BWH+wHQ4 >>69 > + の意味を定義しなおす機能があるようなので、これかなと思ったけど、あまりにも内容が難しいので、諦める。 class Vector3{ public: float x; Vector3(){} Vector3(float x_) : x(x_){} Vector3 operator+(Vector3 &obj){ return Vector3(x + obj.x); } }; class A{ public: A(float x) : vec(x){} Vector3 vec; }; void main(){ A a(1),b(2); a.vec = a.vec + b.vec; cout << a.vec.x << endl; } こういう事? operator+はその性質上、returnで新しいクラスを作る必要があるから処理速度の面で微妙 俺だったら使わない http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/71
72: SGGK ◆6pZCoAtaxk [sage] 2010/09/05(日) 00:15:21 ID:t7yjfHHg >>71 す…凄いです。そうです!そのoperatorがなんとかというそれでした。 まだ自分は答えを見ても何がわからないかもわからない初心レベルですが感謝します。 処理速度が微妙であるとのコメントを参考にして、なんとか>70のやり方(C言語風?)でやれるよう頑張ってみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/72
73: SGGK ◆6pZCoAtaxk [sage] 2010/09/05(日) 23:38:53 ID:glSoiJ6G >>70の下から4行に書いたやり方は諦める事にした。 vector3.hにfloat frametime=0;と書いてコンパイルすると frametimeは既に定義されてると言う内容のエラーが続々発生。 これは、vector3.hがいろんなcppファイルのヘッダーファイルにインクルードされてるからだろうと予想。 float frametime;と書き直しても同じ結果。初期化の有無は関係なかった様子。 vector3.hの中でfloat frametime;と書いておき、他のcppファイルでframetimeを使いたい場合には、 そのcppファイルのヘッダーファイルでなく、cppファイルの上の方の行でextern float frametime;と書いたら直った。 たぶんこれでframetimeは外部変数扱いになってどこからでも使える変数になったかなと思うけど、 ベクトル計算の関数定義の中で使おうと考えているframetimeの値が外部変数として渡すやり方だと なんとなく後々の問題になりそうなので、ベクトル計算用関数の引数を増やして、その引数に値経由でframetimeを渡せないかと考えて終了。 そして、frametimeの外部変数化も中止。(あまり進まず。) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/73
74: 名前は開発中のものです。 [sage] 2010/09/06(月) 06:18:19 ID:WWj0DWld ・Vector3.hのクラス定義内にて、 static float frametime; ・適当なcppにて、float Vector3::frametime=初期値; ということがしたいのかな? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/74
75: SGGK ◆6pZCoAtaxk [sage] 2010/09/06(月) 23:10:19 ID:5jVgy4R8 >>74 その通りです。 ただVector3.hでは、クラスの宣言や定義はしていなくて、ベクトルを表す構造体などを引数にしてベクトルを表す構造体をreturnする関数を宣言するのみ。 そうすればベクトル関係の関数は外部関数になってどのcppファイルからでも使えるかなというのを期待して書いてます。 そしてVector3.cppでその関数の定義をしようとすると関数内のframetimeという変数がメインループで計算するframetimeと名前を同じにしても このままでは中身が別物なはずなので、Vector3.hかframetimeを使うcppファイルのどこかで1度だけ frametimeを定義して、他の残りについては、extern float frametime;とすれば動きそうだと思ったわけです。 externにしたのは、cppファイルが複数あるからstaticよりこちらがいいかなと思っただけであまり自信無し。 「extern static 違い C言語」で検索するとろいろ出てきて読むと自信無くなってきたけど なんとかトライしてみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/75
76: SGGK ◆6pZCoAtaxk [sage] 2010/09/07(火) 23:20:38 ID:qyxrqbqY いままでのプログラムをベクトルを表す構造体で表現する変更作業の開始。 とりえあず先にヘッダーファイルだけを変更する予定。 しかし、ヘッダーファイルを変えただけでコンパイルすればcppファイルの方でエラーが出るはずなので、 ヘッダーファイルを全部コピーしてファイル名の前の方にv_を付けてファイル名を変えた方で変更作業する。 そうすれば、cppファイルと矛盾してエラーが出るという状態を避けられるはず。 そしてヘッダーファイルの変更が終われば、古いヘッダーファイルを削除して、新しいヘッダーファイルのファイル名からv_を取り除いて、 今度はcppファイルを直す。 変なやり方かもしれないけど、やってみる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/76
77: SGGK ◆6pZCoAtaxk [sage] 2010/09/08(水) 23:42:12 ID:2FQaVedh ヘッダファイルを4個書き直した。 あと12個残ってる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/77
78: SGGK ◆6pZCoAtaxk [sage] 2010/09/09(木) 23:34:11 ID:u4JUxGaq 今日も4個しか出来なかった。 cppファイルを直す時に泥沼状態になる事を予想して、 変更箇所を表計算ソフト(エクセルのこと)にメモしながら進めてるから作業が遅いのかもしれない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/78
79: SGGK ◆6pZCoAtaxk [sage] 2010/09/12(日) 23:34:04 ID:zuikLtmE ヘッダファイルあと残り1つ。 これは選手の移動関数を定義してるファイルだけど、気になる箇所があった。 今のプログラムは、どのような速度のパソコンでも60Hzで1フレーム時間あたりの移動量を1〜20ドットにしたい場合の移動量を 20個の配列を用意して入れてるんだけど、これが外部の移動関数から読めてる。 …というのは知ってたけどそういえばextern使ってないのに何故だろうと思い、14歳わくわくC++を調べてみると、 メンバ関数やメンバ変数にstaticを付けるとグローバルな関数、変数扱いに出来るとのこと。 そして呼び出すときには、クラス名::変数または関数とすればよいらしい。 さらに変数の場合は、外部に実体の定義が必要。 忘れてた…。 これは>>74氏のそのままでOKではないか〜!ということでextern無しで書くことにした。 よって>>73で言ってた >ベクトル計算用関数の引数を増やして、その引数に値経由でframetimeを渡せないかと も中止。 とりあえず、最後に残ったヘッダファイルにある移動関数の一つを書き直してコンパイルしてみたら通った。 移動関数はあと3つ残ってる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/79
80: SGGK ◆6pZCoAtaxk [sage] 2010/09/13(月) 22:59:37 ID:621XmSry ヘッダファイルの書き直しが完了。 何もヘッダファイルを読み込んでないヘッダファイルを先に直して、 ヘッダファイルの読み込みの少ないヘッダファイルを先に直すような順番で書き直していったからかどうかはわからないけど、 あまりバグが出なかった。次はcppファイルの書き直しに挑戦。たぶんもっと時間がかかるはず。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/80
81: SGGK ◆6pZCoAtaxk [sage] 2010/09/14(火) 22:23:51 ID:8SPHlgRS とりあえず修正対象にするcppファイルを1つ選び、 そのcppファイルがインクルードしてるヘッダファイルのファイル名の頭に付けてたv_(←修正中のヘッダファイルに付けてたやつ)をはずして、 そのままでは古いヘッダファイルと同じ名前になってしまうので、先に古いヘッダファイルは別のフォルダに移動しておく。 そしてコンパイルしてみる。 一個ずつ直してみたがバグがなかなか減らないし、ヘッダファイルもコンパイルの画面に新旧入り混じっている状態では かえってややこしくなってくる。 cppファイルも一個ずつ順番に直してバグが無くなったら次に…と思っていたが、 うまく説明できないが、そうはならないはずとの考えに至る。 cppファイル単位できれいに独立してるわけではなくて、あるcppファイルのオブジェクトが呼ぶオブジェクトは別のcppファイルで定義されてて そこからまた他のところへ…、するとそのcppファイルでインクルードしてるヘッダファイルも直した方のヘッダファイルに入れ替えなければならない。 結局、全部のヘッダファイルを新しい方だけ残して全部一気にコンパイルしてしまった。 エラーの総数が今現在349個。 ヘッダファイルの修正箇所をエクセルにメモする作業が無駄になってしまったかもしれない。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/81
82: SGGK ◆6pZCoAtaxk [sage] 2010/09/15(水) 22:31:31 ID:/g+buLkb 昨日は一気に全部まとめてコンパイルしたけど、描画関係をまとめたcppファイルはその時点で修正済。 そうした上でのバグ349個。 その後の修正で何故かバグが358個まで増えたけど、なんとかして344個に減ったところで終了。(今日はちょっと疲労気味なので…) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/82
83: 名前は開発中のものです。 [sage] 2010/09/16(木) 03:09:59 ID:OhUUY93b コツコツ頑張ってて偉いなぁ…本気で尊敬する。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/83
84: STG [sage] 2010/09/16(木) 03:35:20 ID:YtfF1rT+ 俺はずっとモデリング勉強&練習… http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/84
85: 名前は開発中のものです。 [sage] 2010/09/16(木) 03:50:06 ID:OhUUY93b >>84 ガンガレ超ガンガレ 俺もそろそろ頑張ってみるか… http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/85
86: SGGK ◆6pZCoAtaxk [sage] 2010/09/16(木) 23:40:48 ID:62n4CZRN >>83 自分はこの板のおかげでゲーム作りへの挑戦は約3年1ヶ月程続いているけど、あまり進んでいないかもしれません。が…頑張ります!。 >>84>>85 お互い頑張りましょ〜!期待してます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/86
87: SGGK ◆6pZCoAtaxk [sage] 2010/09/17(金) 00:11:53 ID:iwt7bbkw ベクトルの構造体を宣言・定義したから、ボールや選手などのオブジェクトの 座標その他のメンバ変数を初期化するときには、例えば初期化関数の内部で オブジェクト.x=848; オブジェクト.y=544; オブジェクト.z=0; としていたのを オブジェクト.構造体変数名 = {848、544、0}; にできるのではと期待して書いてみるとエラーになる。 略)\source\ballcontrol.cpp(45) : error C2059: 構文エラー : '{' 略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '{' の前にありません。 略)\source\ballcontrol.cpp(45) : error C2143: 構文エラー : ';' が '}' の前にありません。 これと同じようなエラーをクラスのオブジェクトでやった経験を思い出し、 オブジェクト.構造体変数名.x=848; オブジェクト.構造体変数名.y=544; オブジェクト.構造体変数名.z=0; と書いたらエラーは出なくなった。 これだけならまだしも関数の引数にも構造体を使おうとしているので、 これもエラーになったらどうしようかと思いつつ、動作している事を優先して作業を進め、 現在のバグは274個。 ネットで調べると自分では構造体を書いたつもりでいても、Cの構造体とC++の構造体には違いがあるらしくて、 自分が見たサイトの説明によれば、 実は、構造体はメンバがデフォルトで公開されているクラスである。 つまり、 "stuct X{" = "class X{ public :" となる。クラスと構造体の差異はそれだけである。 との事。 Cで書いたベクトルの記事を本で見て、それを今まで書いてたC++のソースに 使おうとしたから、自分の気付かない理由で上手くいってない感じ。 まずは今のままで進めてみて関数にベクトル構造体を引数にしたところでも 問題が出るようなら、また考え直すつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/87
88: 名前は開発中のものです。 [sage] 2010/09/17(金) 02:15:46 ID:zNJRouQ+ >>87 見方を変えると「Cの構造体に関数も書けるようにしたものがC++の構造体」とも言えると思う Cの構造体で出来ることはC++でもそっくりそのまま書けると思うんだけどね >自分の気付かない理由で上手くいってない感じ。 バグに関して絶対こうだとは言えないが、CとC++の違いが原因ではないような気がするなー http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/88
89: 名前は開発中のものです。 [sage] 2010/09/17(金) 22:28:19 ID:pd/LBTti >>87 x、y、zを初期化するコンストラクタを定義されていれば オブジェクト.構造体変数名 = クラス名(848,544,0); のような代入ができる。 もしくは、構造体変数をセットするメンバ関数を定義してもいいかも。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/89
90: 名前は開発中のものです。 [sage] 2010/09/17(金) 22:40:10 ID:pd/LBTti 上の補足 コンストラクタを定義していなければ、 オブジェクト.構造体変数名 = {848,544,0}; のような代入もできる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/90
91: 名前は開発中のものです。 [sage] 2010/09/17(金) 23:57:56 ID:iQtTD6+I >>90 それは初期化時のみじゃない? struct vector{ int x,y,z; }; void main(){ vector a = { 1,2,3 }; //ok a = { 4,5,6 }; //エラー } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/91
92: SGGK ◆6pZCoAtaxk [sage] 2010/09/18(土) 01:00:44 ID:wU0YURT9 ありがとうございます。今日は調べるだけで終了でした…。 >>88 たしかにバグの原因がCとC++の違いだと思い込んでしまうと他の原因の可能性を見落としやすくなりそうなので気をつけます。 >>89 今のソースではベクトル関係がクラスでなく構造体で表現されていてコンストラクタについてはまだ考えてませんでした。 バグが結局取り切れなかった場合、勉強しなおしてベクトル関係もクラス化する最終手段に挑戦してみようと思います。 >>90 コンストラクタの定義はしてないのですが、何故かエラーになってしまうので、 今は以下に書くとりあえず的なやり方でエラーを回避してます。 >>91 「構造体の初期化」で検索したところ、とあるサイトにそのような感じの 「構造体変数の初期化は、変数の宣言時には常に行うことが出来る点に注意しよう。」とあり、これを参考に以下のようにしてます。 ベクトル関係のヘッダファイルで struct Vector3{float x,y,z;}; あるオブジェクトの初期化用関数の内部では昨日のやり方から少し変更して、 Vector3 a1={848,544,0}; fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1; と書いてもバグが出ないのでこれでやってみようと思います。 今日は調べただけなので、バグは減ってないけど、全部取れるまで頑張ってみます。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/92
93: 名前は開発中のものです。 [sage] 2010/09/18(土) 01:45:54 ID:ZJvrb5gA >>92 >ベクトル関係もクラス化する最終手段に挑戦してみようと思います。 >>87は自分で書いててよく分かってないみたいだけど、classとstructは根本的には同じもの struct Vector3{ Vector3(float x_, float y_, float z_): x(x_), y(y_), z(z_){} float x,y,z; }; void main(){ Vector3 a(1,2,3); cout << a.x << " : " << a.y << " : " << a.z << endl; a = Vector3(4,5,6); cout << a.x << " : " << a.y << " : " << a.z << endl; } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/93
94: 名前は開発中のものです。 [sage] 2010/09/18(土) 01:56:17 ID:ZJvrb5gA >>92 >Vector3 a1={848,544,0}; >fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1; ちょっとこのレスで、代入のコストが気になったんで検証してみた struct A{ A(){} A(int x_, int y_, int z_): x(x_), y(y_), z(z_){} int x,y,z; }; struct B{ B(){} B(int x_, int y_, int z_): x(x_), y(y_), z(z_){} int x,y,z; void operator=(B &val){ x=val.x; y=val.y; z=val.z; } }; AとBの違いはoperator=を使用してるかどうかだけ A a,b; a = b; こんな感じでただ代入するだけの式を、それぞれ100万回ずつ実行 結果は予想外にもBの方が7倍も遅かった(単位はミリ秒) A 5 B 35 そこで試しに、構造体に「double a[256];」を追加して実行 今度はBは変わらず、Aが極端に遅くなった A 255 B 36 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/94
95: 名前は開発中のものです。 [sage] 2010/09/18(土) 02:09:34 ID:ZJvrb5gA 最初Bの方が遅かったのは、operator=のオーバーロード つまり関数オーバーヘッド分の差が出たのだろう 変数を増やすとAが遅くなるのは、ほぼ間違いなくコピーコンストラクタが発生してるからだろう ここら辺は言語仕様のレベルでBのような代入にしてくれてもいいような気がするなー ま、結論としてはoperator=は弄らない方が速い http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/95
96: SGGK ◆6pZCoAtaxk [sage] 2010/09/20(月) 00:00:13 ID:y8zi6Evk >>93、>>94、>>95 詳細な解説に感謝します。 自分にはまだ難しすぎるのですが、「c++ 構造体の代入 問題点」で検索してみたところ、 以下のHPがこれらを理解するのに参考になり(理解は出来ず雰囲気だけなんとなく自分に伝わったような感じ。)、 リンク先はpdfなので要注意かもしれませんが、 ttp://ist.ksc.kwansei.ac.jp/~ishiura/xcpl/note/cpp3.pdf の12〜13ページあたりで、C++にはいろいろな種類のコンストラクタがあり、 結果は同じようでもその書き方によっては、コンストラクタが多く呼び出されて処理に時間がかかるらしい。 あと>>94のコンストラクタの書き方が見たことない書き方だったけど、 ちょうど17ページにある説明と似てるので、これかな?と思ってみたりで勉強になりました。 バグの方は、126個まで減少。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/96
97: SGGK ◆6pZCoAtaxk [sage] 2010/09/20(月) 23:18:29 ID:L4tJFEVm 今日もあまり作業出来てないけど、バグの残り36個。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/97
98: SGGK ◆6pZCoAtaxk [sage] 2010/09/21(火) 23:17:03 ID:48pAG2m3 やっとバグが0個になった。エラーメッセージが0個になったと言う方が正しい表現に近いかもしれない。 しかし、画面でスタート直後にボールに近い選手が通常よりも早いスピードで画面外に出ていくような動きをして、 画面端に到達してそこから動かなくなる問題が出た。 やっぱり出た。エラーメッセージの出ないバグが…。 もしも、>>96のようなコンストラクタがどうのこうのが理由で動かないとなるとやっかいな予感。 自分は>>96はもちろんのこと今までに難しいといったところはなかなか理解が出来てないから…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/98
99: SGGK ◆6pZCoAtaxk [sage] 2010/09/22(水) 23:13:48 ID:gcFU0B9v バグはまだ取れない。 選手が画面やレーダーに表示されてるという事は、画面の表示範囲を決めてるカメラ関係のところに原因があるという可能性はなさそう。 選手の座標を計算してる箇所を調べる。今書いてる計算式は、説明を省くのでわかりにくいけど、以下のような内容。 fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq)); Application::frametimeの中身が気になったので、printfDx( " frametime = %f \n" , frametime ) ;で調べると、 15.100000と表示された。もう一回やり直すと15.633333と出た。 このframetimeは、dxライブラリのGetNowCount()を毎ループに1回計算し、 ループ前後の差を30回足して、それを30で割った平均値を意味してる。 調べるまで忘れてたけど、GetNowCount()の単位はミリ秒なので、先ほどの式では、1フレームで15ドット近い移動量になっているだろうから、 1秒が約60hzのパソコンだと1秒で1000ドット近く移動するはずなので、昨日の早すぎる移動スピードの原因だけはわかった。 とりあえず、 fp->xy = AddVector(fp->xy,MulVector(sv,Application::frametime/sq/1000)); のように書き直したら、選手がほとんど動かないけど、単位の間違いが原因だとわかった。 選手がボールに向かってくれない原因は未解決。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/99
100: SGGK ◆6pZCoAtaxk [sage] 2010/09/23(木) 21:24:02 ID:3ixO7vXf 選手がボールに向かわないバグが解決した。 選手とボールの距離とそのx、y成分を計算するために座標の引き算をしたが、 選手座標 − ボール座標としてたのが間違い。 ボール座標 − 選手座標が正解。 でも何故かこれでもバグは解消されなかった。 本当の原因は、 違う場所を直していた。 という事だった。 自分のプログラムは移動関数を4種類用意してあり、 1.その場停止 2.マウスに向かう 3.ボールに向かう 4.指定したX、Y座標の位置に向かう なんだけど、いつからか4番の関数だけ使えば十分だろうと思い、 4の関数にマウス座標やボール座標を渡していた。 でも、そのことを忘れていて、ボールに向かわないバグだから ボールに向かう関数を直さねばと思い、その関数だけを直していた。 昨日スピードのバグが直ったのは、その時だけたまたまPC画面が小さくてプログラム行が下がっていたのに気付かず4番の関数を書き直していたのだろうと思われる。 ある意味1日で気付けたのは運が良かったのかもしれない…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/100
101: SGGK ◆6pZCoAtaxk [sage] 2010/09/23(木) 21:46:24 ID:3ixO7vXf プログラムにベクトルの表現を取り入れる作業は一区切り付いたけど、 これはあくまで>>65の目標に取り組めるようにするための準備段階なので、 次は画面関係の修正に挑戦する予定。 まだ方法を考えてる段階なので簡単には進みそうにない予感。 少し斜めから見たフィールド画像でプレイできるようにするのが目標だけど、 ネットではパースというキーワードで検索するものの即取り入れ可能な事を書いてるホームページにはまだ出会えていない。 他には動画サイトで昔のサッカーゲームの画像を見て、参考に出来るところが無いか調査中。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/101
102: SGGK ◆6pZCoAtaxk [sage] 2010/09/25(土) 00:13:42 ID:Q7QeFJjp パース、その他いろいろなキーワードで検索したが見つからず。 いますぐどこかの3Dライブラリを理解できるレベルではないのでかなり困った状況。 大体イラスト関係のホームページがよくヒットして消失点という言葉が出てきて、 これを考えればフィールドの形を遠近法的な台形形状に書くことは出来るだろうけど、 例えばその台形のフィールドに奥行きと高さ方向にメッシュを入れる時、何を基準にすればよいのかを詳しく説明してるところを見つけられず、 結局参考にならなかった。奥行きのメッシュは遠くになるにつれて間隔が狭くなると思うけど、それを決定する基準がわからないという意味。 そしてしばらくまた探していると、とあるホームページで人間の目は並行ではなく放射状にものを見ているとの記述があり、 これが参考になりそうなので、方法を考えているところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/102
103: 名前は開発中のものです。 [sage] 2010/09/25(土) 00:26:55 ID:j8zDlksV >>102 3Dライブラリを使うのが結局は楽だよ (描画効率を無視するとして) フィールドのモデルとプレイヤーのモデルを配置 カメラ位置・方向を決定したら draw 一発 難しい事を考えなくて済む http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/103
104: 名前は開発中のものです。 [sage] 2010/09/25(土) 00:50:55 ID:Djp6Vs3v >>102 確かに3Dライブラリを教科書どおりに使えば簡単にできることだけど 敢えて自力で計算してみようというなら 「透視投影変換」、「同次座標表現」で検索するといいかも。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/104
105: SGGK ◆6pZCoAtaxk [sage] 2010/09/26(日) 01:06:29 ID:CCDwSOVy ありがとうございます。ちょっと考えてみます。 >>103 3Dの勉強を全くしていない状態なので、知識のない自分には3Dライブラリを使うのは無理かと思ってたけど、 すぐに諦める前にもう少しだけ調べてみようと思います。 >>104 「透視投影変換」、「同次座標表現」のキーワード、感謝します。パース等ではなかなか役立つホームページがヒットしなかったので…。 すぐには理解できないけど、検索結果のホームページの内容の方が自分の思いつきより洗練されてるので、3Dライブラリ使用が無理な場合、次の手段として挑戦しようと思います。 とりあえずDXライブラリで出来ないか考えてみる事にした。 ホームぺージから最新版をダウンロードしたら、3.04だった。 いままでのは2.25、リファレンスの球を表示する部分を丸ごとコピペしてコンパイルしたら 球が表示されたので、もし2Dとソースが共存できるなら今までのプログラムを3Dライブラリで丸ごと書き直さなくてもすむかもしれないと思って終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/105
106: SGGK ◆6pZCoAtaxk [sage] 2010/09/29(水) 23:24:31 ID:ixkP0mUb DXライブラリ3Dでプログラムを組むための参考になりそうなホームページがどうも無さそうなので、 DXライブラリ置き場ホームページに行き、サンプルプログラムの 32.3Dアクション基本 を見るが複雑すぎて今は無理と判断。 31.迷路を3Dで表示 も難しいが、プログラムのソースにあるカメラの命令のリファレンスを見てみるもののやっぱりよくわからない。 >>102で言ってた2Dだけで自分で計算するか悩んだが、その前にあと一つ試せる方法があったのでやってみた。 今まで書いてたプログラムの状態や画面の遷移、得点、時間表示などを削除し、 3D円錐の描画命令をコピペし、上記で言ってたカメラの命令をコピペしてみたら描画された。 最初からプログラムを作り直さなくても3D命令のテストが出来たのは運が良かったかもしれない。 カメラの関数の引数を変えると円錐の向き大きさも変化したが、座標系がよくわからないので、 何故このように見えるのかが今はまだわからない。 カメラ関数の引数を変えても2Dの選手やフィールドの絵には変化が無かった。 もしかすると結局はすべて3Dのライブラリ関数で書き直すしかないのかもしれないと思って終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/106
107: 名前は開発中のものです。 [sage] 2010/09/29(水) 23:40:52 ID:UzXxGPtF >>106 2Dの絵がすでにあるならビルボードでググってみるとよろしかろう http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/107
108: SGGK ◆6pZCoAtaxk [sage] 2010/10/01(金) 00:18:19 ID:EHwgOhQ3 >>107 ありがとうございます。3Dを不勉強なので、ビルボードも知りませんでした。 フィールドを3Dで表示して選手を2Dにして遠くにいる選手の画像は2Dのライブラリ関数で縮小表示できれば3Dらしくなるのではと自分はいままで思っていて、 しかしその縮小比率をどのように計算すれば良いのかが悩みどころでしたが、ビルボード関係を調べて何ができるのか読んでみると、 厚みのない画像でも3D空間の物体扱いにできてカメラ関数があればフィールドと一緒に選手も3D視できそうな気がしてきたので作業が進んだら挑戦してみたいと思います。 今日はホームページで3D関係を巡回したのみ。 3D空間からPC上のゲーム画面への座標変換を行うには、いろいろな行列を何度か掛ける必要があるとか、座標系の種類の説明がいろいろ。 これを理解してプログラムを書けるようになるにはどう考えても数カ月から…いや下手すれば数年かかるんじゃないかと感じた。 しかし、一方で昨日のDXライブラリのサンプル 32.3Dアクション基本 のソースを見る限りでは、行列を何回も掛けているような処理の記述は見当たらない。(探し下手で自分が見つけられていないだけかもしれないが…) もしかすると、3D空間内にモデルを配置してカメラ関数の引数をセットすれば3D視できるその中に既にそういった計算が見えないところで行われてるのかもしれない。(これが>>103氏、>>104氏の言っていた事かもしれない) とりあえずなんだかわからない状態だけど、なんらかのモデルを用意して、それを読み込んで画面に表示することに挑戦してみたい。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/108
109: SGGK ◆6pZCoAtaxk [sage] 2010/10/04(月) 23:34:31 ID:OotJcuep DXライブラリのサンプルプログラムで拡張子mqoというのがあり、メタセコイアのファイルのことだとわかったので、 金曜日の夜にメタセコイアR2.4(フリーの方)をインストールした。 モデルをつくる技術が無いので、面→基本図形で面を生成し、材質設定で緑色を指定するにたどりつくまででもかなりの時間がかかった。 サンプルプログラムのやり方を真似してこの平面モデルのmqoファイルを読み込み、表示させようとしたが、 最初は全く表示されず、表示されても白黒だったりしたが、ファイル作るところからやり直してみたら今度は表示された。 結局原因は不明。次は今までの選手の2D画像を平面モデルに張り付けられるのかに挑戦。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/109
110: 名前は開発中のものです。 [sage] 2010/10/06(水) 18:41:28 ID:WfQHbqcm >>109 頑張れ! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/110
111: SGGK ◆6pZCoAtaxk [sage] 2010/10/07(木) 00:39:47 ID:uuBtJJiv >>110 今は全ての作業が試行錯誤なので遅くなっているけど頑張ります! 選手の画像を1コマ切り取り、同じサイズの平面をメタセコイアで作成して その平面に選手の画像を貼ろうとしたが失敗。 この処理はUVマップと呼ばれてるらしいが、とりあえず貼り付けをやめてxz面に垂直なただの平面を作り、 フィールドの次に描画させようとしたら表示されず。 何回かやり直していたら、フィールドと小さな平面が表示されたところで終了。(原因不明) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/111
112: SGGK ◆6pZCoAtaxk [sage] 2010/10/07(木) 23:46:00 ID:IVAUpJqc フィールドの平面モデルにネットのフリー素材のフィールド画像を張り付けてみようとしたら何故か出来た。 UVマッピングとかいまだに解ってないので偶然できただけ。 ビルボードで選手を描画するのは難しい事がわかってきた。 DrawBillboard3D関数が使えるかなと思ってリファレンスを見たら、画像のサイズは自分で入力しなければならないので、 この関数仕様だと、いろんな位置や角度で見たときの選手がどの程度の大きさで見えてるかを自分で計算出来る必要があり、これを実現するのは難しいと思った。 すぐ諦めるのはどうかと思いつつも、最初に諦めてたモデルを配置してカメラ関数で見てもらうやり方を検討することにして今日は終了。 とりあえずは、選手を円筒か何か簡単なモデルで表現して配置してどのように見えるかを目標にする。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/112
113: 名前は開発中のものです。 [sage] 2010/10/08(金) 00:25:13 ID:lwTrudzA >いろんな位置や角度で見たときの選手がどの程度の大きさで見えてるかを自分で計算出来る必要があり DXライブラリ使った事ないので的外れかもしれないけど こういうのって普通ビュー変換で処理されるんじゃないのか http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/113
114: SGGK ◆6pZCoAtaxk [sage] 2010/10/09(土) 01:18:45 ID:k0QY2+O0 >>113 実は自分は変換関係についてネットで調べて言葉を知ったところまでで、それ以上の探求をちょっと怠ってしまっている状況です…orz でもそう言われて気になったのでビルボードの関数を試してみたら遠くのものが小さくでてました。やってみるきっかけになり、感謝します。 int DrawBillboard3D( VECTOR Pos, float cx, float cy, float Size, float Angle, int GrHandle, int TransFlag ) ; の引数、float Size : 描画する画像のサイズ…の意味を間違えて解釈していた。 縦横=Sizeの2D画像が3D空間のどこにあってもこのSizeを保って描画されるのかと思ってた。 もしそうならば、3D空間で遠くにある画像はその分小さく描画したいから自分でその大きさを計算していちいち引数Sizeの値を入力し直す必要があるのかと勘違いしてしまってた。 Sizeはあくまでもロードした画像の大きさであって、あとは座標を指定すればその位置に応じて大きさを変換してくれることが確認できた。 一応結果画像をうpしてみます。 ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0132jpg.html http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/114
115: SGGK ◆6pZCoAtaxk [sage] 2010/10/10(日) 00:13:14 ID:U9No5w8c 今日は進捗なし…orz 毎日何か進捗のある状態に持っていくことの難しさを痛感。 とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。 今まで書いてた2D平面版ではマウスカーソルの位置に選手が向かうようにしていたので同じ操作方法を使えるようにしたいのが理由。 2D版では、ゲーム画面(640X480)の左上角の座標がゲームのフィールド全体の座標でみたとき(WX、WY)という座標で、 マウスカーソルの画面での座標が(X、Y)としたとき、マウスカーソルのフィールド上での座標値は(WX+X、WY+Y)になる。 3Dでもこれに相当する処理をしたいけど、3Dになるとカメラの位置が立体的に変化するからどうすればよいか想像が付かない。 このスレで教わった用語からいもづる的に出てきた用語を駆使して、 「ビュー座標からワールド座標を算出」というそのままなキーワードで検索してみたらたくさん出てきた。 どうすれば出来るのかある程度調べたら、使えそうなライブラリ関数を探す予定。 ライブラリで出来なければ、何も出来ない自分なので…orz ←まぁ、これはあまり気にしないでこれからも行き詰まるまで頑張るつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/115
116: 名前は開発中のものです。 [sage] 2010/10/10(日) 07:27:55 ID:iMXoTcjW 一般的な方法としては、 ・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次元座標に戻せる。 うろ覚えで書いているので細かい間違いがあるかも知れないが(違ってたら乞指摘)、 ゆっくりでいいんで、参考にしてもらえれば嬉しい。 頑張れ! http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/116
117: SGGK ◆6pZCoAtaxk [sage] 2010/10/11(月) 00:46:23 ID:LCOMmGvc 詳細な説明をありがとうございます。 やっぱり自分にはまだ難しすぎたようです…。 しかし、これが解らなければ>>115でやろうとしていることもライブラリ関数だけでは結局出来なさそうなので、 もう少し頑張ってみようと思います。1日の作業時間が短いので、何週間か掛かるかも…。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/117
118: SGGK ◆6pZCoAtaxk [sage] 2010/10/30(土) 23:45:10 ID:DMcbgP8e ま…まだ無理な感じ。何週間じゃなくて何カ月と書いておけばよかった…。 やっぱりある程度の知識が無いと理解が進まないような気がしてきた。 ある程度知識を持ってる前提でちょっとわからない用語を調べるのにはネットは役立つけど、 今の自分は3Dに関しほとんどが知らない用語ばかりで思考が進まないので勉強が足りないと感じた、 遠回りだろうけど、本屋に行きそこに置いてあった中から1冊選んで来た。 「実例で学ぶ3D数学」←生き物を表紙に多用しているオライリーシリーズのひとつで、前スレでもこの本を紹介してくれていた人がいた。 今は第7章で108ページまで読んだけど、自分には難しい内容。 式の証明があまり無い様で、わからない箇所については「そういうものなんだ」ということにして先に読み進めているところ。 9章(〜194ページ)まで読み終わったら、もう一度上記について考える予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/118
119: 名前は開発中のものです。 [sage] 2010/10/31(日) 14:36:58 ID:Ha18eay7 ConvScreenPosToWorldPosのサンプル内でMV1CollCheck_Lineを使って ポリゴン上のマウス座標を出してるっぽいのがあるよ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/119
120: SGGK ◆6pZCoAtaxk [sage] 2010/11/01(月) 00:11:40 ID:IY/H8hBE >>119 こ…、これは気付きませんでした。ありがとうございます。 試しにサンプルで使えそうな部分をコピーしてプログラムソースに貼り付けてまさかのコンパイル。 これではおそらくバグが山積みだろうと思ったら、予想外に通った。画像の文字の意味についてはまだ理解出来てません。 サンプルでは、スクリーン上のマウス座標から直線が延びているイメージで、ワールド座標内のポリゴンに当たったらそこが黄色になるという内容だろうと解釈。 マウスを左上に持っていくとフィールドの左上が黄色、右下にもっていくと右下が黄色、フィールド外だと変化なし。 とにかく反応していることが確かめられたので、このサンプルコードを自分がやろうとしていることを実現できるように 書き変えられるか考えてみようと思います。 参考画像をうp ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0134jpg.html もちろん>>116〜118についても継続するので、並行作業で行く予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/120
121: 名前は開発中のものです。 [sage] 2010/11/04(木) 00:20:21 ID:DIpes90k カキコがなくて心配してたよー http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/121
122: SGGK ◆6pZCoAtaxk [sage] 2010/11/04(木) 22:06:09 ID:vVAyUmeW >>121 >118の本の学習がなかなか進まなかったため、ご無沙汰してしまいました。(汗; ときどき停止するかもしれませんが頑張ります。 本の方は8章(〜144ページ)で一区切り。とりあえず8章まで読めればなんとかなりそうなので9章までの予定は中止。 14章も一部分だけ読んでみた。残りは必要なときが来たら挑戦するつもり。 >>116氏のをもう一度読んでみたところあともう少しでわかりそうな気がしてきたので、 あとはネット検索で投影変換行列を調べてみる予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/122
123: SGGK ◆6pZCoAtaxk [sage] 2010/11/11(木) 00:10:14 ID:OH7eCgI8 >>116氏のアドバイスについて今の自分に出来るところまで図示で理解しようとしてみたのでUP。 視野錘台がうまく斜めに書けていないとかいろいろあるけど、 この状態からさらに理解が進めばDXライブラリを使って自分なりの関数をどのように作ればよいのかがわかるかも…、 そんな時が来るかもしれないと期待してここでいったん区切ることにしてみます。(感謝!) いつも使わせてもらってたアップローダがサービス停止のようなので、いろいろ探して以下のところにしてみた。 (アップローダを使ってるスレを探してたらNE○Tスレを偶然見てこのアップローダの存在を知った。) 他にお勧めのアップローダがあれば、柔軟に対応します。 ttp://ux.getuploader.com/sggk/ 次は>>119氏のヒントを元に次の行動を決める予定 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/123
124: 名前は開発中のものです。 [sage] 2010/11/11(木) 00:28:36 ID:Jw3X6bp+ >>116 の Lは、 GetMousePoint( &Mx, &My ) ; ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) - E ; で求まるんじゃないだろうか。 そこで詰まったんじゃないの? http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/124
125: SGGK ◆6pZCoAtaxk [sage] 2010/11/11(木) 23:34:05 ID:jPJR3Unn >>124 アドバイス、ありがとうございます。 今度は練習プログラムの修正で確認してみようと思っています。 >>119と>>124の両方でやってみるつもり。 マウスが指し示すフィールド上の位置に何かオブジェクト(球体とか)を 表示出来れば上手くいったと考え、この前ベクトル化したプログラムの続きに入る予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/125
126: SGGK ◆6pZCoAtaxk [sage] 2010/11/13(土) 00:09:26 ID:2/KX1c8L 作業時間10分なので何も出来ず…。 とりあえず半径10の球体を(100,0,0)、(0,100,0)、(0,0,100)の順番に表示させてみた。 これによれば、X軸は左方向がプラス、Y軸は上方向がプラス、Z軸は手前方向がプラスになっていたので、 DXライブラリは左手座標系なんだな〜と思ったところで終了。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/126
127: 名前は開発中のものです。 [sage] 2010/11/13(土) 16:02:39 ID:V7u6UtpM カメラの向きによるでしょ http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/127
128: 名前は開発中のものです。 [sage] 2010/11/13(土) 16:11:56 ID:V7u6UtpM あ、座標系か。ゴメン http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/128
129: SGGK ◆6pZCoAtaxk [sage] 2010/11/15(月) 06:53:14 ID:vSKd6IqB >>127,128 X軸は右方向がプラスの方が確かに分かりやすいのでカメラの位置と向きは変えようと思います。 いろいろ理由があり作業が止まったりしていますが、まだ諦めてはいません。(仮眠しようとしたら朝になってしまったとか…) 今のモデルは、フィールドが511x341(何故この数字にしたか忘れてしまった…)でその中心が原点(0,0,0)、 カメラの位置は(0,340,340)でカメラの注視点が原点(0,0,0)になっています。 作業の前にやっぱり簡単な例を用意して自分で(手作業で)変換行列を考えてみるところまで やってみた方がいいかもしれないと思い始めてきたので、その作業分だけ進捗が遅れる可能性ありです。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/129
130: SGGK ◆6pZCoAtaxk [sage] 2010/11/16(火) 00:25:11 ID:MqJY7qc7 今日はエクセルで準備的な作図を途中まで進めて終了。 書いた図が結局役に立たずに時間を無駄にする可能性もあるけどやってみる。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/130
131: SGGK ◆6pZCoAtaxk [sage] 2010/12/13(月) 23:37:18 ID:X8dPGQWF む…無駄になってしまった感じ。 図は書いてみたけど、座標変換について結局あまり理解出来てない事がわかった。 悩んだ結果、恥ずかしいほどに簡単な例を用意し、それを図にして考えてみた。 オブジェクト座標からワールド座標への変換はなんとなく分かったような気がしてきた。 カメラ座標への変換(ビュー変換?)については、オブジェクト座標からワールド座標への変換と同じやり方でたぶん出来るだろうということにして省略し、 今は透視変換について考えているところ。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/131
132: SGGK ◆6pZCoAtaxk [sage] 2010/12/15(水) 00:31:39 ID:KxIpLRHt やっぱりやめることにした。 わずか一日で目標変更…。 昨日の続きをやるとなれば、また数週間経過しそうでそれでいいのだろうかという不安が急に出てきた。 透視変換についても>108の頃の自分よりは理解してるつもりなので、とりあえずプログラムに戻り、それでダメならまた別の方法を考えよう。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/132
133: SGGK ◆6pZCoAtaxk [sage] 2010/12/21(火) 22:35:38 ID:Uo1lQ495 変換についてやっぱりやめないで最後まで調べてUpするに方針変更。(葛藤し過ぎ) できなければ出来たところまでをUpするつもり。 仕事じゃないんだし…、もう少し調べてみても無駄にはならないはず…。 趣味なんだからあまり無駄とか気にしないようにしよう! 今日は>>119氏のアドバイスのテストプログラムの動きの問題について考えてた。 >>120でプログラムが動いていたのは間違いないけど、画面左上に表示される マウスでポイントした点が画面中のポリゴンと交差したところの点座標や他の情報を 表示している画面の文字がどんどん重なっていき見えなくなる問題が出ていた。 自分のプログラムでは、ClsDrawScreen と ScreenFlip() の間にゲームの中身の処理を 書いてループするようにしなければならないんだけど、テストプログラム用に無駄な箇所を消したり、注釈化していたときに 間違えてClsDrawScreenの行を //ClsDrawScreen のように注釈行化してしまっていたのが原因だとわかる。 気付くのに3日以上かかった(汗;) ちなみにDXライブラリではClsDrawScreenは今でも使えるけれど、 公式のリファレンスからは削除されていて、代わりにClearDrawScreen()になっているという事をその時知った。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/133
134: SGGK ◆6pZCoAtaxk [sage] 2010/12/30(木) 01:05:04 ID:8R77hh/I 年末休みだからとはいえさすがにもう寝なくては…。 >>131のカメラ座標への変換がなんとなくやっと理解出来たような感じ。 次は透視変換に挑戦。 ライブラリが無ければ自分は何も出来ないんだから座標変換勉強しても時間の無駄じゃないのか? …という迷いはあるけど、あともう少しなのでこのまま進めてみるつもり…orz http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/134
135: SGGK ◆6pZCoAtaxk [sage] 2010/12/30(木) 16:53:47 ID:4FkYuEBu やっと出来た。 間違いや内容不足はあるかもしれないけど、>>129の11月15日頃からの作業がやっと終了…。 1ページ目は結局使わなかった図。 2ページ目以降の8枚が勉強メモ。 ttp://ux.getuploader.com/sggk/ に オブジェクト座標系からスクリーン座標系まで勉強.zip という名前でUP。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/135
136: 名前は開発中のものです。 [sage] 2011/01/01(土) 02:34:44 ID:iSY3aMmJ P2_page001〜004を見た。 そもそも何をしたいのか読み取れなかったけれども、 最初の赤枠の大前提については、ボールの位置はワールド座標系で管理して、 必要に応じて選手目線の相対座標(オブジェクト座標)を求める方が簡単じゃないかな。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/136
137: SGGK ◆6pZCoAtaxk [sage] 2011/01/01(土) 22:31:50 ID:85GGaF9K 見てくれてありがとうございます。 自分はDXライブラリが無ければ何もプログラムできないので、 プログラムに直接影響しない事を調べてもあまり意味が無いのではないかと思う一方で 座標変換には3D入門の基本のような印象を持っていたので、 もし出来るならちょっと調べてみたいと思ったのが原因で1か月以上経過してしまいました…。 赤枠については今見ると自分もそう思います。 ボールに一番近い選手を知りたいなら選手の座標とボールの座標を フィールド基準の座標系(ワールド座標系)で表して単純に距離計算した方がよさそうです。 次にやろうとしていることは、選手のデータ作り。 ビルボードの関数で選手を表示するので、メタセコイアで板(面?)のモデルを作り テクスチャ?を貼りつける作業。2次元のデータのときには選手のアニメパターンを1枚の画像にしていたけど、 今度はそれを切り出して面のモデルに張り付けた3Dデータを何枚か用意する必要があるので、 メタセコイアの使い方を思いだしているところ。(忘れるのがものすごく早いので我ながらつらいw) http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/137
138: SGGK ◆6pZCoAtaxk [sage] 2011/01/13(木) 23:49:01 ID:XHIcVK/b データはなんとか用意出来た。32ドット四方の面に選手移動アニメの一コマを貼り、 左歩行に2枚、右歩行に2枚、赤選手と青選手があるから(2+2)x2=8個のテクスチャ付き面モデルを作成。 上と下の歩行描写は省くことにした。 テクスチャの貼り方はなんとか分かったけど、今まで使っていた16コマを1枚にしていた2Dデータから 1コマずつ切り出すのに手間取った。 EDGEというソフトを使ってみたが、マウスできちんと32x32で選べない。 なんとなく「edge グリッド表示」でネット検索してみると、「ツクールの素材を作る」という名前で以下がヒット。 ttp://tanktown.web.infoseek.co.jp/tt/g_creat/g_creat/g_creat_graphic01contents.0104.htm まさにこれが知りたかった事なので作業できた。 余談だけどEDGEは2009年で更新が止まってるようで、競合も多いだろうしフリーだから モチベーションを保てずにつぶれたのかな?と思ったらなんとiPhoneに場所を移して活動してるらしい事がわかった。 才能ある人はいろいろ出来てうらやましいと思った。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/138
139: SGGK ◆6pZCoAtaxk [sage] 2011/01/17(月) 23:51:17 ID:Px2vRAS2 >>115で言った >とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。 については、どうやら出来そうな感じ。 それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど、 テストプログラムでは、試したいDXライブラリの関数をメインループにそのまま書き込んだだけなので、 今までのクラスを使ったやり方に比べ単純な例で試して上手くいったと自分が思っているだけなのかもしれないので、 今度は、今までの2Dで動かしていたプログラムの中身を少しずつ3Dのライブラリ関数に置き換えて 動作を確認していき、これでうまくいくようならUPする予定。 フィールド上の一点を指定する方法については、 >>116氏の7行目の投影変換行列の逆行列を使う方法では、 自分の力不足のため投影変換行列を作れないので断念。 座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。 ライブラリを作れる人はすごいと思った。 >>119氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。 >>124氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。 これでやっと>>65に取り掛かる直前の状況になってきた感じ。(感謝!) もしうっかりスルーしてしまった項目があった場合、指摘あれば対応します。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/139
140: SGGK ◆6pZCoAtaxk [sage] 2011/01/18(火) 23:06:54 ID:IAGIcn+p いざソースを書き直そうとするもののどこから手を付ければ良いのか見当がつかない。(いまさら何を言ってるのかと思われそうだけど…) 今出てる問題は、今までのプログラムにベクトルが使えるようにするために追加したクラス、関数(ベクトル同士の加算、減算とか)が 既にDXライブラリに用意されていて、当然DXライブラリの方が関数の種類も多い。 かといって今まで書いた自分のベクトル用関数もソースのあちこちに散っているので、 これをいますぐDXライブラリの関数に置き換えるのは数カ月単位の時間を要するのは確実。 とりあえず、 自分の書いたクラスVector3 ←中身はx,y,zだけ DXライブラリの構造体VECTOR ←中身は不明だけど、リファレンスを見てるとx,y,zが含まれているようだ。 の型を持つ変数同士を変換する事が出来れば、自分の書いた関数、DXライブラリの関数のどちらでも使えるのではないかと予想。 一応、以下のような感じで書いてみた。まだ書いただけなので使えるかどうかは今後の進捗次第。 //Vector3型変数をVECTOR型に変換する関数。 VECTOR Vector3_To_VECTOR(Vector3 a){ VECTOR result; result.x = a.x; result.y = a.y; result.z = a.z; return result; } //VECTOR型変数をVector3型に変換する関数。 Vector3 VECTOR_To_Vector3(VECTOR a){ Vector3 result; result.x = a.x; result.y = a.y; result.z = a.z; return result; } http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/140
141: SGGK ◆6pZCoAtaxk [sage] 2011/01/19(水) 23:11:10 ID:VXY/IGc8 念の為もうひとつ確認しておこうと思い、テストプログラムでメインループの中に Zキーを押したら選手のx座標を少しずつ増やしていく処理を追加してみた。 コンパイルして実行してみたら選手の絵がx方向に動いた。 3Dのビルボードの命令で描画した選手でもいままでの2D命令でやったとき同様に動く事が確認できた。 これで多少は安心してソースの書き直しに着手できる…と思う。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/141
142: 名前は開発中のものです。 [sage] 2011/01/20(木) 00:55:56 ID:yl8ufdN1 C#囓った俺だったら、Vecrot3にToVECTOR()関数を追加するかな Vector3 a; VECTOR b = a.ToVECTOR(); って書けるようにする 普段はVector3を使って、必要に応じてVECTORを吐き出すというイメージ VECTORからVector3への変換はしない、という仕様にした方が多分デバッグは楽になると思う http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/142
143: SGGK ◆6pZCoAtaxk [sage] 2011/01/20(木) 23:35:43 ID:hnrlJRek アドバイス、ありがとうございます。 確かに変数の型はどちらかに統一しておいた方が良さそうなので注意します。 変数はVector3に統一し、DXライブラリの関数の引数と出力の型がVECTORだった場合には、 引数に関しては、Vector3型をVECTOR型に変換した値を入力して、 VECTOR型出力に関しては、そのつど出力のx,y,z値をVector3型変数に入力すれば、>>140で言った VECTOR型変数をVector3型に変換する関数は使わなくて済むので、これでやってみます。 今日のプログラム修正は、データのロード部分のみ。少しずつ進めていく予定。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/143
144: SGGK ◆6pZCoAtaxk [sage] 2011/02/09(水) 21:46:30 ID:iFm8dF3D 修正が思い通りに進まないので悩む。 また以前のようにクラス図の様な図を書いて整理してからソースを修正した方がいいのだろうかと思ったが、 エクセルで書こうとするととても時間が掛かるので、クラス図を書くためのフリーソフトが無いか探してみた。 UMLdraw フリー版とシェア版があり、フリーでは印刷できないので不可。 UMLmemo フリー、印刷無し、ビットマップ出力ありだけど、書いたテキストの空白が改行マークで埋め尽くされて見づらいので不可。 astah* community 無償版、印刷あるけど大きさの調整不可、使い方が難しいので不可。 無理してastah* communityでクラス図もどきを途中まで書いてなんとなく思い始める。 「頑張ってプログラムソースを書き直した方がいいような気がする。」 この状況になるまで約2週間経過。無駄な事をしてしまったのかも・・・。 今は選手のデータ関係を修正中。 前スレ>>885で選手のデータを入力しやすくするために考えた関数を使わずに テキストファイルからデータ(初期位置座標など)を読み込めるように出来ないか考えているところ。 14歳シリーズのC(VS2008編)に使えそうな例が載ってたので参考にしてみるつもり。 http://mevius.5ch.net/test/read.cgi/gamedev/1272901469/144
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 343 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.013s