Non sara' una vera e propria pillola, semplicemente diverse righe di Action Script commentate il piu' possibile per cercare di spiegarvi i concetti alla base di movimenti prospettici e le loro possibili implementazioni rispetto a mouse o altro.
Aprite FlashMX su un documento di 550 x 400 pixels [default] e settate un framerate a 30.
Ora disegnate un rettangolo di 300 x 100 pixel
Assicuratevi che abbia un riempimento solido e con alfa ad almeno 30% [consiglio di usare un colore chiaro, giallo ad esempio] e il bordo come volete...
Ora salvatelo come movieClip con punto di registrazione centrale ... dategli un nome di istanza mc , create un layer sopra questo nella root e scrivete il codice sottoriportato.
Buoni esperimenti a tutti
Codice PHP:
stop();
// Concetti base sulla scala in prospettiva
// Scale=fl/(fl+z)
// [[url]http://www.bit-101.com/tutorials/perspective.html[/url]]
// ... maledetto baco ...
// maggiore sara' z, piu' distante sara' l' oggetto
// Scala
// f = dimensione iniziale
// z = livello di zoom
// x,y = posizionamento
MovieClip.prototype.scale = function(f,z,x,y) {
var s = f / (f + z);
var xcenter = Stage.width/2;
var ycenter = Stage.height/2;
this._x = xcenter + (x * s);
this._y = ycenter + (y * s);
this._xscale = this._yscale = s * 100;
}
var mc_size = mc._width; // larghezza del movie genitore per riferimenti sulla distanza
var zoom = 70; // da quanto parte la zoomata
var zoomarray = new Array(); // necessario per la memoria delle distanze
var total_mcs = 20; // quanti ne duplica [Diminure zoom_step al crescere dei duplicati]
// alcuni esempi di accoppiate decenti:
// total_mcs = 10; zoom_step = 0.6;
// total_mcs = 20; zoom_step = 0.15;
// total_mcs = 30; zoom_step = 0.05;
var distance = 200; // incrementa la distanza
for(var i = 0; i < total_mcs; i++) {
var nowi = total_mcs-i; // rovescio la profondita' per far si che il depth corrisponda
mc.duplicateMovieClip("mc"+i,nowi,this); // duplico
zoomarray[i] = zoom + (distance * i); // assegno la zoomata in base alla profondita'
_root["mc"+i].z = zoomarray[i]; // assegno il riferimento z per ogni mc
_root["mc"+i].onEnterFrame = function() {
var x = _root._xmouse - Stage.width/2; // x centrale
var y = _root._ymouse - Stage.height/2; // y centrale
this.scale(mc_size,this.z,-x,-y);
// applico la scala e gli faccio seguire il mouse al contrario rispetto lo stage
// this.scale(mc_size,this.z,x,y); cosi' avrebbe seguito il mouse
}
}
mc._visible = false; // del primo non ci faccio piu' niente ...
var zoom_step = 0.15; // velocita' di zoomata;
var zoom_backvelocity = 2; // velocita' differente quando torna indietro [1 per lasciarla uguale]
_root.onMouseDown = function() {
this.onEnterFrame = function() {
for(var i = 0; i < total_mcs; i++) {
if(i==(total_mcs-1) && _root["mc"+i].z < -300 && zoom_step>0) { // se l'ultimo e' a zoom -300 torno indietro
zoom_step = -1*(zoom_step) * zoom_backvelocity;
}
else if(i==0 && _root["mc0"].z > 100 && zoom_step<0) { // se il primo e' a scala 100, torno avanti
zoom_step = -1*(zoom_step) / zoom_backvelocity;
}
zoom -= zoom_step * i; // rimpicciolisco sempre piu' la zoomata [e' inversa quindi aumenta la scala]
zoomarray[i] = zoom + (distance * i); // riassegno la memoria della zoomata
_root["mc"+i].z = zoomarray[i]; // riassegno il riferimento al movieClip
if(_root["mc"+i].z < -300) { // verifico che non sia troppo grande
_root["mc"+i]._visible = false; // e in caso lo faccio sparire [effetto trapasso]
}
else {
_root["mc"+i]._visible = true;
}
}
}
}
_root.onMouseUp = function() {
delete this.onEnterFrame;
}