Flash: stage widht e height in contenitore

Di: dar_pri | 26/09/2020 18:17:13
Buongiorno. Avrei un quesito. Ho creato dei mc che verranno caricati nella root principale, fino a qui' niente di nuovo.Ora il problema e' questo, gli mc, che non sono altro in questo caso, che delle gallerie fotografiche, si basano su valori stageW e stageH, in pratica le foto si posizionano sullo stage e al clic non fanno altro che usare un tween allargandosi centralmente allo stage nella root (ovviamente). Il problema, e' che i valori "tot" dello stage del movie clip, non vengono piu' "ovviamente" riconosciuti dallo stage dove lo stesso verra' caricato, quindi ogni sistemazione delle foto si perde e si vanno a caricare calcolando il nuovo stage.Per esempio,l mc originale ha 600x400, lo stage root" dove c'e il contenitore" 1125x600... Ho provato di tutto, lockroot, this, parent, etc... ma e' ovvio che così non può funzionare... this o parent non puo' riferirsi a un valore di stage... quindi e finisco, come posso passare il valore dello stage originale "mc" al nuovo stage che ha il raccoglitore del movie clip? Non so' piu' come muovermi davvero... grazie se potete...Scrivo di seguito gli script, magari possono essere piu' chiari e servire anche ad altri:
Su secondo frame del movieclip originale:
_lockroot= true;
stop();
stageW = 600;
stageH = 400;
bgX = bg._x;
bgY = bg._y;
galleryX = gallery_mc._x;
galleryY = gallery_mc._y;
stageListener = new Object();
Stage.addListener(stageListener);
alignObjects = function () {
gallery_mc._x = galleryX-(Stage.width-stageW)/2;
gallery_mc._y = galleryY-(Stage.height-stageH)/2;
bg._x = bgX-(Stage.width-stageW)/2;
bg._y = bgY-(Stage.height-stageH)/2;
bg._width = Stage.width;
bg._height = Stage.height;
};
stageListener.onResize = function() {
alignObjects();
};
alignObjects();
stop();
All interno della gallery:
//puo' funzionare cosi??
stageW = Stage.width
stageH = Stage.height
//loop e size della foto al click
photoSize = 400;
totalPhotos = total;
for (i=0; i<totalPhotos; ++i) {
this.photo_mc.duplicateMovieClip("photo_mc"+i, i);
this["photo_mc"+i]._rotation = 10-random(20);
loadMovie(thumb[i], this["photo_mc"+i].thumbHolder);
this["photo_mc"+i].photo = photo[i];
this["photo_mc"+i].txt = txt[i];
this["photo_mc"+i].destScale = 100;
this["photo_mc"+i].originRotation = this["photo_mc"+i]._rotation;
this["photo_mc"+i].originX = random(stageW-this.photo_mc._width);
this["photo_mc"+i].originY = random(stageH-this.photo_mc._height);
this["photo_mc"+i].destX = this["photo_mc"+i].originX;
this["photo_mc"+i].destY = this["photo_mc"+i].originY;
this["photo_mc"+i].isDragging = false;
this.photo_mc1.startX = 300;
this.photo_mc1.startY = 400;
this.photo_mc2.startX = 100;
this.photo_mc2.startY = 200;
this.photo_mc3.startX = 280;
this.photo_mc3.startY = 400;
this.photo_mc2.startX = 120;
this.photo_mc2.startY = 220;
this["photo_mc"+i].onEnterFrame = function() {
this.bg._xscale += (this.destScale-this.bg._xscale)/5;
this.bg._yscale = this.bg._xscale;
//foto e zoom
if (this.isDragging == false) {
this._x += (this.destX-this._x)/5;
this._y += (this.destY-this._y)/5;
}
if (this._xscale == this.destScale) {
this.gotoAndStop(1);
this.photoHolder._visible = false;
this.textClip._visible = false;
if (Math.round(this.bg._xscale) == this.destScale) {
this.thumbHolder._visible = true;
}
} else {
this.thumbHolder._visible = false;
if (Math.round(this.bg._xscale) == this.destScale) {
this.photoHolder._visible = true;
this.textClip._visible = true;
}
if (focus !== this._name) {
this.destScale = 100;
this.destX = this.originX;
this.destY = this.originY;
this._rotation = this.originRotation;
}
}
this.textClip._y = this.bg._height/2;
border = (this.bg._width-this.photoHolder._width)/2;
this.photoHolder._x = this.bg._x-this.bg._width/2+(this.bg._width-this.photoHolder._width)/2;
this.photoHolder._y = this.bg._y-this.bg._height/2+border;
this.bttnLarge._width = this.bg._width;
this.bttnLarge._height = this.bg._height;
this.xscale = this.bg._xscale;
this.yscale = this.bg._yscale;
};
}
this.photo_mc._visible = false;
stop();

Risposte



