передать переменную из одного SWF в другой файл ActionScript? - PullRequest
1 голос
/ 02 ноября 2011

Я пытаюсь передать переменную из моего основного SWF в другой файл, который загружается в контейнер в главном SWF. объявил переменную внутри функции. Я не могу получить доступ к переменной. (Извините за большое кодирование) Моя кодировка Моя кодировка a.swf

 import flash.display.LoaderInfo;
 import flash.display.Sprite;
 import flash.text.TextField;
 import flash.text.Font;
 var nc:NetConnection = null;
 var textchat_so:SharedObject = null;
 var lastChatId:Number = 0;
 var chatSharedObjectName:String = "textchat";//i can access this variable
 var chatText:String = "";
 var mcCtr:int = 0;
 var align:String="gh";
 var msg:String;// i cannot access this variable
 listChat.visible = false;
 var tickerIdx:int = 0
 {
 nc = new NetConnection();
 nc.addEventListener(NetStatusEvent.NET_STATUS, ncOnStatus);
 trace("connect: "+ "xxx"); 
trace("connect: "+ "xxx");
    //chatSharedObjectName = connect.soNameStr.text;
    nc.connect("xxx");
   }
 function ncOnStatus(infoObject:NetStatusEvent)
{
trace("nc: "+infoObject.info.code+" ("+infoObject.info.description+")");

if (infoObject.info.code == "NetConnection.Connect.Success")
{
    initSharedObject(chatSharedObjectName);
}

  }


// format the text chat messages
  function formatMessage(chatData:Object)
 {

trace("room"+chatData.txtalign);
var number:String = chatData.user;
 align=chatData.txtalign;
 var myFormat:TextFormat = new TextFormat();
 myFormat.size =(chatData.txtsize);
 var tf:MarqueeTextField = new MarqueeTextField();
 myFormat.font=chatData.txtfont;
 tf.maxChars=100;
 tf.text =chatData.message ;
 tf.textColor = chatData.user; // <----------------------------------
 tf.defaultTextFormat=myFormat;
 //tf.width = stage.stageWidth / 2;

tf.width = stage.stageWidth;
tf.height = stage.stageHeight

 if(chatData.txtalign=="Left")
 {
 tf.autoSize ="left";
 }
 if(chatData.txtalign=="Right")
{
tf.autoSize = "right";
 }
//tf.x = tf.y = 100;
  //trace(stage.stageWidth);
if( listChat.numChildren >= 0 )
{
   //listChat.removeChildAt( 0 ); 

   }    
   listChat.visible=true;
   listChat.addChild(tf);
   var t:Timer = new Timer(chatData.txtspeed);
  t.addEventListener(
TimerEvent.TIMER,
function(ev:TimerEvent): void
{
    tf.text =tf.text.substr(1) + tf.text.charAt(0);

}


);
 t.start();
 if(listChat!=null)
 for (var i:int = listChat.numChildren-2; i >= 0; i--) {
   listChat.removeChildAt (i);
 }
 msg=chatData.txtalign;
  return msg;
 }

 function syncEventHandler(ev:SyncEvent)
  {
var infoObj:Object = ev.changeList;

// if first time only show last 4 messages in the list
if (lastChatId == 0)
{
    lastChatId = Number(textchat_so.data["lastChatId"]) - 1;
    if (lastChatId < 0)
        lastChatId = 0;
}

// show new messasges
var currChatId = Number(textchat_so.data["lastChatId"]);

// if there are new messages to display
if (currChatId > 0)
{
    var i:Number;
    for(i=(lastChatId+1);i<=currChatId;i++)
    {
        if (textchat_so.data["chatData"+i] != undefined)
        {
            var chatMessage:Object = textchat_so.data["chatData"+i];

             formatMessage(chatMessage);


        chatText += "<p>" + msg + "</p>";
        trace(msg);
            //listChat.htmlText = chatText;
        }
    }

    if (listChat.length > 0)
        listChat.verticalScrollPosition = listChat.maxVerticalScrollPosition;
    lastChatId = currChatId;
}
    }

  function connectSharedObject(soName:String)
  {


textchat_so = SharedObject.getRemote(soName, nc.uri);

// add new message to the chat box as they come in
textchat_so.addEventListener(SyncEvent.SYNC, syncEventHandler);

textchat_so.connect(nc);    


}

 function connectSharedObjectRes(soName:String)
 {

connectSharedObject(soName);
trace(soName);
  }

  function initSharedObject(soName:String)
 {
// initialize the shared object server side
nc.call("initSharedObject", new Responder(connectSharedObjectRes), soName);

}

