AS3 中的错误 #1009

Posted

技术标签:

【中文标题】AS3 中的错误 #1009【英文标题】:Error #1009 in AS3 【发布时间】:2014-12-20 22:14:21 【问题描述】:

这个问题仍然悬而未决,据我所知没有找到可行的答案。我已经测试了唯一的当前答案,但没有结果。如果您确实打算回答,我请您先查看提出的解决方案,因为我无法让它发挥作用。

更新:好的,我想我正在使用这个,唯一不发送错误的块是 checkforhit 函数最底部的块,直到试图弄清楚这意味着什么。

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

所以我最近在一个帧上创建了一个带有计时器的项目,但由于某种原因,删除事件侦听器无法正常工作。

这是错误文本 TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在不可能的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");

        

    

【问题讨论】:

好的,我发现我只需要创建一个解决方法,以便每个命中的变量都为真。然后让一些东西测试变量是否为真。 Reaaaaaly 愚蠢的错误将在稍后发布代码。 【参考方案1】:

也许你应该简化你的 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()
    

【讨论】:

@C Parcell 是的,虽然我必须让监听器类似于addEventListener(Event.Collision Event, checkForHit);,这样它才能在拖动为真时立即执行。我不知道在哪里可以找到动作脚本事件列表。【参考方案2】:

Queenblock1block2block3block4nullundefined。再多的摆弄计时器也无法解决这个问题。检查您的实例名称,确保您引用的对象与正在执行的代码位于同一帧。

【讨论】:

所有对象都在那里问题似乎是我更改帧后运行的函数 checkForHit(),即使我已经删除了它。 @Flashdace 好了,你有它。在调用gotoAndStop 之前移除事件监听器。我会在gotoAndStop 之前排队,而不是通过一些复杂的路径依赖它。 已经尝试过没有解决它,但我想我在这个,唯一不发送错误的块是 checkforhit 函数最底部的块。仍在试图弄清楚这意味着什么。【参考方案3】:

您可以检查 TTimer 对象是否存在,然后删除事件监听器

if(TTimer)

    TTimer.removeEventListener(TimerEvent.TIMER, Tcountdown);

【讨论】:

如何修复 1009?对不起,我是菜鸟。我实现了这个,它没有改变任何东西。 它检查 TTimer 是否为 null,如果它为 null,则在这种情况下不进入,并且不要在 nill 对象引用上添加 removeListener 函数 我应该把这段代码放在哪里?我尝试添加它,但没有任何改变。 你可以复制并粘贴你的整个代码吗?这听起来像是我遇到过的最愚蠢的问题,但我的就是不工作。 lool :D 你的电影剪辑是未定义的,你告诉我问题出在 Timer :D

以上是关于AS3 中的错误 #1009的主要内容,如果未能解决你的问题,请参考以下文章

AS3:TypeError:错误 #1009:无法访问空对象引用的属性或方法。需要帮助

错误 #1009:无法访问空对象引用 AS3 项目的属性或方法

TypeError:错误#1009:无法访问null对象引用as3的属性或方法

AS3 阶段 = 空?

AS3 中的“TypeError:错误 #1010:术语未定义且没有属性”

Swift 服务调用中的错误域 = NSURLErrorDomain 代码 = -1004 而不是 -1009