Scrolling i transformació món-pantalla ====================================== Introducció ----------- *Scrolling* `1 `__ Desplaçament dels elements de l'escena d'un videojoc (fons, text, etc). Els jocs abans del *scroll*: la tècnica coneguda com `flip screen `__. Tipus de scrolling: - Scrolling del fons, decoratiu. Ex: Joc d'arcade `Galaxian `__. - Parallax scrolling. Ex: joc d'arcade `Moon patrol `__. - Vertical scrolling. Ex: joc d'arcade `1943 `__. - Side scrolling. Ex: jocs de plataformes tipus `Super Mario bros `__ - Complet ("8 direccions"). Ex: jocs tipus `The legend of Zelda `__ Aquesta llista està ordenada segons la dificultat de programar-ho. Com programar un scroll decoratiu del fons ------------------------------------------ .. image:: Scroll_circular.png :align: center #. Aconseguir una imatge més ample, en la qual una part, de l'amplada de la finestra, estigui repetida. #. Visualitzar només una secció de la imatge de fons (una finestra). En pygame, podem fer que el fons sigui un sprite tota la imatge, molt més gran que la pantalla i amb coordenades negatives, o bé una imatge petita, que sigui una `subsurface `__ de la gran. #. Fer que quan la finestra arribi a *Tmax*, torni a *Tini*. Scroll complet: Un món més gran ------------------------------- El món (escenari, mapa) és més gran que la pantalla. És a dir, els elements del joc viuen en un món i a la pantalla es projecta una vista del món. Transformació món-pantalla (o *window-viewport*) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. image:: window-viewport.svg :align: center :height: 700 La funció de transformació de coordenades de món a coordenades de pantalla és una transformació lineal (un canvi de coordenades): translació + possible escalat. La transformació inversa també. En 3D la situació i els càlculs es compliquen: `2 `__ ... => concepte de `càmera `__. Com afecta això al bucle del joc? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A partir d'ara, podem entendre que el fons és el món i que **tots** els elements del joc (personatges, obstacles, tresors, .etc.) viuen en espai de món. Disposen, doncs, de dues representacions: la del món (les seves coordenades, mida,...) i la de la vista (la seva representació en la pantalla, potser només una imatge). El fons és un element més del joc: la representació del mapa. .. image:: Gameloop.svg :height: 400 - Actualització (*update*) => actualització dels elements, en coordenades de món. - Visualització (*render*) => visualització dels elements, transformats en coordenades de vista. - `Clipping `__: descartar (o tallar) els elements no visibles, per eficiència. - Tractament dels events (*processar input* & al.) => en coordenades de vista, transformades a coordenades de món. Cal emmagatzemar la transformació món-pantalla (la càmera). En 2D, la finestra del món és un rectangle, del qual es poden deduir les funcions de transformació. Més d'una vista --------------- Ara que ja sabem com fer la transformació món-pantalla, no hi ha problema en obtenir més d'una vista en el joc! Exemples: - Joc multijugador => pantalla dividida en dos o quatre... `3 `__ - `Mini-map `__: Vista en miniatura del món (sencer); sovint en una capa superior, com un HUD. Alguns enllaços interessants ---------------------------- - `Mètode *scroll* `__ de les *surfaces* de pygame - `Eines, mòduls i jocs de pygame que usen scrolling `__ - `pyscroll `__ - `gummworld2 `__