• ベストアンサー

DirectXのSpriteについて

現在DirectXを使ってプログラムを書いています。 スプライトを使って画像を描画しようと思ったのですが、 LPD3DXSPRITE pSprite;//スプライト LPDIRECT3DTEXTURE9 texture;//適当な画像 pSprite->Begin( 0 ); pSprite->Draw( texture, 0,0,0,0xffffffff ); pSprite->End(); というように使って画像を描画するようですが、これを見ると pSpriteはアプリケーション内に1つ存在すればいいような気がするのですが複数用意する意味はあるのでしょうか? 教えてください。

  • 0xEF
  • お礼率59% (193/327)

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

確かに1つあればよいので、 毎回作成・解放を行う必要性は薄いです。 ただ「複数用意しなければならない」のと、 「複数用意してもよい」は違います。 少なくとも、1つしか用意できないより、 複数用意できる方が可溶性はありますし、 複数あっても使えないというわけではないでしょう。 意味があるか無いかはプログラミングしてみて、 自分が必要か不要かの問題だと思います。

0xEF
質問者

お礼

解答ありがとうございます。 しばらくはアプリケーション内に1つで十分そうなので1つでやっていってみます。 ありがとうございました。

その他の回答 (1)

  • RockmanX
  • ベストアンサー率50% (3/6)
回答No.1

そのとおりです。ひとつあればよいです。 グローバルに一個用意すれば毎回確保しなくて良いです。

0xEF
質問者

お礼

解答ありがとうございます。 やはり1つで大丈夫なのですね。 思っていた通りで安心しました。 しばらくは1つでやってみます。ありがとうございました。

