0

ID3DXSprite を使用して単純な 2D タイル ゲームを作成しようとしています。なんとか絵を描いてみたところ、編集時と同じ品質ではないことに気付きました。Directx 8 以降では、すべてのテクスチャが 2 の倍数でなければならないことを読みましたが、画像が 32x32 であるため、これは私の場合ではありません。

元画像:リンク

レンダリング画像:リンク

初期化コード:

bool D3DEngine::InitD3D(HWND hwnd)
{
    D3D = Direct3DCreate9(D3D_SDK_VERSION);    
    D3DPRESENT_PARAMETERS D3DPP;

    ZeroMemory(&D3DPP, sizeof(D3DPP));    
    D3DPP.Windowed = true;    
    D3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;    
    D3DPP.hDeviceWindow = hwnd;
    D3DPP.BackBufferFormat = D3DFMT_A8R8G8B8;
    D3DPP.BackBufferWidth = 300;
    D3DPP.BackBufferHeight = 300;
    D3DPP.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

    if (D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_MIXED_VERTEXPROCESSING, &D3DPP, &D3DDevice) != D3D_OK)
    {
        return false;
    }
    else
    {
        D3DXCreateTextureFromFile(D3DDevice, ".bmp", &Texture);

        D3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
        D3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

        Sprite = new D3DSprite(D3DDevice);
        Camera = new Camera2D(0, 0, ScreenPosX, ScreenPosY, 1.0f, 0.0f);

        Debug->Output("Started DirectX");
        return true;
    }
}

レンダリング コード:

void D3DSprite::DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, ScreenPos Pos, D3DCOLOR Color)
{
    D3DXVECTOR3 Center(0.0f, 0.0f, 0.0f);
    D3DXVECTOR3 Position(Pos.x - Camera->GetX(), Pos.y - Camera->GetY(), 0.0f);

    Handle->Draw(Texture, Rect, &Center, &Position, Color);
}

struct ScreenPos
{
    float x;
    float y;
};

class D3DSprite 
{
    public:

        LPD3DXSPRITE Handle;

        D3DSprite(LPDIRECT3DDEVICE9 Device);
        ~D3DSprite();

        void DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, ScreenPos Pos, D3DCOLOR Color);
        void DrawTexture(LPDIRECT3DTEXTURE9 Texture, CONST RECT* Rect, WorldPos Pos, D3DCOLOR Color);
        void Begin(DWORD Flags) { Handle->Begin(Flags); };
        void End() { Handle->End(); };
};

void D3DEngine::Render()
{
    D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_COLORVALUE(0.0f, 0.0f, 0.0, 1.0f), 1.0f, 0);

    D3DDevice->BeginScene();

    ScreenPos Position = {0, 0};

    Sprite->Begin(D3DXSPRITE_OBJECTSPACE | D3DXSPRITE_ALPHABLEND);

    Sprite->DrawTexture(Texture, NULL, Position, D3DCOLOR_COLORVALUE(1.0f, 1.0f, 1.0f, 1.0f));

    Sprite->End();
    D3DDevice->EndScene();
    D3DDevice->Present(NULL, NULL, NULL, NULL);

}
4

1 に答える 1