Skocz do zawartości

[DX] błąd podczas wczytywania tekstury


kabanek

Polecane posty

mam taki problem...

Zaczynam się uczyć DX i zacząłem od kursu http://www.gamedev.pl/tutorials.php?x=view&id=124

 

chciałem tą wiedzę zamknąć w klasy i coś mi nie wychodzi... Oto mój kod:

#ifndef H_TEXTURE
#define H_TEXTURE
#include <windows.h>
#include <ddraw.h>

class Texture
{
     private:
             bool Success;
             int Height;
             int Width;
     public:
            Texture(char * fineName, LPDIRECTDRAWSURFACE &lpDDS);
            bool loadTexture(char * fineName, LPDIRECTDRAWSURFACE &lpDDS);
            bool loaded();
            int getHeight();
            int getWidth();
};

#endif
%Ęip6ć6VFRfCvćFw2ćfwC6ć6VFRfCśFG&rćfwC6ć6VFRgVCFWGW&RćgVCFWGW&RŁFWGW&R6\"fĆTćRD$T5DE$u5U$d4RfśDE2F2fwCśĆEFWGW&RfĆTćRDE2Ś&FWGW&SŁŚĆEFWGW&R6\"fĆTćRD$T5DE$u5U$d4RfśDE2$D$$D&D2F3D26ć7\0$$DĆDvRTĆfĆTćRtU$D%De$dR\0b$ÓTF2fwC7V66W73f6S\0W76vT&TgVCRVF66v7FbĆRb333gVCgVCgVC%%4d$D&WGW&f6S\0vWD&ŚV7B$6ŚVb&fś&6ć77&VFT6F&ĆTD2T6VĆV7D&ŚV7B6ć7Ć$bDE2fwCvWDD2fśF2ÓDE&D&BF2&ć&vGF&ć&VvB6ć75$44DE2fwC&VĆV6TD2F2F2fwCVvC&ć&VvCF2fwCvGF&ć&vGFFVĆWFTD26ć7FVĆWFT&ŚV7B$\0\0\0F2fwC7V66W73G'VS&WGW&G'VSŚ&FWGW&SŁŚĆFVB&WGW&F2fwC7V66W73ŚBFWGW&SŁŚvWDVvB&WGW&F2fwCVvCŚBFWGW&SŁŚvWEvGF&WGW&F2fwCvGF%Ęip6fćFVbD6FVfćRD6ć6VFRfCvćFw2ćfwC6ć6VFRfCśFG&rćfwCŚ6Ć72Fć&fFS6\" fĆTćSD$T5DE$rDCD$T5DE$u5U$d4RDE3
& amp;7V66W73BBBVvC
BvGFV&Ć3Fć6\"ŚfĆTćRDE5U$d4TDU42fśFG6BD$T5DE$u5U$d4RfśDE4'&BB&ĆEFWGW&R6\"ŚfĆTćR&ĆFVB6\"vWDfĆTćRfB&BD$T5DE$u5U$d4RfśDE4V&D$T5DE$u5U$d4RfśDE4'&BvWDVvBBvWEvGFÓ6VćFb\0%Ęip6ć6VFRfCvćFw2ćfwC6ć6VFRgVCFććgVC6ć6VFRgVCFWGW&RćgVCF泣Fć6\"ŚfĆTćRDE5U$d4TDU42fśFG6BD$T5DE$u5U$d4RfśDE4'&BBbF&V7DG&t7&VFRTfśDBTb333łDEDBfwC7&VFU7W&f6RfśFG6BfśDE4'&Tb333łDEW76vT&TgVCRVF66v7FbFV7GW'b333gVCgVCgVC%%4d$DF2fwC7V66W73f6S&WGW&F2fwCśĆEFWGW&RfĆTćRbb333F2fwC7V66W72W76vT&TgVCRVF66v7FbFV7GW'b333gVCgVCgVC%%4d$DF2fwCF2fwCŚ&F泣ĆEFWGW&R6\"ŚfĆTćRFWGW&RBćWrFWGW&RfĆTćRF2fwCśDE2FV7GW&\0F2fwC7V66W73BfwCśĆFVBbb333F2fwC7V66W72W76vT&TgVCRVF66v7FbFV7GW'b333gVCgVCgVC%%4d$D&WGW& amp;f6SF2fwCVvCBfwCśvWDVvBF2fwCvGFBfwCśvWEvGF
FVĆWFRfCF2fwCfĆTćSfĆTćS\0F2fwC7V66W73G'VS&WGW&F2fwC7V66W73Ś&F泣ŚĆFVB&WGW&F2fwC7V66W73Ś6\"F泣ŚvWDfĆTćR&WGW&F2fwCfĆTćSŚBF泣ŚvWDVvB&WGW&F2fwCVvCŚBF泣ŚvWEvGF&WGW&F2fwCvGFfBF泣&BD$T5DE$u5U$d4RfśDE4V&D$T5DE$u5U$d4RfśDE4'&$T5B7&2łS#WÓ$T5BG7Bł3#ÓDE4V&fwC&BfśG7BĆDE4'&f7&2T\0&j\"rŚ    #include <windows.h>
#include <ddraw.h>
#include "Tank.h"
int windowSHeight = 800;
int windowSWidth = 600;
int depth = 32;
char appName[]="Tank by Kaban";
Tank *tank;             //deklaracja czołgu

//Deklaracje wskaźników DirectDraw
LPDIRECTDRAW lpDD                      = NULL;
LPDIRECTDRAWSURFACE lpDDSEkran         = NULL;
LPDIRECTDRAWSURFACE lpDDSObraz         = NULL;
int x;                                 //zmienna przechowująca położenie napisu
DWORD Czas_st=GetTickCount();

//zapowiedzi używanych funkcji
LRESULT CALLBACK Obsluga(HWND hOkno, UINT uMsg, WPARAM wPar, LPARAM lPar);
bool WczytajBMP(LPSTR nazwa_pliku, LPDIRECTDRAWSURFACE lpDDS);
void Render();
void Zwolnij();
//******************************************************************************
//******************************************************************************
//główna część programu
int WINAPI WinMain(HINSTANCE hProgram, HINSTANCE, LPSTR, int swPokaz)
{
//Rejestracja klasy okna
WNDCLASS KlasaOkna;
KlasaOkna.style                  = 0;
KlasaOkna.hInstance          = hProgram;
KlasaOkna.lpszClassName      = appName;
KlasaOkna.lpfnWndProc        = Obsluga;
KlasaOkna.hIcon                  = LoadIcon(NULL,"ikona");
KlasaOkna.hCursor                = LoadCursor(NULL,IDC_ARROW);
KlasaOkna.lpszMenuName       = NULL;
KlasaOkna.cbClsExtra         = 0;
KlasaOkna.cbWndExtra         = 0;
KlasaOkna.hbrBackground      = (HBRUSH) GetStockObject(BLACK_BRUSH);
if(!RegisterClass(&KlasaOkna)) return 0;

//Utworzenie okna
HWND hOkno;
hOkno = CreateWindowEx(WS_EX_TOPMOST,appName,appName,WS_POPUP,0,0,300,200, NULL,NULL,hProgram,NULL);
if(hOkno==NULL) return false;

//wyświetlenie okna
ShowWindow(hOkno,swPokaz);
UpdateWindow(hOkno);

//utworzenie obiektu głównego i ustawienie trybów współpracy
if(DirectDrawCreate(NULL,&lpDD,NULL) != DD_OK) return false;
lpDD->SetCooperativeLevel(hOkno,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
lpDD->SetDisplayMode(windowSHeight,windowSWidth,depth);            //ustawienia ekranu

//stworzenie powierzchni podstawowej
DDSURFACEDESC ddsd;
ZeroMemory(&ddsd,sizeof(ddsd));
ddsd.dwSize  = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(lpDD->CreateSurface(&ddsd,&lpDDSEkran,NULL) != DD_OK) return false;


//stworzenie powierzchni pozaekranowej
ddsd.dwFlags        = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY;
ddsd.dwWidth        = 500;
ddsd.dwHeight       = 25;
if(lpDD->CreateSurface(&ddsd,&lpDDSObraz,NULL) != DD_OK) return false;


//Wczytanie bitmapy z zestawem kafli
//if(!WczytajBMP("napis.bmp",lpDDSObraz)) return false;

//wczytywanie tanka
tank= new Tank("tank1.bmp", ddsd, lpDDSObraz, 0,0);
if (!tank->loaded())
   return false;


//Główna pętla pobierania komunikatów
MSG msg;
while (msg.message!=WM_QUIT)  {
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))  {
  TranslateMessage(&msg);  DispatchMessage(&msg);
  }  else  {
  Render();
  }
 }

 //przywrócenie poprzedniej rozdzielczości
 lpDD->RestoreDisplayMode();
 //zwolnij obiekty DDRaw
 Zwolnij();

