卵の観察日記
[内定が 決まって 浮かれている 卵 だ。]

ソース公開 ver0.1

atori
記事: 43
登録日時: 13年前

ソース公開 ver0.1

投稿記事 by atori » 12年前

現在作っているフレームワークが見せられる形にはなっているんじゃないかな・・・と思い、ソースを公開します。
試したい方はプロジェクトを作って添付ファイルの中身をresourceフォルダを除いて、
プロジェクトに追加、実行してください。

プロジェクトのプロパティの文字セットのところはUnicodeからマルチバイトに変えないと動きません・・・。
resourceフォルダはexeかプロジェクトのあるフォルダとおなじ階層においてください。

アプリ内でできることは、スペースキーで2つの画面を遷移するだけです。
大事なのはソースなので・・・。


次に追加しようと思っているのが、
デバッグ用のコンソールクラス(コンソール作成、削除とコンソールへの文字出力)
ロード画面のシーン(サブスレッドを起動し、サブスレッドでロード処理を行う)
です。

他にも必要なものはたくさんありますが、これは必要かなと思ったので。


今回はゲームにおいて必要な「流れ」を作りました。
他にも、ゲームの基盤を作る上でこういう機能はあったほうがいいとか、今回のソースでここはこうした方がいいなどのアドバイス
をいただけるとうれしいです。

まさかですが、万が一これを使おうという方は、自由に使ってもいいですが、一応声だけかけてください。
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前

Re: ソース公開 ver0.1

投稿記事 by softya(ソフト屋) » 12年前

あとでじっくり見せてもらおうと思いますが、ソースコードの何処までがフレームワークか分かりづらいので教えてください。

アバター
せんちゃ
記事: 50
登録日時: 15年前

Re: ソース公開 ver0.1

投稿記事 by せんちゃ » 12年前

読みやすく、機能毎にちゃんと分けて作っていてエラー処理もきちんと書いているので素晴らしい出来だと思います。
ただインスタンスの参照を直接操作している点が気になります。
ポインタなどは見えないようにしてあげるのが理想的かなと思います。
今回の場合ですとDraw2DObj関数でLPDIRECT3DTEXTURE9を渡している点が気になりました。

atori
記事: 43
登録日時: 13年前

RE: ソース公開 ver0.1

投稿記事 by atori » 12年前

返信が遅れてしまい申し訳ありません。

>ソフト屋さん
ソースコードの何処までがフレームワークか分かりづらいので教えてください。
フレームワークの定義が自分のなかで曖昧なので、正確な答えになっているかわからないのですが・・・
本当に基盤だけを作って、それプラス「これはこう使う」的な例を数行追加しただけになるので・・・ほぼ全部になると思います。


>せんちゃさん
読みやすく、機能毎にちゃんと分けて作っていてエラー処理もきちんと書いているので素晴らしい出来だと思います。
本当ですか!他人にレビューしてもらったのは初めてで不安だったのですが、安心しました。
ポインタなどは見えないようにしてあげるのが理想的かなと思います。
今回の場合ですとDraw2DObj関数でLPDIRECT3DTEXTURE9を渡している点が気になりました。
なるほど・・・。LPDIRECT3DTEXTURE9ではなく、CTexture2Dのポインタを渡してやったほうが良いということなのでしょうか。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前

Re: ソース公開 ver0.1

投稿記事 by softya(ソフト屋) » 12年前

一般的なフレームワークを説明しますね。
ライブラリは関数群を提供するものですよね。※ DXLIBの様に。
フレームワークは、ライブラリを更に進展させて、動作構造自体を規定するものです。

一例としてあげるとフレームワークからInit()、Update()、Draw()を行うクラスを提供するのでそこは自由に書いてください。
ただし、WinMainやら呼び出し元はフレームワークなのでさわらないでください。
音楽や画像の管理をサポートするクラスも提供しますので、それを継承して自由に使ってください
って感じでしょうか。

そういう視点で見ると、何処までがフレームワークなのか利用者が自由に書いて良い部分なのかよく分からなかったのです。

アバター
せんちゃ
記事: 50
登録日時: 15年前

RE: ソース公開 ver0.1

投稿記事 by せんちゃ » 12年前

atori さんが書きました: LPDIRECT3DTEXTURE9ではなく、CTexture2Dのポインタを渡してやったほうが良いということなのでしょうか。
できればポインタ自体渡さないつくりにしたほうがいいかなと思います。
LPDIRECT3DTEXTURE9自体プログラマーが直接触るべきではない、意識するべきではないインスタンスなので
こういったものは一か所にプールを作って何番目のインスタンスを利用しているのか、という番号さえわかればインスタンスの「情報」が
手に入るという仕組みにすると一か所に処理の手続きをまとめられるためメンテもしやすいかなと思います。

CODE:

//	---------------------------------------------
//	公開関数
//	---------------------------------------------
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 回目 ]

atori
記事: 43
登録日時: 13年前

RE: ソース公開 ver0.1

投稿記事 by atori » 12年前

>ソフト屋さん

つまり、そのいじってほしくない部分がフレームワークということですね。
これを使う人がいじることになるのは、各シーンクラスになります。
新しいシーンが欲しければSceneBaseを継承して使ってもらいます。

そのシーンクラス一つがゲーム中の画面一つに該当するのですが、
画面内で必要なオブジェクトやテクスチャなどを、クラスとして、そのシーンクラスにプロパティで追加していくという形になります。

で、実際にテクスチャなどの読み込みをシーンクラスのコンストラクタで行う・・・という感じです。

添付ファイルで言うと、SceneTitleとSceneGameMainの2つをSceneBaseを継承して定義し、
それぞれにObj2DBaseとTexture2Dのクラスを包含しています。

CODE:

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);
};

CODE:

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 回目 ]

atori
記事: 43
登録日時: 13年前

RE: ソース公開 ver0.1

投稿記事 by atori » 12年前

>せんちゃさん

プールを作る・・・確かに、そちらの方が扱いやすく、見た目がかなりスッキリしますね。
そのような方法は考えたこともありませんでした。

そうなると、3D関連の描画や、メッシュ関連なども考え直す必要がありそうです。
サンプルを参考にもう一度作りなおしてみます。

ありがとうございました。