0

这是一个非常基本的问题(我对 AS3 有点陌生)但是你在 AS3 中导入什么来允许“addEventListener”?我犯了学习如何在时间轴上编程的错误,现在这个跳转有点棘手。

编辑:这是我的代码(有无数错误,但我只想修复 addEventListener ):

package 
{
    import flash.display.*;
    import flash.events.*;
import flash.utils.*;

public class TheGameItself extends MovieClip
{

    public static function startit(stage)
    {
        addEventListener(Event.ENTER_FRAME, movecat);
        addEventListener(Event.ENTER_FRAME, spawnanimal);
        var myDelay:Timer = new Timer(100);
        myDelay.addEventListener(TimerEvent.TIMER, showMessage);
        myDelay.start();
        var myMouse = 0;
        var speed = 1;
        var wave = 1;
        var score = 0;
        var rnum = 0;
        var moveornot = false;
    }
    function showMessage(event:TimerEvent):void
    {
        moveornot = true;
    }

    function movecat(event)
    {
        if ((mouseY > 40) && (mouseY < 330))
        {
            cat.y = mouseY;
        }
    }
    function spawnanimal(event)
    {
        var rnum = Math.floor(Math.random() * ((100 / wave) - 1 + 1)) + 1;
        if (rnum == 5)
        {
            myMouse = new mouse();
            myMouse.x = 0;
            myMouse.y = Math.floor(Math.random() * (350 - 45 + 1)) + 45;
            addChild(myMouse);
            for (var i:int = 0; i < 10000; i++)
            {
                if (moveornot == true)
                {
                    myMouse[i].y +=  speed * 100;
                    moveornot == false;
                    if ((myMouse.x == 500) || (myMouse.hitTestObject(cat)))
                    {
                        myMouse.visible = false;
                    }
                }
            }
        }
    }

}

}
4

5 回答 5

1

要创建一个可以分派事件的类,然后扩展flash.events.EventDispatcher. 这将为作为该类实例的对象提供addEventListener和方法。dispatchEvent对于侦听事件的对象,您不需要导入任何内容。

com/foo/MyClass.as

package com.foo {
   import flash.events.EventDispatcher;

   public class MyClass extends EventDispatcher
   {

   }

   public function doSomething():void
   {
       dispatchEvent( new Event("eventType"));
   } 
}

别处:

import com.foo.MyClass;

var obj:MyClass = new MyClass();
obj.addEventListener("eventType", onEvent);

obj.doSomething();

function onEvent(event:Event):void
{
    trace("the event happened");
}
于 2012-10-04T01:13:17.333 回答
1

您不能通过静态函数访问对象的实例。
在以下代码中:

public static function startit(stage)
{
  addEventListener(Event.ENTER_FRAME, movecat);
  addEventListener(Event.ENTER_FRAME, spawnanimal);
  var myDelay:Timer = new Timer(100);
}

通过做:

addEventListener(Event.ENTER_FRAME, movecat);

你本质上是在做:

this.addEventListener(Event.ENTER_FRAME, movecat);

这就是说将侦听器添加到当前实例化中,但是您将函数声明为静态,这将不允许您这样做。

取消静态引用以解决您的问题。

于 2012-10-04T13:22:54.640 回答
0

你需要:

import flash.events.EventDispatcher;

请参阅参考资料

例如,如果您EventDispatcher像这样扩展:

public class MyClass extends EventDispatcher {
...
}

然后你可以在类addEventListener()的任何实例上使用MyClass

于 2012-10-04T01:09:26.660 回答
0

作为TheGameItself扩展MovieClip,你不需要包含任何东西——MovieClip已经扩展了EventDispatcher。你的问题是这startit()是一个静态函数,addEventListener()而是一个对象函数。

从 中删除静态startIt(),创建您的实例TheGameItself,它应该没问题。

例如(在您的主要课程中):

var game:TheGameItself = new TheGameItself; // hold a reference to this somewhere, otherwise it'll be gc'd
game.startIt();

在一些相关的说明中,myMouse等都将score是函数的局部变量startIt(),因此当函数退出时它们将不存在

于 2012-10-04T12:53:36.327 回答
0

您需要导入即将使用的事件的API。如果你要使用一个EnterFrame事件,那么你应该导入flash.Events.Event. 因为EnterFrame事件编码在EventAPI 中。有关更多详细信息,请访问有关事件的 ADOBE 文档

如果你想在添加到阶段后进行初始化,你可以利用这个

 this.addEventListener(Event.ADDED_TO_STAGE, onAdded);

同样在您的代码中,您在静态函数中声明了一些变量。当您尝试在该函数之外访问这些变量时,您将收到错误消息。如果你想让它对所有函数通用,那么将它声明为全局变量。

我不确定你为什么使用静态函数。如果可能,请尝试利用上述侦听器来避免在这种情况下调用静态函数。

于 2012-10-04T05:19:37.560 回答