プログラム」カテゴリーアーカイブ

クラスの再利用性だか独立だか。

クラスの再利用性をあげるためには、他のクラスと密結合しないほうがいいはず。他クラスのメソッドをアクセスしたりしていると、二つのクラスは仲良しになって、片方のクラスだけそのまま再利用できなくなる。

解としては、クラスをインターフェースと実装に分けて、インターフェースにだけアクセスするようにすれば、実装同士はお互いを知らずに生きていけることとなる。

でも、実クラスと、アクセスしているインターフェースは仲良しになるわけで、ここは分離できていない。結局抱き合わせになるのだろうと思う。

と、言うわけで小さなプログラムなんかであれば、あんまりクラスの結合の粗密を考えずに書いちゃっていいのかな、という辺りで踏ん切りつかなくなっています。

軽視しすぎるとぐちゃぐちゃになるのもわかってるのですが、あまり厳密に労力をかけたくないなーとか。

以上ぐだぐだと。

デザインパターン

デザインパターンの本読んでいるとちゅうなのですが、AbstractFactory と Builderの違いがわからないです。目的とかちゃんと違うようなのですが、動作的なメリットがまだ理解できていない。

ついでに言うと、BuilderもTemplateMethodを適用しただけに見えるので、理解がたりないのだろう・・・。

オブジェクト共有

クラス間でオブジェクト共有が出来たら便利だろうなと、考えていました。

IDを渡すとオブジェクトのポインタを返してくれる、オブジェクト管理者みたいなクラスを作っておけば出来そうかな?いろいろな型のオブジェクトが返るだろうから、

void* getObject(OBJID);

見たいな関数があればいいのかな?と思っていたのですが、void*がなんだか危険なような気がしていました。

結局のところ、void*であると、ポインタを預かっておく分にはいいですが解体時には、デストラクタが呼ばれないようですので、よろしく無いようです。オブジェクトを知っている作成者が解体も実施する必要がありますが、オブジェクト管理者がすべてのオブジェクトの仕様を知っていて生成解体するというのも、変ですよね・・・

オブジェクト共有の仕組みと、オブジェクト(クラス)の独立性を両立するにはどんな設計だといいのかなぁ・・・

DXUT

前回の日記で、DirectX+GUIを満足できる環境を探していたのですが、DXUTというフレームワークをいじってみることにしました。

これは、DirectXのサンプルに入っているフレームワークでソース付きです。めんどくさいウィンドウ作成から、DirectXの初期化、その他イベントをコールバックで隠蔽してくれています。

とりあえず、ツール作成には使えそうな感じです。求めていたGUIデザインツールはなく、コードでボタンやリストを配置するのですが、そんなにややこしくないのでとりあえず使えそうです。

XNAがわからない

C#でDirectXを使いたいあーと思って探していると、ManagedDirectXと、XNAという二つのものを見つけました。ManagedDirectXって言うのが、普通のDirectXのC#版(正確にはManagedコード版)で、XNAっていうのはDirectXを使った、ゲーム作るフレームワークのようです。

ManagedDirectXってのは、開発が終わってしまったもののようなので、XNAを調べていたのですが、ゲームフレームワークと言うだけあって、C++&DirectXとは、だいぶ感覚が違います。

とりあえず、プロジェクトに入れないXファイルの読みかたとかわかりません。う~ん。

DirectXを使った通常のGUIつきのツールを作りたいのだけど、C++&DirectX&どこかのリソースエディタの方がいいのかな?

模索中です。

クラスの作り方

C++でのお話です。
クラス設計をしていると、どこまで他クラスにインターフェースを公開するか迷います。のちのちの入り組んだスパゲッティコード化を恐れるのであれば、最小限の公開がいいのでしょうけど、それは他クラスから出来ることが少なくなると言うことだし。

かといって、いろいろなことが出来るようにすると、他クラスにもそれらについて知っていてもらわないといけなくなる。

例えば、描画インターフェースクラスを設計するとして、
初期化、矩形描画、位の簡易版と、
特殊効果、描画先切り替え、等機能をいろいろ盛り込んだ詳細?版と
どっちが良いのか、って決める方法は無いですよね・・・

考えていてもコードはかけないので、思うまま書くのですが・・・
それが失敗の原因?

ID3DXSpriteとID3DXMesh

ID3DXMeshを使って、とりあえずメッシュを描画しようとしてみた。
が、ちっとも表示されない。エラーが帰ってきてるわけではないので、
見える範囲外に描画されているのでは?と思った。

ID3DXSpriteも同時につかっていたのだが、
この描画の前には、ID3DXSprite->Begin();を呼ぶ必要があるそうだ。
これを呼んだ時点で、カメラの設定などが書き換わっているようだ。
じっさい、ID3DXSprite->Begin()のあとに、カメラを設定したところ、
メッシュは表示された(スプライトは表示されなかった。)

二つを同居させるのは難しそうなので、スプライトは
トランスフォーム済み頂点で描画するようにしてみようと思う。

テクスチャサイズ

ID3DXSpriteで描画していたが、うまくサイズが合いませんでした。
描画結果も妙に伸びてるし。

原因はテクスチャサイズ。
たてよこともに2のべき乗サイズでないといけないのに
640×480を読み込ませていたので、かってにリサイズされていました。
基本なのに、忘れてしまっていた。メモメモ。

GUID

DirectXを使ってプログラムするときは、GUIDの定義をちゃんとしましょう。
うっかり忘れると、
IID_IDirectInput8は未解決です
などと、リンカエラーに悩まされます。

プログラムの最初で
#define INITGUID

dxguid.lib
をリンクしましょう。