2011-12-30 8 views
5

Abbiamo recentemente portato il numero di serie dada GLUT a SDL. C'erano numerosi vantaggi nel fare ciò, ma anche alcuni inconvenienti, specialmente nell'area della gestione delle finestre.Gestione di finestre ingrandite utilizzando SDL

Bitfighter viene eseguito in una finestra con proporzioni fisse (800x600 pixel). Gli utenti possono rendere la finestra qualsiasi dimensione desiderata, ma acquisiamo l'evento di ridimensionamento e apportiamo le modifiche alle dimensioni richieste per garantire che la finestra mantenga le proporzioni corrette (utilizzando SDL_SetVideoMode).

(il seguente problema si applica a Windows, ma non è ancora stato testato su altre piattaforme. Quello che ho descritto qui di seguito si riferisce specificamente a Windows, anche se sto cercando una soluzione indipendente dalla piattaforma.)

Di solito, questo funziona alla grande, tranne quando gli utenti sfruttano la finestra facendo doppio clic sulla barra del titolo o utilizzando il pulsante di ingrandimento. In tal caso, l'evento di ridimensionamento della finestra viene richiamato con una dimensione della finestra che si avvicina alle dimensioni dello schermo (meno alcuni pixel per l'ornamento della finestra). Sfortunatamente, quando la finestra è ingrandita, SDL_SetVideoMode non ha alcun effetto (a differenza di GLUT che è stato in grado di ridimensionare una finestra ingrandita). Inoltre, le chiamate successive a SDL_GetVideoInfo segnalano la dimensione richiesta, non la dimensione corrente effettiva della finestra, quindi è difficile stabilire se il tentativo di ridimensionamento ha funzionato.

Sto cercando una piattaforma modo indipendente per eseguire una delle seguenti (in ordine decrescente di preferenza):

  1. ridimensionare una finestra dopo che è stato massimizzato
  2. Rileva quando una finestra è stato ottimizzato in modo da che, sapendo che non posso ridimensionarlo, posso almeno regolare il video da centrare
  3. Evitare che una finestra venga ingrandita (blocca i doppio clic sulla barra del titolo della finestra, usa il pulsante di ingrandimento e trascina la finestra sul parte superiore dello schermo)

Bitfighter è scritto in C++ e stiamo utilizzando l'ultima versione ufficiale di SDL.

+0

Sei in grado di provare SDL 1.3 HEAD? – genpfault

+0

Potremmo essere; dipende da quanto è stabile. Speriamo di rilasciare tra un paio di settimane. – Watusimoto

+1

Guardando attraverso il tuo codice, sembra che tu abbia effettuato la migrazione a SDL 2.0. Questo ha risolto i tuoi problemi? – faffy

risposta

0

Suppongo che tu usi OpenGL con SDL, perché prima hai usato GLUT. Non conosco alcuna soluzione per questo problema, eccetto punto 2. Se si desidera che il video abbia una dimensione specifica, basta lasciare l'SDL-finestra come lo è, e lo chiamo

glViewport(0, 0, width, height); 

con la giusta dimensione con le giuste proporzioni. Con queste soluzioni avrai ancora un bordo nero nella tua finestra, ma mostra solo quanto vuoi. (Con i primi 2 argomenti è anche possibile impostare la posizione della finestra nella finestra;))

1

Migrazione a SDL 2.0 (che a quanto pare hai già)

SDL 2.0 fornisce un'API migliore gestione delle finestre (ne fornisce effettivamente uno). Mentre ci sono ancora molti bug nella gestione di Windows in SDL 2.0 (specialmente sul lato Linux), è notevolmente migliorato dagli 1,2 giorni.