更新:好的我准备好放弃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" );
}
}
我正在犯的错误
更新:我决定发布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
答案 0 :(得分:2)
不要失望,但我对你的问题没有“真正的”答案,而且我真的不会通过所有代码来解决它。学习如何做到这一点是你自己的任务,除非这里的人非常非常渴望声誉,没有人会为你做这件事 - 我们只会帮助你找到正确的方法。
您的问题不是“套餐和课程”,所以请不要放弃它们。一旦你开始理解它们,它们将为你提供很多帮助。你的问题是,你没有面临一个问题,但实际上至少有两个问题(我可能会补充一些问题):
您需要回过头来了解basics of object oriented programming in ActionScript。你不会有太多的运气来获得这样的问题的答案,否则。并且相信我,我并不是说这是一种光顾的方式 - 它只是一个复杂的问题,当你不知道表达它们的条款时,或者当你的对手没有表达时,很难传达复杂的问题。理解他们。把它想象成一个高中数学问题:除非你先学习一些基本的代数,否则你永远不会找到你的三角学问题的解决方案(或得到一个体面的答案)。
您还遇到与加载application domains和Flash Player security model相关的问题 - 这些问题都比尝试OOP时应该瞄准的要复杂得多。这可能是一个主要障碍,除非你想让自己沮丧,否则你应该尝试避免它,直到你的程序实际运行。
所以这是我的建议:始终尝试一次解决一个问题。不要让自己陷入如你现在所处的复杂场景,而是一步一步地走,直到达到你对自己所做的事情充满信心的程度。
您的第一个问题应该是了解课程和对象的内容。其他一切都会在以后发生。您应该尝试在pContent.swf
中隔离问题并使其首先运行 - 或者更好,将程序所需的所有内容放在一个文件中。转换为使用类。然后,一旦您知道如何使用这些内容,就可以开始学习更高级的OO,decoupling your code using interfaces,type casting和loading 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/