【问题标题】:as3 Main-Timline calling a function from a class loaded from Child.swfas3 Main-Timline 从 Child.swf 加载的类中调用函数
【发布时间】:2012-05-13 14:26:34
【问题描述】:

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


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

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

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

Main.swf CODE /// 是 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 中“类”的一部分

 public function GetOnlineStatus(OS:String)

{

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

我遇到的错误

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

更新:我决定发布完整包(我的第一个),看看我是否做得对。

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

【问题讨论】:

  • @weltraumparat,很抱歉我在这方面和这个表格上缺乏知识。你能发布一个链接或我的问题的答案吗?

标签: actionscript-3 flash class function scope


【解决方案1】:

我相信为了使这个工作,加载器的内容属性。您必须创建对加载的 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/

【讨论】:

    【解决方案2】:

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

    您的问题不是“包和类”,所以请不要放弃它们。一旦你开始理解它们,它们就会对你有很大的帮助。你的问题是,你没有面临一个问题,但实际上至少有两个(我可能会补充说相当大的问题):

    1. 您需要返回了解basics of object oriented programming in ActionScript。否则,您将无法获得此类问题的答案。相信我,我的意思并不是以一种傲慢的方式——这只是一件复杂的事情,而且很难沟通复杂的问题,无论是当你不知道表达它们的术语时,还是当你的对手不知道时'不了解他们。把它想象成一个高中数学问题:除非你先学习一些基本的代数,否则你永远不会找到三角问题的解决方案(或得到一个体面的答案)。

    2. 您还遇到了与加载有关的问题,application domainsFlash Player security model - 这一切都比您在尝试 OOP 内容时要解决的问题要复杂得多。这可能是一个主要障碍,除非您想挫败自己,否则您应该尝试避免它,直到您的程序真正运行

    所以这是我的建议:始终尝试一次解决一个问题。不要让自己陷入像现在这样复杂的场景中,而是一步一步来,直到你达到对自己所做的事情有信心的程度。

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

    【讨论】:

      【解决方案3】:

      对不起,如果这听起来不像是一个答案,但我要写几个疑问,我已经阅读了你的代码,可能会导致解决方案:

      • 为什么要将其投射到 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
      

      另外,请记住,一般来说,大写类名而不是变量名是一种很好的做法。 告诉我!

      【讨论】:

      • 1118:将静态类型 Object 的值隐式强制转换为可能不相关的类型 Class。 - 我得到的错误。也许是因为该类是从另一个 child.swf 加载的? - 它不喜欢 pContent。
      【解决方案4】:

      //与类联系,但输出为:[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 如果它有其余代码

      【讨论】:

        【解决方案5】:

        私有函数GetOnlineStatus

        尝试将其设为公共函数。当它是私有的时,它不能在拥有它的类的范围之外被访问。

        【讨论】:

        • 抱歉,起初它是一个 PUBLIC 函数。我改变了它,因为我正在测试。我将编辑上面的主要代码以再次将其显示为 PUBLIC。这没有用。不过还是谢谢。
        • 您确定要加载的 pContent.swf 代表类 pContent。 ? (我也想建议你,类名以大写字母开头,函数名以小写字母开头。这是一个编程标准,避免混淆,当有人查看你的代码时:))
        猜你喜欢
        • 2012-05-04
        • 2014-09-10
        • 2012-02-26
        • 1970-01-01
        • 2017-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多