Статический класс продолжает выдавать «Ошибка № 1063: Несоответствие количества аргументов» - PullRequest
0 голосов
/ 17 августа 2010

Я создал статический класс во 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()  

Я просмотрел код и не могу найти источник ошибки. Когда я запускаю фильм в режиме отладки, он говорит мне, что ошибка может быть найдена в строке 8 в Main (), который является классом документа, и в настоящее время не содержит кода, кроме пустого конструктора. В строке 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 просто добавляет полученный мувиклип к себе.
Наконец, у меня есть 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 ]

2 голосов
/ 17 августа 2010

Не позволяйте синтаксису C ++ - ish обмануть вас.Actionscript - это не C ++.

По какой-то причине, когда вы пишете класс AS, у вас есть два правила, которым вы должны следовать:

  • , у вас может быть только один конструктор
  • конструктор должен иметь те же аргументы, что и конструктор суперкласса.

Таким образом, проблема с вашим классом Inventory заключается в том, что его конструктор принимает аргумент, которого нет в конструкторе MovieClip.

1 голос
/ 17 августа 2010

Позвольте мне не согласиться здесь. Я знаю, что вопрос помечен как ответивший, но для меня Inventory выглядит как синглтон, поэтому, если вы создали его в Main, вот так:

new Inventory();

вы получите ошибку, потому что Inventory ожидает аргумент типа PrivateClass, который, кстати, недоступен из класса Main. Вот что означает ошибка

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

единственный способ создать экземпляр Inventory - это сделать следующее:

var inventory:Inventory = Inventory.getInstance();

Кроме того, извините Келси, но заявить, что конструктор подкласса должен иметь те же аргументы, что и конструктор суперкласса, просто неточно.

0 голосов
/ 17 августа 2010

Просто выяснил, что не так, следуя логике PatrickS. Что я сделал, так это создал Movieclip, который имел некоторую графику слота инвентаря и связал его с классом Inventory. Затем я перетащил экземпляр MovieClip на сцену.

Что тогда сделал Flash, так это, вероятно, использовал конструктор по умолчанию вместо «Inventory.getInstance ();» создать этот экземпляр.

Создание инвентаря с

mainInventory:MovieClip = Inventory.getInstance();
addChild(mainInventory);

в Main () исправляет это. Надо быть осторожным, я полагаю, когда выполняешь гимнастику в коде, а затем с помощью перетаскивания временной шкалы Flash.

...