2011-12-15 8 views
0

Flashムービーを作成して、Flashムービーの既存のMovieClipを置き換える必要のあるテキストと画像URLの詳細を含むXMLを読み込みます。表示オブジェクトをFlash内の新しい表示オブジェクトに置き換えます。

Flashで既存のMovieClipを置き換える方法や、更新された/新しい表示オブジェクトが元の表示オブジェクトの元の外観を維持し、元の表示オブジェクトのTweeningが引き続き新しい更新された表示オブジェクト。

おかげ

スティーブン

アップデート:私はあなたの問題が何であるか本当にわからないんだけど


import flash.events.IOErrorEvent; 
import flash.net.URLLoader; 
import flash.net.URLRequest; 
import flash.events.Event; 
import flash.display.DisplayObject; 
import flash.display.MovieClip; 
import flash.display.Sprite; 
import flash.display.Loader; 
import flash.text.TextField; 
import flash.events.ProgressEvent; 


// get the number of children in display list 
var count:uint = numChildren; 

// get the url for the Ceres server 
//var configUrl:String = loaderInfo.parameters.configUrl; 

// load the config file from the server using the configUrl 
var configUrl:String = "C:\development\projects\ReadXMLInFlash\example_xml_ceres_response.xml"; //loaderInfo.parameters.configFileUrl; 
var defaultImgUrl:String = loaderInfo.parameters.defaultImgUrl; 
var urlRequest:URLRequest = new URLRequest(configUrl); 

// create the XML loader 
var urlLoader:URLLoader = new URLLoader(); 
urlLoader.load(urlRequest); 
urlLoader.addEventListener(Event.COMPLETE, onDataLoaded); 
//Error handling ; 
urlLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
urlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); 
//Could be an error or just a message; 
urlLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, onHTTPStatus); 

function onDataLoaded(evt:Event):void 
{ 
    var myXML:XML = new XML(evt.target.data); 
    var node:XML; 
    // loop through the XML 
    for each (node in myXML.dynamicGroups.DynamicGroup.assets.Asset.elements.Element) 
    { 
     // check the assetValue of the XML, if contains http then a link use 'createNewImageLoader' 
     if(String(node.assetTagName) == 'Image') 
     { 
      createNewImageLoader(node.assetValue, node.elementName); 
     } 
     else 
     { 
      // else it is text (e.g. a product descrition) use createNewTextLoader 
      createNewTextLoader(node.assetValue, node.elementName); 
     } 

    } 

} 

//error callbacks 
function onIOError(evt:IOErrorEvent) 
{ 
    trace("IOError: "+evt.text); 
    // if an error load the default image 
    var defaultImgLoader:Loader = new Loader(); 
    var defaultImgUrl:URLRequest = new URLRequest(defaultImgUrl); 
    defaultImgLoader.load(defaultImgUrl); 
    addChild(defaultImgLoader); 

} 
function onHTTPStatus(evt:HTTPStatusEvent) 
{ 
    //trace("HTTPStatus: "+evt.status); 
} 
function onSecurityError(evt:SecurityErrorEvent) 
{ 
    trace("SecurityError: "+evt.text); 
} 

// loads a image asset 
function createNewImageLoader(loadURL:String, elementname:String):void 
{ 
    for(var i:uint=0;i<numChildren;i++) 
    { 
     var display:DisplayObject = getChildAt(i); 
     if (elementname == display.name) 
     { 
      var loader:Loader = new Loader(); 
      var urlRequest:URLRequest = new URLRequest(loadURL); 
      loader.addEventListener(Event.COMPLETE, function(){ 
            loader.x = display.x; 
            loader.y = display.y; 
            addChild(loader); 
            removeChild(display); 
            }); 
      loader.load(urlRequest); 

     } 
    } 
} 
// adds new text to a display object 
function createNewTextLoader(textToLoad:String, elementname:String):void 
{ 
    trace("elementname:" + elementname); 

    for(var i:uint=0;i<count;i++) 
    { 
     var display:DisplayObject = getChildAt(i); 

     trace("displayName:" + display.name); 
     if (elementname == display.name) 
     { 
      var textToDisplay:TextField = new TextField(); 
      textToDisplay.text = textToLoad; 
      textToDisplay.x = display.x; 
      textToDisplay.y = display.y; 
      addChild(textToDisplay); 
      removeChild(display); 
      break; 
     } 
    } 
} 
+0

あなたが更新/新しい表示オブジェクトが保持します」によって何を意味しています元の表示オブジェクトの元の外観 "? – Kodiak

+0

MovieClipに青いテキストが含まれている場合、そのMCに追加された新しいテキストも同じ色などです。実行時にこれらのMovieClipsに新しいデータを挿入しようとしています。他の誰かが簡単なFlashムービーを作成すると、コードがXMLを読み込んで新しいデータをFlashムービーに挿入します。 – StephenAdams

+0

実行時に定数以外の何かを変更することができます。正確に何をしようとしていますか? – weltraumpirat

答えて

0

