11. april 2005 - 22:26Der er
16 kommentarer og 1 løsning
Skiftende tekst
Jeg skal lave en flash-siden, hvor teksten skifter løbende. Teksten skal læses fra en ekstern fil, fx. asp, php eller xml. Der skal være flere forskellige afsnit den randomly skifter mellem. Hvordan ser et sådan script ud i Flash og evt. xml?
Så kan du læse det i flash med XML-objektet og parse det ind i et array. Det kan du så shuffle med funktionen fra denne artikel[1]. Så kan du vise første element i arrayet i et tekstfelt.
Jeg tror jeg forstår principperne men... Jeg har ikke lavet en xml før og forstår ikke helt men jeg har lige prøvet. Det ligner ikke helt det jeg har set andre steder. Hvor ![CDATA[ og hvorfor .. til sidst?
Hm, alt mellem CDATA kommer direkte med som det ser ud. Altså har du nu tre tekster, der hedder "{linjeskift}Ko{linjeskift}". Du har jo lavet to linjeskift, så kommer de med. skal de ikke være med, skal du fjerne dem, så det hedder <text><![CDATA[Ko]]></text> - så er teksten kun "Ko".
Du bør lave det i CDATA, for så kan du skrive alle tegn. Ellers ville du jo ikke kunne skrive for eksempel < eller ", for det ville ikke være lovlige tegn, det da ville ændre i XML-strukturen.
Det to prikker til sidst er blot for at indikere, at hernede kan der komme flere <text>-noder - prikkerne skal selvfølgelig ikke med :/
Ok det er til at forstå. Jeg kan bare ikke få xml-teksten til at komme ind i flash
Min xml ser sådan ud <?xml version="1.0" encoding="iso-8859-1"?> <texts> <text><![CDATA[Ko ]]></text> <text><![CDATA[Hest ]]></text> <text><![CDATA[Gris ]]></text> </texts>
Jeg har kigget på det link du gav mig og har lagt alt actionscript i en frame og har lavet en dynamisk takstboks med instance name flash_citat1.text og var citat.
Min kode i flash ser sådan ud xml_obj = new XML(); xml_obj.ignoreWhite = true; xml_obj.load("flash_content.xml");
xml_obj.onLoad = function(s) { if (s) { trace("xml loaded"); flash_citat1.text = this.childNodes[0].text; // osv osv } else { trace("xml NOT loaded"); } }
function shuffle(a) { var i, r, t, l = a.length; for (i = 0; i < l; i++) { r = Math.floor(Math.random() * l); t = a[i]; a[i] = a[r]; a[r] = t; } }
var citat = ["flash_citat1.text"]; shuffle(citat); trace(citat); // de samme elementer, bare i ny rækkefølge (måske)
xml_obj = new XML(); xml_obj.ignoreWhite = true; xml_obj.load("flash_content.xml"); var citater = new Array(); xml_obj.onLoad = function(s) { if (s) { for (var i = 0; i < this.firstChild.childNodes.length; i++) { citater.push(this.firstChild.childNodes[i].firstChild.nodeValue); } shuffle(citater); trace("først citat er: "+citater[0]); } else { trace("xml NOT loaded"); } } function shuffle(a) { var i, r, t, l = a.length; for (i = 0; i < l; i++) { r = Math.floor(Math.random() * l); t = a[i]; a[i] = a[r]; a[r] = t; } }
Lige et lille tillægsspørgsmål så kjeg lidt fatter hvad der foregår ;o) Den lange remse med this.firstChild.childNodes er det xml'ens root, child og subchild der henvises til?
xml_obj = new XML(); xml_obj.ignoreWhite = true; xml_obj.load("flash_content.xml"); var citater = new Array(); xml_obj.onLoad = function(s) { if (s) { for (var i = 0; i < this.firstChild.childNodes.length; i++) { citater.push(this.firstChild.childNodes[i].firstChild.nodeValue); } visNæsteCitat(); } else { trace("xml NOT loaded"); } } function shuffle(a) { var i, r, t, l = a.length; for (i = 0; i < l; i++) { r = Math.floor(Math.random() * l); t = a[i]; a[i] = a[r]; a[r] = t; } } var interval = null; var næste_citat = null; function visNæsteCitat() { if (!næste_citat) { næste_citat = citater.concat(); shuffle(næste_citat); } flash_citat1.text = næste_citat.pop(); if (!interval) { interval = setInterval(visNæsteCitat, 25 * 1000); } }
Og dit tekstfelt bør hedde flash_citat1 som instance navn - variable navn er ikke noget man bruger, vel? :)
Du kan tilføje en trace, så du kan se, om der sker noget:
xml_obj = new XML(); xml_obj.ignoreWhite = true; xml_obj.load("flash_content.xml"); var citater = new Array(); xml_obj.onLoad = function(s) { if (s) { for (var i = 0; i < this.firstChild.childNodes.length; i++) { citater.push(this.firstChild.childNodes[i].firstChild.nodeValue); } visNæsteCitat(); } else { trace("xml NOT loaded"); } } function shuffle(a) { var i, r, t, l = a.length; for (i = 0; i < l; i++) { r = Math.floor(Math.random() * l); t = a[i]; a[i] = a[r]; a[r] = t; } } var interval = null; var næste_citat = null; function visNæsteCitat() { if (!næste_citat || næste_citat.length == 0) { trace("vægler nye citater og shuffler dem"); næste_citat = citater.concat(); shuffle(næste_citat); } var c = næste_citat.pop(); trace("næste citat er: "+c); flash_citat1.text = c; if (!interval) { trace("sætter interval til at køre"); interval = setInterval(visNæsteCitat, 25 * 1000); } }
Det virker nu, rigtig dejligt. Slettede den gamle tekstboks og lavede en ny og så virkede det pludseligt. Nu må jeg vist hellere kigge lidt på koden så jeg forstår bare lidt af hvad der foregår. Tusind tak...point til dig :o)
Jeg har faktisk lige en sidste ting Jeg er interesseret i at teksten fader ud når der shuffles men hvordan laver jeg den overgang. Går ud fra jeg skal have flash_citat.text._alpha = 100; ind et sted men har svært ved at gennemskue hvordan den kommer ned på 0. Me den for-løkke?
Altså teksten fader ud før den skifter? Så ville jeg nok pakke dit tekstfelt ind i et movieclip og så sætte en onEnterFrame på movieclippet, som fadede ud, skiftede teksten og fadede ind igen.
Jeg prøver og ellers vender jeg tilbage med et nyt spørgsmål :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.