Forum: Direct3D textures/sprites som ändrar storlek :(

Forum huvudsida -> Programmering -> Direct3D textures/sprites som ändrar storlek :(

Sidor: 1

Till botten

Celeron 15:46 - 17:e September 2005 | Post #1
Medlem
Inlägg: 418


Skicka PM
Jag har nu lyckats visa sprites i Direct3D med bara ett "litet" problem. Dom ändrar storlek. Dom blir större och mer kvadratiska vilket gör att när jag försöker göra en animation med bara en bild (texture) så stämmer inga siffror. Vad kan det bero på?

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



Zoulz 16:43 - 17:e September 2005 | Post #2
Medlem
Inlägg: 30


Skicka PM
Använder ID3DXSprite interfacet eller?
Posta koden så kan jag ta en titt på det.




Celeron 16:59 - 17:e September 2005 | Post #3
Medlem
Inlägg: 418


Skicka PM
  1.  
  2. #include <d3d9.h>
  3. #include <d3dx9.h>
  4. #include <windows.h>
  5.  
  6. bool SetUpD3D(HWND);
  7. bool Update();
  8.  
  9. LPDIRECT3D9 gD3dObject=NULL;
  10. LPDIRECT3DDEVICE9 gD3dDevice=NULL;
  11. LPDIRECT3DTEXTURE9 gTexture=NULL;
  12. LPD3DXSPRITE gSprite=NULL;
  13. int bild=1;
  14. int x=0,y=0,width=0,height=199;
  15. const char KlassNamn[]="Fonstret";
  16.  
  17. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
  18. {
  19. switch(msg)
  20. {
  21. case WM_CREATE:
  22. if(!SetUpD3D(hwnd))
  23. DestroyWindow(hwnd);
  24. break;
  25. case WM_CLOSE:
  26. DestroyWindow(hwnd);
  27. break;
  28. case WM_DESTROY:
  29. gTexture->Release();
  30. gSprite->Release();
  31. gD3dObject->Release();
  32. gD3dDevice->Release();
  33. PostQuitMessage(0);
  34. break;
  35. default:
  36. return DefWindowProc(hwnd,msg,wParam,lParam);
  37. break;
  38. }
  39. return 0;
  40. }
  41.  
  42. int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  43. {
  44. WNDCLASSEX wc;
  45. HWND hwnd;
  46. MSG Msg;
  47. ZeroMemory(&Msg,sizeof(Msg));
  48. wc.cbSize=sizeof(WNDCLASSEX);
  49. wc.style=0;
  50. wc.lpfnWndProc=WndProc;
  51. wc.cbClsExtra=0;
  52. wc.cbWndExtra=0;
  53. wc.hInstance=hInstance;
  54. wc.hIcon=LoadIcon(NULL, IDI_APPLICATION);
  55. wc.hCursor=LoadCursor(NULL,IDC_ARROW);
  56. wc.hbrBackground=(HBRUSH) (COLOR_WINDOW+1);
  57. wc.lpszMenuName=NULL;
  58. wc.lpszClassName=KlassNamn;
  59. wc.hIconSm=LoadIcon(NULL, IDI_APPLICATION);
  60. if(!RegisterClassEx(&wc))
  61. {
  62. MessageBox(0,"Det gick inte att registrera fönstret!","Error",MB_ICONEXCLAMATION | MB_OK);
  63. return 0;
  64. }
  65. hwnd=CreateWindowEx(
  66. WS_EX_CLIENTEDGE,
  67. KlassNamn,
  68. "DirectX animation",
  69. WS_OVERLAPPEDWINDOW,
  70. CW_USEDEFAULT, CW_USEDEFAULT, 640, 640,
  71. NULL, NULL, hInstance, NULL);
  72. if(hwnd==NULL)
  73. {
  74. MessageBox(0,"Det gick inte att skapa fönstret!", "Error", MB_ICONEXCLAMATION | MB_OK);
  75. return 0;
  76. }
  77. ShowWindow(hwnd, nCmdShow);
  78. UpdateWindow(hwnd);
  79. while(Msg.message!=WM_QUIT)
  80. {
  81. if( PeekMessage( &Msg, NULL, 0U, 0U, PM_REMOVE ) )
  82. {
  83. TranslateMessage( &Msg );
  84. DispatchMessage( &Msg );
  85. }
  86. else
  87. if(!Update())
  88. return 1;
  89.  
  90. }
  91. return Msg.wParam;
  92. }
  93.  
  94. bool SetUpD3D(HWND hwnd)
  95. {
  96. gD3dObject=Direct3DCreate9(D3D_SDK_VERSION);
  97. if(gD3dObject==NULL) {
  98. MessageBox(0,"Fel när funktionen Direct3DCreate9(D3D_SDK_VERSION) anropades!","Error",MB_ICONEXCLAMATION | MB_OK);
  99. return false;
  100. }
  101. D3DPRESENT_PARAMETERS presParams;
  102. ZeroMemory(&presParams,sizeof(presParams));
  103. presParams.Windowed=TRUE;
  104. presParams.SwapEffect=D3DSWAPEFFECT_DISCARD;
  105. presParams.BackBufferFormat=D3DFMT_UNKNOWN;
  106. presParams.BackBufferCount=1;
  107. presParams.PresentationInterval=D3DPRESENT_INTERVAL_ONE;
  108. HRESULT hr=gD3dObject->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,
  109. D3DCREATE_HARDWARE_VERTEXPROCESSING,&presParams,&gD3dDevice);
  110. if(FAILED(hr))
  111. {
  112. MessageBox(0,"Fel när gD3dObject->CreateDevice(); anropades!", "Error",MB_ICONEXCLAMATION | MB_OK);
  113. return false;
  114. }
  115. if(FAILED(D3DXCreateTextureFromFile(gD3dDevice,"texture.tga",&gTexture))) {
  116. MessageBox(0,"Fel när D3DXCreateTextureFromFile(gD3dDevice,"testure.tga",&gTexture) anropades!","Error",MB_ICONEXCLAMATION | MB_OK);
  117. return false;
  118. }
  119. if(FAILED(D3DXCreateSprite(gD3dDevice,&gSprite))) {
  120. MessageBox(0,"Fel när D3DXCreateSprite(gD3dDevice,&gSprite) anropades","Error",MB_ICONEXCLAMATION | MB_OK);
  121. return false;
  122. }
  123. return true;
  124. }
  125.  
  126. bool Update() {
  127. width=(128*bild)-1;
  128. x=((128*bild)-1)-128;
  129. bild+=1;
  130. if(bild>5)
  131. bild=1;
  132. if(FAILED(gD3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0))) {
  133. MessageBox(0,"Fel när gD3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,255,0),1.0,0)) anropades","Error",MB_ICONEXCLAMATION | MB_OK);
  134. return false;
  135. }
  136. gD3dDevice->BeginScene();
  137. D3DXVECTOR3 pos;
  138. pos.x=128.0f;
  139. pos.y=0.0f;
  140. pos.z=0.0f;
  141. RECT rc;
  142. rc.right=x;
  143. rc.left=width;
  144. rc.top=y;
  145. rc.bottom=height;
  146. gSprite->Begin(D3DXSPRITE_ALPHABLEND);
  147. gSprite->Draw(gTexture,&rc,NULL,&pos,0xFFFFFFFF);
  148. gSprite->End();
  149. gD3dDevice->EndScene();
  150. gD3dDevice->Present(NULL,NULL,NULL,NULL);
  151. return true;
  152. }


