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

[SDL] SDL_BlitSurface a dostęp do pól prywatnych obiektów.

Ostatnio zmodyfikowano 2011-07-27 00:12
Autor Wiadomość
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.

C/C++
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
P-37027
malan
» 2011-07-25 19:52:45
Dałeś za mało kodu.
P-37029
wizardus
Temat założony przez niniejszego użytkownika
» 2011-07-25 19:56:33
C/C++
#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

C/C++
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

C/C++
#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:

C/C++
#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 );
    //                              m_pStartWindow -> ShowBackground(s_Desktop);
    SDL_Flip( s_Desktop );
    this->GameLoop();
};

void CStartWindow::ShowBackground( SDL_Surface * s_Desktop )
{
    /*
                                SDL_BlitSurface(s_ThemeScreen,
                                NULL,
                                s_Desktop,
                                NULL);
    */
}

Ale to rozwiązanie mnie nie zadowala. Pozdrawiam.
P-37030
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.
P-37047
malan
» 2011-07-25 22:57:00
Jaki z tego wniosek? :)
P-37052
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:

C/C++
CFoo;

CBar
{
private:
    CFoo * m_pFoo;
}

CFoo
{
private:
    CBar * m_pBar;
}

tak ? Bo kurcze staram sie tak robić i wyskakują mi błędy :\
P-37061
wizardus
Temat założony przez niniejszego użytkownika
» 2011-07-26 11:29:15
C/C++
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 ==========

P-37065
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ć :)
P-37095
« 1 » 2
  Strona 1 z 2 Następna strona