Ошибка Flash № 1063: несоответствие количества аргументов

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

У меня есть некоторые из этих ошибок при компиляции, и я знаю решение.

public function GamePlay(stageRef:Stage)
        {
            this.stageRef = stageRef;
            player = new Player(stageRef);

            waitTimer.addEventListener(TimerEvent.TIMER_COMPLETE, WaitTimer, false, 0, true);
            waitTimer.start();

            player.addEventListener(Event.REMOVED_FROM_STAGE, PlayerRemoved, false, 0, true);
        }

В конструкторе я должен добавить stageRef:Stage = null, это устранит ошибку, но если я это сделаю, все мои таймеры будут думать, что этап равен нулю или что-то равно нулю, например.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at scripts::GamePlay/WaitTimer()[C:\Users\Noodles\Documents\Flash Projects\BlockDrop\scripts\GamePlay.as:71]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at flash.utils::Timer/tick()

Что я могу сделать, чтобы исправить эту ошибку?


person RamenNoodles    schedule 21.03.2011    source источник


Ответы (2)


Вы создаете этот объект в конструкторе класса документа вашего основного приложения? Если это так, вы столкнетесь с этой проблемой, даже если остальная часть вашего кода идеальна из-за того, как работает Flash Player.

По сути, «Этап» не имеет значения, пока ваше основное приложение не будет добавлено на сцену. Это быстрый путь к большому количеству необычного поведения и трудно отслеживаемых ошибок. Очень распространенным решением является минимизация кода в конструкторе вашего класса документа. Вместо того, чтобы помещать вашу логику инициализации в ваш конструктор, ваш конструктор просто добавляет прослушиватель событий для Event.ADDED_TO_STAGE, и ваша логика переходит в ваш обработчик. Это будет выглядеть примерно так:

protected var gamePlay:GamePlay;

public function MyConstructor():void {
     this.addEventListener(Event.ADDED_TO_STAGE, addedHandler, false, 0, true);
}

protected function addedHandler(e:Event):void {
     this.removeEventListener(Event.ADDED_TO_STAGE, addedHandler);
     gamePlay = new GamePlay(this.stage);
}

Дайте мне знать, если это решит вашу проблему, возможно, я не совсем понимаю, что происходит, но независимо от того, если у вас возникают проблемы, когда стадия равна нулю, когда этого не должно быть, это обычно является причиной.

person Myk    schedule 21.03.2011
comment
Я не создаю объект в основном классе конструктора. Он создается в классе меню и запускается оттуда. Из основного класса этап передается в класс меню, и я думаю, что проблема именно в этом. Я собираюсь попытаться запустить его из основного класса и посмотреть, что произойдет. - person RamenNoodles; 21.03.2011
comment
Хорошо, действует тот же принцип. этап переменной в конструкторе вашего класса документа будет нулевым. Если вы передаете ссылку на эту переменную до того, как срабатывает событие ADDED_TO_STAGE приложения, то вы просто передаете нулевой объект, и когда он ДЕЙСТВИТЕЛЬНО добавляется на сцену, и переменная сцены заполняется, ваши другие классы не могут знать, что нулевой объект устарел. - person Myk; 21.03.2011
comment
Я все еще получаю ошибку таймера. Я попытался создать оператор if с помощью if(stage) init(); иначе addEventListener(Event.ADDED_TO_STAGE, Init); и я получаю не событие времени компиляции или какую-то ошибку. - person RamenNoodles; 21.03.2011
comment
Что ж, эта ошибка может означать что угодно, но в целом она говорит о том, что вы где-то допустили опечатку. Я бы не стал беспокоиться обо всем, если (стадия), я бы просто добавил ваш прослушиватель событий. По крайней мере, в только что сделанном вами комментарии похоже, что ваша функция называется init(), но в вашем addEventListener() вы передаете Init - AS3 чувствителен к регистру, так что, может быть, это так? - person Myk; 21.03.2011
comment
Все еще не работает вообще, знаете ли вы последствия наличия этих ошибок? Кажется, это вообще не мешает моей игре или делает что-то заметное. Я имею в виду ошибку 1063 в начале вопроса. - person RamenNoodles; 21.03.2011
comment
По сути, это означает, что когда вы создаете объект GamePlay, он ожидает, что вы что-то передадите (предположительно, ссылку на этап) в конструктор объекта GamePlay. Однако ошибка означает, что вы пытаетесь использовать конструктор, фактически ничего не передавая - new GamePlay(stage) vs new GamePlay(). GamePlay ожидает объект, поэтому первоначальная ошибка говорит мне, что где-то вы просто вызываете GamePlay(), ничего не передавая. - person Myk; 22.03.2011
comment
Я вижу, проблема в том, что я передаю сцену в него. Флэш его просто не видит. Так что я действительно не знаю, что я могу сделать в этот момент. - person RamenNoodles; 22.03.2011
comment
Ну, на самом деле вы не должны получать эту ошибку, даже если вы передаете нулевую ссылку на stage. Эта первая ошибка в вашем сообщении выше явно говорит: «Эй, вы забыли передать ссылку!» - person Myk; 23.03.2011
comment
Думаю, это объясняет, почему я не могу найти ответы на свою проблему. Где-то в коде стадия становится нулевой, но не нулевой, что смешно. Я решил переделать всю свою игру, надеюсь, я не смогу избежать этого снова. - person RamenNoodles; 23.03.2011
comment
Я настоятельно рекомендую использовать игровой фреймворк, например, Flixel или PushButtonEngine. Потребуется немного времени, чтобы набрать скорость, но эти фреймворки абстрагируют ВСЕ для вас, поэтому ваша игра будет работать лучше, и вы сможете больше контролировать подобные вещи. Гуглите их! - person Myk; 23.03.2011

При вызове GamePlay укажите параметр Stage.

function fn() //calling function
{
 GamePlay(Stage); //pass Stage to the GamePlay function.
}
person Richard Parnaby-King    schedule 21.03.2011