-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/

Senast redigerad 17:01 - 17:e September 2005


Zoulz 00:56 - 18:e September 2005 | Post #4
Medlem
Inlägg: 30


Skicka PM
Ser inget direkt som kan vara fel på din kod... Vad har du för storlek på din textur? Du vet att den måste vara två potens, annars kommer DirectGraphics att ändra storleken på den automagiskt och då kan man få rätt lustiga resultat.





Celeron 07:09 - 18:e September 2005 | Post #5
Medlem
Inlägg: 418


Skicka PM
Vad är två potens? Bilden är 640x200.

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



Zoulz 15:47 - 18:e September 2005 | Post #6
Medlem
Inlägg: 30


Skicka PM
    Citat av Celeron:
Vad är två potens? Bilden är 640x200.


Ah, då är det förmodligen det då. Höjden/bredden på bilden måste vara 2, 4, 8, 16, 32, 64, 128, 256, 512 etc. En potens av 2.

Nvidia kort brukar klara texturstorlekar upp till 4096, medan ATI's max brukar vara 2048.





Celeron 15:54 - 18:e September 2005 | Post #7
Medlem
Inlägg: 418


Skicka PM
Jasså. Det hade jag ingen aning om! Jag har inte räknat med potenser (eller vad det nu är man gör) såjag visst inte vad det var.
Jag har en fråga till nämligen varför jag måste sätta x positionen till samma storlek som bilden blir när jag inte visar hela bilden.

-------------------------
Det viktigaste är att ha roligt! Har ny hemsida: http://www.freewebs.com/cpperik/



Sidor: 1

Forum huvudsida -> Programmering -> Direct3D textures/sprites som ändrar storlek :(
Atom feed

Du får inte posta i den här tråden | Till toppen