wizardus Temat założony przez niniejszego użytkownika |
[SDL] SDL_BlitSurface a dostęp do pól prywatnych obiektów. » 2011-07-25 19:24:33 Witam. Mam taki problem, mianowicie niedawno nauczyłem się podstaw OOP w C++, rozpocząłem teraz naukę SDL i mam takie pytanie. void CStartWindow::ShowBackground() { SDL_BlitSurface( s_ThemeScreen, NULL, ( m_pGra->ReturnDesktop() ), NULL ); } s_ThemeScreen jest "private" w klasie CStartWindow . m_pGra->ReturnDesktop zwraca wskaźnik SDL_Surface do ekranu. Po kompilacji konkretnie w momencie wywołania funkcji m_pStartWindow->ShowBackground(); nagle program się wyłącza. Czarne okienko SDL mignie i nie ma :<. Reszta kodu jest ok (sprawdzałem kilka razy, kombinowałem na różne sposoby, przekazując do funkcji nawet wskaźnik ekranu itd) Prosiłbym o ewentualne wskazówki co jest nie tak. Pozdrawiam P.S Dodam że moje IDE to DevC++ 4.9.9.2 |
|
malan |
» 2011-07-25 19:52:45 Dałeś za mało kodu. |
|
wizardus Temat założony przez niniejszego użytkownika |
» 2011-07-25 19:56:33 #include <SDL/SDL.h> #include <string> #include "headers.h"
using namespace std;
int main( int argc, char * args[] ) { CGame * Game = new CGame; Game->CreateStartWindow( Game ); Game->StartGame( 1024, 768, 0 ); SDL_Quit(); return 0; }
main.cpp enum GAMESTATE { GS_MENU = 0, GS_LOGIN = 1, GS_RUN = 2, GS_LOGOUT = 9 };
class CGame; class CPlayer; class CMenu; class CMenuItem; class CLoggedWindow; class CUserSurface; class CNPC; class CMap;
class CStartWindow { private: CMenu * m_pMenu; CGame * m_pGra; public: SDL_Surface * s_ThemeScreen; CStartWindow() { s_ThemeScreen = SDL_LoadBMP( "startwindow.bmp" ); m_pMenu = NULL; } CStartWindow( CGame * Game ) { s_ThemeScreen = SDL_LoadBMP( "startwindow.bmp" ); m_pMenu = NULL; m_pGra = Game; } void ShowBackground(); ~CStartWindow(); };
class CGame { private: GAMESTATE m_gGameState; CStartWindow * m_pStartWindow; CLoggedWindow * m_pLoggedWindow; SDL_Surface * s_Desktop; SDL_Event eEvent; public: CGame() { m_gGameState = GS_MENU; m_pStartWindow = NULL; m_pLoggedWindow = NULL; s_Desktop = SDL_LoadBMP( "startwindow.bmp" );; }; void CreateStartWindow( CGame * Game ) { CStartWindow * m_pStartWindow = new CStartWindow( Game ); }; SDL_Surface * ReturnDesktop() { return s_Desktop; } void StartGame( int, int, int ); void GameLoop() { while( m_gGameState != GS_LOGOUT ) { while( SDL_PollEvent( & eEvent ) ) { if( eEvent.type == SDL_QUIT ) { m_gGameState = GS_LOGOUT; } } } SDL_Quit(); }; ~CGame(); };
headers.cpp #include <SDL/SDL.h> #include "headers.h" #include <string>
void CGame::StartGame( int nWidth = 1024, int nHeight = 768, int nWindowMode = 0 ) { SDL_Init( SDL_INIT_EVERYTHING ); s_Desktop = SDL_SetVideoMode( nWidth, nHeight, 32, SDL_SWSURFACE ); SDL_WM_SetCaption( "JakasGra", NULL ); m_pStartWindow->ShowBackground(); this->GameLoop(); };
void CStartWindow::ShowBackground() { SDL_BlitSurface( s_ThemeScreen, NULL, ( m_pGra->ReturnDesktop() ), NULL ); }
class.cpp Rewelacji nie ma ale zaczalem to pisac na dobre dopiero wczoraj (po raz trzeci zastanawiajac sie nad tym jak powinien wygladac projekt). Pozdrawiam. Jeszcze jedno. Gdy umieszcze zmienna lokalną w metodzie wszystko działa. Podmieniłem kod na taki w pliku class.cpp: #include <SDL/SDL.h> #include "headers.h" #include <string>
void CGame::StartGame( int nWidth = 1024, int nHeight = 768, int nWindowMode = 0 ) { SDL_Surface * JakisSurface; SDL_Init( SDL_INIT_EVERYTHING ); s_Desktop = SDL_SetVideoMode( nWidth, nHeight, 32, SDL_SWSURFACE ); SDL_WM_SetCaption( "JakasGra", NULL ); JakisSurface = SDL_LoadBMP( "startwindow.bmp" ); SDL_BlitSurface( JakisSurface, NULL, s_Desktop, NULL ); SDL_Flip( s_Desktop ); this->GameLoop(); };
void CStartWindow::ShowBackground( SDL_Surface * s_Desktop ) { }
Ale to rozwiązanie mnie nie zadowala. Pozdrawiam. |
|
wizardus Temat założony przez niniejszego użytkownika |
» 2011-07-25 21:31:01 Zmieniłem IDE na VC 2010 E E.
Podczas debugowania dostałem
Access violation reading location 0x00000008.
Błąd odczytu pamięci niby. Nie rozumiem z jakiego powodu. |
|
malan |
» 2011-07-25 22:57:00 Jaki z tego wniosek? :) |
|
wizardus Temat założony przez niniejszego użytkownika |
» 2011-07-26 09:06:18 A wniosek jest krótki i niektórym znany... Jeśli chodzi o IDE to od x czasu próbuje sie przerzucić na VC++. Jeśli chodzi o program, chyba nie chcesz mi powiedzieć, że SDL nie korzysta z prywatnych pól obiektów... BTW. Jeśli mam dwie klasy CFoo CBar to żeby była obustronna koneksja między nimi to najpierw musi być deklaracja prosta ta czyli: CFoo;
CBar { private: CFoo * m_pFoo; }
CFoo { private: CBar * m_pBar; }
tak ? Bo kurcze staram sie tak robić i wyskakują mi błędy :\ |
|
wizardus Temat założony przez niniejszego użytkownika |
» 2011-07-26 11:29:15 enum GAMESTATE { GS_MENU = 0, GS_LOGIN = 1, GS_RUN = 2, GS_LOGOUT = 9 };
class CPlayer; class CMenu; class CMenuItem; class CStartWindow class CLoggedWindow; class CUserSurface; class CNPC; class CMap;
class CGame { private: GAMESTATE m_gGameState; CStartWindow * m_pStartWindow; CLoggedWindow * m_pLoggedWindow; SDL_Surface * s_Desktop; SDL_Event eEvent; public: CGame() { m_gGameState = GS_MENU; m_pStartWindow = NULL; m_pLoggedWindow = NULL; s_Desktop = SDL_LoadBMP( "startwindow.bmp" );; }; void CreateStartWindow( CGame * Game ) { CStartWindow * m_pStartWindow = new CStartWindow( Game ); }; SDL_Surface * ReturnDesktop() { return s_Desktop; } void StartGame( int, int, int ); void GameLoop() { while( m_gGameState != GS_LOGOUT ) { while( SDL_PollEvent( & eEvent ) ) { if( eEvent.type == SDL_QUIT ) { m_gGameState = GS_LOGOUT; } } } SDL_Quit(); }; ~CGame(); };
class CStartWindow { private: CMenu * m_pMenu; CGame * m_pGra; public: SDL_Surface * s_ThemeScreen; CStartWindow() { s_ThemeScreen = SDL_LoadBMP( "startwindow.bmp" ); m_pMenu = NULL; } CStartWindow( CGame * Game ) { s_ThemeScreen = SDL_LoadBMP( "startwindow.bmp" ); m_pMenu = NULL; m_pGra = Game; SDL_BlitSurface( s_ThemeScreen, NULL, ( m_pGra->ReturnDesktop() ), NULL ); SDL_Flip( m_pGra->ReturnDesktop() ); } void ShowBackground( SDL_Surface * ); ~CStartWindow(); };
LOGI: 1>------ Build started: Project: SDL_Tutorial, Configuration: Release Win32 ------ 1> class.cpp 1>c:\users\grzesiek\documents\visual studio 2010\projects\sdl_tutorial\sdl_tutorial\headers.h(35): error C2514: 'CStartWindow' : class has no constructors 1> c:\users\grzesiek\documents\visual studio 2010\projects\sdl_tutorial\sdl_tutorial\headers.h(6) : see declaration of 'CStartWindow' 1> main.cpp 1>c:\users\grzesiek\documents\visual studio 2010\projects\sdl_tutorial\sdl_tutorial\headers.h(35): error C2514: 'CStartWindow' : class has no constructors 1> c:\users\grzesiek\documents\visual studio 2010\projects\sdl_tutorial\sdl_tutorial\headers.h(6) : see declaration of 'CStartWindow' ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
|
|
malan |
» 2011-07-26 14:16:51 Szczerze Ci powiem, że nie chce mi się analizować Twojego kodu, gdyż jest on (przynajmniej dla mnie) trochę zawiły. Musiałbym się w niego wczytać. Po ogólnych oględzinach stawiam na wskaźnik z błędnym adresem, czyli np. z adresem zerowym. Użyj debuggera i sprawdzaj po kolei wszystko.
Jeżeli nic nie znajdziesz to wrzuć cały projekt (wraz z grafikami) na jakiś serwer i wtedy będziemy działać :) |
|
« 1 » 2 |