Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    95

    [C++] AIUTOO URG!! GESTIONE FINESTRE CON SDL

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    95
    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...

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Moderazione

    Evitiamo l'enfasi e le esortazioni nei titoli.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.