【初心者歓迎】スレを立てる前にココで質問を【Part9】
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2005/09/24(土) 09:36:08ID:qEhFu+JAスレッドを立てる前にはローカルルールを読みましょう。
http://pc8.2ch.net/gamedev/
※ >>980 を踏んだ人は次スレ立てをお願いします。
その他は>>2-10ぐらい
0180名前は開発中のものです。
2005/10/17(月) 08:36:43ID:6CLb/yQL「アーマードコア」
0181名前は開発中のものです。
2005/10/17(月) 10:19:02ID:tzORz5B+DSBUFFERDESCとかで余計な機能を捨てろ。
とりあえずVOLUMEだけとかにしとけ。
3DAlgorithmとかも切っとけ
それでも駄目なら多分WaveFormatのほう
Oggファイルから正確にデータを取得しているかチェック
0182名前は開発中のものです。
2005/10/17(月) 10:42:20ID:yaIZeSW0DirectSound の 3D 能力を利用するアプリケーションでは、モノラル音源を提供しなければならない。DSBCAPS_CTRL3D フラグを指定してバッファを作成する場合、WAV フォーマットに複数のチャンネルが含まれていると、エラーになる。
0183名前は開発中のものです。
2005/10/17(月) 13:37:40ID:ZU2S9++1動的ポリゴンの設定方法がわかりません。
テクスチャ2枚使わなきゃアニメーションは出来ないですか??
誰か教えてください!
0184名前は開発中のものです。
2005/10/17(月) 14:46:00ID:mC5XUtcLUVを切り替えて動かすことは可能。
UVを直接いじってもいいし、UVだけトランスフォームさせてもいいし、
頂点シェーダでパラメータを送って切り替えてもいい。
0185名前は開発中のものです。
2005/10/17(月) 15:15:10ID:rlSi7aS00186名前は開発中のものです。
2005/10/17(月) 15:16:58ID:ZU2S9++1いろいろやってみてるんですが
「動的ポリゴン設定」とか、「アニメーション設定」の
方法がわかりません…。フレームを設定しても
表情が切り替わるときに顔の部分だけポリゴンごと
消えちゃったりしてます。
どういう手順で設定すれば良いんでしょうか?
0187名前は開発中のものです。
2005/10/17(月) 15:50:52ID:2Em1yKmNそんなあなたに
つ[テンプレ嫁]
0188名前は開発中のものです。
2005/10/17(月) 16:06:46ID:mC5XUtcLまずはSDKのチュートリアルを終わらせる。
読むだけでなく実際に入力して動かすこと。
0189名前は開発中のものです。
2005/10/17(月) 16:10:37ID:tzORz5B+0190名前は開発中のものです。
2005/10/17(月) 17:20:33ID:CED678cwここはお前の日記帳じゃ(ry
0191名前は開発中のものです。
2005/10/17(月) 22:56:31ID:FZPqpXpc1回目は、テクスチャAのある領域を描画
2回目は、テクスチャAの別の領域を描画
3回目は、テクスチャAの更に別の領域を描画
4回目は、テクスチャAの更に更に別の領域を描画
5回目(ry
という考え方だからね。
がんばって実装するべし。
0192名前は開発中のものです。
2005/10/18(火) 06:23:16ID:XTJtQDfeマウスありならFPS形式がメジャーじゃないかな
ポインタの近くの敵を軽く自動ロック
似たようなこと少数でまったり語ってるんで良かったら
http://game10.2ch.net/test/read.cgi/gsaloon/1125751048/
0193名前は開発中のものです。
2005/10/18(火) 19:55:57ID:eCrwHiysゲーム製作についての質問です
ゲームは始まったら当然スグゲーム開始ではなく
タイトル画面があったり設定画面があったりしますよね
これらはどうやって実装したらいいのでしょうか?
一応自分で思いついたのは以下の方法です
ゲームループ内で
switch(game_status)
case START_INIT:
start.Init();
case START_FRAME:
start.update();
start.draw();
break;
case GAME_INIT:
game.Init();
case GAME_FRAME:
game.update();
game.draw();
break;
といった感じです
何かもっとスマートな方法はありますでしょうか?
0194名前は開発中のものです。
2005/10/18(火) 20:03:22ID:I/crJUgrいいんじゃない?
自分でそれだけ考えられたのなら素晴らしいと思うよ。
ちなみにそういうのは仮想関数を使うと綺麗にいく
0195名前は開発中のものです。
2005/10/18(火) 20:04:23ID:5qotF0T30196名前は開発中のものです。
2005/10/18(火) 20:14:50ID:I/crJUgrclass Mode
{
public:
virtual void ExeOneFrame() = 0;
};
class GameMode : public Mode
{
int m_status;
public:
virtual void ExeOneFrame();
};
そのswitch文は丸ごとg_mode->ExeOneFrame();とゆー感じに置き換えてしまって、
GameMode::ExeOneFrame()でm_statusの内容に応じてswitchする、という感じ
グローバルなgame_statusに各モードの推移状態を持たせるとだんだんややこしくなるので
各ローカルクラスでコードが完結するように心がけるとスッキリする。
TitleModeなりConfigModeなり適当に必要なモードを作ってg_modeを差し替えてモード変更。
デザパタで言うところのファサードとかストラテジーとかいうあたりになるのかな
0197名前は開発中のものです。
2005/10/18(火) 20:41:23ID:eCrwHiys仮想関数は前に勉強しただけで実際に組み込んだコトないので
もういちど勉強しなおして>>196さんのを参考に組み込んでみようと思います
0198196
2005/10/18(火) 20:46:42ID:XL7lfMnp0199名前は開発中のものです。
2005/10/18(火) 21:13:27ID:3ahWTE6v0200名前は開発中のものです。
2005/10/18(火) 21:24:37ID:/jccHSsI先に書いとくか、、。
1.Modeクラスに前処理、後処理用のメソッド追加(OnEnter,OnExet)
2.シーン管理クラス作って置いて、シーンの変更がある度に先ほど作ったメソッドをコール
管理クラスに1つ前のシーン名を記憶させとくと便利だと思うよ。
(切り替え等の為に名前で管理する)
0201名前は開発中のものです。
2005/10/19(水) 02:50:48ID:SNni5lY5今3Dモデルを使った2Dシューティングを作ってるんだけど、
自機の行動範囲を制限するために、スクリーン座標を取得したいんだ。
float hsw = (float)vp.Width/2, hsh = (float)vp.Height/2; // vpはビューポート
matScreen = _D3DXMATRIXA16(
hsw, 0, 0, 0,
0, -hsh, 0, 0,
0, 0, 1, 0,
hsw, hsh, 0, 1);
matWorld = matWorld * matView * matProj * matScreen;
という風にやってるんだけど、なんかぜんぜん違う値が出てしまう……。(X座標が50000とか)
スクリーン座標を取得するときの変換行列はこれで合ってる?
0202名前は開発中のものです。
2005/10/19(水) 03:58:01ID:/rxeAJ9Nコルーチンやマイクロスレッドを使う
0203名前は開発中のものです。
2005/10/19(水) 04:29:23ID:LGVIiHwb>これで合ってる?
その説明じゃ普通分からねーよ。matProjの説明が要るだろ。つまり
vector(0,0,0,1) * matWorld * matView * matProj = 謎(x,y,z,w)
この謎ベクトルに何が入ってるのか分かんなきゃ
謎(x,y,z,w) * matScreen の結果が何なのか分からん。
0204名前は開発中のものです。
2005/10/19(水) 04:32:40ID:XFexkAHV行列自体は合ってるかと。
自機の行動範囲ってスクリーン座標からワールド座標に変換するんだよね?
それだと、それの逆行列を使うんだけど、それは大丈夫?
0205名前は開発中のものです。
2005/10/19(水) 04:34:52ID:XFexkAHV射影変換行列であろうことくらい察してやろうよw
0206名前は開発中のものです。
2005/10/19(水) 04:46:47ID:Pmf5eBjN>>193ではないのですが全く同じことをしているのでちょっと質問させて下さい。
Win32APIプログラミングで>>196の様な用途のクラスを使う場合
クラスのインスタンスはどこで作成するのが一般的なのでしょう?
グローバル領域ですか?
それとも値を保持したい変数をstaticにしてウィンドウプロシージャの中で作成ですか?
C++始めたばかりでまだクラスの扱い方がよくわからず変な事言っちゃってるかもしれませんorz
0207名前は開発中のものです。
2005/10/19(水) 04:51:41ID:LGVIiHwb指摘していることくらい察しろよ。
DirectXの場合D3DXで作った射影変換行列なら
matScreenの役割はDirectXのビューポートに相当するものと
想像できる。matScreenが合ってるかどうかを手っ取り早く調べるには
processVerticesの計算結果と比較すればよいだろ。多分結果は違うと思う。
0208201
2005/10/19(水) 05:07:48ID:SNni5lY5しかし、さっきマニュアル見ててD3DXVec3Project()関数の存在を知りました。
今は時間的に厳しい状況なのでとりあえずは、こっちで実装しときます。返答ありがとうございました。
>>207
後で見てみます。
0209名前は開発中のものです。
2005/10/19(水) 05:29:29ID:8WPqoQfN射影変換行列とかビューポートの計算式が載ってたぞ。
そのまんま使ったらちゃんと固定機能パイプラインの計算結果と一致した。
以上報告終わり。
0210名前は開発中のものです。
2005/10/19(水) 07:18:53ID:ct4u9Uqh参考にさせていただいてるのですが
ちょっとわからないコトがあります
>そのswitch文は丸ごとg_mode->ExeOneFrame();とゆー感じに置き換えてしまって、
>GameMode::ExeOneFrame()でm_statusの内容に応じてswitchする、という感じ
例えばタイトル・コンフィング・ゲームの3つのモードを作りたい場合
Mode → GameMode → TitleMode
|
→ConfigMode
といったように派生するというコトでしょうか?
g_modeを差し替える方法がよくわからないので
ヒントだけでもいただけると助かります
0211名前は開発中のものです。
2005/10/19(水) 08:23:27ID:ejWxLDlZプライマリバッファのフラグの設定に3Dやボリュームなどの設定をしていなければ
セカンダリで3Dとかボリュームとかを指定してなければできませんか?3D・ボリューム
・周波数をOGGで再現するのは無理ですかね?
0212名前は開発中のものです。
2005/10/19(水) 09:10:33ID:EVTiPZ6N俺の>>200は無視かよw
>g_modeを差し替える方法がよくわからないので
シーン管理クラスに現在のシーンや1つ前のシーン等をメンバ変数で持たせればいいだけ。
(当然型はMode*。ポリモフィズムは理解してんでしょ?)
0213名前は開発中のものです。
2005/10/19(水) 09:18:02ID:EVTiPZ6N切り替えはシーン名がお勧め。
擬似コード
シーン管理クラス.シーン切り替え( シーン名 );
{
Mode* pMode = this.シーン検索( シーン名 );
現在のシーンメンバ.onExit();
現在のシーンメンバ = pMode;
現在のシーンメンバ.onEnter();
}
ゲームループ内
{
シーン管理クラス.exec();
}
細かいエラー処理とか省略。
ヒントというより殆ど答え。
0214206
2005/10/19(水) 11:50:17ID:Pmf5eBjNごめんね、父さんWinアプリでC++使うの初めてだからよくわからなくて。
変な質問してごめんね。
0215名前は開発中のものです。
2005/10/19(水) 12:08:24ID:GQpweQF8こういうのは人によるからレスも付けづらいんじゃないかな。俺も他の人の知りたいわぁ。
例えばグローバルに置くのが嫌ならば、エントリーやプロシージャ周りを
軽くラップしたメインクラスクラスを書いてみたらどうだろう。
メッセージディスパッチだのは考えず、もうstaticメンバ関数ばかりで良いから。
で、Modeのオブジェクトはそれに持たせると。
なんかのフレームワーク使う方が話は早いけどね。ゲームだと無駄かもだし。
0216206
2005/10/19(水) 12:31:21ID:Pmf5eBjNレスありがとうございました!
0217210
2005/10/19(水) 15:16:03ID:ct4u9Uqhいえ、決して無視したわけではありませんです
ポリモフィズムは一応基礎の基礎だけはわかってるつもりです
>>196,>>200(>>213)など、個々で見るとなんとなくわかるのですけど(答え同然ですし)
それらを組み合わせての書き方がイマイチ理解できないのです
シーン管理クラスの中にGameModeクラス・TitleModeクラス・ConfigModeクラスメンバを
作ればいいのでしょうか?
class Scene {
private:
GameMode gMode;
TitleMode tMode;
ConfigMode cMode;
public:
HRESULT SceneChange(?);
Mode* SceneSeach(?); // シーン検索関数もよくわからないです…
HRESULT exec();
};
…勉強しなおしてもう少し考えてみます
0218名前は開発中のものです。
2005/10/19(水) 16:21:11ID:6yGqL59Wポリモフィズムについて、オブジェクト指向の解説書なんぞを
立ち読みでもいいから読んできてみ。
0219名前は開発中のものです。
2005/10/19(水) 17:16:24ID:XFexkAHVclass Mode
class GameMode
class TitleMode
class ConfigMode
とゆー感じで考えてたつもり。
要は各モードの実装は各モードで自由に書ける、っつーことで。
>シーン管理クラスの中にGameModeクラス・TitleModeクラス・ConfigModeクラスメンバを
>作ればいいのでしょうか?
Scene "has" GameModeの関係になっていて、Sceneクラスが各モードを包括している。
ってことから考えれば、自然にそうなる。
慣れてくると、考え方とコードが一致してくるから、面白いよ。
オブジェクト指向の解説書を適当に探して読んでみ。だんだん設計が楽しくなるかもよw
0220名前は開発中のものです。
2005/10/19(水) 17:17:45ID:XFexkAHVそれはOggの問題ではないでしょ?
OggデータをWaveデータに変換できることがわかってるんだから、
もう問題はDirectSoundの問題だけに絞れてるんだから。
0221210
2005/10/19(水) 17:37:47ID:ct4u9Uqh>>196でGameModeのm_statusの使い方がよくわからず
(TitleMode,ConfigModeからはm_statusがいじれないから)
class Mode
class GameMode
class TitleMode
class ConfigMode
かと思ってました
なんか色々激しく勘違いしてたり知識が足り無すぎるので
ちょいと本屋に逝って来ます( ゚∀゚)ノ゛
0222210
2005/10/19(水) 19:26:07ID:ct4u9Uqh面積だけは関東一に近いとかなんとか言うクセに…
0223名前は開発中のものです。
2005/10/19(水) 19:30:59ID:Pmf5eBjN0224名前は開発中のものです。
2005/10/19(水) 19:33:48ID:XFexkAHV専門書が多そうなとことか
秋葉いくとか。
Amazonもいいかもしらんが中身を読めないからな
0225名前は開発中のものです。
2005/10/19(水) 19:36:03ID:wXmaUH0S>>223
技術書は断然ネットで買った方がいいから。
0226名前は開発中のものです。
2005/10/19(水) 19:47:24ID:Pmf5eBjN書評が良くても自分が調べたいことが載ってるかどうかは別問題だし。
まあ、書籍についてはスレ違いですね。すみません。
0227210
2005/10/19(水) 20:37:01ID:ct4u9Uqh>>213のシーン検索とシーン名なんですが
シーン名を列挙型にしてswitchで検索してポインタ返すくらいしか思いつきません
本当に何度もすいませんがもう少しヒントを頂けないでしょうか?
0228212
2005/10/20(木) 00:23:41ID:0AN5ZXFyシーン名(Modeのメンバ変数)は文字列でよくない?
そう頻繁に切り替えるものでもないし、必要とあらば高速化する手段もあるから。
汎用性という面では文字列はダンチでしょう(XMLの中身も文字列だし)
switch文そのものを使わないのが目的。(理由は何れわかる)
シーン管理クラスの検索機能とは、登録された全てのシーンを総ナメして文字列比較を行い、
一致したシーンを返す事。(まんま答えw)
要するに、まず登録が必要という事。当然、削除やらなんやらも追加していく事になる。(必要になる)
各シーンオブジェクトは(Mode*の)コレクションとして保持する。
ポインタ配列なり、STL::vectorなり、ポインタのポインタなり、わかるもので実装すればよろし。
後々、ファクトリとかに対応すれば、ConfigModeの宣言等はアプリ実装のcppだけ知ってればよくなる。
(ヘッダファイルの循環参照とかで悩まなくなるし、簡潔になる)
0229212
2005/10/20(木) 00:30:58ID:0AN5ZXFyこんな感じ
class SceneManager {
private:
Mode* pCurrentMode;
vector<Mode*> pModeList; これか、
Mode* pModeList[最大数]; こう。
public:
HRESULT Change( const char* sceneName );
Mode* Seach(const char* sceneName ); // シーン検索関数もよくわからないです…
HRESULT Exec();
};
シーン切り替えは、リクエストだけしといて、
一定のタイミングで切り替えるべきだけど後でいいか。
、、シーンかモードか統一しないと気持ち悪いなw
0230名前は開発中のものです。
2005/10/20(木) 00:39:53ID:MGUMfsBq0231& ◆PgquWinh8I
2005/10/20(木) 01:00:29ID:NdIiF/23Processing 1.0 (BETA) - Processing (Beta) with Eclipse
http://processing.org/discourse/yabb_beta/YaBB.cgi?board=Integrate;action=display;num=1117133941
を参考にEclipseから利用することには成功したのですが、アプレットを書き出す良い方法が見つかりません。
AntやABAさんのP5Docletも利用してみましたが、上手くいきませんでした(どちらもAlpha時代のモノのようで)。
Alphaバージョンへ逆行するのか、
Eclipseからの利用を諦めてpdeファイルを直接弄るのか、
それとも何か別に良い方法があるのか…どなたかご存じの方がいらしたら、教えてください。
よろしくお願いします。
(Processingって簡単さがウリの一つっぽいのに、エディタのセットアップから躓くなんて…これがBetaクオリティーか)
0232212
2005/10/20(木) 02:16:41ID:0AN5ZXFyその辺はお任せしますw
Modeクラスにキーを持たせるのは、STLの説明を分ける為と、
デバッグ時にちょっと判り易い(SceneGameStageクラス内をステップ実行。名前は"GameStage_001"とか)というだけの話です。
0233210
2005/10/20(木) 06:53:17ID:4YyIpufE何度もありがとうございます!
脳内ではほぼ理解できたと思います
これから仕事なのでスグには書けないのですが
帰ったらスグに組み込んでみます
0234名前は開発中のものです。
2005/10/20(木) 09:08:29ID:k4jPaPySリリースビルドすればという助言を受けそのようにやってみましたが
うまくいきませんでした。(リリースでビルドする方法はコンパイラ起動時の
オプションに「-v-」を指定するであってると思います)
開発環境では「d3d8xd.dll」が同一フォルダになくてもきちんと動いたのですが、
他のパソコンで起動しようとすると「d3d8xd.dll」を要求されます。
(「d3d8d.dll」は必要ないようです)
これだけ間が空いた理由は、「今までのプログラムに新機能つけてコンパイルする
ときにやってみればいいや」と思っていたからです。
まさか、バグ取りに10日もかかるとは……
0235名前は開発中のものです。
2005/10/20(木) 09:44:11ID:QgJ3c6Thコントロールパネルの DirectX。
Direct3D タブの Debug/Retail D3D Runtime。
変更後再起動が必要だったような気がする。
0236名前は開発中のものです。
2005/10/20(木) 10:06:17ID:NVBSpIBS0237210
2005/10/20(木) 18:06:14ID:4YyIpufEシーンはタイトル・ゲームの2つのみになってます
class SceneManager
{
public:
SceneManager();
~SceneManager();
public:
HRESULT Exec();
HRESULT Change(const char* sceneName); // シーンの切り替え
Scene* Search(const char* sceneName); // 指定されたシーン名のポインタを返す
private:
Scene*p_CurrentScene;
std::vector<Scene*>p_SceneList;
};
// コンストラクタ
SceneManager::SceneManager()
{
// vectorに格納
Scene* p;
p = new TitleScene("TitleScene"); // タイトルシーン
p_SceneList.push_back(p);
p = new GameScene("GameScene"); // ゲームシーン
p_SceneList.push_back(p);
}
0238210
2005/10/20(木) 18:07:21ID:4YyIpufE{
std::vector<Scene*>::iterator v;
for(v = p_SceneList.begin(); v != p_SceneList.end(); ++v)
{
if(!strcmp((*v)->sceneName, sceneName))
return *v;
}
ERROR_EXIT();
}
Searchでみつからなかった時の戻り値がないので警告はでます
その辺はどうにか…します
0239名前は開発中のものです。
2005/10/20(木) 19:12:58ID:H4ZUft/fScene* Search( const char* ) は public にする必要あるかな?
private で目的は達成できると思う。例えばこんな感じに。
class SceneManager {
public:
HRESULT Exec();
HRESULT Change( const char* sceneName ){ p_CurrentScene = Search( sceneName ); }
private:
Scene* Search( const char* sceneName );
};
あと、クラスにシーンの追加メソッドを加えた方が、
シーンが増える度にクラスの実装コードを修正する必要がなくなるから、多少保守しやすいと思う。
多分、212 は下のような使い方をする前提で、説明してたんじゃないかな。
// 初期化
SceneManager sceneMgr;
sceneMgr.Add( new TitleScene ); // シーンを加える
sceneMgr.Add( new ConfigScene );
// シーンの追加コードが続く ...
sceneMgr.Change( "TitleScene" ); // 最初のシーンを指定
// メインループ
while( 1 ){
if( !sceneMgr.Exec() ) // シーンの実行
break;
}
何か勘違いしていたら、ごめんね。
0240あきまさ
2005/10/20(木) 19:37:00ID:NdIiF/23Betaバージョンを諦め、Alphaバージョンを利用することによって解決しました。
その場合についても躓くところが沢山あったので、需要は無いかと思いますが、
日記は私たちに微笑みかける死体 - 今頃?な感じのするProcessing(Alpha) with Eclipseの導入メモ
http://d.hatena.ne.jp/hogeratta/20051020
に纏めておきました。
0241210
2005/10/20(木) 19:52:45ID:4YyIpufE>privateで目的は達成できると思う。
なるほど!確かにそうですね
追加メソッドも追加いたします
ありがとうございました〜
0242名前は開発中のものです。
2005/10/21(金) 00:40:23ID:hmjF6JD/さて、開発環境では動き、もう一台のパソコンで動かない理由がおそらくですが
分かりました。
開発環境では「c:\WINDOWS\system」に件の「d3d8xd.dll」が存在しますが、
もう一台のパソコンのほうではDirectX関係のファイルが「c:\WINDOWS\system32」
にあるにもかかわらず、当該ファイルは存在しないためだと思われます。
さらに、そのパソコンにはコンパネに「DirectX」という項目がありませんでした。
もうどうしたらいいのか分かりません。
というか、どうしようもないので、開発が完了するまでにこの無料で構築した
開発環境を捨てて、まともな開発環境を金出して買えば解決するのでは
などと考えています。
0243名前は開発中のものです。
2005/10/21(金) 00:52:43ID:Pl5M2s/F>コンパネに「DirectX」
SDKをインストールしたときだけでエンドユーザーランタイムだとないと思う。
>(リリースでビルドする方法はコンパイラ起動時の
>オプションに「-v-」を指定するであってると思います)
漏れBCC使ったことないんだけどさ、グーグルの検索結果を見る限り
つけない場合がリリースビルドじゃね?
0244名前は開発中のものです。
2005/10/21(金) 01:31:57ID:9ulD7PqZいや、その通りです。
シーンの追加、マネージャの初期化等は、XXXGameAppクラスの初期化等でやれば良いので、
TitleSceneクラスの宣言等は、XXXGameAppクラスにだけ追加すれば良いと。
シーンの変更リクエストはXXXGameAppクラスのExec()内か、各シーンのExec()内でやると。
シーン管理、Modeクラス等はゲームエンジンに属するものだから、派生クラスとは明確に分ける事を勧めます。
一通りの機能を追加しとけば、色んなゲームで流用出来るし、コード修正もしなくて済みます。
0245名前は開発中のものです。
2005/10/21(金) 11:28:51ID:cIVqISTUリンクするライブラリを d3dx8d.lib → d3dx8.lib にする。
0246210
2005/10/21(金) 13:16:41ID:ABtOh/Cc皆様のお陰でゲームループは満足の行く状態に出来ました
またひとつ質問なのですが
D3Dオブジェクト類(?)はどういった管理をすれば効率が良いでしょうか
現在はRendererクラスの中で
class Renderer
{
public:
Renderer();// コンストラクタ
~Renderer();// デストラクタ
public:
HRESULT Initialize(HWND hWnd, BOOL isFullScreen, int clientWidth, int clientHeight);
LPDIRECT3DDEVICE9 GetDevice();
void Finalize();
private:
LPDIRECT3D9m_pD3D;// IDirect3D9インターフェイスへのポインタ
LPDIRECT3DDEVICE9m_pD3DDevice;// IDirect3DDevice9インターフェイスへのポインタ
D3DPRESENT_PARAMETERSm_D3DPP;// デバイスのプレゼンテーションパラメータ
};
となっていて宣言はメインループ前です
Renderer render;
render.Initialize(....);
// シーン管理クラス初期化
// メインループ
0247210
2005/10/21(金) 13:18:04ID:ABtOh/Cc描画で必ずIDirect3DDevice9ポインタが必要になります
現在の状況だとIDirect3DDevice9ポインタをグローバル変数にしてどのcppファイルからも弄れるようにするか
シーン管理クラス.Exec()の引数として渡してまたその中の各シーンのExec()の引数に…しかありません
前者だとコーディングは物凄く楽だと思いますが安全性?に問題がありそうで、
後者は同じ引数を引っ張っていくのは見辛そうです。
Rendererクラスオブジェクトをシーン管理クラスのメンバにする、
またはIDirect3DDevice9などをシーン管理クラスメンバにしてしまいD3D初期化自体をシーン管理クラスで行う
などが考え付いたのですが(それでも渡すのが一段階減っただけなような…)
他はどのような方法があるのでしょうか?
0248名前は開発中のものです。
2005/10/21(金) 17:33:03ID:yEVH493I0249名前は開発中のものです。
2005/10/21(金) 17:42:53ID:SkWwQYRTその代わり、レンダリングステート等はその都度再チェック再セットという制約
0250210
2005/10/21(金) 20:43:21ID:ABtOh/Ccシングルトンとはなんぞや?って感じだったので
調べてみたところ今回の質問にピターリでした
ついでにデザパタの必要度がわかりました…orz 勉強します
0251名前は開発中のものです。
2005/10/21(金) 21:38:16ID:yEVH493I感覚的には、普通にプログラム組んでたらあのデザパタになってた、ってとこかも。
0252名前は開発中のものです。
2005/10/21(金) 22:01:00ID:0BRyU5+00253名前は開発中のものです。
2005/10/21(金) 22:33:56ID:5xzEEHTf入力できるスペースでカーソル合わせて文字を受け付けるようなのがありますが
文字の変換とかのところってどうやってプログラムでやるんですか?
あとそれに応じた描画なんですがDirectXで再現すると動的なテクスチャの
書き込みで解決するもんですかね?
0254名前は開発中のものです。
2005/10/21(金) 23:15:42ID:sDAuO1Jqこれじゃ駄目?
http://pc8.2ch.net/test/read.cgi/gamedev/1111084681/
0255名前は開発中のものです。
2005/10/21(金) 23:20:55ID:cIVqISTUTextBox とかが簡単なんじゃないの。
0256名前は開発中のものです。
2005/10/21(金) 23:32:20ID:yEVH493IあれはWM_IME_なんたら系メッセージをフックして
変換ウィンドウを自力で書く。
詳しくはsdkのcommonフォルダに入ってるguiサンプルを見てみ
かなりめんどくさい。
0257名前は開発中のものです。
2005/10/21(金) 23:40:26ID:0BRyU5+0そこで十分ですね。
ありがとうございます。
0258名前は開発中のものです。
2005/10/22(土) 00:45:17ID:gkJoVPjmつ http://gamdev.org/w/?%5B%5BProjects%5D%5D
0259名前は開発中のものです。
2005/10/22(土) 03:09:21ID:IIu4nIrL普通にIME制御からゴリゴリと書くだけ。
変換とかの処理はIMEがやってくれるので、描画を全部自分でやる。
一応、X8以外ならエディットコントロールをそのまま使う方法もあるが。
0260名前は開発中のものです。
2005/10/22(土) 11:17:03ID:ly1tBT68シーン管理のケースでもシングルトンやファクトリ使えば、
似たような実装でキャラ管理、キャラステータス管理が出来るようになるよ。
0261名前は開発中のものです。
2005/10/22(土) 12:57:03ID:FPxhi0mR実際に生成したクラスから、実際に描画する下位のクラスまで、
複数のクラスで包れてる時、どう渡していったらよいのか悩んでいます。
・グローバル変数で持つ。
・毎回引数で渡していく。
・包まれてるクラス内部でコピーを持つ。
思いついたのはこの三つなのですが、定番みたいなものってありますか?
0262名前は開発中のものです。
2005/10/22(土) 19:04:20ID:Vm2aXygr敵キャラのように同じものがいくつも生成される場合
テクスチャなどは使い回しですが
そこでそれはどのように管理したらよろしいのでしょうか?
class Cube {
public:
static LPDIRECT3DVERTEXBUFFER9 m_pVB[6];
private:
// 座標とかその他各インスタンスによって違うもの類
};
vector<Cube*> cube; // 管理はベクトルで
と、自分ではstaticクラスメンバを使う方法が思いつきました
ゲーム開始前の初期化処理でm_pVB[6]を初期化するわけですが
それだとCube::m_pVB[6]となり正直見づらい?気がします
何か綺麗な方法とかってありますか?
0263名前は開発中のものです。
2005/10/22(土) 19:10:23ID:uSckOX9o>>262
何か共有データを持つリソース管理クラスでも作ればいいっしょ。
そいつをシングルトンにしてしまう。
class ResourceManager
{
private:
map<string,IDirect3DTexture9*> m_textures;
public:
IDirect3DTexture9* GetTexture( string& str );
};
例えばの話だけれど。
テクスチャみたいに何度も参照するような奴はID制にしてもいいし、その辺はお好みで。
上手く作れば、必要なときにだけ必要なテクスチャをロードできるようなクラスも作れるよ。
0264名前は開発中のものです。
2005/10/22(土) 19:14:05ID:Vm2aXygrシングルトンについてはあまり詳しくないのですが
色々試して見たいと思います
>最近色んなスレで同じような内容を見かけるのだが
すいません。他のスレもみて回ってきます
0265名前は開発中のものです。
2005/10/22(土) 19:57:41ID:z7DLcwehテクスチャ管理クラスだって種類別に分けることも考えられるし
どちらかというとFlyweightを調べれ。
0266名前は開発中のものです。
2005/10/22(土) 21:47:32ID:Vm2aXygrどのようにゲームに使えばいいのかわかりません…orz
現在作ろうとしてるのは
LPDIRECT3DVERTEXVUFFER9 m_pVB[6]: // 立方体
LPDIRECT3DTEXTURE9 m_pTex; // テクスチャ
くらいしか共有するものがありませんが
実際ゲームに組み込むにはどのようにやればいいか
ヒントだけでもお願いできないでしょうか?
共有しないものは今は座標くらいです
0267名前は開発中のものです。
2005/10/23(日) 04:51:57ID:ndzheBND適当に答えるけど、LPDIRECT3DVERTEXVUFFER9って共有化出来るの?
ちょっと疑問。
あるCube?のUV変更したら他のCubeのUVも変わると思うけど?
これって3D?2D?
俺の2Dゲーの実装だと、プリミティブグループというクラスに1つテクスチャ持たせてる。
で、任意の数だけグループがある。(テクスチャ数やレイヤー分けに依存)
で、グループ内には頂点バッファが任意のキャラ数X6頂点分ある。と。(3角形2個で1スプライト)
描画はグループ(頂点バッファ)毎に1度。
テクスチャ切り替えはグループ描画前に。(直前と同じものならスルー。手抜き実装w)
ややこしいと思うので、素直にD3DXのスプライト使えば良いと思うけど。
0268265
2005/10/23(日) 05:11:22ID:465Fxa31俺は別に >>263 を否定しているわけではないので。
class Cube : public Model{
private:
LPDIRECT3DVERTEXBUFFER9 m_pVB[6];
LPDIRECT3DTEXTURE9 m_pTex;
std::string m_strName;
};
class ModelManager{
private:
map<string,Model*> m_Models;
public:
Model* GetModel( string& str );
};
0269262
2005/10/23(日) 11:29:43ID:grZLuuOc>LPDIRECT3DVERTEXVUFFER9って共有化出来るの?
今のところCubeの大きさや色を変えるつもりはなかったので
UV座標は座標などと一緒に各インスタンスに持たせて描画前にm_pVB[]->LockでUV変更するつもりでした
(今思うと毎回Lockってどうなんだろう…)
>>268
>>263氏を参考に作ってましたが
Flyweightなるものを知って試してみようと…
まだまだ知識不足なので頂いたアドバイスは片っ端から調べたいので。
説明には細かいオブジェクト(ゲームなどでは敵・爆発などに)に向くあり、
ちょうどイイのかなと思いました
>class Cube : public Model
Cubeが継承してるModelはDrawなどの純粋仮想変数を持つ抽象クラスでしょうか
それで他の敵にも継承するようなイメージですか?
Model
Cube
Ball
Triangle
0270名前は開発中のものです。
2005/10/23(日) 11:49:27ID:2eSW8adf0271名前は開発中のものです。
2005/10/23(日) 11:59:49ID:I0F4r0w2・・・懐かしいなぁ
0272名前は開発中のものです。
2005/10/23(日) 13:17:08ID:VVGhVNv4アンケートはやめれ
0273名前は開発中のものです。
2005/10/23(日) 13:19:23ID:0pIQSLBL>>243さん
ヘルプを読んで「-v」オプションでリリースビルド、「-v-」オプションで
デバッグビルドと解釈しましたが……
>>245さん
やってみましたが、d3dx8bor.dllを要求されました。
0274名前は開発中のものです。
2005/10/23(日) 14:22:44ID:grZLuuOc連レスすいません
そのやり方は全ての描画パターン?をmapに格納という捕らえ方でいいですか?
例えば同じ形で模様だけが違うキューブの場合
// 水模様のキューブ
LPDIRECT3DVERTEXBUFFER9 m_pVB[6];
LPDIRECT3DTEXTURE9 m_pTex = tex.tga;
std::string m_strName = "WaterCube";
// 空模様のキューブ
LPDIRECT3DVERTEXBUFFER9 m_pVB[6]; // uvだけが違う
LPDIRECT3DTEXTURE9 m_pTex = tex.tga;// 上と同じ
std::string m_strName = "SkyCube";
座標などは
class Item
{
D3DXVECTOR3 position;
// 拡大縮小・回転とか
}
std::vector<Item*> ItemList;
で管理して描画の時に
Model* mod = GetMode("WaterCube");
mod->Draw();
な風でよろしいでしょうか?
0275名前は開発中のものです。
2005/10/23(日) 14:26:53ID:grZLuuOcclass Item{
D3DXVECTOR3 position;
std::string m_type = "WaterCube";
// その他の情報
}
Model* mod = GetModel(m_type);
0276名前は開発中のものです。
2005/10/23(日) 14:43:21ID:465Fxa31大体そんな感じでいいんじゃない。
細かいところは好みが分かれるだろうから
自分なりに色々試すといいんじゃないかな。
0277262
2005/10/23(日) 19:59:05ID:grZLuuOc素直にコンストラクタまたは初期化関数の引数に
12個D3DXVECTOR2を指定するしかないでしょうか?
0278名前は開発中のものです。
2005/10/23(日) 20:05:40ID:kQywssPE形状から計算できるなら計算すればいい。
Cubeなら可能じゃない?
0279262
2005/10/23(日) 20:08:28ID:grZLuuOc対角線上の2座標から求める方法くらいしか…orzそれだと12個必要で…
■ このスレッドは過去ログ倉庫に格納されています