return msg.wParam;
}
//******************************************************************************
//******************************************************************************
//funkcja pobierania komunikatów
LRESULT CALLBACK Obsluga(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);
}
//******************************************************************************
//******************************************************************************
//funkcja wczytująca bitmapy
bool WczytajBMP(LPSTR nazwa_pliku, LPDIRECTDRAWSURFACE lpDDS)
{
HBITMAP hBMP;
BITMAP bmp;
HDC hdc;
HDC pomocniczy;
hBMP = (HBITMAP) LoadImage(NULL,nazwa_pliku,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
if(hBMP ==NULL) return false;
GetObject(hBMP ,sizeof(bmp),&bmp);
pomocniczy = CreateCompatibleDC(NULL);
SelectObject(pomocniczy,hBMP );
if(lpDDS->GetDC(&hdc) == DD_OK) {
  BitBlt(hdc,0,0, bmp.bmWidth, bmp.bmHeight, pomocniczy,0,0,SRCCOPY);
  lpDDS->ReleaseDC(hdc);
}
DeleteDC(pomocniczy);
DeleteObject(hBMP);
return true;
}
//******************************************************************************
//******************************************************************************
//funkcja renderująca
void Render()
{
    tank->print(lpDDSEkran,lpDDSObraz);
/*RECT src = {0, 0, 500, 25};
RECT dst = {0, 0,300,200};
lpDDSEkran->Blt(&dst,lpDDSObraz,&src,0,NULL);**/
}
//******************************************************************************
//******************************************************************************
//funkcja zwalniająca utworzone obiekty DDraw
void Zwolnij()
{
    //delete &tank;//usuwamy tanka
    if(lpDDSObraz!=NULL)   lpDDSObraz->Release();
    if(lpDDSEkran!=NULL) lpDDSEkran->Release();
    if(lpDD!=NULL)       lpDD->Release();
}

Link do komentarza
Udostępnij na innych stronach

chodzi o to, że chcę wczytać obrazek i gdy sprawdzam czy się wczytał wyskakuje kończy mi, że nie wczytało, tzn w linijce

 if (!tank->loaded())
   return false;

 

to ta funkcja zwraca mi false czyli że nie wczytało mi tekstury i kończy program... błąd pewnie jest w klasie ale nie wiem gdzie zacząć szukać...

Link do komentarza
Udostępnij na innych stronach

w metodzie loadTexture ustawiasz success na podstawie metody loadad() w ktorej to zwracasz stan zmiennej success....

troche to dziwne

co wiecej nie widze nigdzie inicjowania tej zmiennej jakas bazowa wartoscia, na moj gust tutaj jest cos nie teges

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Witam choć nie jestem fachowcem od C++ to powiem tak:

 

Powstawiaj sobie pułapki (breakpoints) np. taki kod:

 

...
MessageBox(NULL,"pulapka 1 w konstuktorze klasy","",MB_OK | MB_ICONINFORMATION);
...
' %jLJJ'+y&7i$iz:kfqzfŹĘip\0fCfCGRV[nb[6Ś'ŚVŚGŚRFśĆVŚćV[6śFśBFV[66RŚW7BśW\0F2fwC7V66W73f6S\0&WGW&f6S

 

Takie głupie, ale skuteczne szukanie błędu w programie jest wręcz bardzo dobrym rozwiązaniem, innym sposobem na szukanie błędów jest przelecenie programu debugerem... ale kto to lubi.... :P

 

Pozdrawiam.

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

no już wiem gdzie wywala błąd...

 Tank::Tank(char *fileName,DDSURFACEDESC &ddsd, LPDIRECTDRAWSURFACE &lpDDSObraz, int x, int y)
{
  if ((DirectDrawCreate(NULL,&lpDD,NULL) != DD_OK)||(lpDD->CreateSurface(&ddsd,&lpDDSObraz,NULL) != DD_OK))
  {
         MessageBox(NULL,"NIE Udało się wczytać tekstury!","",MB_OK | MB_ICONINFORMATION);
         this->Success=false;
         return;
  }

 

wyskakuje ten MessageBox

 

co tutaj jest źle?

Link do komentarza
Udostępnij na innych stronach

przy wywoaniu funkcji lpDD->CreateSurface(&ddsd,&lpDDSObraz,NULL)

wywala i taki bd.... Mi taki komunikat szczerze za wiele nie młwi...

 

Obrazek

 

zaczem kombinowa i nic

 

zmieniem nieco konstruktor na taki:

Tank(char *fileName,DDSURFACEDESC &ddsd, LPDIRECTDRAWSURFACE &lpDDSObraz, HWND &hOkno, int x, int y)  Tank::Tank(char *fileName,DDSURFACEDESC &ddsd, LPDIRECTDRAWSURFACE &lpDDSObraz, HWND &hOkno, int x, int y)
{
  TCHAR msg;
  msg=DirectDrawCreate(NULL,&lpDD,NULL);
  if (msg!=DD_OK)
  {
    this->Success=false;
    MessageBox(hOkno,DXGetErrorDescription9(msg),"gra1",MB_OK | MB_ICONINFORMATION);
    return;
  }

  lpDD->SetCooperativeLevel(hOkno,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);

  msg=lpDD->CreateSurface(&ddsd,&lpDDSObraz,NULL);
  if (msg!=DD_OK)
  {
    this->Success=false;
    MessageBox(0,DXGetErrorDescription9(msg),"gra2",MB_OK | MB_ICONINFORMATION);
    return;
  }


  this->loadTexture(fileName);
  if (!this->Success)
    MessageBox(NULL,"NIE Udao si wczyta tekstury!","",MB_OK | MB_ICONINFORMATION);
  MessageBox(NULL,"Wczytaem!","",MB_OK | MB_ICONINFORMATION);  
  this->X=x;
  this->Y=y;
  this->Success=true;
}

 

wynik dziaania tych funkcji zapisuj do zmiennej msg i sprawdzam, czy wszystko poszo ok. Przez pierwszy warunek przechodzi jak powinien, ale przy drugim wywietla mi taki komunikat kontrolny:

Obrazek

 

normalnie idzie si zaama :P

jakie pomysy?

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...