Temporizador para texto después de una acción

Buenas!
Para un trabajo tengo que crear el típico juego de Pong. Cada vez que la pelota llega al final se suma un punto y al llegar a 3 puntos se acaba la partida. Pero antes intento hacer aparecer durante unos segundos “Game Over” y luego se reinicie la partida y el contador. Como puedo poner el texto durante 3 segundos en medio de la pantalla? O es que hay algun fallo al escribirlo?

Aquí abajo dejo el codigo:

// Mides Tauler
int tx = 840;         // Pantalla VGA 840
int ty = 580;         // x 580

// Mides camp
int cx = tx - 20;     // Deixem 10 punts per banda de marge
int cy = ty - 20;     // Deixem 10 punt per banda de marge

//Variables pel mouse
float mx;
float my;

//variables per la pilota
float px;
float py;
int dirx = 1;
int diry = 1;

//variables detecció de raqueta/pilota
float i1x;
float i1y;
float i2x;
float i2y;

//aleatorietat
float rx;
float ry;
float irx;
float iry;

//marcador
int puntesq=0;
int puntdret=0;



void setup()	       // Rutina inicialitzacions
{
  size(840, 680);     // Obrim la finestra
  fill(255);          // definim el color de dibuix (blanc)
  noStroke();         // no dibuixem línies de contorn
  px=420;             // posició inical de la pilota
  py=290;             // posició inical de la pilota
}

void draw()		// bucle de programa
{
  rx=random(1,1);
  ry=random(1,1);
  if(rx>0.5) irx=1; else irx=0;
  if(ry>0.5) iry=1; else iry=0;
  
  
  //canvis estètics al camp 
background(240,130,0);     //fons taronje
  
fill(255);                  //cercle de les àrees
ellipse(830,290,470,560);   
ellipse(20,290,470,560);  
ellipse(20,290,470,560);   
fill(240,130,0);
ellipse(830,290,460,550);
ellipse(20,290,460,550);
rect(0,0,10,580);
rect(830,0,10,580);

  
fill(255);                  // centre del camp
ellipse(410,290,120,120);
fill(240,130,0);
ellipse(410,290,110,110);
 
fill(255);                 //àera petita
ellipse(160,290,90,90);   
ellipse(680,290,90,90);
rect(10,245,150,5); 
rect(10,330,150,5); 
rect(680,330,150,5);
rect(680,245,150,5);
fill(240,130,0);
ellipse(160,290,80,80);
ellipse(680,290,80,80);

  
// dibuixem el camp usant la funció rectangle
fill(255);
rect(407,10,5,cy);   // Línia vertical mig del camp
rect(10,10,5,cy);   // Línia vertical esquerra
rect(10,10,cx,5);   // Línia horitzontal superior
rect(10,cy+5,cx,5); // Línia horitzontal inferior
rect(cx+5,10,5,cy); // Línia vertical dreta
fill(0);
  
//Moviment de raquetes
mx = mouseX; 
my = mouseY;

if (my<20) my=20;    //limitar el moviment per dalt
if (my>490) my=490;  //limitar el moviment per baix

rect(30,my,15,70);   //dibuix de raqueta esquerra
rect(790,my,15,70);  //dibuix de raqueta dreta


//moviment de la pilota
if(dirx==1)
{px=px+3;} else {px=px-3;}  
if(px>820) dirx=0;
if(px<15) dirx=1;

if(diry==1)
{py=py+3;} else{py=py-3;}
if(py>560) diry=0;
if(py<15) diry=1;

fill(100,100,200);       //dibuixar pilota
ellipse(px,py,20,20);  
fill(255,255,255);

//Detector col·lisions pilota/raqueta
i1x=abs(45-px);
i1y=abs(my+35-py);
i2x=abs(790-px);
i2y=abs(my+35-py);


//canviar de direcció la pilota
if((i1x<10)&&(i1y<30))
{
  if(dirx==1) dirx=0; else dirx=1;
// factor aleatori de rebot
  if(irx==0) {if (diry==1) diry=0; else diry=1;}
}

if((i2x<10) && (i2y<30))
{
  if (dirx==1) dirx=0; else dirx=1;
// factor aleatori de rebot
  if (iry==0) {if (diry==1) diry=0; else diry=1;}
}


//Si la pilota passa de la raqueta esquerra
if(px<20)
{
px=420;  //situar la pilota al mig del camp
py=290;
if (irx == 0) {if (diry == 1) diry = 0; else diry = 1;}
  puntdret=puntdret+1;
delay(1000);   //1 segons de delay
}

//si la pilota passa de la raqueta dreta
if(px>815)
{
px=420;     //situar la pilota al mig del camp
py=290;
 if (iry == 0) {if (diry == 1) diry = 0; else diry = 1;}
   puntesq=puntesq+1;
delay(1000);     //1 segon de delay
}


//La partida s'acaba i apareix "game over"
if(puntesq==3 || puntdret==3) 
{ 
text("GAME OVER",290,200);
textSize(40);
fill(255);
puntesq=0; puntdret=0;
}


//marcador
rect(38,580,60,80);
rect(748,580,60,80);
text("PONG GAME",290,640);
textSize(40);
fill(240,130,0);
{
text(puntesq,55,635);
text(puntdret,765,635);
}

}

¡Hola!

Lo siento si mi español es malo, estoy usando el traductor de Google.

El problema que tiene está relacionado con su uso de delay(). Como está escrito en la referencia, delay() se usa para pausar scripts, no necesariamente para controlar la animación.

Sugeriría algunas cosas:

  • Podría ser útil separar lo que dibujes en diferentes funciones. Quizás puedas tener una función que dibuje la cancha, otra que dibuje el marcador y otra que dibuje las paletas y la pelota.
  • Para hacer que su efecto de animación, puede usar variables como un cronómetro, por ejemplo, cuando se marca un gol, puede hacer una declaración if que aumenta el cronómetro, y mientras el cronómetro es inferior a 1000, puede detener el movimiento de la pelota y palas. Lo mismo para Game Over, puedes tener un temporizador especial que detiene todo movimiento y dibuja el texto.

¡Espero que esto ayude!

1 Like