Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Lỗi load ảnh bằng D3DXLoadSurfaceFromFile()!!!

  1. #1
    Ngày gia nhập
    02 2012
    Bài viết
    0

    Arrow Lỗi load ảnh bằng D3DXLoadSurfaceFromFile()!!!

    Trong viusal studio 2010 mình thực hiện việc load ảnh bằng cách sau:

    Code:
    char a[10] = "bitmap.bmp";
    HRESULT result = NULL;
    result = D3DXLoadSurfaceFromFile(
            surface,            //destination surface
            NULL,               //destination palette
            NULL,               //destination rectangle
            LPCWSTR(a),   //source filename
            NULL,               //source rectangle
            D3DX_DEFAULT,       //controls how image is filtered
            0,                  //for transparency (0 for none)
            NULL);              //source image info (usually NULL)
    if(result == NULL)
    return 0;
    ==>Kết quả ảnh ko load được!! Mình load ảnh cách này nhằm mục đích tạo một hàm truyền các chuỗi để load các ảnh có thứ tự như bitmap1.bmp, bitmap2.bmp,....

    Nhưng nếu sử dụng cách bình thường là:
    Code:
    result = D3DXLoadSurfaceFromFile(
            surface,            //destination surface
            NULL,               //destination palette
            NULL,               //destination rectangle
            L"bitmap.bmp",   //source filename
            NULL,               //source rectangle
            D3DX_DEFAULT,       //controls how image is filtered
            0,                  //for transparency (0 for none)
            NULL);              //source image info (usually NULL)
    Cách này thì tất nhiên là ko có vấn đề gì! Mình nghĩ cách 1 đã xảy ra lỗi trong quá trình chuyển đổi chuỗi vào hàm (ở chỗ LPCWSTR(a) chẳng hạn). Các bạn có thể giúp mình sửa lỗi ở cách 1 hay là đưa ra một cách khác thực hiện được mục đích tương tự như mình đã nói không?? rất mong nhận được nhiều comment từ các bạn.... thank you!!!

  2. #2
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Tham khảo bài post này.
    http://diendan.congdongcviet.com/showthread.php?t=42194
    Điều bạn cần hỏi nằm trong hàm

    C Code:
    1. HRESULT LoadSurfaceFromFile(IDirect3DDevice9* pDevice, const TCHAR* filename, IDirect3DSurface9** pSurface)
    2. {
    3.     HRESULT hr;
    4.     int width, height;
    5.     D3DXIMAGE_INFO info;
    6.  
    7.     hr = D3DXGetImageInfoFromFile(filename, &info) ;
    8.     if(FAILED(hr))
    9.         return hr;
    10.     hr = pDevice->CreateOffscreenPlainSurface(info.Width,
    11.                                               info.Height,
    12.                                               D3DFMT_X8R8G8B8,
    13.                                               D3DPOOL_DEFAULT,
    14.                                               pSurface,
    15.                                               0);
    16.     if(FAILED(hr))
    17.         return hr;
    18.     hr = D3DXLoadSurfaceFromFile(*pSurface,
    19.                             0,
    20.                             0,
    21.                             filename,
    22.                             0,
    23.                             D3DX_FILTER_LINEAR,
    24.                             0,
    25.                             &info);
    26.     return hr;
    27. }
    Đã được chỉnh sửa lần cuối bởi namdq2k : 15-03-2012 lúc 01:28 PM.

  3. #3
    Ngày gia nhập
    02 2012
    Bài viết
    0

    Mình đã làm tương tự nhưng vẫn ko được! Bạn xem lại giúp mình phải như thế này ko???

    Đây là full code:

    Code:
    // Beginning Game Programming, 2nd Edition
    // Chapter 6
    // Load_Bitmap program
    
    //header files to include
    #include <d3d9.h>
    #include <d3dx9.h>
    #include <time.h>
    
    //application title
    #define APPTITLE "Create_Surface"
    
    //macros to read the keyboard asynchronously
    #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEY_UP(vk_code)((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    
    //screen resolution
    #define SCREEN_WIDTH 640
    #define SCREEN_HEIGHT 480
    
    //forward declarations
    LRESULT WINAPI WinProc(HWND,UINT,WPARAM,LPARAM);
    ATOM MyRegisterClass(HINSTANCE);
    int Game_Init(HWND);
    void Game_Run(HWND);
    void Game_End(HWND);
    
    //Direct3D objects
    LPDIRECT3D9 d3d = NULL; 
    LPDIRECT3DDEVICE9 d3ddev = NULL; 
    
    LPDIRECT3DSURFACE9 backbuffer = NULL;
    LPDIRECT3DSURFACE9 surface = NULL;
    
    
    //window event callback function
    LRESULT WINAPI WinProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
        switch( msg )
        {
            case WM_DESTROY:
                Game_End(hWnd);
                PostQuitMessage(0);
                return 0;
        }
    
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    
    
    //helper function to set up the window properties
    ATOM MyRegisterClass(HINSTANCE hInstance)
    {
        //create the window class structure
        WNDCLASSEX wc;
        wc.cbSize = sizeof(WNDCLASSEX); 
    
        //fill the struct with info
        wc.style         = CS_HREDRAW | CS_VREDRAW;
        wc.lpfnWndProc   = (WNDPROC)WinProc;
        wc.cbClsExtra	 = 0;
        wc.cbWndExtra	 = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = NULL;
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = LPCWSTR(APPTITLE);
        wc.hIconSm       = NULL;
    
        //set up the window with the class info
        return RegisterClassEx(&wc);
    }
    
    
    //entry point for a Windows program
    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR     lpCmdLine,
                       int       nCmdShow)
    {
        // declare variables
    	MSG msg;
    
    	// register the class
    	MyRegisterClass(hInstance);
    
        // initialize application 
        //note--got rid of initinstance
        HWND hWnd;
    
        //create a new window
        hWnd = CreateWindow(
           LPCWSTR(APPTITLE),              //window class
           LPCWSTR(APPTITLE),              //title bar
           WS_EX_TOPMOST | WS_VISIBLE | WS_POPUP,   //window style
           CW_USEDEFAULT,         //x position of window
           CW_USEDEFAULT,         //y position of window
           SCREEN_WIDTH,          //width of the window
           SCREEN_HEIGHT,         //height of the window
           NULL,                  //parent window
           NULL,                  //menu
           hInstance,             //application instance
           NULL);                 //window parameters
    
        //was there an error creating the window?
        if (!hWnd)
          return FALSE;
    
        //display the window
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
    	
    	//initialize the game
        if (!Game_Init(hWnd))
            return 0;
    
    
        // main message loop
        int done = 0;
    	while (!done)
        {
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    	    {
                //look for quit message
                if (msg.message == WM_QUIT)
                    done = 1;
    
                //decode and pass messages on to WndProc
    		    TranslateMessage(&msg);
    		    DispatchMessage(&msg);
    	    }
            else
                //process game loop (else prevents running after window is closed)
                Game_Run(hWnd);
        }
    
    	return msg.wParam;
    }
    
    
    int Game_Init(HWND hwnd)
    {
    	const char* name = "legotron.bmp";
        HRESULT result;
        //initialize Direct3D
        d3d = Direct3DCreate9(D3D_SDK_VERSION);
        if (d3d == NULL)
        {
            MessageBox(hwnd, L"Error initializing Direct3D", L"Error", MB_OK);
            return 0;
        }
    
        //set Direct3D presentation parameters
        D3DPRESENT_PARAMETERS d3dpp; 
        ZeroMemory(&d3dpp, sizeof(d3dpp));
    
        d3dpp.Windowed = FALSE;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        d3dpp.BackBufferCount = 1;
        d3dpp.BackBufferWidth = SCREEN_WIDTH;
        d3dpp.BackBufferHeight = SCREEN_HEIGHT;
        d3dpp.hDeviceWindow = hwnd;
    
        //create Direct3D device
        d3d->CreateDevice(
            D3DADAPTER_DEFAULT, 
            D3DDEVTYPE_HAL, 
            hwnd,
            D3DCREATE_SOFTWARE_VERTEXPROCESSING,
            &d3dpp, 
            &d3ddev);
    
        if (d3ddev == NULL)
        {
            MessageBox(hwnd, L"Error creating Direct3D device", L"Error", MB_OK);
            return 0;
        }
        //clear the backbuffer to black
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
        
        //create surface
        result = d3ddev->CreateOffscreenPlainSurface(
            640,                //width of the surface
            480,                //height of the surface
            D3DFMT_X8R8G8B8,    //surface format
            D3DPOOL_DEFAULT,    //memory pool to use
            &surface,           //pointer to the surface
            NULL);              //reserved (always NULL)
    
        if (result != D3D_OK)
            return 1;
    
        //load surface from file into newly created surface
        result = D3DXLoadSurfaceFromFile(
            surface,            //destination surface
            NULL,               //destination palette
            NULL,               //destination rectangle
            name,   //source filename
            NULL,               //source rectangle
            D3DX_DEFAULT,       //controls how image is filtered
            0,                  //for transparency (0 for none)
            NULL);              //source image info (usually NULL)
    
        //make sure file was loaded okay
        if (result != D3D_OK)
            return 1;
    
        //return okay
        return 1;
    }
    
    void Game_Run(HWND hwnd)
    {
        //make sure the Direct3D device is valid
        if (d3ddev == NULL)
            return;
    
        //start rendering
        if (d3ddev->BeginScene())
        {
            //create pointer to the back buffer
            d3ddev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer);
    
            //draw surface to the backbuffer
            d3ddev->StretchRect(surface, NULL, backbuffer, NULL, D3DTEXF_NONE);
    
           
            //stop rendering
            d3ddev->EndScene();
        }
    
        //display the back buffer on the screen
        d3ddev->Present(NULL, NULL, NULL, NULL);
    
        //check for escape key (to exit program)
        if (KEY_DOWN(VK_ESCAPE))
            PostMessage(hwnd, WM_DESTROY, 0, 0);
    
    }
    
    void Game_End(HWND hwnd)
    {
        //free the surface
        surface->Release();
    
        //release the Direct3D device
        if (d3ddev != NULL) 
            d3ddev->Release();
    
        //release the Direct3D object
        if (d3d != NULL)
            d3d->Release();
    }

  4. #4
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Đổi:
    Code:
    const char * name = "legotron.bmp";
    Thành
    Code:
    const TCHAR* name = TEXT("legotron.bmp");
    Ở hàm Game_Init()

  5. #5
    Ngày gia nhập
    02 2012
    Bài viết
    0

    Cảm ơn bạn! Mình làm được rồi! Nhưng bạn có thể cho mình biết đoạn code bị lỗi gì không? Cách khai báo |const TCHAR* name = TEXT("legotron.bmp");| này mình ko hiểu!

  6. #6
    Ngày gia nhập
    03 2010
    Nơi ở
    My Home
    Bài viết
    772

    Mặc định Lỗi load ảnh bằng D3DXLoadSurfaceFromFile()!!!

    Trích dẫn Nguyên bản được gửi bởi nguyennhutbinh Xem bài viết
    Cảm ơn bạn! Mình làm được rồi! Nhưng bạn có thể cho mình biết đoạn code bị lỗi gì không? Cách khai báo |const TCHAR* name = TEXT("legotron.bmp");| này mình ko hiểu!
    Nếu không muốn vậy thì bạn có thể làm như sau mà cũng dễ hiểu hơn 1 chút:

    C Code:
    1. #if _UNICODE
    2.     const wchar_t * name = L"legotron.bmp";
    3. #else
    4.     const char * name = "legotron.bmp"
    5. #endif

    code trong winnt.h dạng kiểu thế này:

    C Code:
    1. #if _UNICODE
    2.     typedef wchar_t TCHAR;
    3. #define TEXT(x) L##x
    4. #else
    5.     typedef char    TCHAR
    6. #define TEXT(x) x
    7. #endif

    Các bài viết & Demo về lập trình DirectX 9 từ lâu rồi, thường sử dụng VC6, VC2003(VC7) với mặc định tao project không phải là Unicode. Các phiên bản sau này mặc định là sử dụng Unicode character set nên khi copy code project phải để ý việc này hoặc chuyển projects về lại dạng Multibyte character set bằng cách:

    Project properties - General -- Character set --> Chuyển Use Unicode Character Set thành Use Multi - byte Character Set.
    Đã được chỉnh sửa lần cuối bởi namdq2k : 15-03-2012 lúc 02:36 PM.

Các đề tài tương tự

  1. Load ảnh bitmap trong OpenGL, không có báo lỗi nhưng mà hình ảnh không load được ra màn hình?
    Gửi bởi SusuSun trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 15-10-2012, 03:12 PM
  2. ADO.NET Gặp lỗi "Could not load file or assembly..." khi load Project trong C#.Cách giải quyết như thế nào ?
    Gửi bởi tranloanspkt trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 01-12-2011, 09:33 AM
  3. load Usercontrol vào trang aspx nhưng mà ko load đc file CSS ?
    Gửi bởi tan408 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 09-11-2011, 12:21 AM
  4. Làm sao để khi mở lên thì form4 load chứ không phải form1 load mấy bạn
    Gửi bởi chitviv trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 12-06-2011, 04:13 PM
  5. Làm thế nào để load 1 file dll lúc load-time với lập trình MFC?
    Gửi bởi mfc trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 19-01-2011, 04:04 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn