SDL Rects übergeben



  • Hallo an die Liebe Community ;D,

    Kommen wir gleich mal zu meinem Problem. Ich habe um meine Kenntnisse mit der SDL zu festigen angefangen ein eigenes "Breakonoid" zu programmieren. Nur sitze ich im Moment vor einem kleinen Problem. In meiner Main-Funktion wird eine Funktion ausgeführt welche nur dafür zuständig ist, die Surfaces zu erstellen. Ich weiß immo nicht wie ich dieses Surface, welches in der Funktion deklariert wird wieder an die Main-Funktion zurückgeben kann. Ich weiß dass dieser Rect einem einen Pointer zurückgibt, also kann ich ja schlecht nen Pointer von einem Pointer machen.

    Hier erstmal die Funktion "Game_Init" welche für die initialisierung der Surface zuständig ist:

    int Game_Init (SDL_Surface *screen, SDL_Surface *Menue, int iHighscore, int iS_Volume, int iM_Volume)
    {
    
    	// Initialization of all SDL Subsystems.
    
    	// SDL_VIDEO
    	if (SDL_Init(SDL_INIT_VIDEO) == -1)
    	{
    		cout << "Can`t Init SDL_Video: " << SDL_GetError();
    		exit(1);
    	}
    
    	//SDL_AUDIO
    	if (SDL_Init(SDL_INIT_AUDIO) == -1)
    	{
    		cout << "Can`t Init SDL_AUDIO: " << SDL_GetError();
    		exit(1);
    	}
    	atexit(SDL_Quit);
    
    	// Initialization of the Main Screen
    	screen = SDL_SetVideoMode(800, 600, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
    
    	// Fill Screen with an Black Background
    	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 100, 100, 100));
    	SDL_Flip(screen);
    
    	// Load all Options out of the Stream-Data`s
    
    	ifstream Highscore ("Options/Highscore.opt", ios::binary);
    	Highscore.read ((char*) &iHighscore, sizeof (iHighscore));
    	Highscore.close ();
    
    	ifstream S_Volume ("Options/S_Volume.opt", ios::binary);
    	S_Volume.read ((char*) &iS_Volume, sizeof (iS_Volume));
    	S_Volume.close ();
    
    	ifstream M_Volume ("Options/M_Volume.opt", ios::binary);
    	M_Volume.read ((char*) &iM_Volume, sizeof (iM_Volume));
    	M_Volume.close ();
    
    	return 0;
    
    }
    

    Hier der Aufruf, in der Main-Funktion für die Game_Init und der darauffolgende Versuch Zugriff auf die Surface zu erhalten.

    Game_Init (screen, Menue, iHighscore, iS_Volume, iM_Volume);
    
        Menue = SDL_LoadBMP("Graphics/Background.bmp");
        if (Menue == NULL) 
    	{
            printf("Can't load image of the Background: %s\n", SDL_GetError());
            exit(1);
        }
    
    	SDL_BlitSurface(Menue, NULL, screen, NULL);
    	SDL_Flip(screen);
    
        SDL_Delay (3000);
    
    	return 0;
    }
    

    Ich hoffe, jemand weiß wie ich den Surface am einfachsten der Main funktion zurückgeben kann^^

    MFG,
    _LiFeMaKeR_.



  • Ich weiß dass dieser Rect einem einen Pointer zurückgibt, also kann ich ja schlecht nen Pointer von einem Pointer machen.
    

    Wieso kannst du keinen pointer von nem pointer machen? *Kopfkratz* spricht doch nichts dagegen.

    Aber davon abgesehen, sollte denke ich

    int Game_Init (SDL_Surface *&screen, SDL_Surface *&Menue, int iHighscore, int iS_Volume, int iM_Volume)
    

    statt

    int Game_Init (SDL_Surface *screen, SDL_Surface *Menue, int iHighscore, int iS_Volume, int iM_Volume)
    

    dein Problem erstmal lösen. Dann wird der vom aufrufer übergebene Parameter direkt geändert. Schön is imho allerdings was anderes ^^



  • naja, er könnt sich nen eigenen Datentypen definieren, was das ganze optisch
    "schöner" macht...

    typedef SDL_Surface*& P_SDL_Surface;
    

    somit würde die Funktion so aussehen:

    int Game_Init (P_SDL_Surface screen, P_SDL_Surface Menue, int iHighscore, int iS_Volume, int iM_Volume
    

    ^^



  • Mit schön mein ich natürlich nicht die Optik, sondern das Design :>

    Da er ja offensichtlich c++ verwendet würd ich das wenn man etwas größeres vorhat das erstmal mit ner Klasse wie

    class Video {
    SDL_Surface* screen; 
    public:
    Video(/*parameter zum initialisieren*/ ) {
    /*snip*/
    }
    int BlitOnScreen(SDL_Surface* source, SDL_Rect* sourceRct, SDL_Rect* targetRct) {
    return SDL_BlitSurface(source, sourceRct, screen, targetRct);
    }
    };
    

    kapseln.. so spart man sich das pointer rumreichen ein bißchen.
    Wenn mans wirklich "richtig" machen will würd man natürlich an das ganze nochmal völlig anders rangehen, wrapper für SDL_Surface* und das ganze eigentlich Programm von SDL etwas entkoppeln. Sehr praktisch wenn einem SDL zu langsam ist, und man sich dann doch entscheidet noch opengl dazuzupacken. (jaja, ich hör schon wieder die ersten über unnötigen overhead jammern 🙂 )

    Ist natürlich ne Riesenarbeit die für nen Anfänger imho etwas fehl am Platze ist. Deswegen meine ursprüngliche Lösung :>



  • wäre es (nur mal theoretisch) für C, würde es ja gar nicht anders gehen, oder?
    in C gibt ja keine Klassen (Apple verwendet meines wissens nach ein C welches
    Klassen beinhaltet, heißt das nich Objektiv-C?)

    man würde deine erste Lösung nehmen oder? Wiederum um es lesbarer zu machen, würde
    man in folge dessen ein typedef machen, oder?



  • Mein erste Lösung würde in C auch nicht gehen, da C keine Referenzen kann. (würde auch der typedef nichts helfen).

    Müsste man halt mit SDL_Surface** arbeiten.

    Also

    int Game_Init (SDL_Surface **screen, SDL_Surface **Menue, int iHighscore, int iS_Volume, int iM_Volume)
    

    und mit

    Game_Init (&screen, &Menue, iHighscore, iS_Volume, iM_Volume);
    

    aufrufen, sowie den code weiter unten in Game_Init anpassen.

    Prinzipiell ist aber ein typedef auf SDL_surface* keine schlechte idee, vorallem wenn man sich mit pointern auf pointer unwohl fühlt.


Anmelden zum Antworten