静态类不断抛出“错误#1063:参数计数不匹配”

时间:2010-08-17 11:21:47

标签: flash actionscript-3 static

我在Flash中创建了一个静态类,它作为此游戏的库存代理。 Flash虽然不断给我这个错误:

ArgumentError: Error #1063: Argument count mismatch on Inventory(). Expected 1, got 0.  
    at flash.display::Sprite/constructChildren()  
    at flash.display::Sprite()  
    at flash.display::MovieClip()  
    at Main()  

我查看了代码并且不能为我的生活找到错误的来源。当我在调试模式下运行电影时,它告诉我错误可以在Main()中的第8行找到,它是文档类,除了空构造函数之外,它目前不包含任何代码。第8行是构造函数的起始位置 Inventory类看起来像这样:

package  {  
    import flash.display.MovieClip;
    import flash.utils.getDefinitionByName;

    public class Inventory extends MovieClip{

        private static var instance:Inventory;
        private var invItemQuant:int;

        public function Inventory(pvt:PrivateClass){
            invItemQuant = 0;
        }

        public static function getInstance():Inventory{
            if(Inventory.instance == null){
                Inventory.instance = new Inventory(new PrivateClass());
            }
            return Inventory.instance;
        }

        //Usage: x.addToInventory(itemName);
        //After: item has been added to the inventory
        public function addToInventory(itemName:String){
            var itemType:Class = getDefinitionByName(itemName) as Class;
            var theItem:MovieClip = new itemType();
            theItem.name = itemName;
            invItemQuant++;
            MovieClip(getChildByName("itemSlot" + invItemQuant)).fillSlot(theItem);
        }

        //Usage: x.removeFromInventory(itemName);
        //Before: item is contained in inventory
        //After: item has been removed from the inventory
        public function removeFromInventory(itemName:String){
            for(var i:int = 1; i <= invItemQuant; i++){
                MovieClip(getChildByName("itemSlot" + i)).emptySlot(itemName);
            }
            invItemQuant--;
        }

        //Usage: q = getItemQuant();
        //Before: q is int
        //After: the number of items in inventory is in q
        public function getItemQuant():int{
            return invItemQuant;
        }
    }
}

class PrivateClass {
    public function PrivateClass(){
        trace("PrivateClass called");
    }
}

我把它设为静态,所以我可以从舞台上访问它并将项目添加到库存中。然后,Inventory MovieClip由名为itemSlot1,itemSlot2等的大型插槽组成 然后将库存槽链接到此类:

package  {
    import flash.display.MovieClip;

    public class InvSlot extends MovieClip {

    public function InvSlot() {
        }

        //Usage: x.fillSlot(itemName);
        //Before: slot is empty
        //After: object theItem has been put into the slot
        public function fillSlot(theItem:MovieClip){
            this.addChild(theItem);
        }

        //Usage: x.emptySlot(itemName);
        //Before: movieclip itemname may exist in this object
        //After: movieclip itemname does not exist in this object
        public function emptySlot(itemName:String){

        }
    }
}

我还没有制作emptySlot方法。 fillSlot方法只是将收到的movieClip添加到它自己 最后我有stageItem,当与之交互时(目前刚刚点击)应该添加到库存中。

package  { 
    import flash.events.MouseEvent;

    public class StageItemRubberChicken extends StageItemBase{

        public function StageItemRubberChicken() {
            description = "It's a chicken, of the rubbery kind";
            descriptiveName = "Rubber Chicken";
            itemName = "ItemRubberChicken";
            this.addEventListener(MouseEvent.CLICK, interactWithItem, false, 0, true);
        }

        private function interactWithItem(e:MouseEvent){
            var mainInventory:Inventory = Inventory.getInstance();
            mainInventory.addToInventory(itemName);
            this.parent.removeChild(this);
        }
    }
}

3 个答案:

答案 0 :(得分:2)

不要让C ++ - ish语法欺骗你。 Actionscript不是C ++。

出于某种原因,当您编写AS类时,您必须遵循两条规则:

  • 您可能只有一个构造函数
  • 构造函数必须与超类的构造函数具有相同的参数。

因此,Inventory类的问题在于它的构造函数接受了MovieClip构造函数中不存在的参数。

答案 1 :(得分:1)

请允许我在这里不同意。我知道这个问题被标记为已回答,但是Inventory看起来像是一个Singleton,所以如果你在Main中实例化它就像这样:

new Inventory();

你会得到一个错误,因为Inventory需要一个类型为PrivateClass的参数,顺便说一句,它不能从Main类访问。这就是错误的含义

Argument count mismatch on Inventory(). Expected 1, got 0. 

创建库存实例的唯一方法是执行以下操作:

var inventory:Inventory = Inventory.getInstance();

另外,对不起Kelsey,但声明子类构造函数必须与超类构造函数具有相同的参数,这是不准确的。

答案 2 :(得分:0)

通过遵循PatrickS逻辑找出问题所在。我所做的是创建一个Movieclip,它有一些库存槽图形并将其与Inventory类链接。然后我将MovieClip的一个实例拖到舞台上。

然后Flash可能会使用默认构造函数而不是“Inventory.getInstance();”创建该实例。

使用

创建广告资源
mainInventory:MovieClip = Inventory.getInstance();
addChild(mainInventory);
Main()中的

完成修复此操作的工作。一个人必须要小心,我猜想在代码中进行体操,然后使用拖放Flash时间线。