SCUSATE,rimando il secondo script comunque piu' corretto.Il problema rimane comunque...e come...
//puo' funzionare cosi??
stageW = Stage.width
stageH = Stage.height
//loop e size della foto al click
photoSize = 400;
totalPhotos = total;
for (i=0; i<totalPhotos; ++i) {
this.photo_mc.duplicateMovieClip("photo_mc"+i, i);
this["photo_mc"+i]._rotation = 10-random(20);
loadMovie(thumb[i], this["photo_mc"+i].thumbHolder);
this["photo_mc"+i].photo = photo[i];
this["photo_mc"+i].txt = txt[i];
this["photo_mc"+i].destScale = 100;
this["photo_mc"+i].originRotation = this["photo_mc"+i]._rotation;
this["photo_mc"+i].originX = random(stageW-this.photo_mc._width);
this["photo_mc"+i].originY = random(stageH-this.photo_mc._height);
this["photo_mc"+i].destX = this["photo_mc"+i].originX;
this["photo_mc"+i].destY = this["photo_mc"+i].originY;
this["photo_mc"+i].isDragging = false;
this["photo_mc"+i].onEnterFrame = function() {
this.bg._xscale += (this.destScale-this.bg._xscale)/5;
this.bg._yscale = this.bg._xscale;
//foto e zoom
if (this.isDragging == false) {
this._x += (this.destX-this._x)/5;
this._y += (this.destY-this._y)/5;
}
if (this._xscale == this.destScale) {
this.gotoAndStop(1);
this.photoHolder._visible = false;
this.textClip._visible = false;
if (Math.round(this.bg._xscale) == this.destScale) {
this.thumbHolder._visible = true;
}
} else {
this.thumbHolder._visible = false;
if (Math.round(this.bg._xscale) == this.destScale) {
this.photoHolder._visible = true;
this.textClip._visible = true;
}
if (focus !== this._name) {
this.destScale = 100;
this.destX = this.originX;
this.destY = this.originY;
this._rotation = this.originRotation;
}
}
this.textClip._y = this.bg._height/2;
border = (this.bg._width-this.photoHolder._width)/2;
this.photoHolder._x = this.bg._x-this.bg._width/2+(this.bg._width-this.photoHolder._width)/2;
this.photoHolder._y = this.bg._y-this.bg._height/2+border;
this.bttnLarge._width = this.bg._width;
this.bttnLarge._height = this.bg._height;
this.xscale = this.bg._xscale;
this.yscale = this.bg._yscale;
};
}
this.photo_mc._visible = false;
stop();

Di: dar_pri | 26/09/2020 18:18:13


Hola!
...premetto che ho dato un' occhiata molto veloce allo script che hai postato, comunque credo che il problema sia da imputare al fatto che dopo il "loadMovie" non attendi il pieno caricamento del filmato...
...cerco di spiegarmi meglio, quando carichi un filmato dall'esterno i suoi parametri non sono disponibili subito ma solo a caricamento avvenuto, quindi quando vai a leggere i valori di altezza e larghezza del file caricato questi o saranno "nul" o saranno "0" (non ricordo come si comporta flash in questi casi) quindi le istruzioni:
this["photo_mc"+i].originX = random(stageW-this.photo_mc._width);
this["photo_mc"+i].originY = random(stageH-this.photo_mc._height);
non avranno effetto in quanto le variabili:
this.photo_mc._width
this.photo_mc._height
non avranno un valore valido, questo avviene perchè il codice viene eseguito prima che il movie caricato sia reso disponibile dal sistema per il suo utilizzo.
(sempre che non ho interpretato male lo script da te postato!)
Per ovviare a questo devi attendere dopo il loadMovie che il filmato sia stato effettivamente caricato e poi rilevarne le dimensioni.
Per fare questo ti consiglio di abbandonare l'uso del semplice loadMovie e passare alla classe:
MovieClipLoader
la quale mette a disposizione diversi metodi per la gestione del movie mentre viene caricato, cerco ora di elencarti brevemente i metodi che potrebbero fare al caso tuo, per il loro utilizzo ti rimando alla lettura della guida...
Creazione dell'oggetto:
var mcLoader = new MovieClipLoader();
Per il caricamento del movie esterno:
mcLoader.loadClip;
Per quando parte il caricamento, (se vuoi fare partire un preload):
mcLoader.onLoadStart;
Mentre il movie viene caricato, (se hai fatto partire un preload qui rilevi i byte attualmente caricati):
mcLoader.onLoadProgress;
Se vengono rilevati errori durante il caricamento, (ad esempio non viene trovata la risorsa da te indicata per essere caricata):
mcLoader.onLoadError;
Quando il caricamento del movie è completato, (ma il movie stesso non è ancora disponibile per l'utilizzo):
mcLoader.onLoadComplete;
Ed infine il metodo che fa al caso tuo:
mcLoader.onLoadInit;
Che viene usato per inizializzare il movie prima di essere mostrato, quindi anche posizionandolo a piacere sullo stage...
...spero di esserti stato utile...

Di: alispiegate | 26/09/2020 18:18:13


Grazie innanzi tutto per la risposta,Alispegate...Ho rinunciato all effetto random sullo stage,quindi le foto non si posizioneranno piu' random a ogni caricamento.Sono passato a un semplice,onRelease a foto ferme
Questo in pratica se ne andato...con lui l effetto...
//this["photo_mc"+i].originX = random(stageW-this.photo_mc._width);
this["photo_mc"+i].originY = random(stageH-this.photo_mc._height);
In pratica cosi' le photo non hanno piu' bisogno di leggersi i valori dello stage...
Si,il mio loadMovie e' un po' povero...ma la classe //MovieClipLoader la conosco pochino...mi spaventava "e spaventa" sviluppare questo codice in maniera diversa...
Prendo al volo l occasione di approfondire questa classe...
grazie davvero tanto per l interesse e per la tua competenza.Ciao

Di: dar_pri | 26/09/2020 18:19:13