Diferència entre revisions de la pàgina «PyQt: Timers i pilotes rebotant»
(→Timers) |
|||
(Hi ha 3 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 11: | Línia 11: | ||
[[Fitxer:Qt-piloteta1.png]] | [[Fitxer:Qt-piloteta1.png]] | ||
+ | === Suggeriments per fer la pràctica === | ||
+ | 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. | ||
<br> | <br> | ||
Línia 16: | Línia 22: | ||
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. | 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'[http://qt-project.org/doc/qt-4.8/qtimer.html 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''. | |
− | + | ||
− | + | <syntaxhighlight lang="python"> | |
− | + | 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() | ||
+ | #... | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
<br> | <br> | ||
Línia 57: | Línia 74: | ||
== Gestió dels rebots == | == Gestió dels rebots == | ||
+ | [[Fitxer:Pilota-rebots.png|float|right]] | ||
+ | |||
Dintre de la funció '''actualitza_pos( ample, alt )''' de la pilota caldrà gestionar els rebots: | Dintre de la funció '''actualitza_pos( ample, alt )''' de la pilota caldrà gestionar els rebots: | ||
* Incrementar posició segons velocitat | * Incrementar posició segons velocitat |
Revisió de 17:07, 19 gen 2015
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é.