PONG CLOCK

Un orologio molto movimentato…

In questa versione

  • la palla si sincronizza con l’orologio del tuo computer al primo cambio dei minuti
  • successivamente la palla segnala
    • secondi, ogni volta che urta una paletta
    • minuti, quando va fuori e riparte dalla parte opposta con una nuova traiettoria

Il movimento delle palette potrebbe essere reso ancora più naturale.

final float dimPalla=5;
float minX, maxX, minY, maxY, dimX, dimY, lineaP; 
color lineaS;
BARRA barra_s, barra_d;
float barraB, barraH;      
PALLA palla;
float xp, yp;      
int   h, m, m2, s, mm, ritardo;

PFont font;

void setup()
{
  size(500, 350); 
  rectMode(CENTER);  
  smooth();                  
  strokeWeight(2);   
  font=loadFont("C20.vlw"); 
  textFont(font);
  textAlign(CENTER);

  lineaP=width/2;  
  lineaS=color(200, 200, 100);
  barraB=width/40;
  barraH=height/8;

  minX=1.5*barraB;  
  minY=dimPalla;
  maxX=width-minX;  
  maxY=height-dimPalla;
  dimX=maxX-minX;   
  dimY=maxY-minY;

  barra_s=new BARRA(barraB, height/2, barraB, barraH); 
  barra_d=new BARRA(width-barraB, height/2, barraB, barraH);   
  palla=new PALLA();

  ritardo=0;  
}

void draw()
{
  background(0);

  // linea verticale
  stroke(lineaS);
  line(lineaP, minY, lineaP, maxY);                       

  // orologio digitale
  h=hour();
  m2=minute();         
  s=second();
  mm=millis();  
  if(m2 != m)
  {
	palla=new PALLA(); 
	m=m2;
	ritardo=mm;
	if(m%2 == 0)
	  ritardo-=1000;
  } 
  mm=mm-ritardo;

  fill(255);  
  text(nf(h, 2), lineaP-20, 20);            
  text(nf(m, 2), lineaP+20, 20);            

  palla.aggiorna();

  xp=palla.x();
  yp=palla.y();
  barra_s.aggiorna(xp, yp);
  barra_d.aggiorna(xp, yp);
}


class BARRA
{
  final color coloref=color(50, 150, 150);  
  final color colores=color(25, 75, 75);  

  float x, y;
  float B, H;
  float minYb, maxYb;

  BARRA(float nx, float ny, float nB, float nH)
  {
	x=nx;
	y=ny;
	minYb=barraH/2+dimPalla;
	maxYb=height-barraH/2-dimPalla;
  }
  void aggiorna(float nx, float ny)
  {
	if(s < 59)
	{
	  if(x < lineaP && nx < lineaP || x > lineaP && nx > lineaP)
	  {
		if(ny > maxYb)
		  y=maxYb;
		else if(ny < minYb)
		  y=minYb;
		else
		  y=(y+ny)/2;   
	  }
	}  
	stroke(colores);   
	fill(coloref);
	rect(x, y, barraB, barraH);
  }
}

class PALLA
{
  final color colores=color(200, 100, 100);
  final color coloref=color(255, 200, 100);

  final float minANG=PI/20, maxANG=PI/2.5;

  float   diametro;
  float   x, y;
  float   Y0, dx, dy, seno;

  PALLA()
  {
	diametro=dimPalla;
	Y0=random(dimY);
	seno=sin(random(minANG, maxANG));
  } 
  void aggiorna()
  {             
	if(s < 59) { dx=mm*dimX/1000.0; dy=Y0+seno*dx; dx=dx%dimX; if((mm/1000) % 2 == 0) x=minX+dx; else x=maxX-dx; y=dy%(2*dimY); if(y > dimY)
		y=2*dimY-y;
	  y+=minY;

	  stroke(colores);
	  fill(coloref);
	  ellipse(x, y, diametro, diametro);    
	}
  }

  float x() { 
	return x; 
  }
  float y() { 
	return y; 
  }
}