Lavorando con Cocos2d su mac osx e non su dispositivo iOS, mi sono imbattuto nella complessità di gestire la finestra a diverse risoluzioni, a calcolare la toolbar o bottombar della finestra nei resize, e nella gestione del fullscreen, requisito oramai fondamentale affinché l’applicazione venga accettata sullo store per osx.
Dopo molti test e molti tutorial cercati sulla rete sono riuscito a trovare una strada che mi permetta di lavorare in maniera decente.
Come prima cosa ho ridimensionato la finestra nella view presente nel template di cocos2d, in modo da gestire l’intera area, portandola da questa:
a questa (facendo in modo che la view interna occupi l’intera area della finestra)
e poi negli attributi della window, settare il fullscreen:
Fatto questo, nel nostro AppDelegate, dove generalmente inizializziamo il nostro framework e la nostra applicazione, arriviamo a definire e ridefinire una serie di caratteristiche della finestra, della view opengl e del frame:
Inizializziamo il nostro director e prendiamo le dimensioni del display principale, e calcoliamo la dimensione della title bar facendo la differenza tra le dimensioni dei due frame ottenuti:
1 2 3 4 5 6 | NSRect frameOpenGL = glView_.frame; NSRect frameWindow = window_.frame; NSRect mainDisplayRect = [[NSScreen mainScreen] frame]; CGFloat display_width = mainDisplayRect.size.width; CGFloat display_height = mainDisplayRect.size.height; CGFloat titleBarHeight =frameWindow.size.height-frameOpenGL.size.height; |
a questo punto calcoliamo l’aspect ratio dello schermo, per capire se stiamo lavorando in 4:3, 16:9, 16:10 etc, questo perche vogliamo riproporre lo stesso aspect ratio alla nostra finestra.
1 | double ar = mainDisplayRect.size.width / mainDisplayRect.size.height; |
Definiamo la dimensione iniziale che vogliamo dare alla finestra (forzando cosi la dimensione definita nel nostro Xib)
La height la calcoliamo in base alla width e al nostro aspect ratio.
1 2 | CGFloat min_width = 800; CGFloat min_height = roundf(min_width / ar); |
poi impostiamo la risoluzione della view opengl. Le due sono indipendenti. Possiamo avere una finestra di 800×600 pixel ma ad una risoluzione inferiore o maggiore. Ovviamente maggiore e’ la risoluzione e migliore sarà la qualità grafica.
1 2 | CGFloat work_width = 1280; CGFloat work_height = roundf(work_width / ar); |
ora aggiorniamo la dimensione del frame (del rettangolo) della finestra e della view opengl con i dati impostati precedentemente e impostiamo l’aspect ratio alla finestra:
1 2 3 4 | [window_ setFrame:NSMakeRect(0, 0, min_width, min_height+titleBarHeight ) display:YES]; [glView_ setFrame:CGRectMake(0, 0, min_width, min_height)]; [window_ setContentAspectRatio:NSMakeSize(display_width, display_height)]; |
infine centriamo la finestra nello schermo sulla base della risoluzione e del frame .
1 2 3 | NSScreen * screen = window_.screen; NSRect r = screen.frame; [window_ setFrameTopLeftPoint:NSMakePoint(r.size.width/2 - frameWindow.size.width/2, r.size.height/2 + frameWindow.size.height/2)]; |
In questo modo otteniamo un sistema gestibile per il controllo della dimensione della finestra a runtime e della risoluzione di rendering.