神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。
新着記事
• 2020.04.01 (告知)
「GES」ってなんですか?
• 2016.08.15 (雑記)
テーブルトークRPGのお話
• 2016.07.16 (C++実用)
usingのススメ
• 2016.06.19 (雑記)
1年生セミナー作品公開!
• 2016.06.17 (雑記)
第三回一年生対象セミナー開催のお知らせ!
• 2016.06.13 (雑記)
第一回、第二回一年生対象セミナーの様子
• 2016.06.03 (告知)
第二回一年生対象セミナー開催のお知らせ!
• 2016.05.27 (告知)
一年生対象セミナー開催のお知らせ!
• 2016.05.20 (告知)
ゲーム開発部の説明会を開きました!
• 2016.05.01 (雑記)
2016年度GESメンバー自己紹介 その他のメンバー
• 2016.04.30 (雑記)
2016年度GESメンバー自己紹介 5人目
• 2016.04.29 (雑記)
2016年度GESメンバー自己紹介 4人目
• 2016.04.28 (雑記)
2016年度GESメンバー自己紹介 3人目
• 2016.04.27 (雑記)
2016年度GESメンバー自己紹介 2人目
• 2016.04.26 (雑記)
2016年度GESメンバー自己紹介 1人目
カテゴリー
はじめに (1)
告知 (106)
雑記 (565)
就職活動 (39)
お役立ち【一般】 (47)
お役立ち【技術】 (32)
C++基礎 (26)
C++実用 (27)
DirectX (6)
VisualStudio (20)
WindowsAPI (12)
デザイン (7)
ゲーム制作 (54)
おすすめ参考書 (10)
2D技術 (3)
3D技術 (4)
おすすめゲーム (9)
Android (2)
アーカイブ
2020年04月(1)
2016年08月(1)
2016年07月(1)
2016年06月(4)
2016年05月(3)
2016年04月(5)
2015年10月(1)
2015年09月(4)
2015年08月(4)
2015年07月(5)
2015年06月(11)
2015年05月(11)
2015年04月(4)
2015年02月(2)
2015年01月(9)
2014年12月(12)
2014年11月(4)
2014年10月(6)
2014年09月(5)
2014年08月(29)
2014年07月(17)
2014年06月(6)
2014年05月(16)
2014年04月(19)
2014年03月(32)
2014年02月(32)
2013年11月(2)
2013年10月(3)
2013年09月(2)
2013年07月(1)
2013年06月(1)
2013年05月(2)
2013年02月(4)
2013年01月(4)
2012年12月(8)
2012年11月(7)
2012年10月(14)
2012年09月(15)
2012年08月(30)
2012年07月(26)
2012年06月(26)
2012年05月(26)
2012年04月(32)
2012年03月(41)
2012年02月(16)
2012年01月(5)
2011年12月(6)
2011年11月(19)
2011年10月(13)
2011年09月(20)
コメント
• 2016.01.29 / from:人面犬さん
「GES」ってなんですか?
• 2015.10.01 / from:8chさん
VisualStudioを少しでも使いこなそう~ビルドの構成編~ その1
• 2015.09.12 / from:uncleさん
void*を使ってみる
• 2015.09.10 / from:某卒業生さん
void*を使ってみる
• 2015.06.07 / from:uncleさん
autoで可読性の向上を 2年3年向け
リンク
管理画面
新しい記事を書く
GESブログ
神ゲーブログ
神戸電子
神戸電子作品一覧
学生作品動画一覧
GESホムペ
Team ヤーウェイ!
菖蒲涼一郎のゲーム企画塾
HOME
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
2024/11/25 (Mon)
▲TOP
インターフェイス講座
ども、こんばんわ~
目を閉じれば楽園が見えてるZAKIです
発表会はすごい作品が多かったですね~
とってもよく作りこんであったり、アイデアが面白かったりすごいチームばかりでした
僕もがんばってやらなければっ
さて、今回のテーマは
「インターフェイス講座」
です
C++言語のクラスについての話になるので2年生対象ですね
みなさんはインターフェイスって使ってますか?
これを使ってやると沢山のコードを使いまわせたりするんですよ
[0回]
さて、C++言語でもinterfaceって書けばインターフェイスが定義できるの知ってましたか?
i
nterface
ITest {
public
:
virtual
GetValue() = 0;
virtual
SetValue() = 0;
};
こんな感じでメソッドを全て純粋仮想関数にしてやれば定義できますよ
それでは、これを使うとどう、コードを使いまわせるのか。
とりあえず、例を見ながら説明しましょう
今回は
XFileを読み込んだクラスのインスタンスを保存して、必要なときに取り出して使う、リソースマネージャー的なもの
を作るとします。
XFileの読み込みをする場合、
スキンメッシュ
と
スタティックメッシュ(普通のメッシュ)
の大きく2パターンがありますね。
この二つをクラスにするとして、共通する処理は
読み込み
描画
開放
の3つがありますね。
なので、これをインターフェイスで定義します。
//ロード時のデータ構造体
typedef struct
_tag_XFILE_LOADDATA {
LPDIRECT3DDEVICE9 pd3dDevice;
//デバイス
string
szFileName;
//ファイル名
}XFILE_LOADDATA;
//Interface定義
interface
IXFile {
public
:
//読み込み
virtual
HRESULT LoadFile(XFILE_LOADDATA *pLoadData) = 0;
//描画
virtual
HRESULT Render(LPDIRECT3DDEVICE9 pd3dDevice) = 0;
//開放
virtual
void
Release() = 0;
};
こんな感じですかね
これをスキンメッシュクラスとスタティックメッシュクラスで
実装してメソッドをオーバーライド
します
LoadFile()メソッドの引数が構造体になっているのは、クラスを作っている最中に他にいるデータがあった場合、
引数で一つ一つ指定すると、
継承した先のメソッドも全て変更しなければならないので面倒
です。
その分構造体にしておくと、
構造体のメンバを変更するだけで済むからです
ポインタで渡しているのは、
インターフェイスの実装先で構造体を更に継承して、データを増やせるようにするためです
Render()メソッドの引数はデバイスだけにしているので、構造体にはしていません
今回の場合はRender()メソッドは使いませんが、一応共通するメソッドと言うことで定義しています
シェーダなどを内部に持たせる場合は他に引数がいる可能性もあるので、構造体にしてもいいでしょう
ここまでだとただめんどくさいだけですねw
さて、肝心なのはここからです。
今度はスキンメッシュクラス、スタティックメッシュクラスを読み込んで、保管しておく
リソースマネージャーを作ります。
//XFILEの読み込みタイプを指定
enum
XFILE_TYPE {
XFILE_STATIC,
//スタティックメッシュ
XFILE_SKIN,
//スキンメッシュ
XFILE_TYPE_NUM,
//読み込みタイプ総数
};
//XFileの読み込みデータを保管するクラス
class
CXFileManager {
private
:
typedef
std::map<string,IXFile *> IXFILE_MAP;
private
:
IXFILE_MAP m_mapData;
public
:
//=============================================================
//読み込んだXFileインスタンスを取り出す(読み込んでなければ読み込んで保管する)
//=============================================================
HRESULT GetObject(IXFILE **pXFile,XFILE_LOADDATA *pLoadData,XFILE_LOADTYPE loadType) {
HRESULT hr = S_OK;
//戻り値用引数の中身が無い場合、プログラムをとめる
assert(pXFile != NULL);
//既に読み込んだXFileのインスタンスがあるか検索
IXFILE_MAP::iterator it = this->m_mapData.find(pLoadData->szFileName);
if(it != this->m_mapData.end()) {
//あったら戻り値用引数に入れて返す
*pXFile = it->second;
return S_OK;
}
//戻り値用引数の中身が無い場合、プログラムをとめる
assert(pLoadData != NULL);
//ロードするXFileのタイプが違うなら、とめる
assert(loadType >= XFILE_TYPE_NUM);
//無かったら読み込む
*pXFile = (loadType == XFILE_STATIC) ?
new
CXFile() :
new
CSkinXFile();
hr = pXFile->LoadXFile(pLoadData);
if
(FAILED(hr))
return
hr;
this->m_mapData.insert(pair<string,IXFile *>(pLoadData->szFileName,*pXFile));
return S_OK
;
}
//=============================================================
//保管した全てのリソースを開放する
//=============================================================
void
AllRelease() {
IXFILE_MAP::iterator it = this->m_mapData.begin();
for(;it != this->m_mapData.end();it++) {
it->second->Release();
delete
it->second;
}
}
}
ふう、こんな感じですかね
ちなみに、コンパイルは僕の脳内のみで組んだのでコピペで動くかは不明です
コピペで動いた人は褒美として僕に10円ください
大まかに組んだので、読み込みと全て開放しかつけていません。
GetObject()メソッドで戻り値用引数IXFile **を使っているのは、
マネージャーのほうにインスタンスの本体を持たせておきたいから
です。
マネージャーを使うユーザーはIXFile *のアドレスを渡してやるわけです
なんだかDirectX見たいでかっこよくないですか?
あとはマップコンテナのIXFile *を
参照カウンタつきのスマートポインタにしておけば完璧
ですねw
こうすれば、マネージャーがXFileリソースの読み込み開放を全て管理することが出来るので、
開放忘れの心配がなくなりますね
そして、肝心のリソースの読み込み、開放ではIXFileインターフェイスが大活躍していますね
IXFileインターフェイスのLoadXFile()メソッドは純粋仮想関数なので、newされたクラスのオーバーライド先のメソッドを実行するわけです
そうすると、クラスごとに違う読み込み処理が行えますね
開放では、クラスを意識せずに一気に開放することが出来ますね
もし、判別したいのであればtypeid演算子やインターフェイスにGetID()メソッドなどを付けて、それから判別する方法もありますね~
そして、IXFileインターフェイスを実装しているクラスはCXFileManagerを使うことができるので、
いちいちクラスごとにリソースマネージャーを作ってやる必要がなくなります
これが、先に言っていたコードを使いまわすことができるという理由なのです
更に、マネージャーをテンプレートで実装してやれば、
型の制限を越えたすごい汎用性を持ったマネージャー
が出来上がりますね
インターフェイスは他にも
クラスの設計を隠すことが出来ます
製作チームメンバーからある機能のあるクラスをもらったとき、privateやpublicなメンバやメソッドが沢山あって混乱したりしませんか?
去年僕はそれがわずらわしかったので、インターフェイスとインスタンスを作成、開放する関数のみを渡して、中身はDLLにして隠しました
インターフェイスには読み込み、開放、描画、当たり判定ぐらいの純粋仮想関数が書いてあるだけです。
あとは簡単なリファレンスを用意して、ばっちり
とまぁ、いろいろ使い道が広いですね
ちょっと設計がめんどくさいかもですが、是非とも慣れておいて欲しいです
もっと詳しくやってみたいと思う人は
GoFのデザインパターン
を勉強しておくといいですよ。
オブジェクト指向でよくあるパターンを集めたものです。
オブジェクト指向の基本みたいなものでもあると思うので、オススメです。
「Java言語で学ぶ デザインパターン入門」
と言う本がおすすめです。
Java言語で書かれていますが、とても優しく解説しているので、すごくわかりやすいと思います
さて、結構長々と書いてしまいましたねw
最後まで読んでくれて、ありがとうございました。
それでは、今回はこの辺りで。
あでゅー
ノシ
PR
2007/12/19 (Wed)
C++実用
Comment(1)
▲TOP
<< 麻雀講座 第一回:基礎編
HOME
DLLにしてみようぜっ? >>
COMMENT
NAME
TITLE
MAIL
(非公開)
URL
EMOJI
COMMENT
コメント宜しくお願いします。
PASS
(コメント編集に必須です)
SECRET
管理人のみ閲覧できます
無題
by 新世界の神
2007/12/19(Wed)22:31
Edit
interfaceはC#にもありますね。
これを機会に皆さんには有効活用してもらいたいですね。
コンテナもlistやDICTIONARY( mapのようなもの )コンテナのような便利なものがありますし、他の言語でも有効活用出来そうですね。
ブログ内検索
最新記事
「GES」ってなんですか?
(04/01)
テーブルトークRPGのお話
(08/15)
usingのススメ
(07/16)
1年生セミナー作品公開!
(06/19)
第三回一年生対象セミナー開催のお知らせ!
(06/17)
第一回、第二回一年生対象セミナーの様子
(06/13)
第二回一年生対象セミナー開催のお知らせ!
(06/03)
一年生対象セミナー開催のお知らせ!
(05/27)
ゲーム開発部の説明会を開きました!
(05/20)
2016年度GESメンバー自己紹介 その他のメンバー
(05/01)
2016年度GESメンバー自己紹介 5人目
(04/30)
2016年度GESメンバー自己紹介 4人目
(04/29)
2016年度GESメンバー自己紹介 3人目
(04/28)
2016年度GESメンバー自己紹介 2人目
(04/27)
2016年度GESメンバー自己紹介 1人目
(04/26)
カテゴリー
はじめに ( 1 )
告知 ( 106 )
雑記 ( 565 )
就職活動 ( 39 )
お役立ち【一般】 ( 47 )
お役立ち【技術】 ( 32 )
C++基礎 ( 26 )
C++実用 ( 27 )
DirectX ( 6 )
VisualStudio ( 20 )
WindowsAPI ( 12 )
デザイン ( 7 )
ゲーム制作 ( 54 )
おすすめ参考書 ( 10 )
2D技術 ( 3 )
3D技術 ( 4 )
おすすめゲーム ( 9 )
Android ( 2 )
最新コメント
質問
[01/29 人面犬]
分かりやすい
[10/01 8ch]
No Title
[09/12 uncle]
無題
[09/10 某卒業生]
No Title
[06/07 uncle]
カレンダー
10
2024/11
12
S
M
T
W
T
F
S
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
アーカイブ
2020 年 04 月 ( 1 )
2016 年 08 月 ( 1 )
2016 年 07 月 ( 1 )
2016 年 06 月 ( 4 )
2016 年 05 月 ( 3 )
2016 年 04 月 ( 5 )
2015 年 10 月 ( 1 )
2015 年 09 月 ( 4 )
2015 年 08 月 ( 4 )
2015 年 07 月 ( 5 )
2015 年 06 月 ( 11 )
2015 年 05 月 ( 11 )
2015 年 04 月 ( 4 )
2015 年 02 月 ( 2 )
2015 年 01 月 ( 9 )
2014 年 12 月 ( 12 )
2014 年 11 月 ( 4 )
2014 年 10 月 ( 6 )
2014 年 09 月 ( 5 )
2014 年 08 月 ( 29 )
2014 年 07 月 ( 17 )
2014 年 06 月 ( 6 )
2014 年 05 月 ( 16 )
2014 年 04 月 ( 19 )
2014 年 03 月 ( 32 )
2014 年 02 月 ( 32 )
2013 年 11 月 ( 2 )
2013 年 10 月 ( 3 )
2013 年 09 月 ( 2 )
2013 年 07 月 ( 1 )
2013 年 06 月 ( 1 )
2013 年 05 月 ( 2 )
2013 年 02 月 ( 4 )
2013 年 01 月 ( 4 )
2012 年 12 月 ( 8 )
2012 年 11 月 ( 7 )
2012 年 10 月 ( 14 )
2012 年 09 月 ( 15 )
2012 年 08 月 ( 30 )
2012 年 07 月 ( 26 )
2012 年 06 月 ( 26 )
2012 年 05 月 ( 26 )
2012 年 04 月 ( 32 )
2012 年 03 月 ( 41 )
2012 年 02 月 ( 16 )
2012 年 01 月 ( 5 )
2011 年 12 月 ( 6 )
2011 年 11 月 ( 19 )
2011 年 10 月 ( 13 )
2011 年 09 月 ( 20 )
リンク
管理画面
新しい記事を書く
GESブログ
神ゲーブログ
神戸電子
神戸電子作品一覧
学生作品動画一覧
GESホムペ
Team ヤーウェイ!
菖蒲涼一郎のゲーム企画塾
RSS
RSS 0.91
RSS 1.0
RSS 2.0
カウンター
[PR]
大田区 不動産
テスト
最新トラックバック
Copyright © --
GESブログ
-- All Rights Reserved
Design by
CriCri
/ Photo by
Geralt
/ powered by
NINJA TOOLS
/
忍者ブログ
/ [PR]
COMMENT
無題
これを機会に皆さんには有効活用してもらいたいですね。
コンテナもlistやDICTIONARY( mapのようなもの )コンテナのような便利なものがありますし、他の言語でも有効活用出来そうですね。