PyQt: Timers i pilotes rebotant
Exercici de pilota rebotant dins d'una pantalla.
L'implementem en PyQt (Python amb les llibreries Qt).
Contingut
Introducció[modifica]
Cal haver fet abans l'exercici PyQt: pintar dintre d'un widget.
Tindrem d'entrada una pantalla com aquesta però enlloc del controlar la posició de la pilota controlarem la velocitat. La pilota es mourà i rebotarà per les parets.
Suggeriments per fer la pràctica[modifica]
Cadascun d'aquests punts els anem aclarint més avall.
- Crear el timer i fer un print cada 100 ms
- Avançar la pilota, sense rebots. Podem deixar la posx i la posy en l'objecte Pantalla, tal i com ho teniem a la pràctica anterior.
- Crear objecte pilota i encapsular a dins els atributs i funcions descrits més avall.
- Gestionar els rebots dintre de l'objecte pilota.
Timers[modifica]
Per poder moure la pilota necessitareu un Timer: un temporitzador que regularment faci una crida a una funció, en el nostre cas per repintar la pantalla. En cada execució pintarem la pilota recalculant les seves noves coordenades i així crearem el moviment.
Utilitzarem l'objecte QTimer de Qt. Caldrà que l'inicialitzem en algun punt del codi (constructor), indicar on cridarà (connectar-lo al repaint), inicialitzar el temps d'intèrval i llançar-ho amb un start.
class Pantalla(QWidget):
#...
def __init__(self):
#...
self.timer = QTimer() # creem el timer
self.timer.timeout.connect( self.repaint ) # connectem la signal timeout al metode de repintat
#...
self.timer.start( 200 ) # engeguem el timer (temps en ms)
#...en algun altre punt del nostre codi...
#... si volem aturar la partida...
pantalla.timer.stop()
#...
Objecte Pilota[modifica]
Farem les coses bé. Crearem un objecte Pilota que contindrà els següents atributs.
- posx
- posy
- velx
- vely
- maxVel (de moment no el fem servir, però indicarà la màxima velocitat de la pilota)
- color (QColor, es dona en RGB)
- tamany (radi de la pilota)
I tindrà els següents mètodes:
- pinta ( QPainter )
- actualitza_pos ( amplada, alçada )
- setVelX ( valor )
- setVelY ( valor )
L'objecte Pantalla tindrà un objecte Pilota a dins, que gestionarà el seu propi moviment i rebot dintre de actualitza_pos (li passarem l'amplada i alçada del widget Pantalla per adaptarnos al seu tamany i fer els rebots correctament). Per tant, ara a Pantalla.pinta() tindrem només:
- Crear QPainter qp
- pilota.actualitza_pos(...)
- pilota.pinta( qp )
Connexions (però casi que millor ho deixeu pel final, de moment avanceu la pilota amb velocitat constant):
- xslider -> setVelX
- yslider -> setVelY
Gestió dels rebots[modifica]
Dintre de la funció actualitza_pos( ample, alt ) de la pilota caldrà gestionar els rebots:
- Incrementar posició segons velocitat
- Controlar que la posició de la pilota no ha sobrepassat cap dels 4 límits de les parets. Si ho ha fet, canviem:
- El signe (+ o -) de la velocitat.
- Col·loquem la pilota en el límit per si ens hem passat.
Velocitat variable[modifica]
Efectuem les connexions:
- xslider -> setVelX
- yslider -> setVelY
Recordatori: PyQt: connectant signals amb slots
I dintre d'aquests mètodes modifiquem la velocitat de la pilota. Veurem com canvia la trajectòria.
Connectem teclat amb els controls[modifica]
Volem modificar la velocitat de la pilota també amb les tecles de cursor.
Ho pots fer amb aquest article: PyQt: Events de teclat
El pas següent pot ser pintar una raqueta per fer el joc del ping-pong. La pots controlar amb les tecles també.