【问题标题】:1061: Call to a possibly undefined method removeThis through a reference with static type flash.display:DisplayObject1061:通过静态类型 flash.display:DisplayObject 的引用调用可能未定义的方法 removeThis
【发布时间】:2014-07-29 12:02:58
【问题描述】:

这是创建对象的地方,按下空格键时会创建一个新实例:

/* SHOOTING */
function fireRocket():void
{
    if (fireHold == 0)
    {
        fireHold = 1;
        var Timer = setInterval(fireDelay,fireRate);

    function fireDelay()
        {
            fireHold = 0;
            clearInterval(Timer);
        }
        if (rocketContainer.numChildren < 7)
        {
            trace(rocketContainer.numChildren)
            var rocketGameObject = new rocketObject  ;
            rocketContainer.addChild(rocketGameObject);
            rocketGameObject.x = spaceShip.x + 35;
            rocketGameObject.y = spaceShip.y + 35;
        }
        else
        {
            trace("Too many rockets present");
        }
    }
}

一旦确认命中(通过下面的命中测试),应运行以下命令:

function hitTest(evt:Event):void
{
    /* HIT TEST */
    for (var i=0; i < rocketContainer.numChildren; i++)
    {
        for (var j=0; j < enemyContainer.numChildren; j++)
        {
            if (rocketContainer.getChildAt(i).hitTestObject(enemyContainer.getChildAt(j)))
            {
                trace(rocketContainer.getChildAt(i));
                rocketContainer.getChildAt(i).removeThis();
            }
        }
    }
}

这是用于在使用方法调用时处理对象的移动和移除的类:

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.display.DisplayObject;

    public class rocketClass extends MovieClip
    {

        public function rocketClass()
        {
            this.addEventListener(Event.ENTER_FRAME,rocketMove);
        }
        function rocketMove(evt:Event):void
        {
            this.x +=  20;
            if (this.x > stage.stageWidth)
            {
                removeThis();
            }
        }
        public function removeThis():void
        {
            trace("reached")
            this.parent.removeChild(this);
            this.removeEventListener(Event.ENTER_FRAME, rocketMove);
        }

    }

}

现在当我在确认的命中中执行trace(rocketContainer.getChildAt(i)); 时,它返回[object rocketObject]。所以我只能假设它成功地检测到它是一个对象,这是我要删除的对象。

但是,当我想使用 rocketContainer.getChildAt(i).removeThis(); 这样的类的方法删除它时,我收到以下错误:

1061: 通过静态类型 flash.display:DisplayObject 的引用调用可能未定义的方法 removeThis

【问题讨论】:

  • getChildAt(int n) 返回 DisplayObject 类型的 Object,而不是 RocketClass。在调用该函数之前,创建一个 Rocketclass 类型的临时变量并将 getchildat() 传递给 Rocketclass。

标签: actionscript-3 flash methods


【解决方案1】:

您需要将rocketContainer.getChildAt(i) 转换为您的类rocketObject,因为getChildAt() 返回DisplayObject。它看起来像:

(rocketContainer.getChildAt(i) as rocketClass).removeThis();

rocketClass(rocketContainer.getChildAt(i)).removeThis();

附:在 AS3 中,类名最好从大写的符号开始。 RocketClass -> RocketClass。

附言并且类名中的“类”部分是不必要的。

【讨论】:

    【解决方案2】:

    只是为了重申我在评论中所说的内容以及 Crabar 在他的回答中所写的内容,您需要在使用 getChildAt(int) 时强制转换为适当的类。

    Crabars 的答案应该可以工作,这是一种替代方法(没有太大不同。)以提高可读性。

    var temp:rocketClass = rocketContainer.getChildAt(i) as rocketClass;
    temp.removeThis();
    

    混淆的一点可能是:为什么 hitTestObject() 有效?答案是:因为 hitTestObject() 是 DisplayObject 类的一个方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多