【问题标题】:TypeError: Error #1009: Cannot access a property or method of a null object reference. For A noobTypeError:错误 #1009:无法访问空对象引用的属性或方法。对于一个菜鸟
【发布时间】:2012-10-10 20:59:25
【问题描述】:

所以,基本上我在使用 hitTesting 时遇到了这个问题。在我完成的所有 AS3 中,我从来没有遇到过这个错误。我正在使用拖放操作,基本上你必须将垃圾拖到bin.Pretty 直截了当。这是搞砸的代码并给了我错误:

    if(coin3.hitTestObject(wallet1)) {
coins +=1;
coin3.x -=7000;
}

所以这个错误真的很烦我,我需要修复它,它正在破坏我的游戏!我没有将对象分配给变量或数据类型,就这么简单。我该如何解决这个问题?我不知道什么是空! 完整代码如下:

import flash.events.Event;
import flash.events.MouseEvent;
var coins:Number = 0;
var maxcoins:Number = 3;
coin2.addEventListener(MouseEvent.MOUSE_DOWN, coin2drag);
function coin2drag(e:MouseEvent)
{
    coin2.startDrag();
}
stage.addEventListener(MouseEvent.MOUSE_UP, coin2undrag);
function coin2undrag(e:MouseEvent)
{
    coin2.stopDrag();
}

coin3.addEventListener(MouseEvent.MOUSE_DOWN, coin3drag);
function coin3drag(e:MouseEvent)
{
    coin3.startDrag();
}
stage.addEventListener(MouseEvent.MOUSE_UP, coin3undrag);
function coin3undrag(e:MouseEvent)
{
    coin3.stopDrag();
}
coin4.addEventListener(MouseEvent.MOUSE_DOWN, coin4drag);
function coin4drag(e:MouseEvent)
{
    coin4.startDrag();
}
stage.addEventListener(MouseEvent.MOUSE_UP, coin3undrag);
function coin4undrag(e:MouseEvent)
{
    coin4.stopDrag();
}

coin2.addEventListener(Event.ENTER_FRAME, coin2hit);
function coin2hit(e:Event)
{
    if (coin2.hitTestObject(wallet1))
    {
        coins +=  1;
        coin2.x +=  700000;
    }
    if (coins == maxcoins)
    {
        gotoAndStop(54);
    }
}


coin3.addEventListener(Event.ENTER_FRAME, coin3hit);
function coin3hit(e:Event)
{
    if (coin3.hitTestObject(wallet1))
    {

        coins +=  1;
        coin3.x +=  700000;
    }
};


coin4.addEventListener(Event.ENTER_FRAME, coin4hit);
function coin4hit(e:Event)
{
    if (coin4.hitTestObject(wallet1))

    {
        coins +=  1;
        coin4.x +=  700000;
    }
};

【问题讨论】:

标签: actionscript-3 flash hittest


【解决方案1】:

此错误表示您尝试访问的对象不存在。 在这种情况下,这意味着 coin3、wallet1 或 coin 变量在您尝试使用之前尚未正确创建(初始化)。

只需确保 coin3 和 wallet1 是您的电影剪辑的真实名称并且它们确实在舞台上,并确保在使用之前至少将硬币设置为任何值(如硬币 = 0;);。

【讨论】:

  • 你能写一些示例代码吗? coin3 和 wallet1 是movieclip 和instance 名称。请你写一个例子!我真的卡住了(感谢您的帮助)
  • 另外,它说问题是 coin3hit(hitTest 的函数名称)
  • 请确保在声明硬币变量时将其设置为任何值:您需要在某处有该行 var coin:int = 0;在能够在其他任何地方使用硬币变量之前。 (把它放在使用它的脚本之上)。并且请重新验证movieclips实际上命名为coin3和wallet1,我知道很多时候拼写错误使开发人员扯掉了他们的头发:-)
  • 是的,所有的电影剪辑都有正确的名称。请,对于我使用的 var coin:Number = 0;然后 var maxcoins:Number = 3;当 coin == maxcoins 时,它会进入下一帧。
  • 正如@MaxG 在另一个答案中所说,请验证您放置在舞台上的硬币和钱包的每个实例都已正确命名(在属性面板中选择舞台上的影片剪辑时) )。您的代码似乎没有任何我能注意到的错误...
【解决方案2】:

如果您严格使用代码实例化您的对象,请确保您正确分类您的对象,并相应地命名您的变量...即:

var coin3:Coin = new Coin;

其中“coin3”是“Coin”类的一个实例...根据您打算对该对象执行的操作,您可能需要:

addChild(coin3);
//this may sit inside a function, or directly after the var is created, depending on what you're trying to do

