as3 Проблемы с манипуляциями с объектами вне класса Document

Я новичок в ActionScript, и я постоянно пытался создать игру с боковой прокруткой. Все шло хорошо, пока я не понял, что мне нужна функция «игра окончена». Проблема в том, что у меня есть много объектов мувиклипов с собственными именами экземпляров, к которым я обращаюсь из моего класса документа.

Однако теперь у меня есть новый класс документа, который инициирует мой старый класс документа для запуска игры, а также запускает игру поверх экрана, так что я могу сбросить игру. За исключением того, что теперь я получаю сообщение об ошибке свойства undefined (заполните поле) для всех 50 объектов моего экземпляра.

Итак, мой вопрос в том, как заставить flash распознавать и разрешать классу, не являющемуся документом, управлять этими экземплярами Movie Clip.

Я создал небольшой пример, чтобы проиллюстрировать, что я пытаюсь сделать.

package  {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;
public class Test extends MovieClip {

    public static var gstage:Stage;

    public function Test() {
        // constructor code
        var playScreen:Go = new Go();
        addChild( playScreen );
    }

}

}

Выше мой класс документа "moveme - это имя экземпляра.

Другой класс, который был бы моим старым классом документа, это

package  {
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.Event;
import Test;

public class Go extends MovieClip {
    public var test:Test;

    public function Go() 
    {
        if (stage)
        {
            init();
        }
        else
        {
        addEventListener(Event.ADDED_TO_STAGE, init);
        }
    }
    private function init(e:Event = null):void 
    {       
           if (e) removeEventListener(Event.ADDED_TO_STAGE, init);
            trace(stage.width);
            addEventListener(Event.ENTER_FRAME, loop);

    }
    public function loop(e:Event, Test):void
    {
        Test.moveme.scaleX++
                    Test.moveme.x++

    }

}

}

Ошибка, которую я получаю с этим, - ArgumentError: Error # 1063: Несоответствие количества аргументов в Go / loop (). Ожидал 2, получил 1.

или если я удалю тест в цикле общедоступной функции (e: Event, Test): void, я получаю ту же ошибку, что и раньше. Я уже много чего пробовал, я могу заставить его отслеживать ширину сцены, я просто не могу контролировать экземпляры.

Любая помощь будет оценена по достоинству!


person Andrew    schedule 30.04.2014    source источник


Ответы (2)


Это неправильно по следующим причинам:

 public function loop(e:Event, Test):void
    {
        Test.moveme.scaleX++
        Test.moveme.x++

    }
  • Test - это имя класса, если вы хотите сделать его параметром, вы должны написать что-то вроде цикла публичной функции (e: Event, testObj: Test): void
  • Слушатель событий не передает testObj. Поэтому, если вы хотите использовать его как со слушателем событий в качестве обработчика событий, так и с возможностью вызывать его самостоятельно, вам следует перейти на цикл общедоступных функций (e: Event = null, testObje: Test = null): void
    Тогда прослушиватель событий не вызовет ошибку. Вызов самой функции можно сделать так: loop (null, yourInstanceOfTest)

Кроме того, тело функции пытается вызвать методы, переменные класса, а не экземпляра, это должно быть:

 {
     test.moveme.scaleX++
     test.moveme.x++

 }

В вашем случае, поскольку test является экземпляром класса, Test является классом.
Но тогда нет причин передавать Test в качестве параметра, просто удалите его и оставьте только часть e: Event. Если вы действительно хотите его использовать, используйте экземпляр переданного параметра, например:

{
         // provided that use passed parameter type of Test as a testObj, like in my example
         testObj.moveme.scaleX++
         testObj.moveme.x++

}
person Creative Magic    schedule 30.04.2014
comment
Теперь, если я попробую цикл общедоступной функции (e: Event = null, testObj: Test = null): void {testObj.moveme.scaleX ++}, я получаю сообщение об ошибке TypeError: Error # 1009: Невозможно получить доступ к свойству или методу ссылки на нулевой объект . в Go / loop () [C: \ Users \ name \ Desktop \ games \ game3 \ Go.as: 31] строка 31 - это testObj.moveme.scaleX ++. Я также получаю ту же ошибку, используя test.moveme.scaleX ++ с частью testObj, взятой из функции. - person Andrew; 30.04.2014
comment
Как я уже сказал: когда событие Event.ENTER_FRAME запускает и вызывает цикл, оно передает только один аргумент, само событие, в цикл функции. Следовательно, testObj имеет значение null и недоступен. Вы можете объявить testObj как переменную класса и назначить ее в функции init. открытый класс Go расширяет MovieClip {private var testObj: Test; частная функция init (e: Event = null): void {testObj = new Test (); [...] цикл публичной функции (e: Event = null): void {testObj.moveme.scaleX ++} - person Jan; 05.05.2014

Когда событие Event.ENTER_FRAME запускает и вызывает цикл, оно передает только один аргумент, само событие, функции «цикл». Однако функция «loop» ожидает 2 аргумента: «e: Event» и «Test» неизвестного типа. Вы можете либо удалить второй аргумент из функции, поскольку вы не используете его в функции, либо, если вы планируете вызывать функцию из другого места позже и передать второй аргумент, установите для него значение null, чтобы Event.ENTER_FRAME мог правильно его вызвать. :

Либо:

public function loop(e:Event):void

Or:

public function loop(e:Event, test : Test = null):void
person Jan    schedule 30.04.2014