2012-07-23 1 views
0

Direct X를 사용하여 직접 라이브러리를 작성했으며 이상한 문제가 발생했습니다. 모든 때문에,Direct X Sprite 렌더링 문제

Direct X Rendering Issue

내가 강박 관념 코드를 밟은과 실제 스프라이트의 로딩에 대해 뭔가해야한다는 결론을 내렸다 : 나는 단순히 큰 검은 사각형을보고하고 애니메이션화 스프라이트 렌더링을 시도 하다니 내 코드에서 볼 수있는 것은 괜찮습니다. 분명히 BltFast와 같은 함수를 사용할 수 없기 때문에 스프라이트 표면이 백 버퍼에 성공적으로 blitted되는지 확인할 수 없습니다. 여기

내 부하이며, 스프라이트 기능을 렌더링 :

스프라이트 :: LOAD

/** 
* loads a bitmap file and copies it to a directdraw surface 
* 
* @param pID    wait 
* @param pFileName  name of the bitmap file to load into memory 
*/ 
void Sprite::Load (const char *pID, const char *pFileName) 
{ 
    // initialises the member variables with the new image id and file name 
    mID     = pID; 
    mFileName   = pFileName; 

    // creates the necessary variables 
    HBITMAP    tHBM; 
    BITMAP    tBM; 
    DDSURFACEDESC2  tDDSD; 
    IDirectDrawSurface7 *tDDS; 

    // stores bitmap image into HBITMAP handler 
    tHBM     = static_cast<HBITMAP> (LoadImage (NULL, pFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION)); 

    GetObject (tHBM, sizeof (tBM), &tBM); 

    // create surface for the HBITMAP to be copied onto 
    ZeroMemory (&tDDSD, sizeof (tDDSD)); 
    tDDSD.dwSize   = sizeof (tDDSD); 
    tDDSD.dwFlags   = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
    tDDSD.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
    tDDSD.dwWidth   = tBM.bmWidth; 
    tDDSD.dwHeight   = tBM.bmHeight; 
    DirectDraw::GetInstance()->DirectDrawObject()->CreateSurface (&tDDSD, &tDDS, NULL); 

    // copying bitmap image onto surface 
    CopyBitmap(tDDS, tHBM, 0, 0, 0, 0); 

    // deletes bitmap image now that it has been used 
    DeleteObject(tHBM); 

    // stores the new width and height of the image 
    mSpriteWidth   = tBM.bmWidth; 
    mSpriteHeight   = tBM.bmHeight; 

    // sets the address of the bitmap surface to this temporary surface with the new bitmap image 
    mBitmapSurface   = tDDS; 
} 

스프라이트 ::

/** 
* renders the sprites surface to the back buffer 
* 
* @param pBackBuffer  surface to render the sprite to 
* @param pX    x co-ordinate to render to (default is 0) 
* @param pY    y co-ordinate to render to (default is 0) 
*/ 
void Sprite::Render (LPDIRECTDRAWSURFACE7 &pBackBuffer, float pX, float pY) 
{ 
    if (mSpriteWidth > 800)  mSpriteWidth = 800; 

    RECT   tFrom; 

    tFrom.left  = tFrom.top  = 0; 
    tFrom.right  = mSpriteWidth; 
    tFrom.bottom = mSpriteHeight; 

    // bltfast parameters are (position x, position y, dd surface, draw rect, wait flag) 
    // pBackBuffer->BltFast (0 + DirectDraw::GetInstance()->ScreenWidth(), 0, mBitmapSurface, &tFrom, DDBLTFAST_WAIT); 
    pBackBuffer->BltFast (static_cast<DWORD>(pX + DirectDraw::GetInstance()->ScreenWidth()), 
     static_cast<DWORD>(pY), mBitmapSurface, &tFrom, DDBLTFAST_WAIT); 
} 

답변

0

을 렌더링 표면은 간단하지 않았다 호환 가능한 형식.

extern "C" HRESULT 
DDCopyBitmap(IDirectDrawSurface7 * pdds, HBITMAP hbm, int x, int y, 
      int dx, int dy) 
{ 
    HDC      hdcImage; 
    HDC      hdc; 
    BITMAP     bm; 
    DDSURFACEDESC2   ddsd; 
    HRESULT     hr; 

    if (hbm == NULL || pdds == NULL) 
     return E_FAIL; 
    // 
    // Make sure this surface is restored. 
    // 
    pdds->Restore(); 
    // 
    // Select bitmap into a memoryDC so we can use it. 
    // 
    hdcImage = CreateCompatibleDC(NULL); 
    if (!hdcImage) 
     OutputDebugString("createcompatible dc failed\n"); 
    SelectObject(hdcImage, hbm); 
    // 
    // Get size of the bitmap 
    // 
    GetObject(hbm, sizeof(bm), &bm); 
    dx = dx == 0 ? bm.bmWidth : dx;  // Use the passed size, unless zero 
    dy = dy == 0 ? bm.bmHeight : dy; 
    // 
    // Get size of surface. 
    // 
    ddsd.dwSize = sizeof(ddsd); 
    ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; 
    pdds->GetSurfaceDesc(&ddsd); 

    if ((hr = pdds->GetDC(&hdc)) == DD_OK) 
    { 
     StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, 
        dx, dy, SRCCOPY); 
     pdds->ReleaseDC(hdc); 
    } 
    DeleteDC(hdcImage); 
    return hr; 
} 
: 여기

은 지금 부하 함수를 호출 고정 copybitmap 기능입니다