JavascriptProva

mercoledì 18 gennaio 2012

Overloading dei coriandoli... e delle funzioni!

Ora mi trovo davanti un oggetto che ha i metodi step() e muovi().
Che ne faccio?

Il metodo step() ha bisogno di diversi parametri
this.step=function(intX,intY,limX,limY){
...che sono necessari nel momento in cui io voglia far rimbalzare l'oggetto contro un limite.
I parametri intX e intY sono sempre necessari in quanto misurano la lunghezza di un passo, mentre i parametri limX e limY sono superflui quando non voglio far rimbalzare l'oggetto.
Allora posso ricorrere all'overloading, creando due metodi step, uno con i limiti e uno senza.
Credo che questa tecnica sia usabile in JavaScript.
Proviamo.
Questo è l'oggetto oggetto:
function oggetto(nome){
  var MioNome=nome;
 
 var Sinistra=Number((document.getElementById(MioNome).style.left).replace("px",""));
 var Alto=Number((document.getElementById(MioNome).style.top).replace("px",""));
 var Larghezza=Number((document.getElementById(MioNome).style.width).replace("px",""));
 var Altezza=Number((document.getElementById(MioNome).style.height).replace("px",""));
 var Intervallo;
 var dirX="destra", dirY="basso"
  this.step=function(intX,intY,limX,limY){
  
  if(Sinistra>limX)
   dirX="sinistra";
  if(Sinistra<0)
   dirX="destra" 
  if(dirX=="sinistra")
   intX=-intX;
  if(dirX=="destra")
   intX=intX;

  if(Alto>limY)
   dirY="alto";
  if(Alto<0)
   dirY="basso" 
  if(dirY=="alto")
   intY=-intY;
  if(dirX=="basso")
   intY=intY;

    Sinistra+=intX
  Alto+=intY
    document.getElementById(MioNome).style.left=Sinistra;
  document.getElementById(MioNome).style.top=Alto;
  }
 
 this.muovi=function(tempo, intX, intY, limX, limY){
  clearInterval(Intervallo);
  Intervallo=window.setInterval(function(oggetto){oggetto.step(intX, intY, limX, limY)},tempo,this);
 }
 this.inter=function(){
  clearInterval(Intervallo);
 }
  
}
Posso creare un'altra funzione step con i soli parametri relativi alla lunghezza del passo.
E ci vuole un'altra funzione muovi che chiami questa funzione anzichè quella con i limiti.

Ci provo.

function oggetto(nome){
  var MioNome=nome;
 
 var Sinistra=Number((document.getElementById(MioNome).style.left).replace("px",""));
 var Alto=Number((document.getElementById(MioNome).style.top).replace("px",""));
 var Larghezza=Number((document.getElementById(MioNome).style.width).replace("px",""));
 var Altezza=Number((document.getElementById(MioNome).style.height).replace("px",""));
 var Intervallo;
 var dirX="destra", dirY="basso"
  this.step=function(intX,intY,limX,limY){
  
  if(Sinistra>limX)
   dirX="sinistra";
  if(Sinistra<0)
   dirX="destra" 
  if(dirX=="sinistra")
   intX=-intX;
  if(dirX=="destra")
   intX=intX;

  if(Alto>limY)
   dirY="alto";
  if(Alto<0)
   dirY="basso" 
  if(dirY=="alto")
   intY=-intY;
  if(dirX=="basso")
   intY=intY;

    Sinistra+=intX
  Alto+=intY
    document.getElementById(MioNome).style.left=Sinistra;
  document.getElementById(MioNome).style.top=Alto;
  }
 
 this.step=function(intX,intY){
  
    Sinistra+=intX
  Alto+=intY
    document.getElementById(MioNome).style.left=Sinistra;
  document.getElementById(MioNome).style.top=Alto;
  }

 this.muovi=function(tempo, intX, intY, limX, limY){
  clearInterval(Intervallo);
  Intervallo=window.setInterval(function(oggetto){oggetto.step(intX, intY, limX, limY)},tempo,this);
 }

 this.muovi=function(tempo, intX, intY){
  clearInterval(Intervallo);
  Intervallo=window.setInterval(function(oggetto){oggetto.step(intX, intY)},tempo,this);
 }
 
 this.inter=function(){
  clearInterval(Intervallo);
 }
  
}
Ora uso i miei coriandoli con queste nuove funzioni...

Benissimo! Partono imperterriti e se ne vanno all'infinito! Segno che è stata usata la funzione muovi(tempo, intX, intY) anzichè la funzione muovi(tempo, intX, intY, limX, limY).

ù Ed ecco l'overloading realizzato!

Nessun commento:

Posta un commento