2016-12-20 5 views
1

DirectX9には、LPD3DXSPRITEがスプライトをどこでブリットするかを指定できる特定の機能がありますか?私はタイル情報でサーフェスをロードしようとしていて、そのサーフェスの一部をバックバッファに表示しようとしています。私は、LPD3DXSPRITE :: Draw()で宛先サーフェスのパラメータがないことを認識しました。おそらく自動的にバックバッファです。そして、私の世界の表面の描画は、スプライトをカバーします。LPDIRECT3DTEXTURE9をLPDIRECT3DSURFACE9に描画

解決策はありますか、またはこの問題にアプローチする別の方法はありますか?なぜ私は、私のタイルスプライトを処理するためにLPDIRECT3DTEXTURE9オブジェクトを使用することを考えた透明性が必要ですが、マップはバックバッファに収まらないため、マップをサーフェスにロードして描画することを考えました。

//Filename: MyDirectX.h 
//Direct3D objects 
extern LPDIRECT3D9 d3d; 
extern LPDIRECT3DDEVICE9 d3ddev; 
extern LPDIRECT3DSURFACE9 backbuffer; 
extern LPD3DXSPRITE spriteobj; 

LPDIRECT3DTEXTURE9 LoadTexture(string filename, D3DCOLOR transcolor = D3DCOLOR_XRGB(0,0,0)); 

void DrawTile(LPDIRECT3DTEXTURE9 source, int frame, int width, int height, int columns, LPDIRECT3DSURFACE9 dest, int destx, int desty, D3DCOLOR color); 
void BuildGameWorld(); 
void ScrollScreen(); 
///////////////////////////////////////////////////////////////////////////// 
//Filename: MyGame.cpp 
#include "MyDirectX.h" 

//THIS FUNCTION HERE 
void DrawTile(LPDIRECT3DTEXTURE9 source, int frame, int width, int height, int columns, LPDIRECT3DSURFACE9 dest, int destx, int desty, D3DCOLOR color) 
{ 
    //get dimensions for the tile 
    RECT r1; 
    r1.left = (frame % columns) * width; 
    r1.top = (frame/columns) * height; 
    r1.right = r1.left + width; 
    r1.bottom = r1.top + height; 

    //can only draw to the backbuffer? Any work around? 
    spriteobj->Draw(source, &r1, &D3DXVECTOR3(r1.right/2, r1.bottom/2, 0), &D3DXVECTOR3(destx, desty, 0), color); 
} 

void BuildGameWorld() 
{ 
    int x, y; 
    LPDIRECT3DTEXTURE9 tiles = nullptr; 

    //load the texture file 
    tiles = LoadTexture("goodly-2x.png", D3DCOLOR_XRGB(255, 0, 255)); 

    spriteobj->Begin(D3DXSPRITE_ALPHABLEND); 

    for(y = 0; y < MAPHEIGHT; y++) 
    { 
     for(x = 0; x < MAPWIDTH; x++) 
     { 
      DrawTile(tiles, MAP_LAYER1[y * MAPWIDTH + x], 32, 32, 16, gameworld, x * 32, y * 32, D3DCOLOR_XRGB(255,255,255)); 
     } 
    } 

    spriteobj->End(); 

    //release the texture file 
    tiles->Release(); 
} 

//Without this function, and placing BuildGameWorld() inside the Game_Run() 
//rendering phase the screen displays stripes of blue which I can only 
//assume is the transparent tiles working incorrectly*/ 
void ScrollScreen() 
{ 
    //update horizontal scrolling position and speed 
    ScrollX += SpeedX; 
    if (ScrollX < 0) 
    { 
     ScrollX = 0; 
     SpeedX = 0; 
    } 
    else if (ScrollX > GAMEWORLDWIDTH - SCREENW) 
    { 
     ScrollX = GAMEWORLDWIDTH - SCREENW; 
     SpeedX = 0; 
    } 

    //update vertical scrolling position and speed 
    ScrollY += SpeedY; 
    if (ScrollY < 0) 
    { 
     ScrollY = 0; 
     SpeedY = 0; 
    } 
    else if (ScrollY > GAMEWORLDHEIGHT - SCREENH) 
    { 
     ScrollY = GAMEWORLDHEIGHT - SCREENH; 
     SpeedY = 0; 
    } 

    //set dimensions of the source image 
    RECT r1 = {ScrollX, ScrollY, ScrollX+SCREENW-1, 
     ScrollY+SCREENH-1}; 

    //set the destination rect 
    RECT r2 = {0, 0, SCREENW-1, SCREENH-1}; 

    d3ddev->StretchRect(gameworld, &r1, backbuffer, &r2, 
     D3DTEXF_NONE); 

} 
+0

彼らは何のコードが含まれていないとき、人々は常に批判されますが、あなたが含まれている可能性が過度に。あなたのコードを最小限の例で表現することができれば、回答者にとって大きな助けになります。あなたがアップロードしたすべてのコードを見て、誰が問題を特定しようとしているのかは分かりません。あなたが大きなコードブロックを離れても、あなたが確信しているビットを指摘したとしても、それはあなたにもっと多くの助けとより少ないdownvotesを得るかもしれません。 –

+0

私は余分なコードを削除し、私が問題を引き起こしていると思われる機能についてコメントしました。 ScrollScreen()。 –

+0

ありがとうございます。助けを借りて幸運。 –

答えて

1

あなたはこのようID3DXRenderToSurfaceを使用されるだろうID3DXSprite、レンダーターゲットを指定する最も簡単な方法を使用しているので:

// inside IDirect3DDevice9::BeginScene()/EndScene() block 
ID3DXRenderToSurface::BeginScene() 
ID3DXSprite::Begin() 

// draw your sprites 

ID3DXSprite::End() 
ID3DXRenderToSurface::EndScene() 
+0

便利なリンクは次のとおりです。 http://www.gamedev.net/topic/491590-rendering-sprites-off-screen/ http://www.codesampler.com/dx9src/dx9src_7.htm – VuVirt

+0

ありがとうございました!レンダーターゲットを設定する方法がわかりませんでした。私の最初の走りは地図のスクロールを除いてうまくいった。それ以降の私の走りはただの黒い画面ですが、私はそれに取り組んでいきます。 –

+1

ID3DXRenderToSurfaceを動作させることができませんでしたが、Direct3DデバイスにSetRenderTarget関数があることがわかりました。ですから私のプログラムは次のようになります: d3ddev-> SetRenderTarget(NULL、gameworld); d3ddev-> BeginScene(); //ここでのレンダリングコード d3ddev-> EndScene(); d3ddev-> SetRenderTarget(NULL、バックバッファ); –

関連する問題