Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[DirectX] Problem z pętlą komunikatów.

Ostatnio zmodyfikowano 2011-04-13 17:41
Autor Wiadomość
blojayble
Temat założony przez niniejszego użytkownika
[DirectX] Problem z pętlą komunikatów.
» 2011-04-13 17:05:42
Witam ponownie. Tym razem mam problem z DirectX. Zaczynam naukę i na początku kompiluje parę przykładów.

Kiedy już udało mi się wyeliminować błędy z napisami,(dodanie tchar.h) skompilowałem mój program, lecz się on zawiesza.

Visual mówi mi że jest problem z msg, że jest używany bez inicjacji.

C/C++
#include "stdafx.h"
#include "tsest.h"

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; //pozycja wierzchołka
    DWORD color; //kolor wierzchołka
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
//==============================================================================

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;

//==============================================================================
LRESULT CALLBACK ProcObslugi( HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar );
bool NoweOkno( HINSTANCE hProg, HWND * hWnd, LPSTR lpszTyt );
HRESULT InitD3D( HWND hOkno );
void Render();
void Cleanup();
HRESULT InitVB();
//==============================================================================
// Funkcja główna
//------------------------------------------------------------------------------
int WINAPI WinMain( HINSTANCE hProgram, HINSTANCE, LPSTR, int swPokaz )
{
    HWND hOkno;
   
    //Utworzenie okna dla DirectX
    if( !NoweOkno( hProgram, & hOkno, "Direct3D - Program 3" ) ) return false;
   
    ShowWindow( hOkno, swPokaz ); UpdateWindow( hOkno );
   
    //Utworzenie obiektów DirectX
    if( InitD3D( hOkno ) != S_OK ) Cleanup();
   
    MSG msg;
   
    //Pętla pobierania komunikatów i renderingu
    while( msg.message != WM_QUIT ) {
        if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) ) {
            TranslateMessage( & msg ); DispatchMessage( & msg );
        } else Render();
       
    }
   
    //Zwolnienie obiektów Directx
    Cleanup();
    return msg.wParam;
}
//==============================================================================
// Funkcja do komunikatów Windowsa
//------------------------------------------------------------------------------
LRESULT CALLBACK ProcObslugi( HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar )
{
    switch( uMsg ) {
       
    case WM_KEYDOWN:
        switch( wPar ) {
        case VK_ESCAPE:
            PostQuitMessage( 0 );
            break;
        };
        break;
       
    case WM_CLOSE:
        DestroyWindow( hOkno );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
    };
    return DefWindowProc( hOkno, uMsg, wPar, lPar );
}
//==============================================================================
// Utwórz nowe okno Windows
//------------------------------------------------------------------------------
bool NoweOkno( HINSTANCE hProg, HWND * hWnd, LPSTR lpszTyt )
{
    WNDCLASS wc;
    wc.lpszClassName = _T( "Kurs DirectX" );
    wc.hInstance = hProg;
    wc.lpfnWndProc = ProcObslugi;
    wc.style = 0;
    wc.hIcon = LoadIcon( NULL, IDI_WINLOGO );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH ) GetStockObject( BLACK_BRUSH );
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    if( !RegisterClass( & wc ) ) return false;
   
    * hWnd = CreateWindowEx( 0, _T( "Kurs DirectX" ), lpszTyt,
    WS_POPUP, 100, 100, 200, 100,
    NULL, NULL, hProg, NULL );
    if( * hWnd == NULL ) return false;
    else return true;
   
}
//==============================================================================
// Zainicjuj obiekty Directx
//------------------------------------------------------------------------------
HRESULT InitD3D( HWND hWnd )
{
    if( NULL ==( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
         return E_FAIL;
   
    D3DPRESENT_PARAMETERS pp;
    ZeroMemory( & pp, sizeof( pp ) );
    pp.Windowed = false;
    pp.BackBufferWidth = 640;
    pp.BackBufferHeight = 480;
    pp.BackBufferFormat = D3DFMT_A8R8G8B8;
    pp.SwapEffect = D3DSWAPEFFECT_FLIP;
   
   
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, & pp, & g_pd3dDevice ) ) ) return E_FAIL;
   
    InitVB();
    return S_OK;
}
//==============================================================================
// Wczytaj wierzchołki
//------------------------------------------------------------------------------
HRESULT InitVB()
{
    CUSTOMVERTEX vertices[] =
    {
        { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, },
        { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
        { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
    };
   
    if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( CUSTOMVERTEX ), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, & g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }
   
    VOID * pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof( vertices ),( void ** ) & pVertices, 0 ) ) ) return E_FAIL;
   
    memcpy( pVertices, vertices, sizeof( vertices ) );
    g_pVB->Unlock();
   
    return S_OK;
}
//==============================================================================
// W tej funkcji będziesz renderował scenę
//------------------------------------------------------------------------------
void Render()
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0x00000000, 1.0f, 0L );
    g_pd3dDevice->BeginScene();
   
    //TUTAJ RYSUJESZ WSZYSTKIE OBIEKTY
   
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
    g_pd3dDevice->EndScene();
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

//==============================================================================
// Zwolnij wszystkie obiekty D3D
//------------------------------------------------------------------------------
void Cleanup()
{
    if( g_pVB != NULL ) g_pVB->Release();
   
    if( g_pd3dDevice != NULL )
         g_pd3dDevice->Release();
   
    if( g_pD3D != NULL )
         g_pD3D->Release();
   
}
//==============================================================================

Niby wszystko cacy, a jednak pojawiają się błędy:

'tsest.exe': Loaded 'C:\Documents and Settings\Zolw\Moje dokumenty\Visual Studio 2010\Projects\tsest\Debug\tsest.exe', Symbols loaded.
'tsest.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\user32.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\d3d9.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\d3d8thk.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\version.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\winmm.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\msvcr100d.dll', Symbols loaded.
'tsest.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', Cannot find or open the PDB file
'tsest.exe': Loaded 'C:\WINDOWS\system32\MSCTF.dll', Cannot find or open the PDB file
Run-Time Check Failure #3 - The variable 'msg' is being used without being initialized.
The program '[3780] tsest.exe: Native' has exited with code 0 (0x0).


Próbowałem innych pętli, z google, ale wywalały jeszcze więcej błędów.

Co zrobić aby wszystko ładnie chodziło, może to wina tych plików?
P-30701
Aithne
» 2011-04-13 17:28:59
Przecież jest napisane ;)
Run-Time Check Failure #3 - The variable 'msg' is being used without being initialized.
Używasz niezainicjalizowanej zmiennej msg ;) Dodaj przed pętlą np.:
msg.message = WM_NULL;
P-30703
blojayble
Temat założony przez niniejszego użytkownika
» 2011-04-13 17:41:18
Haha, dzięki wielkie, nie domyśliłem się że to o zmienną chodzi. :D

Dziękuję i pozdrawiam. :)
P-30705
« 1 »
  Strona 1 z 1