as3 Main-Timline从Child.swf加载的类调用函数

时间:2012-05-04 03:00:00

标签: actionscript-3 flash class function scope

更新:好的我准备好放弃Pacakages和课程。没有答案。不知道该怎么办。我试图让这个问题更容易并且发了一个新帖子,但是我被投了票。 as3 calling a function in another class


我使用PACKAGES和CLASSES非常新。在遇到这么多问题后,我终于从时间表转换过来了。请耐心等待我缺乏知识。我需要知道如何调用我在父swf中的maintime中的代码加载的子swf文件中的函数。

有2个swf文件。 Main.swf和pConent.swf  1. Main.swf在第一帧的时间轴中有代码。  2. pConent.swf正在将PACKAGE CLASS加载为文件。

问题 我试图从它的父Main.swf中调用一个函数。我该怎么做呢? 以下是两者的代码部分。感谢

Main.swf代码///是Andrid swf的AIR

function LoadContent()
{  
    TheContent.load(new URLRequest( "pContent.swf"));
    TheContent.contentLoaderInfo.addEventListener(Event.COMPLETE, LoadContentTWO);
    function LoadContentTWO(e:Event)
    {
        Content = TheContent.content as MovieClip;
        pContent = Content as Object;
        addChild(TheContent);

            var OSS:String = "device";
            trace(pContent); //// comes out as: [object pContent]
        pContent.GetOnlineStatus(OSS); ///// HOW DO I GET THIS TO CALL FUNCTION
    } 
}

pContent.swf中“CLASS”的一部分我试图打电话

 public function GetOnlineStatus(OS:String)

{

    if(OS=="online")
        trace("inside ONLINE" );
        }
    if(OS=="device")
        {
        trace("inside DEVICE" );
        }
}

我正在犯的错误

TypeError:错误#1006:GetOnlineStatus不是函数。

更新:我决定发布FULL PACKAGE(我的第一个),看看我做得对。

package  
{

import flash.display.MovieClip;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
import flash.display.*;
import flash.media.Sound;
import flash.system.*;
import flash.media.SoundChannel;
import flash.display.MovieClip;
import flash.events.MouseEvent;




    public class pContent extends MovieClip 
    { 
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

var ScreenY = flash.system.Capabilities.screenResolutionY;
var ScreenX = flash.system.Capabilities.screenResolutionX;
var swf:String;
var daSounds:String;
var images:String;
var videos:String;
var OnlineStatus:Boolean;



//++++++++++++++++++++++++
//++++++++++++++++++++++++

public function pContent()
    {
    BG.addEventListener(MouseEvent.CLICK, mouseHandlerdown);        
    }

//++++++++++++++++++++++++
//++++++++++++++++++++++++





    //-------- * FUNCTIONS * --------
    //-------------------------------

    public function mouseHandlerdown(event:MouseEvent):void 

        {
        alpha = .3; // testing
        }

    public function GetOnlineStatus(OS:String)
        {

        if(OS=="online")
            {
            OnlineStatus = true;
            Security.allowDomain("*");
            trace("inside THE PATH " + ThePath.text);
            daSounds = "http://mycontactcorner.com/upload/files/";
            swf =    "http://mycontactcorner.com/upload/files/";
            trace("inside THE DEVICE ONLINE" );
            OnlineStatus = false;
            swf = "";
            daSounds = "content/sounds/";
            //LoadMenu();
            LoadStage();
            LoadBeau();
            }
        if(OS=="device")
            {
            trace("inside THE DEVICE ONLINE" );

            }
        }

    //------ * END FUNCTIONS * -----            
    //------------------------------ 



    }// END FUNCTION pContent
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



}//// END PACKAGE

5 个答案:

答案 0 :(得分:2)

不要失望,但我对你的问题没有“真正的”答案,而且我真的不会通过所有代码来解决它。学习如何做到这一点是你自己的任务,除非这里的人非常非常渴望声誉,没有人会为你做这件事 - 我们只会帮助你找到正确的方法。

