Autor Zpráva
alfik96
Profil
Zdravím vás,
měl bych jeden možná pitomý dotaz.
Následující problém:

Na akci stiknutí tlačítka načítám do MC externí swf (klip1.swf) pomocí loaderu, addChild() atd. a současně se ten MC dá do pohybu.
Po projetí funkce pro načtení se proměnná "i" zvýší o 1 (i++), takže při dalším stisku tlačítka se do MC načte a dá do pohybu následující swf (klip2.swf).

Je to v poho, jen mám problém s tím, že když se do toho MC načítá další a další swf.. tak bych potřeboval při každém stisku tlačítka, aby se ten příslušný(minulý) obsah MC vymazal, "vynuloval" a načetl se tam ten další obsah (klip2.swf) v pořadí. A to všechno na jedno stisknutí tlačítka.
Nedaří se mi nijak, aby se ten obsah MC vždy vymazal před tím než se tam načte a dá do pohybu (díky MC) následující, další swf.

pozn. Ten MC mám na ploše a nastaven na viditelnost false a v místě A. Stiskem tlačitka je MC viditelnost true a vykoná pohyb do místa B a tam zůstane.

Z toho pak plyne, že se mi při dalším stisku tlačítka nejprve zobrazí MC v místě A , ale s obsahem, který tam byl naposledy načten, dokud se nenačte následující obsah (swf) přes. Současně se dá do pohybu do místa B.
To má za následek, že tam v té animaci (pohybu z A do B) nejprve problikne minulý obsah (jedná se jen o setinu vteřiny asi, ale je to vidět) a potom teprve ten správný. Což je nežádoucí.

snad je to trochu srozumitelné.

Nevíte někdo jak na to, pls? Děkuji za případné odpovědi.
FlashManiac
Profil
alfik96:
pouzij funkci removeChild()
alfik96
Profil
FlashManiac:

když použiju removeChild() tak se mi zároveň načte obsah a vymaže a na výstupu to píše: Error #2007: Parametr child nesmí být null. a nezobrazí se vůbec nic.
alfik96
Profil
jednoduše řečeno, bych potřeboval zajistit, aby při stisku tlačítka se všechen minulý externí obsah vymazal a teprve potom se načetl obsah následující.
embee
Profil
To je proto, protoze pridavas pres addChild neco, co ma v tom okamziku hodnotu null...

Nicmene da se to resit pres unload() metodu loaderu - teda za predpokladu, ze loader je ten zminovany MC (on to sice de facto neni MC, ale chova se dost podobne, je to display object).

Takze cela akce by mohla vypadat takto:

klik tlacitka
unload puvodniho klipu (nezapomen osetrit prvni nacteni, protoze v tom okamziku ten loader nic nactene nema)
load noveho klipu do loaderu
na load.complete event se loader rozpohybuje a pricte se jednicka

V tomhle pripade nemusis ani moc resit add/remove child, protoze obsah se vymenuje uvnitr loaderu. Jeste poznamka - na lokualu ten unload

Vseobecne k mazani veci v AS3 - uz to nejde tak jednoduse jako v AS2. V as3 funguje jakysi garbage collector, ktery ti smaze objekt v pameti pokud:

- ma nastavenou hodnotu null
- neni v display object listu (= neni pridan nikam pres addChild)
- nema na sobe zadny listener se silnou referenci (vyjimku tvori resize a myslim enter frame listener, ty se musi rucne odebrat)

v takovem pripade se pak objekt z pameti predava garbage collectoru, ktery ho smaze. Mozna to nepopisuju uplne presne, ale tak nejak by to melo fungovat. V obecne rovine tedy:

klik
mc = null
mc.parent.removeChild(mc)
mc = nova hodnota
neco.addChild(mc)

- tohle ale vychazi z toho, ze MC mas instancovany pres skript a ne na TL (v takovem pripade se k nemu po removeChild uz nikdy nedostanes)

doufam ze jsem nenapsal nejakou blbost :D
alfik96
Profil
embee:

díky moc za radu, se v tom zas pohrabu a zkusím to.
díky, ale není uplně vyloučený, že nastanou i tak problémy jak se znám :-))
embee
Profil
alfik96:
vidim ze jsem nejak nedokoncil jednu vetu :D chtel jsem rict, ze na lokalu ten unload vetsinou nefunguje uplne spolehlive, ale na serveru uz ano.
alfik96
Profil
Zdarvím vás podruhé :)

Ještě bych se rád zeptal jestli jde nějakým způsobem udělat proměnnou závislou na měnícím se "i" (třeba od 0-10).
V následujícím scriptu:

var k1:Loader = new Loader();
var k1_url:URLRequest = new URLRequest("klip.swf");
k1.load(k1_url);
container1.addChild(k1);

Něco jako:
např. pro i = 2:

var k[i]:Loader = new Loader(); pro každé "i". Tohle se "AS" ale vůbec nelíbí :)

Chtěl bych tím vždy v dalším kroku vymazat, unloadovat předchozí loader např. k[i-1].unload(); atd. v dalších krocích. Pokud něco podobného vůbec jde..
Nevíte jak na to?
flz
Profil
alfik96:
najlepšie bude založiť nové vlákno.
alfik96
Profil
flz:
ok

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0