AS3中的错误#1009

时间:2014-10-25 02:05:27

标签: actionscript-3 flash actionscript flash-cs5 flash-cs6

这个问题仍然存在,据我所知,没有找到可行的答案。我已经测试了唯一没有结果的答案。如果您计划回答我的问题,请您首先查看建议的解决方案,因为我无法让它发挥作用。

更新:好的我想我是这个,唯一不发送错误的块是checkforhit函数最底部的块,直到试图找出这意味着什么。

 Cannot access a property or method of a null object reference.
 at impossible_fla::MainTimeline/checkForHit()

所以我最近在一个框架上创建了一个带有计时器的项目,但出于某种原因,remove事件监听器并没有工作。

这是错误文本     TypeError:错误#1009:无法访问空对象引用的属性或方法。         at impossible_fla :: MainTimeline / checkForHit()

即使我做了removeEventListener(Event.ENTER_FRAME,checkForHit); ?

stop();
var currentObject:MovieClip = null;
var dragging:Boolean = false;
initDrag(block1);
initDrag(block2);
initDrag(block3);
initDrag(block4);
var TCount:Number = 50;
var TTimer:Timer = new Timer(100,TCount);
TTimer.addEventListener(TimerEvent.TIMER, Tcountdown);
function Tcountdown(e:TimerEvent):void
{
    if (TCount == 1)
    {
        trace("done");
        TTimer.removeEventListener(TimerEvent.TIMER, Tcountdown);
        gotoAndStop("lose");



    }
    else
    {
        Queen.alpha +=  0.02;
        TCount--;
        trace(TCount);
    }
}

function initDrag(obj:MovieClip )
{
    obj.addEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.addEventListener(MouseEvent.MOUSE_UP,stopADrag);
}
function endDrag(obj:MovieClip )
{

    obj.removeEventListener(MouseEvent.MOUSE_DOWN,startADrag);
    stage.removeEventListener(MouseEvent.MOUSE_UP,stopADrag);
    removeEventListener(Event.ENTER_FRAME, checkForHit);

}
function startADrag(e:MouseEvent):void
{
    currentObject = (MovieClip)(e.target);
    var rect:Rectangle = new Rectangle(0,0,stage.stageWidth - currentObject.width,stage.stageHeight - currentObject.height + 100);
    currentObject.startDrag(false,rect);
    dragging = true;

}
function stopADrag(e:MouseEvent):void
{
    if (currentObject != null)
    {

        dragging = false;

        currentObject.stopDrag();
    }
}
addEventListener(Event.ENTER_FRAME, checkForHit);
function checkForHit(e:Event):void
{
    if (dragging)
    {
        if (block2.hitTestObject(dragtest))
        {
            endDrag(block2);
            removeEventListener(Event.ENTER_FRAME, checkForHit);


            TTimer.start();

        }
        if (block3.hitTestObject(dragtest))
        {

            removeEventListener(Event.ENTER_FRAME, checkForHit);

            endDrag(block3);
            removeEventListener(Event.ENTER_FRAME, checkForHit);

            gotoAndStop("lose");

        }
        if (block4.hitTestObject(dragtest))
        {
            endDrag(block4);
            removeEventListener(Event.ENTER_FRAME, checkForHit);

            gotoAndStop("lose");
        }
        if (block1.hitTestObject(dragtest))
        {
            removeEventListener(Event.ENTER_FRAME, checkForHit);


            endDrag(block1);

            gotoAndStop("lose");

        }

    }
}

3 个答案:

答案 0 :(得分:1)

如果存在TTimer对象,则可以检查,然后删除事件侦听器

if(TTimer)
{
    TTimer.removeEventListener(TimerEvent.TIMER, Tcountdown);
}

答案 1 :(得分:1)

Queenblock1block2block3block4null或其他undefined。没有任何摆弄计时器将解决这个问题。检查您的实例名称,确保您引用的对象与正在执行的代码位于同一帧中。

答案 2 :(得分:0)

也许您应该简化checkForHit功能

function checkForHit(e:Event):void
{
    if (dragging)
    {
        if (block2.hitTestObject(dragtest)) 
        {
            endDrag(block2);
            TTimer.start();
        }
        else 
        {
            if (block1.hitTestObject(dragtest))
            {
                endDrag(block1);
            }
            if (block3.hitTestObject(dragtest))
            {
                endDrag(block3);
            }
            if (block4.hitTestObject(dragtest))
            {
                endDrag(block4);
            }
            gotoAndStop("lose");
        }
        // removeEventListener here is not needed because it is within endDrag()
    }
}