上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DxLibのモデル操作はハンドルを使って行うんだけど

int handle = MV1LoadModel("aaa.x");
MV1DrawModel(handle);
MV1DeleteModel(handle);

int型はあかんやろ

handle = 12345;//こんなん出来たらあかんやろ

というわけで

class Handle
{
public:
Handle() : h(-1){} //ハンドルの初期値は-1にする
operator int() const { return h; } //dxlibの関数で使いやすくするため
void Set(int n){h=n;}
int Get(){return h;}
private:
void operator = (const Handle& src);//代入禁止
int h;
};

こんなん作った、Setterで明示的に操作することで
「意図せずにハンドルの値を書き換えていた」ということは無くなる

Handle handle;
handle.Set(MV1LoadModel("aaa.x"));
MV1DrawModel(handle);
MV1DeleteModel(handle);

operator=をprivateにしているので代入しようとするとコンパイルエラーにできる
handle = 12345;//エラー
operator intを実装しているのでhandle.Get()としなくて良い

もう1つ問題点

handle = MV1LoadModel("aaa.x");
handle = MV1LoadModel("aaa.x");
handle = MV1LoadModel("aaa.x");
MV1DeleteModel(handle);

こんな事をするとメモリが爆発するので
適当な関数を作ってハンドルを引数として渡して
ハンドルの値をチェックするようにした

bool Hoge(ss::Handle* pHandle, const char* szPath)
{
//ハンドルがモデルを持っていたら解放を試みる
if(*pHandle == -1)
{
MV1DeleteModel(*pHandle);
}

//読込、ハンドル設定
pHandle->Set(MV1LoadModel(szPath));

//成否
if(*pHandle == -1)
return false;
return true;
}

こんな感じ

Handle handle;
Hoge(&handle, "aaa.x");
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://perillasoft.blog75.fc2.com/tb.php/39-38dabfb1
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。