現在作っているフレームワークが見せられる形にはなっているんじゃないかな・・・と思い、ソースを公開します。
試したい方はプロジェクトを作って添付ファイルの中身をresourceフォルダを除いて、
プロジェクトに追加、実行してください。
プロジェクトのプロパティの文字セットのところはUnicodeからマルチバイトに変えないと動きません・・・。
resourceフォルダはexeかプロジェクトのあるフォルダとおなじ階層においてください。
アプリ内でできることは、スペースキーで2つの画面を遷移するだけです。
大事なのはソースなので・・・。
次に追加しようと思っているのが、
デバッグ用のコンソールクラス(コンソール作成、削除とコンソールへの文字出力)
ロード画面のシーン(サブスレッドを起動し、サブスレッドでロード処理を行う)
です。
他にも必要なものはたくさんありますが、これは必要かなと思ったので。
今回はゲームにおいて必要な「流れ」を作りました。
他にも、ゲームの基盤を作る上でこういう機能はあったほうがいいとか、今回のソースでここはこうした方がいいなどのアドバイス
をいただけるとうれしいです。
まさかですが、万が一これを使おうという方は、自由に使ってもいいですが、一応声だけかけてください。
卵の観察日記
[内定が 決まって 浮かれている 卵 だ。]
[内定が 決まって 浮かれている 卵 だ。]
ソース公開 ver0.1
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
Re: ソース公開 ver0.1
あとでじっくり見せてもらおうと思いますが、ソースコードの何処までがフレームワークか分かりづらいので教えてください。
Re: ソース公開 ver0.1
読みやすく、機能毎にちゃんと分けて作っていてエラー処理もきちんと書いているので素晴らしい出来だと思います。
ただインスタンスの参照を直接操作している点が気になります。
ポインタなどは見えないようにしてあげるのが理想的かなと思います。
今回の場合ですとDraw2DObj関数でLPDIRECT3DTEXTURE9を渡している点が気になりました。
ただインスタンスの参照を直接操作している点が気になります。
ポインタなどは見えないようにしてあげるのが理想的かなと思います。
今回の場合ですとDraw2DObj関数でLPDIRECT3DTEXTURE9を渡している点が気になりました。
RE: ソース公開 ver0.1
返信が遅れてしまい申し訳ありません。
>ソフト屋さん
本当に基盤だけを作って、それプラス「これはこう使う」的な例を数行追加しただけになるので・・・ほぼ全部になると思います。
>せんちゃさん
>ソフト屋さん
フレームワークの定義が自分のなかで曖昧なので、正確な答えになっているかわからないのですが・・・ソースコードの何処までがフレームワークか分かりづらいので教えてください。
本当に基盤だけを作って、それプラス「これはこう使う」的な例を数行追加しただけになるので・・・ほぼ全部になると思います。
>せんちゃさん
本当ですか!他人にレビューしてもらったのは初めてで不安だったのですが、安心しました。読みやすく、機能毎にちゃんと分けて作っていてエラー処理もきちんと書いているので素晴らしい出来だと思います。
なるほど・・・。LPDIRECT3DTEXTURE9ではなく、CTexture2Dのポインタを渡してやったほうが良いということなのでしょうか。ポインタなどは見えないようにしてあげるのが理想的かなと思います。
今回の場合ですとDraw2DObj関数でLPDIRECT3DTEXTURE9を渡している点が気になりました。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
Re: ソース公開 ver0.1
一般的なフレームワークを説明しますね。
ライブラリは関数群を提供するものですよね。※ DXLIBの様に。
フレームワークは、ライブラリを更に進展させて、動作構造自体を規定するものです。
一例としてあげるとフレームワークからInit()、Update()、Draw()を行うクラスを提供するのでそこは自由に書いてください。
ただし、WinMainやら呼び出し元はフレームワークなのでさわらないでください。
音楽や画像の管理をサポートするクラスも提供しますので、それを継承して自由に使ってください
って感じでしょうか。
そういう視点で見ると、何処までがフレームワークなのか利用者が自由に書いて良い部分なのかよく分からなかったのです。
ライブラリは関数群を提供するものですよね。※ DXLIBの様に。
フレームワークは、ライブラリを更に進展させて、動作構造自体を規定するものです。
一例としてあげるとフレームワークからInit()、Update()、Draw()を行うクラスを提供するのでそこは自由に書いてください。
ただし、WinMainやら呼び出し元はフレームワークなのでさわらないでください。
音楽や画像の管理をサポートするクラスも提供しますので、それを継承して自由に使ってください
って感じでしょうか。
そういう視点で見ると、何処までがフレームワークなのか利用者が自由に書いて良い部分なのかよく分からなかったのです。
RE: ソース公開 ver0.1
できればポインタ自体渡さないつくりにしたほうがいいかなと思います。atori さんが書きました: LPDIRECT3DTEXTURE9ではなく、CTexture2Dのポインタを渡してやったほうが良いということなのでしょうか。
LPDIRECT3DTEXTURE9自体プログラマーが直接触るべきではない、意識するべきではないインスタンスなので
こういったものは一か所にプールを作って何番目のインスタンスを利用しているのか、という番号さえわかればインスタンスの「情報」が
手に入るという仕組みにすると一か所に処理の手続きをまとめられるためメンテもしやすいかなと思います。
// ---------------------------------------------
// 公開関数
// ---------------------------------------------
int LoadTexture( LPSTR fileName ){ // ユーザーはdevice自体渡さなくても扱える作りにできると望ましいです
int id = -1;
for( int i = 0 ; i = 256 ) return false;
if( !m_Handle[id].texture2D ) return false;
m_Handle[id].texture2D->Release();
m_Handle[id].texture2D = NULL;
}
その手続きを行うのに必要な番号を切ってあげるのです。
というような実装をすることでアプリ実装時にインスタンスの情報を知る必要性がなくなります。
上記の実装は結構いい加減に書きましたが肝なのはプログラムを書くにあたってアプリ層がいかにプラットフォームの提供しているAPIや
ライブラリの機能を理解していなくても実装ができるのか、という点です。
実はフレームワークというのは基本概念として「下の機能を見せない、意識しなくても実装できる」仕組みのことなので
インスタンスを直接利用しないというのはとても大事な部分なのです。
最後に編集したユーザー せんちゃ on 2013年7月04日(木) 00:02 [ 編集 1 回目 ]
RE: ソース公開 ver0.1
>ソフト屋さん
つまり、そのいじってほしくない部分がフレームワークということですね。
これを使う人がいじることになるのは、各シーンクラスになります。
新しいシーンが欲しければSceneBaseを継承して使ってもらいます。
そのシーンクラス一つがゲーム中の画面一つに該当するのですが、
画面内で必要なオブジェクトやテクスチャなどを、クラスとして、そのシーンクラスにプロパティで追加していくという形になります。
で、実際にテクスチャなどの読み込みをシーンクラスのコンストラクタで行う・・・という感じです。
添付ファイルで言うと、SceneTitleとSceneGameMainの2つをSceneBaseを継承して定義し、
それぞれにObj2DBaseとTexture2Dのクラスを包含しています。
今はコンストラクタで直接正射影変換をしていますが、これから射影変換用のクラスを作っていこうと思っています。
レンダーステートに関してはこのままユーザに設定していただくという感じで。
で、いじって欲しくない部分は、SceneGameMainとSceneTitle以外になると思います。
最後に、添付ファイルを見なおしていて気づいたのですが、DxManagerクラスはもう使っていません。
かつての無駄処理です。 ですので、無視してみてください。
長文失礼しました。
つまり、そのいじってほしくない部分がフレームワークということですね。
これを使う人がいじることになるのは、各シーンクラスになります。
新しいシーンが欲しければSceneBaseを継承して使ってもらいます。
そのシーンクラス一つがゲーム中の画面一つに該当するのですが、
画面内で必要なオブジェクトやテクスチャなどを、クラスとして、そのシーンクラスにプロパティで追加していくという形になります。
で、実際にテクスチャなどの読み込みをシーンクラスのコンストラクタで行う・・・という感じです。
添付ファイルで言うと、SceneTitleとSceneGameMainの2つをSceneBaseを継承して定義し、
それぞれにObj2DBaseとTexture2Dのクラスを包含しています。
class CSceneTitle:public CSceneBase
{
private:
CDXGraphicsRenderar* m_pDxRenderar;
CDirectInput* m_pDInput;
// ここでメッシュやら定義
CObj2DBase m_bg;
CTexture2D m_bgTex;
public:
CSceneTitle(CDXGraphicsRenderar* dxRenderar, CDirectInput* dInput);
~CSceneTitle(void);
CSceneBase* Run(void);
void Render(void);
};
CSceneTitle::CSceneTitle(CDXGraphicsRenderar* dxRenderar, CDirectInput* dInput)
{
m_pDxRenderar = dxRenderar;
m_pDInput = dInput;
// ここで射影変換、レンダーステートの設定
// 正射影
D3DXMATRIX projMat;
D3DXMatrixIdentity(&projMat);
D3DXMatrixOrthoLH(&projMat, 640, -480, 0.1f, 2.0f);
m_pDxRenderar->GetD3DDev()->SetTransform( D3DTS_PROJECTION, &projMat );
D3DXMATRIX viewMat;
D3DXVECTOR3 vEye(0.0f, 0.0f, -1.0f);
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
D3DXMatrixIdentity(&viewMat);
D3DXMatrixLookAtLH(&viewMat, &vEye, &vAt, &vUp);
m_pDxRenderar->GetD3DDev()->SetTransform( D3DTS_VIEW, &viewMat );
m_pDxRenderar->GetD3DDev()->SetRenderState( D3DRS_LIGHTING, FALSE );
// リソースのロード、オブジェクトの表示など初期化
m_bg.SetSize(640, 480);
m_bgTex.LoadTexture(m_pDxRenderar->GetD3DDev(), "resource/titleBG.jpg");
}
レンダーステートに関してはこのままユーザに設定していただくという感じで。
で、いじって欲しくない部分は、SceneGameMainとSceneTitle以外になると思います。
最後に、添付ファイルを見なおしていて気づいたのですが、DxManagerクラスはもう使っていません。
かつての無駄処理です。 ですので、無視してみてください。
長文失礼しました。
最後に編集したユーザー atori on 2013年7月04日(木) 00:08 [ 編集 1 回目 ]
RE: ソース公開 ver0.1
>せんちゃさん
プールを作る・・・確かに、そちらの方が扱いやすく、見た目がかなりスッキリしますね。
そのような方法は考えたこともありませんでした。
そうなると、3D関連の描画や、メッシュ関連なども考え直す必要がありそうです。
サンプルを参考にもう一度作りなおしてみます。
ありがとうございました。
プールを作る・・・確かに、そちらの方が扱いやすく、見た目がかなりスッキリしますね。
そのような方法は考えたこともありませんでした。
そうなると、3D関連の描画や、メッシュ関連なども考え直す必要がありそうです。
サンプルを参考にもう一度作りなおしてみます。
ありがとうございました。