я хочу получить доступ к переменной внутри функции (formatMessage) из b.as

Я могу загрузить a.swf в b.as здесь мое кодирование b.as

private function addMessage(){
_loader = new Loader();
_loader.x=10;
_loader.y=200;
_loader.load(new URLRequest("a.swf"));
_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);

 function onLoad(evt:Event):void {
var target:DisplayObject = LoaderInfo(evt.target).content as DisplayObject; 
trace(target["msg"]);// here it return null value
 }
}

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Ваш вопрос не очень понятен, но в любом случае следующая строка никогда не будет работать как есть:

 var target:DisplayObject = LoaderInfo(evt.target).content as DisplayObject; 
 trace(target["msg"]);// here it return null value

, поскольку DisplayObject не имеет свойства msg, вам необходимо использовать либо Object, либо MovieClip.

 var target:DisplayObject = event.currentTarget.content as MovieClip; 
 trace(target.msg);// may work better

 //and whilst you're there, you may as well remove the event listener...

... почти забыл, в a.swf убедитесь, что ваша переменная общедоступна

 public var msg:String = "whatever"
1 голос
/ 02 ноября 2011

Я не могу понять какой-то кусок вашего кода.

  • Функция Param of Message не является переменной, и ее вызов аналогичен названию функции.
  • Ваша переменная msg должна быть общедоступной
  • Ваша функция Сообщение не имеет определенного возвращаемого значения
  • Сообщение (Сообщение);Это не имеет смысла!

Итак, я не знаю, как работает ваше приложение, но я исправляю ваш код следующим образом:

 public var msg:String = "";
 function Message(msg:String):void
 {
     this.msg = msg;// Here you assign directly the message
     trace(this.msg);
 }

В коде загрузчика, если вы хотите получить доступв переменную msg ваш код должен работать нормально.

Совет: вам следует использовать классы concat для ваших swfs и работать с открытым методом для доступа к этим переменным.Если у вас есть проблемы, вы можете опубликовать больше своего кода, чтобы быть более точным.

Я надеюсь, что это будет полезно для вас!

ОБНОВЛЕНИЕ: Повторяю, я не знаюЯ не знаю много о том, как структурировано ваше приложение, я бы сделал следующее:

  1. Определенный в Adobe Flash класс документа для вашего проекта fla, например main.as
  2. Создайте другой проект Adobe Flash с классом документа, расширяющим MovieClip: например, Message.as.Этот класс экспортирует вызов SWF message.swf
  3. Поместите функцию загрузчика в Main.as.
  4. Ваш класс сообщения должен быть написан так:

    public class Message
    {
        private var _msg:String = "";
    
        //Constructor
        public function Message(msg:String)
        {
            _msg = msg;
        }
    
        //Getter method
        public function get msg():String
        {
            return _msg;
        }
    }
    
  5. В Main.as напишите функцию загрузчика, как вы сделали, и загрузите message.swf (обратите внимание на положение файловой системы).

  6. Когда загрузка завершится, вы можете вызватьМетод получения сообщения msg непосредственно на загруженном SWF:

    function onLoad(evt:Event):void
      {
       var loadedM:MovieClip = LoaderInfo(evt.target).content as MovieClip; 
       trace(loadedM.msg);
      }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...