0

更新:好的,我准备放弃包和课程。没有答案。不知道该怎么办。我试图让这个问题变得更容易并发表了一篇新文章,但我被否决了。as3 调用另一个类中的函数


我对使用 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
4

5 回答 5

2

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

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

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

  2. 您还遇到了与加载、应用程序域Flash Player 安全模型有关的问题——这些问题都比您在尝试 OOP 时应该考虑的要复杂得多。这可能是一个主要障碍,除非您想挫败自己,否则您应该尽量避免它,直到您的程序真正运行为止

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

您的第一个问题应该是了解类和对象的情况。其他一切都将在以后出现。您应该尝试隔离您的问题pContent.swf并首先使其工作 - 或者更好的是,将您的程序所需的所有内容放入一个文件中。转换为使用类。然后,一旦你知道如何使用这些,开始学习更高级的 OO,使用接口解耦你的代码类型转换在运行时加载二进制文件

于 2012-05-07T23:03:50.783 回答
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

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

于 2012-05-04T16:34:49.353 回答
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

于 2012-05-04T15:35:45.560 回答
0

私有函数 GetOnlineStatus

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

于 2012-05-04T03:11:00.583 回答
0

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

于 2015-07-26T15:51:04.963 回答