インターフェイスを引数に持つ関数

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bonbo

インターフェイスを引数に持つ関数

#1

投稿記事 by bonbo » 13年前

お世話になっています。早速ですが質問させていただきます。
インターフェイスを含むコードを関数にしようとしたのですが
うまく動いてくれません。

これを

コード:

ID3DXSprite*g_pSprite;//グローバル

HRESULT CreateSplite(LPCTSTR lpszFilename)
{
	HRESULT hr = S_FALSE;
	UINT uLevel = 0;
	IDirect3DSurface9* pSurface = NULL;

	// スプライト情報の生成
	if (SUCCEEDED(hr))
		hr = ::D3DXCreateSprite(g_pd3dDevice, &spr);//g_pSpriteが含まれる
	if (SUCCEEDED(hr))
		hr = ::D3DXCreateTextureFromFile(g_pd3dDevice, lpszFilename, &g_pTexture);
	if (SUCCEEDED(hr))
		hr = g_pTexture->GetSurfaceLevel(uLevel, &pSurface);

	// サーフェイス取得
	if (SUCCEEDED(hr))
		hr = pSurface->GetDesc(&g_sSurfaceInfo);
	if (pSurface != NULL)
		pSurface->Release();
	pSurface = NULL;

	// 失敗したら破棄
	if (FAILED(hr))
		DestroySplite(g_pSprite);

	return hr;
}
↓こうしたい

コード:

ID3DXSprite*g_pSprite;//グローバル

HRESULT CreateSplite(LPCTSTR lpszFilename,ID3DXSprite* spr)
{
	HRESULT hr = S_FALSE;
	UINT uLevel = 0;
	IDirect3DSurface9* pSurface = NULL;

	// スプライト情報の生成
	if (SUCCEEDED(hr))
		hr = ::D3DXCreateSprite(g_pd3dDevice, &spr);//g_pSpriteが含まれる
	if (SUCCEEDED(hr))
		hr = ::D3DXCreateTextureFromFile(g_pd3dDevice, lpszFilename, &g_pTexture);
	if (SUCCEEDED(hr))
		hr = g_pTexture->GetSurfaceLevel(uLevel, &pSurface);

	// サーフェイス取得
	if (SUCCEEDED(hr))
		hr = pSurface->GetDesc(&g_sSurfaceInfo);
	if (pSurface != NULL)
		pSurface->Release();
	pSurface = NULL;

	// 失敗したら破棄
	if (FAILED(hr))
		DestroySplite(spr);

	return hr;
}
一応::D3DXCreateSpriteからはS_OKが帰ってきてるので成功はしてるはずなのですが、
ここを関数にした途端、そのあとにある

コード:

spr->Begin(D3DXSPRITE_ALPHABLEND);//スプライトの描画開始合図です、ID3DXSprite* sprです
でエラーが表示されます。おそらく正しく参照できてないのだと思うのですが、
どこを直せばよいでしょうか。
よろしくお願いします。

ソースコードです。88行目にCreateSprite関数があります
http://www1.axfc.net/uploader/so/2682100

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: インターフェイスを引数に持つ関数

#2

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

変数の参照になっていませんね。
C++の参照を使ってはどうでしょうか?
あるいはC言語ならダブルポインタにする必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

bonbo

Re: インターフェイスを引数に持つ関数

#3

投稿記事 by bonbo » 13年前

>soft屋さん
ありがとうございます、できました
>C++の参照を使ってはどうでしょうか?
なるほど…インターフェイスにも使えるんですね…
初歩的な質問ですみませんでした…

以下修正したもの

コード:

ID3DXSprite*g_pSprite;//グローバル
 
HRESULT CreateSplite(LPCTSTR lpszFilename,ID3DXSprite* &spr)                              /*ここを修正しました*/
{
    HRESULT hr = S_FALSE;
    UINT uLevel = 0;
    IDirect3DSurface9* pSurface = NULL;
 
    // スプライト情報の生成
    if (SUCCEEDED(hr))
        hr = ::D3DXCreateSprite(g_pd3dDevice, &spr);//g_pSpriteが含まれる
    if (SUCCEEDED(hr))
        hr = ::D3DXCreateTextureFromFile(g_pd3dDevice, lpszFilename, &g_pTexture);
    if (SUCCEEDED(hr))
        hr = g_pTexture->GetSurfaceLevel(uLevel, &pSurface);
 
    // サーフェイス取得
    if (SUCCEEDED(hr))
        hr = pSurface->GetDesc(&g_sSurfaceInfo);
    if (pSurface != NULL)
        pSurface->Release();
    pSurface = NULL;
 
    // 失敗したら破棄
    if (FAILED(hr))
        DestroySplite(spr);
 
    return hr;
}
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る