Autor Zpráva
FlashManiac
Profil
Zdravím..
mám malý dotaz..
Zkouším si hrát s AS3 ale narazil jsem na problém volání funkcí, které jsou v nosném SWF(parent) z načteného SWF (child) našel jsem na webu sic nějaké rady jako třeba zde:
AS forum

ale neřeší to můj problém...
V principu si myslím, že tomám stejné.. nicméně m to píše:
TypeError: Error #1010: Termín není definovaný a nemá žádné vlastnosti. at MethodInfo-6()

ve zdrojovém SWF mám tohle:
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
/*import fl.motion.MatrixTransformer;
var matrix:Matrix = poleClipu[0].transform.matrix;
MatrixTransformer.rotateAroundExternalPoint(matrix,350,350,90);
poleClipu[0].transform.matrix = matrix;*/

var poleClipu:Array=new Array();
var loader:Loader = new Loader();
var poleAdres:Array=new Array();
var indexAdres:uint=0;


function inic():void{
	poleAdres.push("pozadi.swf");
	poleAdres.push('test.swf');
	poleAdres.push("submenu.swf");
	poleAdres.push('tlacitka.swf');

	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, zkontrolujNacteno);
	loader.load(new URLRequest(poleAdres[indexAdres]));
	
	preloader_mc.visible=true;
	preloader_mc.loader_mc.play();
}
function zkontrolujNacteno(e:Event):void{
	poleClipu.push(loader);
	indexAdres++;
	loader=new Loader();
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, zkontrolujNacteno);
	if(indexAdres<4){
		if(poleAdres[indexAdres]==null){
			indexAdres++;
			poleClipu.push(null);
		}
		loader.load(new URLRequest(poleAdres[indexAdres]));
	}else{
		preloader_mc.loader_mc.gotoAndStop(1);
		preloader_mc.visible=false;
		prijedPozadi();
	}
}


function prijedPozadi():void{
	addChild(poleClipu[0]);
	poleClipu[0].getChildAt(0).x=poleClipu[0].width*(-0.5);
	poleClipu[0].getChildAt(0).y=poleClipu[0].height*(-0.5);
	poleClipu[0].y=350;
	poleClipu[0].x=-350;
	
	var mujTween:Tween=new Tween(poleClipu[0],"x",Strong.easeOut,poleClipu[0].x,350,1,true);
	mujTween.addEventListener(TweenEvent.MOTION_FINISH,spustPrezentaci);
}
function spustPrezentaci(e:TweenEvent) {
	addChild(poleClipu[1]);
	addChild(poleClipu[2]);
	poleClipu[2].getChildAt(0).x=poleClipu[0].width*(-0.5);
	poleClipu[2].getChildAt(0).y=poleClipu[0].height*(-0.5);
	poleClipu[2].y=350;
	poleClipu[2].x=350;
	addChild(poleClipu[3]);
	poleClipu[3].getChildAt(0).x=poleClipu[0].width*(-0.5);
	poleClipu[3].getChildAt(0).y=poleClipu[0].height*(-0.5);
	poleClipu[3].y=350;
	poleClipu[3].x=350;
	poleClipu[3].getChildAt(0).inic();
	//var mujTween:Tween=new Tween(poleClipu[0],"rotation",None.easeNone,0,90,0.5,true);
 }
function works():void{
	trace('parent');
}

inic();

a v načítaém SWF je tohle:
import flash.events.MouseEvent;

function inic():void{
	prezentace_mc.gotoAndStop(1);
	spoluprace_mc.gotoAndStop(1);
	kontakt_mc.gotoAndStop(1);
	Mouse.hide();
	kurzor_mc.x=this.mouseX;
	kurzor_mc.y=this.mouseY;
	stage.addEventListener(MouseEvent.MOUSE_MOVE,chytMuchu);
	vytvorFce();
}
function chytMuchu(e:MouseEvent):void{
	kurzor_mc.x=this.mouseX;
	kurzor_mc.y=this.mouseY;
} 
function vytvorFce():void{
	prezentace_mc.addEventListener(MouseEvent.ROLL_OVER,naTlacitku);
	spoluprace_mc.addEventListener(MouseEvent.ROLL_OVER,naTlacitku);
	kontakt_mc.addEventListener(MouseEvent.ROLL_OVER,naTlacitku);
	prezentace_mc.addEventListener(MouseEvent.ROLL_OUT,mimoTlacitko);
	spoluprace_mc.addEventListener(MouseEvent.ROLL_OUT,mimoTlacitko);
	kontakt_mc.addEventListener(MouseEvent.ROLL_OUT,mimoTlacitko);
	
	prezentace_mc.addEventListener(MouseEvent.CLICK,prezentaceClick);
}
function naTlacitku(e:MouseEvent):void{
	e.target.play();
}
function mimoTlacitko(e:MouseEvent):void{
	e.target.gotoAndStop(1);
}
var prezentaceClick:Function= function():void{
	//trace(this)
	//trace(this.parent)
	//trace(this.parent.parent) 
	trace('child');
	MovieClip(this.parent.parent).works();
}
//inic();

je zvláštní že směr volání parent->child to zvládá OK ale jak chci zavolat fci z child->parent.. tak to vypíše chybu..
zdrojáky jsou zde:
http://uloz.to/5700785/projekt.rar

pokud by měkdo věděl jak na to byl bych vděčný.. jsem z toho poněkud zoufalý.. nechci to dělat pomocí AS2, pokud to nebude bezpodmínečně nutné..
embee
Profil
Podle me mas blbe cestu, tohle musi fungovat (nemam tu cs4, takze to nemuzu checknout... a stejne bez index.fla to uplne nejde). Tenhle error je casto zpusoben typem (ale v tom kodu typo nevidim, tak nevim)

A zkus zrusit warpovani do MovieClip() - to jsem u kontrukci cest nikdy nepouzival a funguje to f poho :) Co ti blijou ty tracy

//trace(this)
//trace(this.parent)
//trace(this.parent.parent)

?
FlashManiac
Profil
vysype to tohle:
[object MainTimeline]
[object Loader]
[object MainTimeline]

pak jsem přišel ještě na tehle způsob:
stage.getChildAt(0).spustPrezentaci();

funguje to..ale musel jsem vypnout striktní mód..

teď jsem ale zkusil i
this.parent.parent.spustPrezentaci();


a zazracne to jede.. vcera mi to nechtělo jet ani při vypnutém striktním módu.. trošku nechápu.. každopádně to teď už funguje
embee
Profil
No, striktni kod vypinat nemusis... teda z me zkusenosti - wrapnu to do anonymni funkce a compiler to pochrousta... ale je divne, ze pouzivas stejny figl a hazlo ti to error. Kazdopadne:

this.parent.parent.spustPrezentaci();

tenhle styl pouzivam ja. Jeste je moznost ta, ze pokud se jedna o tridu a ne o swf soubor, tak te tride muzes predat referenci na stage v konstruktoru a odkazovat se uvnitr tridy pres tu referenci. Taky reseni :) Ale to jenom u trid.
FlashManiac
Profil
embee:
tak parkticky ten samy styl (this.parent.parent.spustPrezentaci(); ) jsem používal i v AS2.. nevím zda používáš CS4 nebo CS3. Pokud CS3 je možné, že je to tam trošku benevolentnější a nemusíš vypínat striktní mód.. každopádně mi to teď funguje..
dík za pomoc
embee
Profil
FlashManiac:
cs3, 4 a 5 - vsude se to chova stejne :) nz, stejne sis to vyresil sam :)

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