您的问题不是“套餐和课程”,所以请不要放弃它们。一旦你开始理解它们,它们将为你提供很多帮助。你的问题是,你没有面临一个问题,但实际上至少有两个问题(我可能会补充一些问题):

  1. 您需要回过头来了解basics of object oriented programming in ActionScript。你不会有太多的运气来获得这样的问题的答案,否则。并且相信我,我并不是说这是一种光顾的方式 - 它只是一个复杂的问题,当你不知道表达它们的条款时,或者当你的对手没有表达时,很难传达复杂的问题。理解他们。把它想象成一个高中数学问题:除非你先学习一些基本的代数,否则你永远不会找到你的三角学问题的解决方案(或得到一个体面的答案)。

  2. 您还遇到与加载application domainsFlash Player security model相关的问题 - 这些问题都比尝试OOP时应该瞄准的要复杂得多。这可能是一个主要障碍,除非你想让自己沮丧,否则你应该尝试避免它,直到你的程序实际运行

  3. 所以这是我的建议:始终尝试一次解决一个问题。不要让自己陷入如你现在所处的复杂场景,而是一步一步地走,直到达到你对自己所做的事情充满信心的程度。

    您的第一个问题应该是了解课程和对象的内容。其他一切都会在以后发生。您应该尝试在pContent.swf中隔离问题并使其首先运行 - 或者更好,将程序所需的所有内容放在一个文件中。转换为使用类。然后,一旦您知道如何使用这些内容,就可以开始学习更高级的OO,decoupling your code using interfacestype castingloading binaries at runtime

答案 1 :(得分:1)

  

//与班级联系,但出现为:[object pContent]

因为你说

pContent = Content as Object;

我不确定你为什么要做这个额外的步骤

将其更改为此

Content = TheContent.content as MovieClip;
// pContent = Content as Object; //NO NEED OF THIS
addChild(Content); // just in case this gives error change it as addChild(Content as Object);

var OSS:String = "device";
trace(Content); //now see the difference
Content.GetOnlineStatus(OSS); // it calls now

另外,请提供您发布该可怕问题的链接:P如果有其余代码

答案 2 :(得分:1)

很抱歉,如果这听起来不是一个答案,但我会写一些疑问,我已经阅读了可能导致解决方案的代码:

  • 为什么要将它投射到MovieClip?如果你将它转换为MovieClip,编译器会告诉你方法“GetOnlineStatus”不存在,因为MovieClip类没有它!我认为你必须把它作为pContent

  • 您为什么要尝试投射TheContent.content?什么是“内容”?我看了你以前的帖子,我看不到任何名为“内容”的东西?

如果我忽略了我的第二个疑问(TheContent.content问题),我会改变这样的代码:

 Content = TheContent.content as pContent;  // your class it's called pContent
 addChild(Content);
 Content.GetOnlineStatus(OSS); // it calls now

另外,请记住,通常将类名称而不是变量大写是一个很好的实践。 让我知道!

答案 3 :(得分:0)

私人函数GetOnlineStatus

尝试将此作为公共功能。当它是私有的时,它不能在拥有它的类的范围之外访问。

答案 4 :(得分:0)

我相信为了使这项工作,Loader的内容属性。您必须创建对加载的SWF的引用作为您尝试调用的类。该课程必须包含在主SWF的项目中。然后你可以在孩子中调用那个特定类的函数。

function LoadContent()
{  
    TheContent.load(new URLRequest( "pContent.swf"));
    TheContent.contentLoaderInfo.addEventListener(Event.COMPLETE,     LoadContentTWO);
}

function LoadContentTWO(e:Event)
    {
        var pContent:GetOnlineStatus = GetOnlineStatus(e.target.content);
        addChild(e.target.content); //Assuming that "TheContent was 
    //  declared as var TheContent:Loader , you'd be adding the loader to the stage when I think you actually wanted // to add the content. 

        var OSS:String = "device";
        trace(pContent); //// comes out as: [object pContent]
        pContent.GetOnlineStatus(OSS); ///// HOW DO I GET THIS TO CALL FUNCTION
    // This should work now. If not, try to loading a function that is not the class' main function. Because I think you might get an "unable to call static function error". I'm a begginner too though, so sorry if I'm wrong. Example: pContent.GetOnlineStatusFunction(OSS);
    } 

这个答案假设pContent.swf包含一个如下所示的类文件:

package {
    public class GetOnlineStatus {
        public function GetOnlineStatus (OSS:String) {
             //Do your GetOnlineStatus Logic. This is the main function.
        }
      /*public function GetOnlineStatusFunction (OSS:String) {
            //Example non-main function
        } */
    }
}  

来源:http://www.scottgmorgan.com/accessing-document-class-of-externally-loaded-swf-with-as3/