鼠标事件未调用子类中的方法(函数)

method (function) in subClass not being called on mouse event

我的目标是:

  1. 定义一个名为 Ship 的 Sprite 子类
  2. 在运行时使用事件来调用此新 class
  3. 中的函数

看来我已经想出了如何使用链接的 .as 文件中的包来创建我的 Ship class。但是我似乎无法访问 class 中的函数。谁能看出我做错了什么?

var ShipMc:Ship = new Ship();
addChild(ShipMc);// This successfully adds an instance, so I know the class is working.
addEventListener(MouseEvent.CLICK, ShipMc.addShip);//But this doesn't seem to run the function

此代码可以很好地实例化 Sprite,但 Ship.as 文件中的代码,特别是函数,无法正常工作。没有运行时错误,但也没有追踪到输出 window。

package
{
    import flash.display.Sprite

    public class Ship extends Sprite
    {
        public function addShip():void
        {
            trace("running addShip function")     
        }
    }
}

上次在 Flash 中编码的是 AS2!

我只想提一下,我试过使用 addShip():voidaddShip()。两者的反应相同。应该是带:void吧?无论如何,我认为没有人抛出这一事实告诉我这部分代码甚至没有人阅读。

非常感谢任何帮助!拔头发。

您的代码不工作,因为它包含一些问题,让我们看看。

您应该知道您正在将 MouseEvent.CLICK 事件侦听器附加到主时间轴,该时间轴现在还不包含任何可点击对象(它是空的),所以让我们从添加一些东西到您的 Ship class 来避免:

public class Ship extends Sprite
{ 
    // the constructor of your class, called when you instantiate this class 
    public function Ship()
    {
        // this code will draw an orange square 100*100px at (0, 0)
        graphics.beginFill(0xff9900);
        graphics.drawRect(0, 0, 100, 100);
        graphics.endFill();
    }   
    public function addShip():void
    {
        trace("addShip function run");
    } 
}

N.B: 您可以将 MouseEvent.CLICK 事件侦听器附加到舞台上,即使舞台上什么都没有,它也可以工作。

现在,如果您测试您的应用程序,您将在舞台的左上角看到一个可点击的橙色方块,但编译器将引发错误 (ArgumentError),因为它正在等待侦听器函数(Ship.addShip() 函数)接受一个 MouseEvent 对象。

因此,为了避免该错误,您的 Ship.addShip() 函数可以是这样的,例如:

public function addShip(e:MouseEvent):void
{
    trace("addShip function run");
}

那么你的代码应该可以工作。

您还可以通过在主代码中使用另一个可以调用 Ship.addShip() 函数的侦听器函数来简化事情,例如:

var ShipMc:Ship = new Ship();
addChild(ShipMc);

addEventListener(MouseEvent.CLICK, onMouseClick);

function onMouseClick(e:MouseEvent): void 
{
    ShipMc.addShip();
}

有关所有这些的更多信息,您可以查看 AS3 fundamentals,在那里您可以找到您需要了解的有关 AS3 的所有信息。

希望能帮到你。