| Autor |
Wiadomość |
totageros ~user
Dołączył: 22 Wrz 2009 Posty: 4
|
|
Witam!
Programuje w directx wszystko pięknie aż do tutka o plikach *.x.Kodzik skopiowalem z załącznika!
| Kod: | //==============================================================================
// Przykład do lekcji o Directx Graphics
// Pliki *.x (część I)
// www.directx.fiv.pl
//==============================================================================
//==============================================================================
#include <d3d9.h>
#include <d3dx9.h>
//==============================================================================
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
D3DXMATRIXA16 matWorldY;
D3DXMATRIXA16 matWorldZ;
LPD3DXMESH g_pMesh = NULL;//siatka obiektu
D3DMATERIAL9* g_pMeshMaterials = NULL;//materiał siatki
LPDIRECT3DTEXTURE9* g_pMeshTextures = NULL;//tekstury siatki
DWORD g_dwNumMaterials = 0L;//liczba tekstur siatki
//==============================================================================
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();
HRESULT Wczytaj_obiekt();
void Cleanup();
void SetupMatrices();
//==============================================================================
// 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;
ZeroMemory( &msg, sizeof( 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 = "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,"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;
pp.EnableAutoDepthStencil = TRUE;
pp.AutoDepthStencilFormat = D3DFMT_D16;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, &g_pd3dDevice ) ) )
return E_FAIL;
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
SetupMatrices();
if (FAILED(Wczytaj_obiekt())) return E_FAIL;
return S_OK;
}
//==============================================================================
// W tej funkcji będziesz renderował scenę
//------------------------------------------------------------------------------
void Render()
{
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
D3DXMatrixRotationY( &matWorldY, GetTickCount()/1250.0f );
D3DXMatrixRotationZ( &matWorldZ, GetTickCount()/1250.0f );
g_pd3dDevice->SetTransform( D3DTS_WORLD, &(matWorldY*matWorldZ) );
g_pd3dDevice->BeginScene();
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
g_pd3dDevice->SetMaterial( &g_pMeshMaterials[i] );
g_pd3dDevice->SetTexture( 0, g_pMeshTextures[i] );
g_pMesh->DrawSubset( i );
}
g_pd3dDevice->EndScene();
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
//==============================================================================
// Zwolnij wszystkie obiekty D3D i siatki
//------------------------------------------------------------------------------
void Cleanup()
{
if( g_pMeshMaterials != NULL )
delete[] g_pMeshMaterials;
if( g_pMeshTextures )
{
for( DWORD i = 0; i < g_dwNumMaterials; i++ )
{
if( g_pMeshTextures[i] )
g_pMeshTextures[i]->Release();
}
delete[] g_pMeshTextures;
}
if( g_pMesh != NULL )
g_pMesh->Release();
if( g_pd3dDevice != NULL) g_pd3dDevice->Release();
if( g_pD3D != NULL ) g_pD3D->Release();
}
//==============================================================================
// Wczytaj obiekty z pliku
//------------------------------------------------------------------------------
HRESULT Wczytaj_obiekt()
{
LPD3DXBUFFER pD3DXMtrlBuffer;
//wczytaj siatkę
if( FAILED( D3DXLoadMeshFromX("urt.x", D3DXMESH_SYSTEMMEM,
g_pd3dDevice, NULL, &pD3DXMtrlBuffer, NULL,
&g_dwNumMaterials, &g_pMesh ) ) ) return E_FAIL;
//skopiuj materiały i tekstury
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
//kopiuj materiał
g_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
//ustaw kolor
g_pMeshMaterials[i].Ambient = g_pMeshMaterials[i].Diffuse;
if( FAILED( D3DXCreateTextureFromFile( g_pd3dDevice,
d3dxMaterials[i].pTextureFilename,
&g_pMeshTextures[i] ) ) )
{
g_pMeshTextures[i] = NULL;
return E_FAIL;
}
}
//zwolnij "pomoc"
pD3DXMtrlBuffer->Release();
return S_OK;
}
//==============================================================================
void SetupMatrices()
{
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 0.0f,-11.0f ),
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 480.0f/640.0f, 1.0f, 100.0f );
g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}
|
Program się kompiluje ale przy włączaniu Pojawia się komunikat:[glow=red,2,300]Unhandled exception at 0x00401511 in Directx.exe: 0xC0000005: Access violation reading location 0xfeeeff9a.[/glow]
|
|
| Powrót do góry |
|
|
erizo ~user

Dołączył: 24 Sie 2008 Posty: 452 Skąd: z Polski Pomógł: 24
|
|
Moze sprobuj obsluzyc ten wyjatek.
_________________ Całe życie na farcie i chciałbym tak do końca |
|
| Powrót do góry |
|
|
totageros ~user
Dołączył: 22 Wrz 2009 Posty: 4
|
|
| erizo napisał: | | Moze sprobuj obsluzyc ten wyjatek |
Jaki wyjątek??
|
|
| Powrót do góry |
|
|
erizo ~user

Dołączył: 24 Sie 2008 Posty: 452 Skąd: z Polski Pomógł: 24
|
|
| Cytat: | | Unhandled exception at 0x00401511 in Directx.exe: 0xC0000005: Access violation reading location 0xfeeeff9a. |
pisze, ze unhandled exception
_________________ Całe życie na farcie i chciałbym tak do końca |
|
| Powrót do góry |
|
|
totageros ~user
Dołączył: 22 Wrz 2009 Posty: 4
|
|
dobra ale jak go "obsłużć"??
|
|
| Powrót do góry |
|
|
erizo ~user

Dołączył: 24 Sie 2008 Posty: 452 Skąd: z Polski Pomógł: 24
|
|
Nigdy nie pisalem w DirectX. Nie wiem.
Poszukaj sobie.
_________________ Całe życie na farcie i chciałbym tak do końca |
|
| Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
MapaPowered by phpBB © 2001, 2005 phpBB Group
|
|