否则,如果您要调用已物理放置在舞台上的对象,请确保它具有您所调用的任何名称的实例名称。这是在属性窗口窗格中设置的。简单地将 MC 命名为“coin3”(或其他)是行不通的。

虽然没有看到更多代码,但很难知道发生了什么。如果类结构的概念是新概念,那么您绝对应该阅读它的工作原理,因为它对于使用 AS3 等面向对象的语言正确创建和管理对象至关重要。

【讨论】:

  • 整个代码现在都在问题中,你能告诉我该怎么做吗?
  • 看起来您每次将硬币添加到钱包时都在尝试存储硬币,是吗?如果是这样,一个更好的方法是将硬币变成一个数组并每次将硬币推入数组......一旦达到你的 maxcoins,你可以清除数组以进行下一次运行......还有为什么你要把你的硬币寄到 x=700000 吗?你只是想摆脱它吗?
  • 是的,我正试图摆脱它。你能不能把我的代码改成数组来告诉我你的意思,我不太明白。我的电子邮件只是entertainingji@gmail.com
  • 什么是破坏我的游戏是,我离开框架后错误不断出现。无论如何我可以删除侦听器或其他东西以使错误停止不断出现。因为,游戏正在运行,但是它正在中断,因为错误不断涌入。帮助?
【解决方案3】:

这可能会让您入门...阅读有关数组如何工作的信息,以更好地了解如何计算和管理对象。对于您实际尝试做的任何事情,这可能是理想的,也可能不是理想的,但是您可以用它们做一些非常漂亮的事情……而且您错误地引用了您的拖动功能之一。我把它清理了一下,使它更容易管理。

import flash.events.Event;
import flash.events.MouseEvent;

var coins:Array();
//this creates an empty array

var maxcoins:int= 3;

coin2.addEventListener(MouseEvent.MOUSE_DOWN, drag);
coin2.addEventListener(MouseEvent.MOUSE_UP, undrag);
coin3.addEventListener(MouseEvent.MOUSE_DOWN, drag);
coin3.addEventListener(MouseEvent.MOUSE_UP, undrag);
coin4.addEventListener(MouseEvent.MOUSE_DOWN, drag);
coin4.addEventListener(MouseEvent.MOUSE_UP, undrag);

// if only dragging one object at a time, then you can just put all your drags into two     functions

function drag(e:MouseEvent)
{
coin2.startDrag();
coin3.startDrag();
coin4.startDrag();
}

function undrag(e:MouseEvent)
{
coin2.stopDrag();
coin3.stopDrag();
coin4.stopDrag();
}

/////////////////////////////////////////////////////////////////

coin2.addEventListener(Event.ENTER_FRAME, coin2hit);
function coin2hit(e:Event)
{
if (coin2.hitTestObject(wallet1))
{
    coins.push(coin2);
//this pushes the coin into the Array which will continue count until it is     cleared below ////

coin2.visible=false;
//setting coin2 to not be visible is simpler than moving it away, especially if the object is never being added again on stage. 
}

if (coins == maxcoins) // mind you this conditional will ONLY execute if coin2hit() is run.
{
    gotoAndStop(54);

    coins.pop(); //this clears the array ////
}
}


coin3.addEventListener(Event.ENTER_FRAME, coin3hit);
function coin3hit(e:Event)
{
if (coin3.hitTestObject(wallet1))
{

    coins.push(coin3);
    coin3.visible=false;
}
};


coin4.addEventListener(Event.ENTER_FRAME, coin4hit);
function coin4hit(e:Event)
{
if (coin4.hitTestObject(wallet1))

{
    coins.push(coin4);
    coin4.visible=false;
}
};

【讨论】:

  • 如何将硬币添加到数组中?
  • 另外,尝试使用跟踪来更好地查明问题...看看在错误出现之前您可以通过多少功能。例如,在每个函数中放置一个trace(thisFunctionName, "or string") 或其他任何内容,以查看它是否真的进入了这些函数。您的跟踪将出现在输出窗口中...如果您不清楚跟踪的工作原理,请阅读,因为这也是调试的重要部分!这很简单:)
  • 比较静态类型数组的值和可能不相关的类型
  • 在bug开始不断出现后,有什么办法可以删除事件监听器。当我离开框架时,bug不断出现。如何在不调试的情况下停止它?喜欢删除一些东西?
  • 尝试将var coinNum:int; coin2=coinNum; coin3=coinNum; coin4=coinNum; 添加到代码顶部,并将所有push 函数替换为coins.push(coinNum);,看看会发生什么...
猜你喜欢
  • 2012-12-29
  • 2015-05-27
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多