関連するQ&A

  • DIRECTXのスプライト描画で質問です

    いつもお世話になってます。 DIRECTX9.0、VC++6.0を使っています。 DIRECTXでLPDIRECT3DTEXTURE9(テクスチャ)とLPD3DXSPRITE(スプライト)を使って描画しています。 ですが、テクスチャの縦と横のサイズが256*256を超えたものが正常に表示できません。 色々調べてみると、縦と横のピクセル数が2の乗数以外の中途半端なサイズのテクスチャは、キリの良いサイズに変換されるみたいですが、一応縦横共に2の乗数のテクスチャなのにうまく表示できません。 例:768*512ピクセルのTGA形式のファイル 大きな画像ファイルを表示する方法はないでしょうか? どうぞ宜しくお願いします。

  • 描画について

    今DirectXでゲームを作ろうとしてるものですが、描画しようと思い打ったのですが位置が思い通りにならない(描画が範囲を下回っている)描画されなくて困っています。ソースはこれです。 HRESULT Render(void) { g_pD3DDevice->Clear(0, NULL,NULL, D3DCOLOR_XRGB(0, 255, 255), 1.0f, 0); // シーンの描画開始 if (SUCCEEDED(g_pD3DDevice->BeginScene())) { // スプライトの描画開始(アルファ・ブレンディング有効&デバイス状態を保存も復元もしない) pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE); // シーンの描画(2D画像の描画) RECT SrcRect = { 0,0,640,480 }; // テクスチャ内でスプライトに使う範囲(0,0)-(512,64) D3DXVECTOR3 Center(320,240,0); // スプライト内の中心の位置(256,32,0) D3DXVECTOR3 Position(320,240,0); // スプライトを表示する位置(0,0,0)+(320,240,0) static int alpha=0; pSprite->Draw(pTexture.m_texture, // スプライトに使うテクスチャ &SrcRect, // 描画範囲 &Center, // スプライト内の中心の位置 &Position, // スプライトを表示する位置 D3DCOLOR_ARGB(alpha>255?511-alpha:alpha,255,255,255)); //alpha++; alpha &= 0x1FF; //pTexture.m_colorKey); // スプライトの描画終了 pSprite->End(); // シーンの描画終了 g_pD3DDevice->EndScene(); } // シーンの表示 return g_pD3DDevice->Present(NULL, NULL, NULL, NULL); }どうしたらきちんとした位置に描画できるのでしょうか。

  • DirextX9.0を使用した2Dゲームにおけるデータ設計

    【環境】WinXP/VC++6.0/DirectX9.0 お世話になっております。 上記環境で2Dゲームの作成を考えた場合、プレイヤー・敵などのキャラクタークラスと、それらを描画するためのスプライトクラスをどのように関連付けるかについて決めかねています。 なお、DirextXの2D機能のみ使用する前提です。 1.スプライトにキャラクターのポインタを持たせる。 2.キャラクターにスプライトのポインタを持たせる。 3.キャラクタークラスをスプライトクラスから派生する。 私は以下のように 1.の案を検討しているのですが、改善点や一般的な設計方法がありましたらご指摘いただけると幸いです。 // プレイヤー、敵など画像と座標をもつオブジェクトの基本クラス class CBaseUnit {  位置座標、移動方向、移動速度、ステータス、 等 }; // プレイヤークラス class CPlayer : public CBaseUnit {  プレイヤーに固有の属性、操作 }; // スプライトクラス class CSprite {  テクスチャー、  描画順序、 等  CBaseUnit** ppUnit; //(★) public:  BOOL Update(){   // (*ppUnit) が NULL なら FALSE を返す。  };  BOOL Draw(ID3DXSPRITE lpD3DXSprite){   // (*ppUnit) から座標を取得して lpD3DXSprite->Draw(座標等);  }; }; // スプライト管理クラス CSpriteManager {  ID3DXSPRITE lpD3DXSprite;  CSpriteのリスト list; public:  VOID Update(){   // list 内の各スプライトに対し以下の処理   if (!スプライト->Update()) {    // スプライト に関連付いた CBaseUnit オブジェクトが消滅したことを    // 意味するので、このスプライトをリストから除外する。   };  };  Draw(){   // リスト内の全スプライトに対し以下を実行   スプライト->Draw(lpD3DXSprite);  }; };

  • DirectXでのスプライトの開始(終了)宣言に関して質問があります

    DirectXでのスプライトの開始(終了)宣言に関して質問があります スプライトを使用する場合 sprite->Begin(0); スプライトA描画 スプライトB描画 スプライトC描画 sprite->End(); といった感じで囲うと、ある本に書いてあったのですが これって sprite->Begin(0); スプライトA描画 sprite->End(); sprite->Begin(0); スプライトB描画 sprite->End(); sprite->Begin(0); スプライトC描画 sprite->End(); と記載しても問題ないでしょうか?(動作負荷的な問題で) 負荷が変わらないなら、後者の書き方で書こうかと思っているので・・・

  • ID3DXSprite::Drawメソッドに関して質問です。

    ID3DXSprite::Drawメソッドに関して質問です。 ID3DXSprite::Drawメソッドの第3引数でスプライトの 中心を識別する座標を指定できますが、 この座標を画像の様に中心にセットします(単に2で除算するだけですが)。 スプライト上では中心を(0,0)と扱うので、仮にこのスプライトを 左上にあわせて描画するとします。 なお、スプライトのサイズと、ウィンドウのクライアントサイズは 完全に一致しているとします。 単純に中心までの幅はX、中心までの高さはXとなりますので、 スプライトをX、Y分だけ右下にずらせば 問題なく描画されるかと思っていたのですが、 何故か画像内の結果上の様に地味に左上に描画されてしまいます。 そこで画像内の結果下の様にそれぞれにさらに0.5pixlずらして描画しますと これは想像どおりの位置で描画されます。 インターネットで調べるとテクスチャの描画の際には0.5pixl云々という記述が あるのですが、この場合でも0.5pixlのずれを意識する必要があるのでしょうか? それとも私自身、根本的に座標の求め方に問題があるのでしょうか? どうか、ご指摘お願いします。

  • DirectXのスプライト機能で3D回転

    http://oshiete1.goo.ne.jp/qa4484924.html 前回この質問をした者です。 疑問を整理して、もう一度質問させて貰います。 DirectX9.0cのスプライト機能で、X軸やY軸の回転のような3Dの変換は可能でしょうか? また前回での回答して頂いた事について一つ。 sprite->Begin(D3DXSPRITE_OBJECTSPACE)というフラグを指定した所、確かに3Dの回転を実現できました。 しかし今度はテクスチャの画像が表示されなくなり、白いポリゴンが表示されるようになってしまいました。これを解決する方法をご存じの方、どうかご教示下さい。 あるいはD3DXSPRITE_OBJECTSPACEを使ったサンプルソースなどが掲載されたHPや書籍をご存じでしたら、紹介して頂きたく思います。

  • BCCでのTexture使用に関するError?

    win2k BCC5.5 BCCDevloper DirectX9.0b で開発してるのですが。 コンパイルは通るのですが、 実行するとD3DX81ab.DLLが必要と出て終了します。 なのでsystemに追加して実行したら、 今度は起動するけどエラー終了になります。 デバッガ使用して調べてみたら、 texture使用の部分でErrorがでてしまいます。 調べたけど分からなかったので質問させていただきます。 以下関連部分ソースコード #include <tchar.h> #include <d3dx9.h> #include <dxerr9.h> (中略) LPD3DXSPRITE pSprite = NULL; LPDIRECT3DTEXTURE9 pTexture = NULL; TCHAR gl_disp[]=_T("canvas.png"); (中略) hr = D3DXCreateTextureFromFile(gl_lpD3ddev,gl_disp,&pTexture); if(FAILED(hr)) return DXTRACE_ERR("InitDXGraphics D3DXCreateTextureFromFile", hr); hr = D3DXCreateSprite(gl_lpD3ddev, &pSprite); if(FAILED(hr)) return DXTRACE_ERR("InitDXGraphics D3DXCreateSprite", hr); (以下省略) D3DXCreateTextureFromFileでErrorが出ているというのは分かったのですが、それ以降がサッパリです。 これだけでは足りないようでしたらご指摘ください。 何か参考になるURLなどでもかまいませんのでよろしくお願いします。

  • DirectXでの半透明PNG画像について

    半分が半透明で、もう半分は透明でない単色のPNG画像(128×128サイズ)を作成しました。 ソフトはAdobe Photoshop Elements 6.0で、アルファ設定されている「PNG-24」です。 D3DXCreateTextureFromFileEx関数で、そのPNG画像を読み込んで描画したのですが、半透明の部分は描画されず、透明にしていない片方しか描画されませんでした。 半透明の部分も描画されるようにするにはどうすればよいでしょうか? 自分でもいろいろ調べてみたのですが、原因がよく分からないので質問させていただきます。 一応、参考程度に… // スプライトオブジェクトの作成 if ( FAILED( D3DXCreateSprite( g_pd3dDevice, &m_pSprite ) ) ) {     // エラー処理 } D3DXIMAGE_INFO info; // テクスチャの読み込み if( FAILED( D3DXCreateTextureFromFileExA( g_pd3dDevice,                                FileName,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                D3DX_DEFAULT,                                0,                                D3DFMT_A1R5G5B5,                                D3DPOOL_MANAGED,                                D3DX_FILTER_NONE,                                D3DX_FILTER_NONE,                                0,                                &info,                                NULL,                                &g_pd3dTexture) ) ) {     // エラー処理 }

  • DirectX png画像でx軸回転について

    D3DXCreateTextureFromFile関数でpng画像を読み込んで、LPD3DXSPRITEのスプライト機能で描画しています。 float rad += 0.005f;という感じでラジアン値を変えつつ回転の様子を調べているのですが、どうも予想通りに動いてくれません。 D3DXMatrixRotationZでz軸回転させると、一定間隔でくるくる回ってくれて、これは予想通りです。 しかしD3DXMatrixRotationXでx軸回転させようとすると、一瞬で画像が縮んでしばらく消えてから、また一瞬の内に伸びて縮んでしばらく消える、という事の繰り返しになります。 なぜx軸(y軸もですけど)の時だと、上手く回転してくれないのでしょう? そして、どのように値を与えれば、一定間隔でくるくる回ってくれるようになるのでしょうか? どうかよろしくお願いします。

  • ID3DXSprite::Drawメソッドに関しての質問です。

    ID3DXSprite::Drawメソッドに関しての質問です。 Drawメソッドの第2引数は CONST RECT* と定義されており、ここに描画される有効範囲を指定します。 このRECT構造体に添付の画像の様に800x600のサイズのテクスチャを描画範囲と指定する場合、 (0,0)(800,600)と指定すると、結果的に幅は801pixl,高さは601pixlとなると考え、 (0,0)(799,599)と指定しました。しかし、この様に指定すると、実際には799x599pixlとして 描画されてしまいます。 ID3DXSprite::Drawメソッドの描画範囲を指定する第2引数は RECT.top、RECT.left は切り取り位置、 RECT.right、RECT.bottom は描画サイズと解釈するべきなのでしょうか? このあたりのことは書籍やネットでもあまり取り上げられない問題なので、 詳細をご掲示頂けると幸いです。 よろしくお願いします。

専門家に質問してみよう