PDA

Visualizza la versione completa : [C++] Gestione finestre con SDL


robyp
14-08-2005, 17:28
Vi prego aiuto! questo pezzo di codice mi fa diventare pazzo!!!

Sto facendo una finestra con la libreria SDL (uso DevC++) che passa da videomode a fullscreen(schermo intero)alla pressione di un tasto. L'unico problema sta nella classe dove memorizzo altezza larghezza della finestra ed il flag per aggiungere modalità varie.. in questa classe ho due metodi (Windowed() e FullScreen())per switchare da una modalità all'altra: un metodo aggiunge la stringa SDL_fullscreen al flag ed nell'altro lo tolgo. i valori di width ed height che memorizzo nel costruttore nelle due funzioni elencate si perdono e width ed height contengono stranamente zero!
Perchè?!!!

Ecco la classe la prima parte è in un file header che includo e l'altra in un file cpp:

---Project.h---
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <iostream>

using namespace std;

#define FALSE 0
#define TRUE 1
#define endl \n

class SDLVideoclass{

public:
//contructors
SDLVideoclass(){}
SDLVideoclass(int w, int h, int flagsScreen);
//destructor
~SDLVideoclass(){}
//This will initialize the video system by calling SDL_SetVideoMode
int InitVideo();
//set to use a fullscreen display (default)
void Fullscreen();
//set to use a windowed display (default)
void Windowed();
//retrieve the current settings.
int VGetWidth();
int VGetHeight();
int VGetFlags();
SDL_Surface* VGetScreen();
private:
//private variables
int width;
int height;
Uint32 flags;
SDL_Surface *screen;
};

---sdlMain.cpp---

#include "project.h"

SDLVideoclass::SDLVideoclass(int w, int h, int flagsScreen)
{
//contructor with custom width and height settings. (still windowed mode)
width = w;
height = h;
flags = flagsScreen;
screen = NULL;
}

int SDLVideoclass::InitVideo()
{
if( SDL_Init(SDL_INIT_VIDEO) <0 ) //inizializzo il video
{
// SDL_GetError() ritorna una descrizione dell'errore
cout << "Errore init SDL: " << SDL_GetError() << "\n";
return FALSE;
}

atexit(SDL_Quit);

screen = SDL_SetVideoMode(VGetWidth(), VGetHeight(), 0, VGetFlags());

if (screen == NULL )
{
cout << "Problemi con il settaggio dello schermo:" << SDL_GetError();
return 1;
}
return TRUE;
}

int SDLVideoclass::VGetWidth() {return width;}
int SDLVideoclass::VGetHeight() {return height;}
int SDLVideoclass::VGetFlags() {return flags;}
SDL_Surface* SDLVideoclass::VGetScreen(){return screen;}

//PASSO DA WINDOWED A FULLSCREEN
void SDLVideoclass::Fullscreen()
{
SDL_ShowCursor(SDL_DISABLE); //hidden the mouse cursor
//aggiungo il flag fullscreen
flags |= SDL_FULLSCREEN;
/* oppure _flags = SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN;*/
//QUI SOTTO SE METTO 800 E 600 AL POSTO DEI METODI MI FUNZIONA!!
screen = SDL_SetVideoMode(VGetWidth(), VGetHeight(), 0, flags);//ANCHE SE METTO _width ed _height no!
}

//PASSO DA FULLSCREEN A WINDOWED
void SDLVideoclass::Windowed()
{
//rimuovo fullscreen flag
SDL_ShowCursor(SDL_ENABLE);
flags &= ~SDL_FULLSCREEN;
//QUI SOTTO SE METTO 800 E 600 AL POSTO DEI METODI MI FUNZIONA!!
screen = SDL_SetVideoMode(VGetWidth(), VGetHeight(), 0, flags);//COSì VA! SE METTO _width ed _height no!
}

GLI EVENTI ED IL MAIN LI GESTISCO COSì:

#include "project.h"

SDLVideoclass sdlIn;

void start()
{
//variabile per il ciclo principale
int fine = 0;
//memoria dello stato dello schermo (intero o a finestra)
int full_s = 0;
//flag per SDL_SetVideoMode
//Uint32 flags=SDL_HWSURFACE|SDL_DOUBLEBUF|SDL_FULLSCREEN;
//game loop, ovvero il loop che viene eseguito finche` non si esce
while(!fine)
{
//dichiariamo una struttura SDL_Event
SDL_Event event;
//SDL_WaitEvent attende il prossimo evento
SDL_WaitEvent(&event);

//premendo la x della finestra col mouse si esce
if ( event.type == SDL_QUIT ) fine = 1;

if ( event.type == SDL_KEYDOWN )
{
//ma si esce anche premendo Esc
if ( event.key.keysym.sym == SDLK_ESCAPE ) fine = 1;
if ( event.key.keysym.sym == SDLK_F1 )
{
//premendo F1 si passa in modalita` schermo intero
if(!full_s)
{
sdlIn.Fullscreen();
full_s++; //var per lo switch tra modalità
}
//premendolo ancora si torna in modalita` finestra
else
{
sdlIn.Windowed();
full_s--;
}

}

}
}//end while
}


int main(int argc, char* argv[])
{
//creo l'oggetto alla classe SDLVideoclass per la gestione delle funzioni video con la libreria SDL
SDLVideoclass sdlIn(800,600,SDL_HWSURFACE|SDL_RESIZABLE);
//creo la finestra
sdlIn.InitVideo();
//inizia l'esecuzione in ascolto di eventi
start();
return 0;
}


GRAZIE MILLE
Roby

robyp
14-08-2005, 17:49
Cavolo! Pensare che copiandolo qua mi sono riletto il codice e l'ho trovato! mi fosilizzavo sulla classe e l'errore era nel main!
scusate ho fatto un errore di distrazione..managgia. ho dichiarato globale sdlInn ma nel main ne instanzio un'altro quindi istanzio due classi una inizializzata e l'altra no.. Ops... :zizi:

alka
14-08-2005, 18:55
Evitiamo l'enfasi e le esortazioni nei titoli. :)

Ciao! :ciauz:

Loading