Tjena
Jag laddar in flera textstycken i Flash med loadVars();.
När allt laddats in, sätter en animation igång, som efter varje "varv" byter text i ett fält.
Såhär har jag gjort:
myVars = new LoadVars();
myVars.load("http://www.blaha.com/test.php ");
myVars._path = this
myVars.onLoad = function (success) {
trace(this._path)
if (success) {
for(var num in this){
i = 1;
[b]_root.t[ i ] = this[num];[/b]
trace("text: " + num);
i++;
}
} else {
trace (" Error loading variables ");
}
};
stop();
Variablerna jag skickar in heter var1, var2, var3 osv... och jag vill sätta dessa som variabler i Flash när texten laddas in.
Efter varje varv på animationen ska texten alltså bytas ut till nästa, när den sista är visas ska den börja om från 1.
Problemet är den fetstilta raden, kan inte sätta variablerna som jag tänkt mig.
Några förslag?
Tack!
for(var num in this){
i = 1;
_root.t[ i ] = this[num];
trace("text: " + num);
i++;
}
För varje varv där, så sätter i till 1, det innebär att _root.t alltid kommer att vara _root.t.1
Det är väl inte riktigt så det är tänkt va?
Flytta i = 1; utanför for-satsen så ökar du den för varje num i this.
i = 1;
for(var num in this){
_root.t[ i ] = this[num];
trace("text: " + num);
i++;
}
Sen är jag lite tveksam till om du har en mc i _root som heter t, där du har flera variabler textfält som heter 1, 2, 3 osv.
Heter de inte snarare t1, t2, t3 osv?
Om jag har rätt borde det bli så här:
_root["t"+i] = this[num];
Yo,
Den första grejen, med att jag satte I inne i Loopen såg jag strax efter att jag postat här, så det är redan åtgärdat.
_root.t[x] är bara variabelnamn.
Tanken är att jag ska ladda in x antal texter i Flash och sedan visa dom i samma textarea, med start från text 1.
När text 1 visats färdigt, ökar jag en variabel som heter "active_text" (denna har ett initialt värde 1).
Problemet är alltså att jag vill sätta:
mytext.text = _root.t[active_text];
Great Success!
Nu gjorde jag såhär:
Frame 1:
stop();
var i = 1;
var foo = new Array();
myVars = new LoadVars();
myVars.load("http://www.mydomain.com/test.php");
myVars._path = this;
myVars.onLoad = function (success) {
if (success) {
for(var num in this){
_root["foo" + i] = this[num];
i++;
}
_root.maxnum = i - 3;
gotoAndPlay(2);
} else {
trace (" Error loading variables ");
}
};
Frame [mitt-i-animationen]:
if(!active_text || active_text == _root.maxnum){
active_text = 1;
}else{
active_text++;
}
moo = _root["foo" + active_text];
mytext.text = moo;
Det funkar strålande bra, tack för hjälpen!
Hej igen,
Nu ska jag bygga ut den här funktionen lite grann och skulle behöva få in ytterligare
data i min loop.
Variablerna som laddas in just nu heter var1, var2, var3, var4... och dessa sätts som _root.fooX (där X är en siffra som startar på 1.
Nu skulle jag alltså behöva ha in ett till värde, som ska ange idnummer för vilken bild som ska visas till vilken text, låt säga att vi kallar den för img1, img2, img3, img4...
OM jag nu vill kunna spara dessa på ett bra sätt i Flash, som olika variabler, hur ska jag göra?
Tack!
Om jag förstår dig rätt så borde det enklaste vara att göra ett object av varje fooX.
Följande kod har jag använt i en mp3-spelare en gång.
Kolla på for-loopen så förstår du nog hur det går till.
Annars får du hojta. :)
var songArray = new Array();
var playlistXML:XML = new XML();
playlistXML.ignoreWhite = true;
playlistXML.onLoad = function() {
for (var i = 0; i<this.firstChild.firstChild.childNodes.length; ++i) {
songArray[i] = new Object();
songArray[i].id_number = i;
songArray[i].art = this.firstChild.firstChild.childNodes[i].attributes.artist;
songArray[i].tit = this.firstChild.firstChild.childNodes[i].attributes.title;
songArray[i].fil = this.firstChild.firstChild.childNodes[i].attributes.url;
}
}
Sen är jag inte helt med på din förra lösning. :q
Du skapar en array som heter foo, men sen använder du inte den, utan skapar nya variablar som heter fooX istället, visst det funkar ju, men varför isåfall deklarera en array? Det kan iofs varit jag som förvirrade dig med mitt förra svar. Isåfall berodde det på att jag inte såg att du skapat någon array i ditt första inlägg...
Jag rekommenderar dig att köra på arrayen istället, i a f jag tycker det är enklare att hålla ordning på.
Aha, okej, jag alltså in en XML fil istället för som jag gjorde tidigare?
Det här med min Array som inte används är bara skräpkod som jag glömt att ta bort.
Vore kanon om du hade lust att visa lite hur XML filen ska se ut och hur den ska laddas in, fungerar detta precis som loadVars()?
Höll på med Flash väldigt mycket för flera år sen, men slutade strax efter att Flash 6 MX kom, så det var ett tag sen. Mycket av det man kunde då är borta nu, men en del sitter kvar :)
Vore kanon om du kunde visa ett XML exempel samt inladdningsbiten med.
Tack!
Du behöver ju inte använda en xml.
Men om du gör det kan den ju t ex se ut så här.
<roten>
<poster>
<post id="1" img="1"/>
<post id="2" img="6"/>
<post id="3" img="3"/>
<post id="4" img="1"/>
</poster>
</roten>
Och då laddar du in den så här.
var loadUrl:String = "xml/variabler.php"; //eller var nu din xml kan tänkas ligga och heta
var fooArray = new Array();
var loadMyXML:XML = new XML();
loadMyXML.ignoreWhite = true;
loadMyXML.onLoad = function() {
for (var i = 0; i<this.firstChild.firstChild.childNodes.length; ++i) {
fooArray[i] = new Object();
fooArray[i].id_number = this.firstChild.firstChild.childNodes[i].attributes.id;
fooArray[i].img = this.firstChild.firstChild.childNodes[i].attributes.img;
}
}
loadMyXML.load(loadUrl);
Klart som korvspad. Eller hur? :)
Yo!
Nu har jag fått det att fungera skitbra, precis som jag vill.
En liten fråga på vägen bara.
Jag ska hämta in x antal av de senaste posterna från ett forum och presentera i Flashfilen.
Det ska hämta en rubrik, samt 255 tecken av själva texten.
Kan jag (ska jag) då istället formatera xml-filen såhär istället:
<?xml version="1.0" encoding="utf-8"?>
<result>
<posts>
<post id="110" topic="My Topic">This is the first characters of my thread...</post>
<post id="110" topic="My Topic">This is the first characters of my thread...</post>
<post id="110" topic="My Topic">This is the first characters of my thread...</post>
<post id="110" topic="My Topic">This is the first characters of my thread...</post>
</posts>
</result>
Jag försöker nu få ut det som står mellan <></>, men utan att lyckas. Ska Googla lite mer på det här, men om någon vet vad jag ska använda, istället för attributes, får ni gärna tala om det :)
Tack!
Ja du kan formatera XML:en så.
För att läsa in:
fooArray[i].texten = this.firstChild.firstChild.childNodes[i].firstChild.value;
borde göra susen. :)
Hmm, nja, då blir det undefined.
Fler gissningar?
:)
Nu har nästan gjort klart det här.
Det återstår bara att fixa det här med Cross Domain's i Flash.
Texten laddas in schysst när jag kör filmen inuti Flash, men alla värden blir "undefined" när jag kör det i webbläsaren.
Jag har Googlat och sökt och kollat olika tutorials, om XML filer med ALLOW-DOMAIN osv. utan att fixa det här.
Vad är det enklaste sättet att ta sig runt den här problematiken?
Du laddar säkert inte in XML:en riktigt, du måste utgå från platsen där filen som innehåller flashen ligger när du laddar in den.
Dvs du har en html-fil, "index.html", i rooten, där du visar din flashfil som ligger i mappen "flash" i rooten. I mappen "flash" har du en mapp som heter "XML" som innehåller din XML-fil "vars.xml".
När du då provar det i flashen så funkar det utmärkt att köra på url:en "XML/vars.xml", men om du kör den genom "index.html" måste du köra på url:en "flash/XML/vars.xml".
Är du med? :)
Jo, jag är med.
"Problemet" är att jag laddar in en ASP fil, som "är" själva XML filen.
I min "index" fil anger jag "filmen.swf" och med loadVars() anger jag hela sökvägen, http://www.domänet.com/minfil.asp
Har även testat att gå via en sån här "proxy-fil", men med samma resultat.
Det är konstigt, för jag gjorde en liknande grej i förra veckan, fast med PHP, vilket funkade alldeles lysande.
Alla filer jag kör här, ligger i rooten på servern.
ligger index(.html?), filmen.swf och minfil.asp i samma katalog?
Isåfall skall det ju räcka att ha:
[B]var loadUrl:String = "minfil.asp";[/B]
var fooArray = new Array();
var loadMyXML:XML = new XML();
loadMyXML.ignoreWhite = true;
loadMyXML.onLoad = function() {
for (var i = 0; i<this.firstChild.firstChild.childNodes.length; ++i) {
fooArray[i] = new Object();
fooArray[i].id_number = this.firstChild.firstChild.childNodes[i].attributes.id;
fooArray[i].img = this.firstChild.firstChild.childNodes[i].attributes.img;
}
}
[B]loadMyXML.load(loadUrl);[/B]
Se det i fetstil
Nepps, samma sak då.
Alla filer ligger i samma mapp, direkt i rooten.
Nu kör jag html-filen "fristående", i Flashfilen laddar jag in "filen.asp", "crossdomain.xml", i xmlfilen kör jag allow="*".
Fattar verkligen inte det här.
Fler förslag?
Yes, det var mitt dumma huvud som spökade igen.
Hade gjort ett fel i XML filen, som gjorde att noderna tolkades fel.
Tack för hjälpen!
Inga problem, finnt att du fick det att fungera. :bire
Yes, visst var det :)
En fråga till bara...
Problemet förut berodde på att jag hade det här högst upp i min XML fil:
<result>
[b]<status>200</status>[/b]
<posts>
<post...>blaha...</post>
<post...>blaha...</post>
<post...>blaha...</post>
</posts>
</result>
När jag använder XML med ex.vis PHP så har jag alltid med <status> delen för att enkelt kunna visa om något gått fel.
Om jag vill kunna hantera detta på ett snyggt sätt i Flash, göra olika saker beroende på vad <status> har för värde, hur skulle det kunna se ut?
Jag tänker mig att om status är tex. "500", så ska ett felmeddelande visas i Flash, för i detta fall finns inga "<post />".
Har du provat att kolla hjälpfilerna i programmet? ;)
Men det är inga problem att läsa av din status-nod OCH post-noderna. Så länge man känner till hur man läser av en XML-fil, det vill säga.
Det allra enklaste är med hjälp av firstChild, lastChild och childNodes[X].
Den XML-en du har här ovanför kan vi också läsa så här:
<firstChild eller childNodes[0]>
<firstChild eller childNodes[0]>200</firstChild eller childNodes[0]>
<lastChild eller childNodes[1]>
<firstChild eller childNodes[0]>blaha...</firstChild eller childNodes[0]>
<childNodes[1]>blaha...</childNodes[1]>
<lastChild eller childNodes[2]>blaha...</lastChild eller childNodes[2]>
</lastChild eller childNodes[1]>
</firstChild eller childNodes[0]>
Är du med?
Så i ditt exempel här ovan hade vi alltså kunnat läsa av status-nodens värde med:
this.firstChild.[B]firstChild[/B].firstChild.nodeValue
och post-nodernas värden med:
this.firstChild.[B]lastChild[/B].childNodes[X].firstChild.nodeValue;
Men det allra enklaste för att kolla det inte är några post-noder borde ju vara en ekel if-sats, så här:
if (this.firstChild.lastChild.childNodes.length == 0) {
//Om det inte finns några poster
} else {
//Om det finns poster
}
Lycka till. :)