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

时间:2014-10-30 16:09:04

标签: actionscript-3 class

我的库存系统似乎出错了。

这是我的班级:

package 
{
    import flash.display.*;

    public class InventoryDemo extends MovieClip
    {
        var inventory:Inventory;

        public function InventoryDemo()
        {
            inventory = new Inventory(this);
            inventory.makeInventoryItems([d1,d2]);
        }
    }
}

我已经在第二个关键帧中放置了d1和d2对象。

这是儿童班:

package 
{
    import flash.display.*;
    import flash.events.*;

    public class Inventory
    {
        var itemsInInventory:Array;
        var inventorySprite:Sprite;

        public function Inventory(parentMC:MovieClip)
        {
            itemsInInventory = new Array  ;
            inventorySprite = new Sprite  ;
            inventorySprite.x = 50;
            inventorySprite.y = 360;
            parentMC.addChild(inventorySprite);

        }
        function makeInventoryItems(arrayOfItems:Array)
        {
            for (var i:int = 0; i < arrayOfItems.length; i++)
            {
                arrayOfItems[i].addEventListener(MouseEvent.CLICK,getItem);
                arrayOfItems[i].buttonMode = true;
            }
        }

        function getItem(e:Event)
        {
            var item:MovieClip = MovieClip(e.currentTarget);
            itemsInInventory.push(item);
            inventorySprite.addChild(item);
            item.x = itemsInInventory.length - 1 * 40;
            item.y = 0;
            item.removeEventListener(MouseEvent.CLICK,getItem);
            item.addEventListener(MouseEvent.CLICK,useItem);
        }

        function useItem(e:Event)
        {
            var item:MovieClip = MovieClip(e.currentTarget);
            trace(("Use Item:" + item.name));
        }
    }
}

当我在舞台上只有d1和d2的黑色项目中尝试时,代码可以正常工作。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

您的错误表明在您拨打

时未创建d1和d2
inventory.makeInventoryItems([d1,d2]);

您建议您在第二个关键帧中创建了d1和d2,但如果InventoryDe​​mo是您的DocumentClass,那么它将在您到达第二个关键帧之前运行。

因此,如果您想使用d1和d2,您需要将它们移动到第一帧,或者您需要在影片的第二帧发生之前不要尝试使用它们。

如果你想在第二帧上保留d1和d2,那么你需要从构造函数中调出一个新函数,然后调用你在第二帧上调用的函数:

public function InventoryDemo()
{
    //Do nothing here
    //inventory = new Inventory(this);
    //inventory.makeInventoryItems([d1,d2]);
}

public function initialiseInventory():void
{
    //Initialise you inventory here.
    inventory = new Inventory(this);
    inventory.makeInventoryItems([d1,d2]);
}

然后在时间轴的第2帧调用函数:

initialiseInventory();
stop();