、または:ここで私はこれをロードするために使用しているコードです。何を達成しようとしているのですか?私はあなたの質問に私の能力の最大限に答えようとします。

コメントとコードで読んだことは、ムービークリップ内のテキストと画像を変更することです。

function createNewTextLoader(textToLoad:String, elementname:String):void 
{ 
    trace("elementname:" + elementname); 

    for(var i:uint=0;i<count;i++) 
    { 
     var display:DisplayObject = getChildAt(i); 

     trace("displayName:" + display.name); 
     if (elementname == display.name) 
     { 
      var textToDisplay:TextField = new TextField(); 
      textToDisplay.text = textToLoad; 
      textToDisplay.x = display.x; 
      textToDisplay.y = display.y; 
      addChild(textToDisplay); 
      removeChild(display); 
      break; 
     } 
    } 
} 

:これを行うには、ちょうどこのコードを変更

function createNewTextLoader(textToLoad:String, elementname:String):void 
{ 
// If the display object by the name of the value of "elementname" exists and it is a text field 
    if (getChildByName(elementname) != undefined && 
     getChildByName(elementname) is TextField) 
    { 
     var textToDisplay:TextField = (TextField)getChildByName(elementname);// I dont know if you need a cast here but just in case 
     textToDisplay.text = textToLoad;// change the text in the text field 
    } 
} 

と、この置き換え:私は実際には持っていない

function createNewImageLoader(loadURL:String, elementname:String):void 
{ 
    if (getChildByName(elementname) != undefined && 
     getChildByName(elementname) is Loader) 
    { 
     var loader:Loader = (Loader)(getChildByName(elementname); 
     var urlRequest:URLRequest = new URLRequest(loadURL); 
     loader.load(urlRequest); 
    } 
} 

:これで

function createNewImageLoader(loadURL:String, elementname:String):void 
{ 
    for(var i:uint=0;i<numChildren;i++) 
    { 
     var display:DisplayObject = getChildAt(i); 
     if (elementname == display.name) 
     { 
      var loader:Loader = new Loader(); 
      var urlRequest:URLRequest = new URLRequest(loadURL); 
      loader.addEventListener(Event.COMPLETE, function(){ 
            loader.x = display.x; 
            loader.y = display.y; 
            addChild(loader); 
            removeChild(display); 
            }); 
      loader.load(urlRequest); 
     } 
    } 
} 

をこのコードはまだテストされていますが、正しい質問に答えることさえある。

0

なぜあなたは既にステージ上にMCを持っているのですか?XMLを読み込んだ後にそれらを更新する必要があります...あなたはXMLを読み込んだ後に作成できませんか?

どちらの場合でも、更新メソッドを持つTextLoaderImageLoaderという2つの独自のクラス(MovieClipのサブクラス)を作成することをお勧めします。

package 
{ 
    import flash.display.MovieClip; 

    public class TextLoader extends MovieClip 
    { 
     private var _txt:TextField; 

     public function TextLoader() 
     { 
      _txt = new TextField(); 
      // do TextFormat stuff, set size and position of _txt 
      addChild(_txt); 

      // you could also set some initial text like: 
      _txt.text = "loading ..."; 
      // this will be overwritten later 
     } 

     public function update(label:String):void 
     { 
      _txt.text = label; 
     } 
    } 
} 

ImageLoaderも、このようになりますが、その代わりのTextFieldのはupdate(url:String)方法を介して更新されたローダーを得ました。

このようにXMLをロードする前のMCを作成:すべてのMCを更新し、XMLがロードされたときに

var allTxts:Array = []; 
for (var i:int=0;i<10;++i) 
{ 
    var txt:TextLoader = new TextLoader(); 
    txt.x = 50; 
    txt.y = (i+1) * 50; 
    txt.name = "txt_" + i; // the names you got in your xml 
    addChild(txt); 

    allTxts.push(txt); 
} 

function getTxtWithName(name:String):TextLoader 
{ 
    for (var i:int=0;i<allTxts.length;++i) 
    { 
     var txt:TextLoader = allTxts[i] as TextLoader; 
     if (txt != null && txt.name == name) 
     { 
      return txt; 
     } 
    } 
    return null; 
} 

function onDataLoaded(evt:Event):void 
{ 
    var myXML:XML = new XML(evt.target.data); 
    var node:XML; 
    // loop through the XML 
    for each (node in myXML.dynamicGroups.DynamicGroup.assets.Asset.elements.Element) 
    { 
     // check the assetValue of the XML, if contains http then a link use 'createNewImageLoader' 
     if(String(node.assetTagName) == 'Image') 
     { 
      var txt:TextLoader = getTxtWithName(node.elementName); 
      if (txt != null) 
      { 
       txt.update(node.assetValue); 
      } 
     } 
     else 
     { 
      // else it is text (e.g. a product descrition) use createNewTextLoader 
      var img:ImageLoader = getImageWithName(node.elementName); 
      if (img != null) 
      { 
       img.update(node.assetValue); 
      } 
     } 
    } 
} 
関連する問題