2009-10-14 75 views
0

这个问题可能很简单但解决但我不清楚。这可能只是因为我做错了一些事情。我已经学习了OOP和AS3几个小时,所以我对这些概念非常熟悉,但不熟悉流程。这是我整理的一个项目,以加强我一直在研究的内容。自定义(简单)AS3类代码没有完全执行

此处的目标是将预创建的影片剪辑的实例从库中加载到舞台上,然后在FLA的时间帧ActionScript中执行定位功能,并从AS文件的类ActionScript中执行一个函数,以同时调整movieclip并输出一个跟踪。

我有两个文件: smileface.fla smileface.as

在smileface.fla,我必须驻留在我的库MovieClip对象。它具有以下相关属性...

 
Name: faceInst 
Class: smileface 
Base Class: null 

我有一帧(关键),它包含以下ActionScript:

 
var faceInst:smileface = new smileface(); 
this.addChild(faceInst); 
faceInst.x = stage.stageWidth/2; 
faceInst.y = stage.stageHeight/2; 

在我smileface.as文件我有以下代码:

 
package { 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    public class smileface extends MovieClip { 
     public function smileFunction() { 
      this.width = stage.stageWidth/5; 
      this.height = stage.stageHeight/5; 
      trace("Done!"); 
     } 
    } 
} 

我预计(没有理由这样做)在加载movieclip对象之后,它将根据规范调整大小,然后将输出跟踪。

但是,发生的情况是,人脸显示在舞台上,居中,但没有调整大小,并且曲线根本不输出。

回答

5

如果你想要这个,因为它需要有相同的名称,该文件的构造,smileface而不是smilefunction

您正在创建要添加在它之前的阶段,呼吁阶段的实例构造函数中的宽度将为空。你应该把它移动到一个加入到帧事件侦听器:

package { 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    public class smileface extends MovieClip { 
     public function smileFace() { 
     addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

    public function init(ev:Event){ 
      this.width = stage.stageWidth/5; 
      this.height = stage.stageHeight/5; 
      trace("Done!"); 
     } 
    } 
} 
+0

非常感谢,我需要阅读更多关于构造函数和方法。我看到了我的错误,但需要运行更多的测试才能找到它。 – Structure 2009-10-14 10:01:19

+0

基本级别构造函数是一个方法调用,只要该类被创建,就需要将其命名与类名完全相同,以便它能够正确运行。任何其他函数都需要专门调用,例如,您可以通过在addchild()调用之后调用faceInst.init()而不是在类中使用事件处理函数来执行此init函数。 – longstaff 2009-10-14 12:32:50

2

似乎函数smileFunction()从来没有被调用过(至少我看不到它被调用的地方)。导出代码应该是:

var faceInst:smileface = new smileface(); 
this.addChild(faceInst); 
faceInst.x = stage.stageWidth/2; 
faceInst.y = stage.stageHeight/2; 
faceInst.smileFunction(); 

这应该使功能运行和smileface到中心本身在舞台上,并做跟踪。

+0

谢谢!我赞赏这个额外的观点,并且也会对此进行测试。 – Structure 2009-10-14 10:03:23

1

我希望(没有理由这样做)的MovieClip对象后加载,它会根据规范调整,然后跟踪将被输出。

我认为你的期望是基于这样一个事实,即你记得看到一些自动调用方法的代码。这就是所谓的构造函数,这些方法以类名命名。因此,将smileFunction重命名为smileface应该能够做到这一点。注意从构造函数访问阶段的空错误。改为使用addedToStage事件侦听器。

考虑将类重命名为SmileFace - 这是约定。类是PascalCased,方法是camelCased。

+0

是的,我期望这个方法在对象实例化时自动调用。 我很欣赏构造函数和方法功能之间的澄清 - 这是我没有看到我的错误的原因。我需要对命名方法和构造函数进行一些试验和错误,以便更好地掌握它们如何被调用并相互连接。 我会注意到未来的套管标准。 – Structure 2009-10-14 10:07:03

0

你忘记创建构造函数,并且必须与类名称的名称相同。你的函数不会被任何事件列表器或任何其他函数调用。

package { 
    import flash.display.MovieClip; 
    import flash.display.Stage; 
    public class smileface extends MovieClip { 
     public function smileface():void{ 
     smileFunction(); 
     } 
     public function smileFunction() { 
      this.width = stage.stageWidth/5; 
      this.height = stage.stageHeight/5; 
      trace("Done!"); 
     } 
    } 
}