Newsgroup: it.comp.lang.javascript
Titolo: animazioni

Saluti a tutto il NG
Ho fatto delle animazioni utilizzando setTimeout e ricorsione ...tutto ok;
il problema č che sono anche interattive e quindi puň capitare di attivare,
ad esempio, lo spostamento verso destra quando non č ancora terminato quello
a sinistra: a quel punto l'oggetto incomincia a "vibrare" nel conflitto tra
la funzione sposta_destra e quella sposta_sinistra...
Per quanto abbia imposto dei controlli per impedire le chiamate al di fuori
dei casi consentiti, non riesco ad evitare che movimenti "frenetici" del
mouse mandino in crisi l'animazione.
Mi chiedo allora se non ci sia un errore di fondo nella strategia, se non ci
sia qualche strumento piů adatto a questi casi.. e chiedo consiglio a voi.
Thx yanez

 sia qualche strumento più adatto a questi casi.. e chiedo consiglio a voi.
Se vuoi un suggerimento piu' specifico serve che posti del codice.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

 Se vuoi un suggerimento piu' specifico serve che posti del codice.
sull'assegnazione del valore null (come pure sul return false) , ho le idee
un po' confuse..
cmq queste sono le funzioni...
function abbassa(obj,top)
  {
  var x=parseInt(document.getElementById(obj).style.top);
  if(x<top)
  {
  x=x+8;
  document.getElementById(obj).style.top=(String(x)+"px")
  timerdown=setTimeout("abbassa('"+obj+"',"+top+")",60)
  }
   else {clearTimeout(timerdown)}
  }
 function alza(obj,top)
  {
     var x=parseInt(document.getElementById(obj).style.top);
  if(x>top)
  {
  x=x-8;
  document.getElementById(obj).style.top=(String(x)+"px")
  timerup=setTimeout("alza('"+obj+"',"+top+")",60)
  }
  else {clearTimeout(timerup)}
  }
queste funzioni vengono richiamate all'interno di altre  su più oggetti
contemporaneamente,
function1 ()
              {.....
                abbassa(oggetto1, x)
                abbassa(oggetto2,y)
                ....
               }
function2 ()
              {.....
                alza(oggetto1, z)
                alza(oggetto2,w)
                ....
               }
thx
yanez

 
Forse ho capito male, ma potresti provare cosi:
<html>
<script language="javascript">
     function pause(numberMillis) {
         var dialogScript =
                    'window.setTimeout('
            +         'function () { '
            +        '    window.close(); '
            +        '}, '
            +         numberMillis
            +     ');';
         //IExplorer dal 5.5 in poi
         window.showModalDialog('javascript:document.writeln('
             + '"<script>'
             +     dialogScript
             + '<' + '/script>'
             +'")'
         );
     }
     //fai finta che siano le animazioni...
     function conta()    {
         for (count_1= 0; count_1< 11; count_1++)    {
             document.frm.txt_1.value= count_1;
             pause(500);
             document.frm.txt_2.value= (10 - count_1);
             pause(500);
         }
     }
</script>
<body onload="javascript:conta()">
	<form name="frm">
	    <input type="text" name="txt_1" value="">
	    <input type="text" name="txt_2" value="">
	</form>
</body>
</html>
Se usi la funzione pause tra le due animazioni impostando il numero 
corretto di secondi, dovrebbe funzionare.
VISTO CHE SON QUI NE APPROFITTO!!! (Scusa!) Qualcuno saprebbe fare un' 
equivalente della funzione pause() qui sopra per mozilla/netscape/etc.? 
Non deve funzionare come window.setTimeout, in background, il browser 
deve aspettare, non deve poter fare null'altro. Ho provato a looppare su 
equazioni pesanti ma la cpu va in crisi. Help...non voglio che gli 
utenti debbano per forza usare I.E. ... Si potrebbe provare con i 
millisecondi della data? Si pu• controllare continuamente l'ora senza 
appesantire la CPU?
Aiuto!

   document.getElementById(obj).style.top=(String(x)+"px")
Prima di eseguire questo codice, e poi assegnare il successivo timeout,
devi verificare che l'oggetto che stai abbassando abbia o meno il timeout
dell'alza() settato o meno.; in quel caso invochi clearTimeout.
Stessa cosa per l'alza().. devi verificare se ha o meno il timeout
dell'abbassa attivo o no.
Tra l'altro, utilizzare *TROPPI* timeout e' uno spreco incredibile di
risorse.. ricordati che Javascript non e' multithread.


 however improbable, must be the truth." (S.H.)
Ciao yanez

 javascript?
Perche' tu lo stai usando come se si trattasse di creare piu' thread, cosa
che non e' vera. In sostanza stai appesantendo le risorse del computer.
Potrebbe convenirti, invece che istanziare "n" volte le stesse funzioni
(abbassa e alza) su un numero imprecisato di oggetti, cambiare logica
applicativa, in modo da istanziarle al massimo una volta, e quindi gestire
il tutto con un unico setTimeout / setInterval.
E qui si ritorna alla creazione di un oggetto che gestisce un po' tutto
l'ambaradan.
In sostanza crei un oggetto gestore, quando vuoi alzare un altro oggetto
non fai altro che dire all'oggetto gestore "aggiungi questo oggetto alla
lista degli oggetti da alzare". L'oggetto gestore esegue un unico
timeout/interval in cui dice "okay, vediamo un po' quali oggetti ho da
alzare ora".
Tutta questa cosa va implementata a mano, secondo un'ottica OOP.
In questo modo non crei timeout inutili che appesantiscono il sistema.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'
che sara', non cambia cio' che e'.
Sta a te decidere poi come prendere questa cosa,se logorarsi per un passato
che non puoi cambiare, invece di prendere tutto il bene che il presente ti
offre." ()

 On Mon, 1 Mar 2004 12:19:37 +0100, yanez wrote:
OK!
Lo sapevo che quell'ultimo capitolo del manuale sugli oggetti personalizzati
prima o poi me lo sarei dovuto sorbire... ;-)
Un'ultima cosa (per questo 3d)...cosa intendi per ottica OOP?
Thx
yanez

 Un'ultima cosa (per questo 3d)...cosa intendi per ottica OOP?
Programmazione Orientata ad Oggetti
