martedì 1 marzo 2011

Processing| Gioco stile pong con Wiimote


Lo scopo del gioco è quello di bloccare tutti i cubetti in arrico facendoli rimbalzare indietro muovendo la "racchetta". Per farlo è sufficiente impugnare il Wiimote in orizzontale e ruotarlo per far muovere la "racchetta" verso l'alto o verso il basso.
Ogni 5 punti, la velocità del gioco aumenta ed è possibile compiere al massimo 3 errori. Al terzo errore il gioco termina.
il codice non  è molto complicato, tuttavia facciamo qualche considerazione su alcuni metodi:
  • int ln(int n): serve per poi modificare la posizione del testo con il punteggio, in base al numero di cifre del punteggio;
  • float stab(float Y): riduce l'effetto "vibrazione" della racchetta;
  • void newpos(): assegna al mattoncino (o pallina a seconda di come lo volete vedere) una nuova posizione e un nuovo colore (entrambi casuali);
  • boolean impact(): ritorna true se vi è un impatto tra la pallina e la racchetta;
  • void backg(): disegna lo sfondo del gioco, che cambia di colore ad ogni avvio.
import lll.wrj4P5.*; 
Wrj4P5 wii; 
color c = color(0,0,0); //ball color 
int width_=600;  
int height_=500; 
float x = width_; //ball position 
float y = width_; //ball position 
float speed = 5; 
  
boolean back=false; 
float yuser=0;  
int imp=0; 
int lives=3; 
PFont f; 
float Y,oldY=0; 
boolean conn=false; 
  
float r=random(255/20); //background 
float g=random(255/20); 
float b=random(255/20); 
  
  
void setup() { 
  size(width_,height_); 
  f=loadFont("Purisa-48.vlw"); 
  
  newpos(); 
  
  wii=new Wrj4P5(this); 
  wii.connect(); 
  
} 
  
void draw() { 
  if(conn==true || (wii.rimokon.isConnected())){ 
    conn=true; 
    backg(); 
  
  
    if(lives<=0){ 
      textFont(f,40); 
      text("Game Over",width/2-100,height/2); 
      return; 
    } 
  
    move(); 
  
    fill(255); 
    textFont(f,26); 
    text("Lives: "+lives,width-110,height-10); 
    textFont(f,40); 
    text(imp,width-(25*ln(imp)),30); 
    Y=(float)((wii.rimokon.senced.x+1)*(height/3+50)); 
  
    Y=stab(Y); 
  
    display(); 
  }else{ 
    fill(0); 
    textFont(f,16); 
    text("Trying to find a Wiimote",width/2-100,height/2); 
  } 
} 
  
int ln(int n){ 
  int i=0; 
  while (n>0){ 
    n=n/10; 
    i++; 
    println(n); 
  } 
  return i; 
} 
  
float stab(float Y){ 
  if (abs(Y-oldY)>2.5){ 
        oldY=Y; 
        return Y; 
  } 
  return oldY; 
} 
  
void move() { 
  if(!back){ 
    x = x - speed; 
    if (x <0) { 
      println("-1"); 
      lives--; 
      newpos(); 
    } 
  }else{ 
    x = x + speed; 
    if(x>=width){ 
      back=false; 
      newpos(); 
    } 
  } 
} 
  
void newpos(){ 
    x = width; 
    y=random(height-30); 
    c=color((int)random(255),(int)random(255),(int)random(255)); 
} 
  
void display() { 
  fill(c); 
  stroke(c); 
  rect(x,y,30,30); 
  fill(20); 
  noStroke(); 
  rect(10, Y,40,80); 
  if(impact()){ 
    back=true; 
    imp++; 
    println(imp); 
    if(imp%5==0) 
      speed++; 
  } 
} 
  
boolean impact(){ 
  if((x<=50 && x>(50-speed)) && ((y<Y+80) && (y+40>Y))) 
    return true; 
  return false; 
} 
  
void backg(){ 
  for(int i=0;i<height/20;i++){ 
    fill(color((i+1)*r,(i+1)*g,(i+1)*b)); 
    noStroke(); 
    rect(0,20*i,width,20); 
  } 
} 
  
Nel video qui sotto potete vedere il gioco in esecuzione.


UPDATE 07/03/11: I sorgenti e i file .jar sono disponibili su github

0 commenti:

^