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

时间:2014-07-29 12:02:59

标签: actionscript-3 flash methods

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

/* 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的引用调用可能未定义的方法removeThis:DisplayObject

2 个答案:

答案 0 :(得分:0)

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

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

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

P.S。在AS3中,类名最好从符号大写开始。 rocketClass - &gt; RocketClass。

P.P.S。并且类名中的“class”部分是不必要的。

答案 1 :(得分:0)

重申我在评论中所说的内容以及Crabar在答案中所写的内容,你需要在使用getChildAt(int)时转换为适当的类。

Crabars的答案应该有效,而且这是一种替代方式(并没有那么多不同。),以提高可读性。

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

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