as3无法操纵Document类之外的对象

时间:2014-04-30 08:41:52

标签: actionscript-3 flash class document instances

我是动作脚本的新手,我一直在努力创造一个侧面滚动游戏。一切顺利,直到我意识到我需要一个游戏而不是功能。问题是我有许多movieclip对象,它们有自己的实例名称,我可以从我的文档类中访问它。

然而,现在我有一个新的文档类启动我的旧文档类来启动游戏,并且还通过屏幕启动游戏,所以我可以重置游戏。除了现在我得到了所有50个实例对象的未定义属性的错误访问(填空)。

所以我的问题是如何让flash识别并允许我的非文档类,类来操作这些Movie Clip实例。

我创建了一个小规模的例子来说明我想要做的事情。

package  {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;
public class Test extends MovieClip {

    public static var gstage:Stage;

    public function Test() {
        // constructor code
        var playScreen:Go = new Go();
        addChild( playScreen );
    }

}

}

以上是我的Document类" moveme是实例的名称

另一个类是我的旧Document类

package  {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
import Test;

public class Go extends MovieClip {
    public var test:Test;

    public function Go() 
    {
        if (stage)
        {
            init();
        }
        else
        {
        addEventListener(Event.ADDED_TO_STAGE, init);
        }
    }
    private function init(e:Event = null):void 
    {       
           if (e) removeEventListener(Event.ADDED_TO_STAGE, init);
            trace(stage.width);
            addEventListener(Event.ENTER_FRAME, loop);

    }
    public function loop(e:Event, Test):void
    {
        Test.moveme.scaleX++
                    Test.moveme.x++

    }

}

}

我得到的错误是ArgumentError:错误#1063:Go / loop()上的参数计数不匹配。预计2,得到1。

或者如果我在公共函数循环中删除Test(e:Event,Test):void我得到了和以前一样的错误。我已经尝试了很多东西,我可以用它来追踪舞台宽度,我似乎无法控制实例。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

由于以下原因,这是错误的:

 public function loop(e:Event, Test):void
    {
        Test.moveme.scaleX++
        Test.moveme.x++

    }
  • 测试 - 是一个类名,如果你想把它作为参数,你应该写一些类似公共函数循环的东西(e:Event,testObj:Test):void
  • 事件侦听器不会传递testObj。因此,如果您希望将事件侦听器用作事件处理程序并且能够自己调用它,则应该更改为公共函数循环(e:Event = null,testObje:Test = null):void

另外,函数体正在尝试调用类的变量,而不是实例,它应该是:

 {
     test.moveme.scaleX++
     test.moveme.x++

 }

在您的情况下,因为test是Class的一个实例,所以Test是一个Class 但是没有理由将Test作为参数传递,只需删除它并仅保留e:Event部分。如果您确实想要使用它,那么使用传递的参数实例,如下所示:

{
         // provided that use passed parameter type of Test as a testObj, like in my example
         testObj.moveme.scaleX++
         testObj.moveme.x++

}

答案 1 :(得分:0)

当事件Event.ENTER_FRAME触发并调用循环时,它只将一个参数(事件本身)传递给函数“loop”。然而,函数“loop”需要2个参数,即未知类型的“e:Event”和“Test”。您可以从函数中删除第二个参数,因为您不在函数中使用它,或者如果您打算稍后从其他地方调用该函数并传递第二个参数,则将其设置为null,以便Event.ENTER_FRAME可以正确地调用它:

或者:

public function loop(e:Event):void

或者:

public function loop(e:Event, test : Test = null):void