1人でゲームが作れるように修行します。2
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2010/05/04(火) 00:44:29ID:HN0quC1A前スレ
1人でゲームが作れるように修行します。
http://pc11.2ch.net/test/read.cgi/gamedev/1006284805/
0044名前は開発中のものです。
2010/05/23(日) 21:58:24ID:VDqMKVb3RPGな気もするが、動作はちゃんとできている。
まだ製作序盤だと思うが、クリア、全滅があると面白いと思う。
洞窟にゴール地点を作ったり、敵を強くしたり。
0045887
2010/05/23(日) 23:27:33ID:ne7zja47ごめん。SRPGって書いてるけどRPGなんだ。
SimpleなRPGってことでSRPGにしたら、シミュレーションRPGとかぶっちゃったんだ。
分かった。全滅とか作ってみる。
ちょっと敵も増やしてみようかな。
意見もらえてモチベーション上がった。ありがとう。
0046SGGK ◆6pZCoAtaxk
2010/07/14(水) 23:35:58ID:E0crx8nl887氏、もしかして開発中止だろうか。
再開して戻って来れるように、こちらの進捗0でも何か書いてみる。
自分の方は2か月の空白を作ってしまい、>>42で辞めないと言ったものの、開発続行はやはり怪しい。
とりあえず、>>42、>>7で言った頭の整理は時間が掛かりすぎるので中止。
ゲームのメインの部分で前半、後半で同じような内容が書かれてあり、
長すぎてわかりにくい感じがするので、少し改善できないか考えてみる予定。
0047SGGK ◆6pZCoAtaxk
2010/07/15(木) 22:11:02ID:K2yOe2RIバグが出てるわけでもないし、わかりにくくてもなんとかソースを読むこともできるから、
整理に時間をかける程でもないなと思った。
とりあえずこのままにして、前スレで言っていた以下の目標をやってみる。
>967 :SGGK ◆6pZCoAtaxk [sage]:2010/04/27(火) 23:03:19 ID:puWvjObW
>次の小目標は、
>今まですべての選手が一斉にボールを追いかけていたのをやめて、
>FWは前1/3、MFは中1/3、DFは後ろ1/3の範囲にボールがある時だけ
>ボールを追いかけるようにプログラムを直す。
>…にしてみる予定。
0048SGGK ◆6pZCoAtaxk
2010/07/19(月) 23:53:37ID:Enn47Jg4まず、メインループの中にある選手の移動関数について。
移動関数の中で今が前半か後半かを判断する変数を使えるようにしたいけど、
いまのままではおそらく使えないと予想。
現在のプログラムは、選手関係の変数や関数をひとまとめにしたクラスの
オブジェクトをゲーム処理を主とした関数内に作ってあり、そのオブジェクトのメンバ関数で選手移動処理をするようになってるので、
ゲーム処理を主とした関数で定義した変数を認識させるにはたぶんその変数のアドレスを渡さなければいけないと思い、
とりあえず、
1.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルに「前半か後半かを判断する変数」を
定義してる別のヘッダファイルを加える。
2.選手関係の変数や関数をひとまとめにしたクラスを宣言してるヘッダファイルの中の
選手移動処理の関数の引数に「前半か後半かを判断する変数」を追加する。
3.選手移動処理の関数の定義がfieldplayercontrol.cppの中にあるので、
これにも同様に「前半か後半かを判断する変数」を追加する。
ここまで書けば関数の中身を後回しにしてもコンパイラは通るはずだと思い、
コンパイルするとエラー。
error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。
運よくバグは取れたけど、詳細は進まない作業の代わりにネタおよび自分の作業メモとして少しずつ書く予定。
てっきり、また全角の空白をどこかに入れてしまったのかと思ったが、そうではなかった。
知ってれば一瞬なのに何時間か掛かってしまい、これがプログラムのしんどいところ。
0049STG
2010/07/21(水) 20:04:43ID:jGZViznhゲーム仕様でどうしても2Dでは実現しづらい部分が出てきたので3Dに移行。
サンプルプログラムで大体どんな感じに組めばいいかはわかったのでモデル製作の勉強開始。
モデリングソフト高すぎワロタ…のでBlenderを使うことに。
0050SGGK ◆6pZCoAtaxk
2010/07/22(木) 00:32:00ID:umEPonN6こんばんは!。見ている人がいるからには、諦めずにもう少し頑張ってみようと思います。
自分もいつかは3Dをやりたいと思っているので、Blenderの事は記憶に留めておきます。
>48のバグは、最初「error C2146: 構文エラー : ';' が、識別子 の前に必要です。」で検索したところ、
その中で、「変数宣言の位置によってエラーになったりならなかったり ...」という言葉が目に付き、
ソースを見たところ、ヘッダファイルの左端の縦棒が太く表示されていて何かここに問題のあるしるしなのかと思い、
考えてみると、今回、選手の移動関数の引数として読み込ませたいと思っている変数は、
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
で、これはsoccergame.hで宣言されてて、しかし、選手の移動関数は
fieldplayercontrol.hで宣言されているので、ならば、fieldplayercontrol.hの上の行に
#include "soccergame.h"をいれてやればいいのではと思ってそうした。
しかし、先ほどのMATCHSTATEはクラスなどの外側に記述してあるので、コンパイルしたら、
soccergame.hと#include "soccergame.h"したfieldplayercontrol.hとで重複してしまうのではと思い、
#include "soccergame.h"を消したら、コンパイルできた!…という話。
0051SGGK ◆6pZCoAtaxk
2010/07/22(木) 22:16:41ID:lTzR4XWCソースはifとswitchの組み合わせなので長文になってしまっているのが相変わらずの難点。
次の目標は、出来れば走ったり、ジャンプをさせたりとかいろいろ思いつくけど、
選手それぞれの近くにライフゲージを表示させて、ライフが少しずつ減り、0になったら
選手が停止する
に挑戦。
0052名前は開発中のものです。
2010/07/23(金) 02:53:39ID:C4gQhbldつまり・・・どういうことだってばよ
いやすまん、偶然スレ覗いたら気になったんでちょっと質問させて欲しい
enum A{};
enum A{};
void main{}
例えばこう書くと、VisualC++では「error C2011: 'A' : 'enum' 型の再定義」っていうエラーになるんだけど
>>50の下6行で言いたいのは、こういう事とは違うの?
0053SGGK ◆6pZCoAtaxk
2010/07/25(日) 12:32:50ID:p6Ls+avhそうです。その通りです。
「選手移動処理の関数」に「前半か後半かを判断する変数」つまり
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
を引数として持たせたい。
でも、この「前半か後半かを判断する変数」の宣言は、soccergame.hにあり、「選手移動処理の関数」の宣言はfieldplayercontrol.hにあるので、
fieldplayercontrol.hの中でsoccergame.hを#includeしなければ、引数として認識できないかなと思った。
でもそうするとfieldplayercontrol.hとsoccergame.hの両方に
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
があるので、コンパイルしたときに
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
enum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
void main{}
と2重になるので、
C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。
というエラーが出てるのかと思った。
0054SGGK ◆6pZCoAtaxk
2010/07/25(日) 12:35:16ID:p6Ls+avhenum MATCHSTATE{
FIRST_HALF=1,HALF_TIME,SECOND_HALF,RESULT_DISPLAY
};
だけを直接書きこんでみると、
error C2011: 'MATCHSTATE' : 'enum' 型の再定義
というエラーが出た。
自分が思っていたバグの原因は間違いで、
>>50で
>#include "soccergame.h"を消したら、コンパイルできた!
ときのコンパイルできた理由はほかにあるらしく、
しかもenum MATCHSTATE{略};は問題なく認識されていたらしい…orz
(>>52←指摘ありがとうございます!)
0055SGGK ◆6pZCoAtaxk
2010/07/25(日) 14:01:28ID:p6Ls+avh#include "soccergame.h"で発生したバグだから、そのsoccergame.hの中に';' が抜けてるところがあるのかと思ったが、良く見たけど見つからない。
他のヘッダーファイルに#include "soccergame.h"をやってコンパイルすると、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
が出る。"soccergame.h"に何かあるのか…。
もしかするとヘッダーファイル2重読み込み防止(いわゆるインクルードガード)の書き方が
"soccergame.h"だけ何かの作業でずれたか消えたかしてたか?と見てみたがなんともない。
ためしに「ヘッダファイル 2重読み込み」で検索するとやっぱりこれといったのが無く、しかし、
その中に「ヘッダーファイルは慎重に扱わないと危険です」という言葉が目に付き、
クリックすると内容が難しすぎて解らなかったけど、雰囲気的に「循環参照」というのが気になる。
0056SGGK ◆6pZCoAtaxk
2010/07/25(日) 14:03:02ID:p6Ls+avhfieldplayercontrol.h に soccergame.h をインクルードしたときを考えてみる。
soccergame.h は #include "fieldplayercontrol.h" してるので、
お互いがお互いをインクルードしあってる。
念のため、soccergame.h がインクルードしてないヘッダーファイルにsoccergame.hをインクルードしてみる。
これなら循環じゃないから、バグが出ないはずだと思ったが、
バグが出る場合と出ない場合がある。
バグが出ないと予想したのにバグが出たヘッダーファイルは、もしかするとsoccergame.hのインクルードしたヘッダーファイルからまたヘッダーファイルが呼ばれてて…のような感じで呼ばれていたのかもしれないが、調べきれず。
さらに
error C2146: 構文エラー : ';' が、識別子 の前に必要です。 ヘッダーファイル 循環参照
で検索してみると、掲示板関係ばかり引っかかるけど、どうも循環参照が原因の可能性が高い。
「ヘッダーファイル内でのインクルードはできるだけ避けたい。」という書き込みもあるし。
仮に循環参照が原因として何故、「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」というメッセージになるのかわからないけど、
とりあえずヘッダーファイルをインクルードしているうちに循環参照になっていたのが原因の可能性が一番高いと考えて、
>>51の課題挑戦を再開。
0057名前は開発中のものです。
2010/07/25(日) 16:05:50ID:7RX0IWHa0058名前は開発中のものです。
2010/07/25(日) 16:13:03ID:Vl6SpnXHまずヘッダーの重複読み込みを気にしているようだけど、「#pragma once」は記述している?
ちなみにマクロを使って同じ事も出来る
ttp://www.geocities.co.jp/SiliconValley/6071/technic/16.html
そして「error C2146: 構文エラー : ';' が、識別子〜」は、行数を特定しにくいエラーの一つだけど
これを発見するには、デバッグの基本技の一つ「コメントアウト」が有効
例えば、以下のように4つの関数があったとする
void A(){}
void B(){}
void C(){}
void D(){}
このCとDをコメントアウトしてコンパイル
void A(){}
void B(){}
/*
void C(){}
void D(){}
*/
これでC2146エラーが消えたようならCかD、残るようならAかBに絞り込める
消えた場合Cだけコメントアウトすれば、特定の関数まで絞り込める
この方法を使えば、例えば500行のソースが書かれている場合
その約半分250行くらいから下をコメントアウト、さらにその半分、さらにその半分・・・と機械的に絞り込む事が出来る
0059名前は開発中のものです。
2010/07/25(日) 16:24:34ID:vN3nsQ+l0060名前は開発中のものです。
2010/07/25(日) 20:13:54ID:bN26srjK>>52
インクルードガード関係ない可能性が高い
0061SGGK ◆6pZCoAtaxk
2010/07/26(月) 22:44:04ID:HmEvw+7Eたぶんまだ正解ではないんだろうなという雰囲気が伝わってきたので、再考。
まず、>>58氏の#pragma onceを試して、もう一度soccergame.hをfieldplayercontrol.hにインクルードしてみたがやはり同じバグが発生。
でも、#pragma onceなら1行で、しかも同じ書き方でインクルードガードできるから便利。(感謝!、絞り込みも活用します。)
次に昨日書いた循環参照について。
soccergame.hをfieldplayercontrol.hにインクルードした時、soccergame.hの中では、FieldPlayerControlクラス型の実体を定義してるけど、
fieldplayercontrol.hの中でSoccerGameクラス型の実体を定義してはいないから、循環参照ではなかったかもしれないという気がしてきた。
お互いをインクルードしあってるだけでは循環参照に必ずしもなるとはいえないかもしれない。自信はないけど。
そこで、soccergame.hをfieldplayercontrol.hにインクルードした時のfieldplayercontrol.hの中身はどうなっているのかソースにして追いかけてみようとふと思った。
ひとつ気になった。
soccergame.hはその中で#include"fieldplayercontrol.h" してるので、soccergame.hをfieldplayercontrol.hにインクルードしたら、
fieldplayercontrol.h の中で #include"fieldplayercontrol.h"されるのだろうか?
なぜなら、もともとのfieldplayercontrol.hは、#include"fieldplayercontrol.h"なんてしてないから、インクルードガードされないんじゃないかなと思ったので。
0062SGGK ◆6pZCoAtaxk
2010/07/26(月) 23:01:02ID:HmEvw+7E「ヘッダファイルは、自分とは別のヘッダファイルを #include でインクルードできるので、(略)」 という記述があったので、
それ前提でソースをエクセルに張って考えてみたら、自分としては今までで一番正解に近そうな答えが出た。
soccergame.hをfieldplayercontrol.hにインクルードしたときにsoccergame.hの中にある#include"fieldplayercontrol.h"がキャンセルされていたら、
soccergame.hからインクルードした部分の処理を進めているときは、まだFieldPlayerControlクラス型が宣言されてないから、
soccergame.hからインクルードした部分にFieldPlayerControl fieldplayercnt;
と書いても、
「error C2146: 構文エラー : ';' が、識別子 'fieldplayercnt' の前に必要です。」
というエラーが出る…というのが答えかもしれない。
一応、エクセル→jpgでうp
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0129.jpg
0063STG
2010/07/28(水) 04:37:11ID:ttdS5Bl4忘れていたわくわく感があふれてくるっ
知らない用語がどんどん出てくるこの冒険感っ
練習ソフトクリーム
http://www.dotup.org/uploda/www.dotup.org1057678.jpg
0064SGGK ◆6pZCoAtaxk
2010/07/28(水) 23:06:54ID:6+SmVQnU自分もサッカーゲームの3D化を目指して開発を急ぎたいです。
>>51の課題に挑戦。
ソースはまだ書いてないけど、選手クラスにライフ値を記録するためのメンバ変数を追加して、
選手の描画関数を実行するときに選手の座標を基準にDXライブラリの四角形描画関数を2回使重ね書きして実現できないかなと脳内設計。
ライフ値をソースのどこでどのくらい減らせばいいのかを検討中。
0065SGGK ◆6pZCoAtaxk
2010/08/03(火) 22:32:31ID:nPEW7e3nライフ値は、各選手が移動関数を実行した直後に少しずつ減らすようにしておき、
「 現時点のライフ値/最大ライフ値xライフゲージ最大長さ 」を計算して長方形をその長さで描画する。
減り具合は完全ではないけど、今は調整する予定なし。
次の目標
●共通(ゴールキーパー以外)
(実装済)歩く Z+マウス操作
1 走る X+マウス操作
2 進行方向固定 Shiftキー
3 特殊技術(ボールが頭上ならヘディング、足元ならダイビングヘッド) Spaceバー
●ボールキープ時
4 ジャンプ(タックル避けにもなる) C
5 ロングパス 左クリック
6 ショートパス 右クリック
7 シュート 左右同時クリック
8 パス/シュートは,押す長さで強さを調整
●非ボールキープ時
9 タックル 左クリック
10 カット 右クリック
これらの内6個でも実装できれば上出来と考えて挑戦する予定。
期限を決めてやるのは無理そうな感じ…orz
0066STG
2010/08/28(土) 03:50:26ID:gP4FgSviBlenderの仕様でいろいろ不都合が出てきたのでメタセコイアにのりかえ中
0067SGGK ◆6pZCoAtaxk
2010/08/29(日) 22:43:31ID:HGm0TpTIアクセス規制が続いていて、実は現在も書き込めない状態でご無沙汰してました。
メタセコイアはフリー版あるらしいので、ドットが不得意な自分もいつかは触ってみたいソフトです。
3〜4週間の2chアクセス規制が頻繁にあり過ぎて製作活動ペースが落ちてくるので(言い訳)、
運営の思う壷かもしれないけど、試しにp2とやらで今日から1年間だけ書き込めるようにしてみた。
肝心の進捗の方は思わしくなく、>65の目標をみると、今のゲーム画面は視点がおかしいので悩む。
フィールドは真上から見てるのに、選手は真横から見た絵になっている。
蹴ったボールをいずれは曲線を描くようにしたいけど、この画面ではそれを表現するのが難しい事に気づく。
そしてボールの座標は(x,y)だけでは足りなくて(x、y、z)にしておかなければな後々不便な事になるような気がしてきた。
これはベクトルの表現を取り入れたプログラムに書き直しておいた方がいいかなと思い始めたところ、
偶然手元に「14歳からはじめるわくわくC言語プログラミング教室VS2008編」という本があり、
運よくこれの第3章がベクトルの説明をしていたので、読んでみることにした。
もう少しで読み終わるけど、解り辛い…。
0068SGGK ◆6pZCoAtaxk
2010/08/30(月) 23:32:27ID:0WWGfdkP書き込み規制の原因は荒らしをする人にあるわけだから。
とりあえず3章だけを読み終えた。
明日も時間が出来ればベクトルを取り入れたプログラムに書きなおしてみる予定。
0069SGGK ◆6pZCoAtaxk
2010/08/31(火) 23:49:31ID: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;
と書き直したら、コンパイラが通った。
クラスの定義の中では初期値を書けないのをすっかり忘れていた。
思い出せたのは運が良かった。
0070SGGK ◆6pZCoAtaxk
2010/09/02(木) 23:42:53ID:N3a4x6peそれらの変数や関数を定義したファイル、vector3.cppを作成してみた。
とは言うものの、中身は変数を3つ持つ構造体とその構造体の型を持つ変数を引数にもつ関数で
関数は、
ベクトル=ベクトル+ベクトル
微小時間後の位置を示すベクトル=現在の位置を示すベクトル+微小時間xその時点での速度を表すベクトル
の2式だけ。
この微小時間がいわゆるフレームタイムであり、今までのプログラムだと
メインループ関数の中で、DXライブラリのScreenFlip()関数を30回ループしてその平均を
フレームタイムとしてる。ScreenFlip()関数は画面のリフレッシュレートとやらと同期して動くらしいので
そういうやり方でフレームタイムが計算できるらしい。
でも、これだとメインループ関数の外側で宣言・定義されてる微小時間後の位置を示すベクトルを計算するための
関数に必要な微小時間(フレームタイム)が読み取れないと予想。
とりあえず、30回ループする部分を関数にして、vector3.h、vector3.cppで宣言・定義して、
その30回ループする部分を関数にしたのをメインループで呼び出してなんとかできないかと思ったところで終了。
0071名前は開発中のものです。
2010/09/04(土) 10:45:00ID:BWH+wHQ4> + の意味を定義しなおす機能があるようなので、これかなと思ったけど、あまりにも内容が難しいので、諦める。
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で新しいクラスを作る必要があるから処理速度の面で微妙
俺だったら使わない
0072SGGK ◆6pZCoAtaxk
2010/09/05(日) 00:15:21ID:t7yjfHHgす…凄いです。そうです!そのoperatorがなんとかというそれでした。
まだ自分は答えを見ても何がわからないかもわからない初心レベルですが感謝します。
処理速度が微妙であるとのコメントを参考にして、なんとか>70のやり方(C言語風?)でやれるよう頑張ってみます。
0073SGGK ◆6pZCoAtaxk
2010/09/05(日) 23:38:53ID:glSoiJ6Gvector3.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の外部変数化も中止。(あまり進まず。)
0074名前は開発中のものです。
2010/09/06(月) 06:18:19ID:WWj0DWld・適当なcppにて、float Vector3::frametime=初期値;
ということがしたいのかな?
0075SGGK ◆6pZCoAtaxk
2010/09/06(月) 23:10:19ID:5jVgy4R8その通りです。
ただVector3.hでは、クラスの宣言や定義はしていなくて、ベクトルを表す構造体などを引数にしてベクトルを表す構造体をreturnする関数を宣言するのみ。
そうすればベクトル関係の関数は外部関数になってどのcppファイルからでも使えるかなというのを期待して書いてます。
そしてVector3.cppでその関数の定義をしようとすると関数内のframetimeという変数がメインループで計算するframetimeと名前を同じにしても
このままでは中身が別物なはずなので、Vector3.hかframetimeを使うcppファイルのどこかで1度だけ
frametimeを定義して、他の残りについては、extern float frametime;とすれば動きそうだと思ったわけです。
externにしたのは、cppファイルが複数あるからstaticよりこちらがいいかなと思っただけであまり自信無し。
「extern static 違い C言語」で検索するとろいろ出てきて読むと自信無くなってきたけど
なんとかトライしてみます。
0076SGGK ◆6pZCoAtaxk
2010/09/07(火) 23:20:38ID:qyxrqbqYとりえあず先にヘッダーファイルだけを変更する予定。
しかし、ヘッダーファイルを変えただけでコンパイルすればcppファイルの方でエラーが出るはずなので、
ヘッダーファイルを全部コピーしてファイル名の前の方にv_を付けてファイル名を変えた方で変更作業する。
そうすれば、cppファイルと矛盾してエラーが出るという状態を避けられるはず。
そしてヘッダーファイルの変更が終われば、古いヘッダーファイルを削除して、新しいヘッダーファイルのファイル名からv_を取り除いて、
今度はcppファイルを直す。
変なやり方かもしれないけど、やってみる。
0077SGGK ◆6pZCoAtaxk
2010/09/08(水) 23:42:12ID:2FQaVedhあと12個残ってる。
0078SGGK ◆6pZCoAtaxk
2010/09/09(木) 23:34:11ID:u4JUxGaqcppファイルを直す時に泥沼状態になる事を予想して、
変更箇所を表計算ソフト(エクセルのこと)にメモしながら進めてるから作業が遅いのかもしれない。
0079SGGK ◆6pZCoAtaxk
2010/09/12(日) 23:34:04ID:zuikLtmEこれは選手の移動関数を定義してるファイルだけど、気になる箇所があった。
今のプログラムは、どのような速度のパソコンでも60Hzで1フレーム時間あたりの移動量を1〜20ドットにしたい場合の移動量を
20個の配列を用意して入れてるんだけど、これが外部の移動関数から読めてる。
…というのは知ってたけどそういえばextern使ってないのに何故だろうと思い、14歳わくわくC++を調べてみると、
メンバ関数やメンバ変数にstaticを付けるとグローバルな関数、変数扱いに出来るとのこと。
そして呼び出すときには、クラス名::変数または関数とすればよいらしい。
さらに変数の場合は、外部に実体の定義が必要。
忘れてた…。
これは>>74氏のそのままでOKではないか〜!ということでextern無しで書くことにした。
よって>>73で言ってた
>ベクトル計算用関数の引数を増やして、その引数に値経由でframetimeを渡せないかと
も中止。
とりあえず、最後に残ったヘッダファイルにある移動関数の一つを書き直してコンパイルしてみたら通った。
移動関数はあと3つ残ってる。
0080SGGK ◆6pZCoAtaxk
2010/09/13(月) 22:59:37ID:621XmSry何もヘッダファイルを読み込んでないヘッダファイルを先に直して、
ヘッダファイルの読み込みの少ないヘッダファイルを先に直すような順番で書き直していったからかどうかはわからないけど、
あまりバグが出なかった。次はcppファイルの書き直しに挑戦。たぶんもっと時間がかかるはず。
0081SGGK ◆6pZCoAtaxk
2010/09/14(火) 22:23:51ID:8SPHlgRSそのcppファイルがインクルードしてるヘッダファイルのファイル名の頭に付けてたv_(←修正中のヘッダファイルに付けてたやつ)をはずして、
そのままでは古いヘッダファイルと同じ名前になってしまうので、先に古いヘッダファイルは別のフォルダに移動しておく。
そしてコンパイルしてみる。
一個ずつ直してみたがバグがなかなか減らないし、ヘッダファイルもコンパイルの画面に新旧入り混じっている状態では
かえってややこしくなってくる。
cppファイルも一個ずつ順番に直してバグが無くなったら次に…と思っていたが、
うまく説明できないが、そうはならないはずとの考えに至る。
cppファイル単位できれいに独立してるわけではなくて、あるcppファイルのオブジェクトが呼ぶオブジェクトは別のcppファイルで定義されてて
そこからまた他のところへ…、するとそのcppファイルでインクルードしてるヘッダファイルも直した方のヘッダファイルに入れ替えなければならない。
結局、全部のヘッダファイルを新しい方だけ残して全部一気にコンパイルしてしまった。
エラーの総数が今現在349個。
ヘッダファイルの修正箇所をエクセルにメモする作業が無駄になってしまったかもしれない。
0082SGGK ◆6pZCoAtaxk
2010/09/15(水) 22:31:31ID:/g+buLkbそうした上でのバグ349個。
その後の修正で何故かバグが358個まで増えたけど、なんとかして344個に減ったところで終了。(今日はちょっと疲労気味なので…)
0083名前は開発中のものです。
2010/09/16(木) 03:09:59ID:OhUUY93b0084STG
2010/09/16(木) 03:35:20ID:YtfF1rT+0085名前は開発中のものです。
2010/09/16(木) 03:50:06ID:OhUUY93bガンガレ超ガンガレ
俺もそろそろ頑張ってみるか…
0086SGGK ◆6pZCoAtaxk
2010/09/16(木) 23:40:48ID:62n4CZRN自分はこの板のおかげでゲーム作りへの挑戦は約3年1ヶ月程続いているけど、あまり進んでいないかもしれません。が…頑張ります!。
>>84>>85
お互い頑張りましょ〜!期待してます。
0087SGGK ◆6pZCoAtaxk
2010/09/17(金) 00:11:53ID: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++のソースに
使おうとしたから、自分の気付かない理由で上手くいってない感じ。
まずは今のままで進めてみて関数にベクトル構造体を引数にしたところでも
問題が出るようなら、また考え直すつもり。
0088名前は開発中のものです。
2010/09/17(金) 02:15:46ID:zNJRouQ+見方を変えると「Cの構造体に関数も書けるようにしたものがC++の構造体」とも言えると思う
Cの構造体で出来ることはC++でもそっくりそのまま書けると思うんだけどね
>自分の気付かない理由で上手くいってない感じ。
バグに関して絶対こうだとは言えないが、CとC++の違いが原因ではないような気がするなー
0089名前は開発中のものです。
2010/09/17(金) 22:28:19ID:pd/LBTtix、y、zを初期化するコンストラクタを定義されていれば
オブジェクト.構造体変数名 = クラス名(848,544,0);
のような代入ができる。
もしくは、構造体変数をセットするメンバ関数を定義してもいいかも。
0090名前は開発中のものです。
2010/09/17(金) 22:40:10ID:pd/LBTtiコンストラクタを定義していなければ、
オブジェクト.構造体変数名 = {848,544,0};
のような代入もできる。
0091名前は開発中のものです。
2010/09/17(金) 23:57:56ID:iQtTD6+Iそれは初期化時のみじゃない?
struct vector{
int x,y,z;
};
void main(){
vector a = { 1,2,3 }; //ok
a = { 4,5,6 }; //エラー
}
0092SGGK ◆6pZCoAtaxk
2010/09/18(土) 01:00:44ID:wU0YURT9>>88
たしかにバグの原因がCとC++の違いだと思い込んでしまうと他の原因の可能性を見落としやすくなりそうなので気をつけます。
>>89
今のソースではベクトル関係がクラスでなく構造体で表現されていてコンストラクタについてはまだ考えてませんでした。
バグが結局取り切れなかった場合、勉強しなおしてベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>90
コンストラクタの定義はしてないのですが、何故かエラーになってしまうので、
今は以下に書くとりあえず的なやり方でエラーを回避してます。
>>91
「構造体の初期化」で検索したところ、とあるサイトにそのような感じの
「構造体変数の初期化は、変数の宣言時には常に行うことが出来る点に注意しよう。」とあり、これを参考に以下のようにしてます。
ベクトル関係のヘッダファイルで
struct Vector3{float x,y,z;};
あるオブジェクトの初期化用関数の内部では昨日のやり方から少し変更して、
Vector3 a1={848,544,0};
fp.xy(←これは昨日書いていたオブジェクト.構造体変数名の事)=a1;
と書いてもバグが出ないのでこれでやってみようと思います。
今日は調べただけなので、バグは減ってないけど、全部取れるまで頑張ってみます。
0093名前は開発中のものです。
2010/09/18(土) 01:45:54ID:ZJvrb5gA>ベクトル関係もクラス化する最終手段に挑戦してみようと思います。
>>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;
}
0094名前は開発中のものです。
2010/09/18(土) 01:56:17ID:ZJvrb5gA>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
0095名前は開発中のものです。
2010/09/18(土) 02:09:34ID:ZJvrb5gAつまり関数オーバーヘッド分の差が出たのだろう
変数を増やすとAが遅くなるのは、ほぼ間違いなくコピーコンストラクタが発生してるからだろう
ここら辺は言語仕様のレベルでBのような代入にしてくれてもいいような気がするなー
ま、結論としてはoperator=は弄らない方が速い
0096SGGK ◆6pZCoAtaxk
2010/09/20(月) 00:00:13ID:y8zi6Evk詳細な解説に感謝します。
自分にはまだ難しすぎるのですが、「c++ 構造体の代入 問題点」で検索してみたところ、
以下のHPがこれらを理解するのに参考になり(理解は出来ず雰囲気だけなんとなく自分に伝わったような感じ。)、
リンク先はpdfなので要注意かもしれませんが、
ttp://ist.ksc.kwansei.ac.jp/~ishiura/xcpl/note/cpp3.pdf
の12〜13ページあたりで、C++にはいろいろな種類のコンストラクタがあり、
結果は同じようでもその書き方によっては、コンストラクタが多く呼び出されて処理に時間がかかるらしい。
あと>>94のコンストラクタの書き方が見たことない書き方だったけど、
ちょうど17ページにある説明と似てるので、これかな?と思ってみたりで勉強になりました。
バグの方は、126個まで減少。
0097SGGK ◆6pZCoAtaxk
2010/09/20(月) 23:18:29ID:L4tJFEVm0098SGGK ◆6pZCoAtaxk
2010/09/21(火) 23:17:03ID:48pAG2m3しかし、画面でスタート直後にボールに近い選手が通常よりも早いスピードで画面外に出ていくような動きをして、
画面端に到達してそこから動かなくなる問題が出た。
やっぱり出た。エラーメッセージの出ないバグが…。
もしも、>>96のようなコンストラクタがどうのこうのが理由で動かないとなるとやっかいな予感。
自分は>>96はもちろんのこと今までに難しいといったところはなかなか理解が出来てないから…。
0099SGGK ◆6pZCoAtaxk
2010/09/22(水) 23:13:48ID: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));
のように書き直したら、選手がほとんど動かないけど、単位の間違いが原因だとわかった。
選手がボールに向かってくれない原因は未解決。
0100SGGK ◆6pZCoAtaxk
2010/09/23(木) 21:24:02ID:3ixO7vXf選手とボールの距離とそのx、y成分を計算するために座標の引き算をしたが、
選手座標 − ボール座標としてたのが間違い。
ボール座標 − 選手座標が正解。
でも何故かこれでもバグは解消されなかった。
本当の原因は、
違う場所を直していた。
という事だった。
自分のプログラムは移動関数を4種類用意してあり、
1.その場停止
2.マウスに向かう
3.ボールに向かう
4.指定したX、Y座標の位置に向かう
なんだけど、いつからか4番の関数だけ使えば十分だろうと思い、
4の関数にマウス座標やボール座標を渡していた。
でも、そのことを忘れていて、ボールに向かわないバグだから
ボールに向かう関数を直さねばと思い、その関数だけを直していた。
昨日スピードのバグが直ったのは、その時だけたまたまPC画面が小さくてプログラム行が下がっていたのに気付かず4番の関数を書き直していたのだろうと思われる。
ある意味1日で気付けたのは運が良かったのかもしれない…。
0101SGGK ◆6pZCoAtaxk
2010/09/23(木) 21:46:24ID:3ixO7vXfこれはあくまで>>65の目標に取り組めるようにするための準備段階なので、
次は画面関係の修正に挑戦する予定。
まだ方法を考えてる段階なので簡単には進みそうにない予感。
少し斜めから見たフィールド画像でプレイできるようにするのが目標だけど、
ネットではパースというキーワードで検索するものの即取り入れ可能な事を書いてるホームページにはまだ出会えていない。
他には動画サイトで昔のサッカーゲームの画像を見て、参考に出来るところが無いか調査中。
0102SGGK ◆6pZCoAtaxk
2010/09/25(土) 00:13:42ID:Q7QeFJjpいますぐどこかの3Dライブラリを理解できるレベルではないのでかなり困った状況。
大体イラスト関係のホームページがよくヒットして消失点という言葉が出てきて、
これを考えればフィールドの形を遠近法的な台形形状に書くことは出来るだろうけど、
例えばその台形のフィールドに奥行きと高さ方向にメッシュを入れる時、何を基準にすればよいのかを詳しく説明してるところを見つけられず、
結局参考にならなかった。奥行きのメッシュは遠くになるにつれて間隔が狭くなると思うけど、それを決定する基準がわからないという意味。
そしてしばらくまた探していると、とあるホームページで人間の目は並行ではなく放射状にものを見ているとの記述があり、
これが参考になりそうなので、方法を考えているところ。
0103名前は開発中のものです。
2010/09/25(土) 00:26:55ID:j8zDlksV3Dライブラリを使うのが結局は楽だよ
(描画効率を無視するとして)
フィールドのモデルとプレイヤーのモデルを配置
カメラ位置・方向を決定したら draw 一発
難しい事を考えなくて済む
0104名前は開発中のものです。
2010/09/25(土) 00:50:55ID:Djp6Vs3v確かに3Dライブラリを教科書どおりに使えば簡単にできることだけど
敢えて自力で計算してみようというなら
「透視投影変換」、「同次座標表現」で検索するといいかも。
0105SGGK ◆6pZCoAtaxk
2010/09/26(日) 01:06:29ID:CCDwSOVy>>103
3Dの勉強を全くしていない状態なので、知識のない自分には3Dライブラリを使うのは無理かと思ってたけど、
すぐに諦める前にもう少しだけ調べてみようと思います。
>>104
「透視投影変換」、「同次座標表現」のキーワード、感謝します。パース等ではなかなか役立つホームページがヒットしなかったので…。
すぐには理解できないけど、検索結果のホームページの内容の方が自分の思いつきより洗練されてるので、3Dライブラリ使用が無理な場合、次の手段として挑戦しようと思います。
とりあえずDXライブラリで出来ないか考えてみる事にした。
ホームぺージから最新版をダウンロードしたら、3.04だった。
いままでのは2.25、リファレンスの球を表示する部分を丸ごとコピペしてコンパイルしたら
球が表示されたので、もし2Dとソースが共存できるなら今までのプログラムを3Dライブラリで丸ごと書き直さなくてもすむかもしれないと思って終了。
0106SGGK ◆6pZCoAtaxk
2010/09/29(水) 23:24:31ID:ixkP0mUbDXライブラリ置き場ホームページに行き、サンプルプログラムの
32.3Dアクション基本 を見るが複雑すぎて今は無理と判断。
31.迷路を3Dで表示 も難しいが、プログラムのソースにあるカメラの命令のリファレンスを見てみるもののやっぱりよくわからない。
>>102で言ってた2Dだけで自分で計算するか悩んだが、その前にあと一つ試せる方法があったのでやってみた。
今まで書いてたプログラムの状態や画面の遷移、得点、時間表示などを削除し、
3D円錐の描画命令をコピペし、上記で言ってたカメラの命令をコピペしてみたら描画された。
最初からプログラムを作り直さなくても3D命令のテストが出来たのは運が良かったかもしれない。
カメラの関数の引数を変えると円錐の向き大きさも変化したが、座標系がよくわからないので、
何故このように見えるのかが今はまだわからない。
カメラ関数の引数を変えても2Dの選手やフィールドの絵には変化が無かった。
もしかすると結局はすべて3Dのライブラリ関数で書き直すしかないのかもしれないと思って終了。
0107名前は開発中のものです。
2010/09/29(水) 23:40:52ID:UzXxGPtF2Dの絵がすでにあるならビルボードでググってみるとよろしかろう
0108SGGK ◆6pZCoAtaxk
2010/10/01(金) 00:18:19ID:EHwgOhQ3ありがとうございます。3Dを不勉強なので、ビルボードも知りませんでした。
フィールドを3Dで表示して選手を2Dにして遠くにいる選手の画像は2Dのライブラリ関数で縮小表示できれば3Dらしくなるのではと自分はいままで思っていて、
しかしその縮小比率をどのように計算すれば良いのかが悩みどころでしたが、ビルボード関係を調べて何ができるのか読んでみると、
厚みのない画像でも3D空間の物体扱いにできてカメラ関数があればフィールドと一緒に選手も3D視できそうな気がしてきたので作業が進んだら挑戦してみたいと思います。
今日はホームページで3D関係を巡回したのみ。
3D空間からPC上のゲーム画面への座標変換を行うには、いろいろな行列を何度か掛ける必要があるとか、座標系の種類の説明がいろいろ。
これを理解してプログラムを書けるようになるにはどう考えても数カ月から…いや下手すれば数年かかるんじゃないかと感じた。
しかし、一方で昨日のDXライブラリのサンプル 32.3Dアクション基本 のソースを見る限りでは、行列を何回も掛けているような処理の記述は見当たらない。(探し下手で自分が見つけられていないだけかもしれないが…)
もしかすると、3D空間内にモデルを配置してカメラ関数の引数をセットすれば3D視できるその中に既にそういった計算が見えないところで行われてるのかもしれない。(これが>>103氏、>>104氏の言っていた事かもしれない)
とりあえずなんだかわからない状態だけど、なんらかのモデルを用意して、それを読み込んで画面に表示することに挑戦してみたい。
0109SGGK ◆6pZCoAtaxk
2010/10/04(月) 23:34:31ID:OotJcuep金曜日の夜にメタセコイアR2.4(フリーの方)をインストールした。
モデルをつくる技術が無いので、面→基本図形で面を生成し、材質設定で緑色を指定するにたどりつくまででもかなりの時間がかかった。
サンプルプログラムのやり方を真似してこの平面モデルのmqoファイルを読み込み、表示させようとしたが、
最初は全く表示されず、表示されても白黒だったりしたが、ファイル作るところからやり直してみたら今度は表示された。
結局原因は不明。次は今までの選手の2D画像を平面モデルに張り付けられるのかに挑戦。
0110名前は開発中のものです。
2010/10/06(水) 18:41:28ID:WfQHbqcm頑張れ!
0111SGGK ◆6pZCoAtaxk
2010/10/07(木) 00:39:47ID:uuBtJJiv今は全ての作業が試行錯誤なので遅くなっているけど頑張ります!
選手の画像を1コマ切り取り、同じサイズの平面をメタセコイアで作成して
その平面に選手の画像を貼ろうとしたが失敗。
この処理はUVマップと呼ばれてるらしいが、とりあえず貼り付けをやめてxz面に垂直なただの平面を作り、
フィールドの次に描画させようとしたら表示されず。
何回かやり直していたら、フィールドと小さな平面が表示されたところで終了。(原因不明)
0112SGGK ◆6pZCoAtaxk
2010/10/07(木) 23:46:00ID:IVAUpJqcUVマッピングとかいまだに解ってないので偶然できただけ。
ビルボードで選手を描画するのは難しい事がわかってきた。
DrawBillboard3D関数が使えるかなと思ってリファレンスを見たら、画像のサイズは自分で入力しなければならないので、
この関数仕様だと、いろんな位置や角度で見たときの選手がどの程度の大きさで見えてるかを自分で計算出来る必要があり、これを実現するのは難しいと思った。
すぐ諦めるのはどうかと思いつつも、最初に諦めてたモデルを配置してカメラ関数で見てもらうやり方を検討することにして今日は終了。
とりあえずは、選手を円筒か何か簡単なモデルで表現して配置してどのように見えるかを目標にする。
0113名前は開発中のものです。
2010/10/08(金) 00:25:13ID:lwTrudzADXライブラリ使った事ないので的外れかもしれないけど
こういうのって普通ビュー変換で処理されるんじゃないのか
0114SGGK ◆6pZCoAtaxk
2010/10/09(土) 01:18:45ID:k0QY2+O0実は自分は変換関係についてネットで調べて言葉を知ったところまでで、それ以上の探求をちょっと怠ってしまっている状況です…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
0115SGGK ◆6pZCoAtaxk
2010/10/10(日) 00:13:14ID:U9No5w8c毎日何か進捗のある状態に持っていくことの難しさを痛感。
とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。
今まで書いてた2D平面版ではマウスカーソルの位置に選手が向かうようにしていたので同じ操作方法を使えるようにしたいのが理由。
2D版では、ゲーム画面(640X480)の左上角の座標がゲームのフィールド全体の座標でみたとき(WX、WY)という座標で、
マウスカーソルの画面での座標が(X、Y)としたとき、マウスカーソルのフィールド上での座標値は(WX+X、WY+Y)になる。
3Dでもこれに相当する処理をしたいけど、3Dになるとカメラの位置が立体的に変化するからどうすればよいか想像が付かない。
このスレで教わった用語からいもづる的に出てきた用語を駆使して、
「ビュー座標からワールド座標を算出」というそのままなキーワードで検索してみたらたくさん出てきた。
どうすれば出来るのかある程度調べたら、使えそうなライブラリ関数を探す予定。
ライブラリで出来なければ、何も出来ない自分なので…orz ←まぁ、これはあまり気にしないでこれからも行き詰まるまで頑張るつもり。
0116名前は開発中のものです。
2010/10/10(日) 07:27:55ID: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次元座標に戻せる。
うろ覚えで書いているので細かい間違いがあるかも知れないが(違ってたら乞指摘)、
ゆっくりでいいんで、参考にしてもらえれば嬉しい。
頑張れ!
0117SGGK ◆6pZCoAtaxk
2010/10/11(月) 00:46:23ID:LCOMmGvcやっぱり自分にはまだ難しすぎたようです…。
しかし、これが解らなければ>>115でやろうとしていることもライブラリ関数だけでは結局出来なさそうなので、
もう少し頑張ってみようと思います。1日の作業時間が短いので、何週間か掛かるかも…。
0118SGGK ◆6pZCoAtaxk
2010/10/30(土) 23:45:10ID:DMcbgP8eやっぱりある程度の知識が無いと理解が進まないような気がしてきた。
ある程度知識を持ってる前提でちょっとわからない用語を調べるのにはネットは役立つけど、
今の自分は3Dに関しほとんどが知らない用語ばかりで思考が進まないので勉強が足りないと感じた、
遠回りだろうけど、本屋に行きそこに置いてあった中から1冊選んで来た。
「実例で学ぶ3D数学」←生き物を表紙に多用しているオライリーシリーズのひとつで、前スレでもこの本を紹介してくれていた人がいた。
今は第7章で108ページまで読んだけど、自分には難しい内容。
式の証明があまり無い様で、わからない箇所については「そういうものなんだ」ということにして先に読み進めているところ。
9章(〜194ページ)まで読み終わったら、もう一度上記について考える予定。
0119名前は開発中のものです。
2010/10/31(日) 14:36:58ID:Ha18eay7ポリゴン上のマウス座標を出してるっぽいのがあるよ
0120SGGK ◆6pZCoAtaxk
2010/11/01(月) 00:11:40ID:IY/H8hBEこ…、これは気付きませんでした。ありがとうございます。
試しにサンプルで使えそうな部分をコピーしてプログラムソースに貼り付けてまさかのコンパイル。
これではおそらくバグが山積みだろうと思ったら、予想外に通った。画像の文字の意味についてはまだ理解出来てません。
サンプルでは、スクリーン上のマウス座標から直線が延びているイメージで、ワールド座標内のポリゴンに当たったらそこが黄色になるという内容だろうと解釈。
マウスを左上に持っていくとフィールドの左上が黄色、右下にもっていくと右下が黄色、フィールド外だと変化なし。
とにかく反応していることが確かめられたので、このサンプルコードを自分がやろうとしていることを実現できるように
書き変えられるか考えてみようと思います。
参考画像をうp
ttp://gamdev4.hp.infoseek.co.jp/cgi-bin/up/No_0134jpg.html
もちろん>>116〜118についても継続するので、並行作業で行く予定。
0121名前は開発中のものです。
2010/11/04(木) 00:20:21ID:DIpes90k0122SGGK ◆6pZCoAtaxk
2010/11/04(木) 22:06:09ID:vVAyUmeW>118の本の学習がなかなか進まなかったため、ご無沙汰してしまいました。(汗;
ときどき停止するかもしれませんが頑張ります。
本の方は8章(〜144ページ)で一区切り。とりあえず8章まで読めればなんとかなりそうなので9章までの予定は中止。
14章も一部分だけ読んでみた。残りは必要なときが来たら挑戦するつもり。
>>116氏のをもう一度読んでみたところあともう少しでわかりそうな気がしてきたので、
あとはネット検索で投影変換行列を調べてみる予定。
0123SGGK ◆6pZCoAtaxk
2010/11/11(木) 00:10:14ID:OH7eCgI8視野錘台がうまく斜めに書けていないとかいろいろあるけど、
この状態からさらに理解が進めばDXライブラリを使って自分なりの関数をどのように作ればよいのかがわかるかも…、
そんな時が来るかもしれないと期待してここでいったん区切ることにしてみます。(感謝!)
いつも使わせてもらってたアップローダがサービス停止のようなので、いろいろ探して以下のところにしてみた。
(アップローダを使ってるスレを探してたらNE○Tスレを偶然見てこのアップローダの存在を知った。)
他にお勧めのアップローダがあれば、柔軟に対応します。
ttp://ux.getuploader.com/sggk/
次は>>119氏のヒントを元に次の行動を決める予定
0124名前は開発中のものです。
2010/11/11(木) 00:28:36ID:Jw3X6bp+GetMousePoint( &Mx, &My ) ;
ConvScreenPosToWorldPos( VGet( Mx, My, 0.0f ) ) - E ;
で求まるんじゃないだろうか。
そこで詰まったんじゃないの?
0125SGGK ◆6pZCoAtaxk
2010/11/11(木) 23:34:05ID:jPJR3Unnアドバイス、ありがとうございます。
今度は練習プログラムの修正で確認してみようと思っています。
>>119と>>124の両方でやってみるつもり。
マウスが指し示すフィールド上の位置に何かオブジェクト(球体とか)を
表示出来れば上手くいったと考え、この前ベクトル化したプログラムの続きに入る予定。
0126SGGK ◆6pZCoAtaxk
2010/11/13(土) 00:09:26ID:2/KX1c8Lとりあえず半径10の球体を(100,0,0)、(0,100,0)、(0,0,100)の順番に表示させてみた。
これによれば、X軸は左方向がプラス、Y軸は上方向がプラス、Z軸は手前方向がプラスになっていたので、
DXライブラリは左手座標系なんだな〜と思ったところで終了。
0127名前は開発中のものです。
2010/11/13(土) 16:02:39ID:V7u6UtpM0128名前は開発中のものです。
2010/11/13(土) 16:11:56ID:V7u6UtpM0129SGGK ◆6pZCoAtaxk
2010/11/15(月) 06:53:14ID:vSKd6IqBX軸は右方向がプラスの方が確かに分かりやすいのでカメラの位置と向きは変えようと思います。
いろいろ理由があり作業が止まったりしていますが、まだ諦めてはいません。(仮眠しようとしたら朝になってしまったとか…)
今のモデルは、フィールドが511x341(何故この数字にしたか忘れてしまった…)でその中心が原点(0,0,0)、
カメラの位置は(0,340,340)でカメラの注視点が原点(0,0,0)になっています。
作業の前にやっぱり簡単な例を用意して自分で(手作業で)変換行列を考えてみるところまで
やってみた方がいいかもしれないと思い始めてきたので、その作業分だけ進捗が遅れる可能性ありです。
0130SGGK ◆6pZCoAtaxk
2010/11/16(火) 00:25:11ID:MqJY7qc7書いた図が結局役に立たずに時間を無駄にする可能性もあるけどやってみる。
0131SGGK ◆6pZCoAtaxk
2010/12/13(月) 23:37:18ID:X8dPGQWF図は書いてみたけど、座標変換について結局あまり理解出来てない事がわかった。
悩んだ結果、恥ずかしいほどに簡単な例を用意し、それを図にして考えてみた。
オブジェクト座標からワールド座標への変換はなんとなく分かったような気がしてきた。
カメラ座標への変換(ビュー変換?)については、オブジェクト座標からワールド座標への変換と同じやり方でたぶん出来るだろうということにして省略し、
今は透視変換について考えているところ。
0132SGGK ◆6pZCoAtaxk
2010/12/15(水) 00:31:39ID:KxIpLRHtわずか一日で目標変更…。
昨日の続きをやるとなれば、また数週間経過しそうでそれでいいのだろうかという不安が急に出てきた。
透視変換についても>108の頃の自分よりは理解してるつもりなので、とりあえずプログラムに戻り、それでダメならまた別の方法を考えよう。
0133SGGK ◆6pZCoAtaxk
2010/12/21(火) 22:35:38ID:Uo1lQ495できなければ出来たところまでをUpするつもり。
仕事じゃないんだし…、もう少し調べてみても無駄にはならないはず…。
趣味なんだからあまり無駄とか気にしないようにしよう!
今日は>>119氏のアドバイスのテストプログラムの動きの問題について考えてた。
>>120でプログラムが動いていたのは間違いないけど、画面左上に表示される
マウスでポイントした点が画面中のポリゴンと交差したところの点座標や他の情報を
表示している画面の文字がどんどん重なっていき見えなくなる問題が出ていた。
自分のプログラムでは、ClsDrawScreen と ScreenFlip() の間にゲームの中身の処理を
書いてループするようにしなければならないんだけど、テストプログラム用に無駄な箇所を消したり、注釈化していたときに
間違えてClsDrawScreenの行を //ClsDrawScreen のように注釈行化してしまっていたのが原因だとわかる。
気付くのに3日以上かかった(汗;)
ちなみにDXライブラリではClsDrawScreenは今でも使えるけれど、
公式のリファレンスからは削除されていて、代わりにClearDrawScreen()になっているという事をその時知った。
0134SGGK ◆6pZCoAtaxk
2010/12/30(木) 01:05:04ID:8R77hh/I>>131のカメラ座標への変換がなんとなくやっと理解出来たような感じ。
次は透視変換に挑戦。
ライブラリが無ければ自分は何も出来ないんだから座標変換勉強しても時間の無駄じゃないのか?
…という迷いはあるけど、あともう少しなのでこのまま進めてみるつもり…orz
0135SGGK ◆6pZCoAtaxk
2010/12/30(木) 16:53:47ID:4FkYuEBu間違いや内容不足はあるかもしれないけど、>>129の11月15日頃からの作業がやっと終了…。
1ページ目は結局使わなかった図。
2ページ目以降の8枚が勉強メモ。
ttp://ux.getuploader.com/sggk/
に
オブジェクト座標系からスクリーン座標系まで勉強.zip
という名前でUP。
0136名前は開発中のものです。
2011/01/01(土) 02:34:44ID:iSY3aMmJそもそも何をしたいのか読み取れなかったけれども、
最初の赤枠の大前提については、ボールの位置はワールド座標系で管理して、
必要に応じて選手目線の相対座標(オブジェクト座標)を求める方が簡単じゃないかな。
0137SGGK ◆6pZCoAtaxk
2011/01/01(土) 22:31:50ID:85GGaF9K自分はDXライブラリが無ければ何もプログラムできないので、
プログラムに直接影響しない事を調べてもあまり意味が無いのではないかと思う一方で
座標変換には3D入門の基本のような印象を持っていたので、
もし出来るならちょっと調べてみたいと思ったのが原因で1か月以上経過してしまいました…。
赤枠については今見ると自分もそう思います。
ボールに一番近い選手を知りたいなら選手の座標とボールの座標を
フィールド基準の座標系(ワールド座標系)で表して単純に距離計算した方がよさそうです。
次にやろうとしていることは、選手のデータ作り。
ビルボードの関数で選手を表示するので、メタセコイアで板(面?)のモデルを作り
テクスチャ?を貼りつける作業。2次元のデータのときには選手のアニメパターンを1枚の画像にしていたけど、
今度はそれを切り出して面のモデルに張り付けた3Dデータを何枚か用意する必要があるので、
メタセコイアの使い方を思いだしているところ。(忘れるのがものすごく早いので我ながらつらいw)
0138SGGK ◆6pZCoAtaxk
2011/01/13(木) 23:49:01ID:XHIcVK/b左歩行に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に場所を移して活動してるらしい事がわかった。
才能ある人はいろいろ出来てうらやましいと思った。
0139SGGK ◆6pZCoAtaxk
2011/01/17(月) 23:51:17ID:Px2vRAS2>とりあえず次にやろうとしているのは、マウスでフィールド上の一点を指定できるようにすること。
については、どうやら出来そうな感じ。
それを表す図やテストプログラムの実行ファイルをUPしようかと思ったけど、
テストプログラムでは、試したいDXライブラリの関数をメインループにそのまま書き込んだだけなので、
今までのクラスを使ったやり方に比べ単純な例で試して上手くいったと自分が思っているだけなのかもしれないので、
今度は、今までの2Dで動かしていたプログラムの中身を少しずつ3Dのライブラリ関数に置き換えて
動作を確認していき、これでうまくいくようならUPする予定。
フィールド上の一点を指定する方法については、
>>116氏の7行目の投影変換行列の逆行列を使う方法では、
自分の力不足のため投影変換行列を作れないので断念。
座標変換、結構勉強してみたつもりだけど、さすがに投影変換行列を作るのは無理だった。
ライブラリを作れる人はすごいと思った。
>>119氏のConvScreenPosToWorldPosのサンプル内を使う案については、可能であることを>>120で確認済。
>>124氏の案についても昨日テストプログラムで試した結果、可能であることがわかった。
これでやっと>>65に取り掛かる直前の状況になってきた感じ。(感謝!)
もしうっかりスルーしてしまった項目があった場合、指摘あれば対応します。
0140SGGK ◆6pZCoAtaxk
2011/01/18(火) 23:06:54ID: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;
}
0141SGGK ◆6pZCoAtaxk
2011/01/19(水) 23:11:10ID:VXY/IGc8Zキーを押したら選手のx座標を少しずつ増やしていく処理を追加してみた。
コンパイルして実行してみたら選手の絵がx方向に動いた。
3Dのビルボードの命令で描画した選手でもいままでの2D命令でやったとき同様に動く事が確認できた。
これで多少は安心してソースの書き直しに着手できる…と思う。
0142名前は開発中のものです。
2011/01/20(木) 00:55:56ID:yl8ufdN1Vector3 a;
VECTOR b = a.ToVECTOR();
って書けるようにする
普段はVector3を使って、必要に応じてVECTORを吐き出すというイメージ
VECTORからVector3への変換はしない、という仕様にした方が多分デバッグは楽になると思う
0143SGGK ◆6pZCoAtaxk
2011/01/20(木) 23:35:43ID:hnrlJRek確かに変数の型はどちらかに統一しておいた方が良さそうなので注意します。
変数はVector3に統一し、DXライブラリの関数の引数と出力の型がVECTORだった場合には、
引数に関しては、Vector3型をVECTOR型に変換した値を入力して、
VECTOR型出力に関しては、そのつど出力のx,y,z値をVector3型変数に入力すれば、>>140で言った
VECTOR型変数をVector3型に変換する関数は使わなくて済むので、これでやってみます。
今日のプログラム修正は、データのロード部分のみ。少しずつ進めていく予定。
■ このスレッドは過去ログ倉庫に格納されています