Доступ к переменным из отдельного класса

#actionscript-3 #flash-cs6 #flashdevelop

#actionscript-3 #flash-cs6 #flashdevelop

Вопрос:

Привет всем, итак, я пытаюсь получить доступ к логическим переменным из отдельного класса, вызываемого mcPressMachine с помощью моего основного класса SmashyFoodEngine . Что я хочу сделать, так это когда оценка > = 6, затем измените логические значения следующим образом в моем основном классе движка Введите событие кадра:

 if (nScore >= 6)
        {
            for each(var AllPresses:mcPressMachine in aPressMachineArray)
            {
                AllPresses.level_1 = false;
                AllPresses.level_2 = true;
            }
        }
 

в моем mcPressMachine классе у меня есть логические значения, настроенные для управления тем, какие кадры этого класса видеороликов на временной шкале будут воспроизводиться следующими. Итак, в основном, если значение level_1 равно true, тогда воспроизводите случайные кадры из (1,8), если значение level_2 равно true, тогда кадры (9,13) и т.д… Который настроен таким образом в классе pressMachine:

 public var level_1:Boolean = true;
public var level_2:Boolean = false;

private function init():void 
    {

        if (level_1)
        {
            var randomFrameLevel_1:Number = randomNumber(1, 8);
            this.gotoAndStop(randomFrameLevel_1);

        }

        if (level_2)
        {
            var randomFrameLevel_2:Number = randomNumber(9, 13);
            this.gotoAndStop(randomFrameLevel_2);

        }
    }
 

поэтому, когда я отслеживаю его, и оценка равна> = 6, логические значения меняются идеально, но на экране ничего не происходит. Видеоклипы точно такие же и не меняются на кадры level_2 (9-13);

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

 private function addNewPressMachines():void 
    {
        //have array of press machines come out 5 at a time. 
        for (var i:int = 0; i < 2; i  )
        {
            //trace(aPressMachineArray.length   "PRESS MACHINES");
            pressMachine = new mcPressMachine();
            pressMachine.x = startPoint.x   (xSpacing * i);
            pressMachine.y = (stage.stageHeight / 2);

            stage.addChildAt(pressMachine, 1);
            aPressMachineArray.push(pressMachine);

            pressMachine.inner.top.visible = false;
            pressMachine.inner.top.topText.text =  " "   sharedObjectHighScore.data.highScore;


        }
    }
 

Кто-нибудь может увидеть, делаю ли я что-то не так? Я не получаю никаких ошибок, просто не работает должным образом. Любой совет был бы потрясающим. Спасибо!

Комментарии:

1. Вы выполняете этот код в init(), который вызывается один раз при создании экземпляра машины, да?

2. Да, это правильно

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

4. ДА. Вы объявляете свои переменные как true и false в коде конструктора. Затем вы используете условие, которое зависит от этих значений, но они всегда будут одинаковыми. Вам нужно изменить логические значения, а затем снова вызвать функцию init() . Я бы, вероятно, сделал это немного по-другому. Я опубликую ответ, если у меня будет время. Но в краткосрочной перспективе попробуйте сделать то, что я только что предложил. И вам нужно будет сделать это общедоступной функцией, а не частной (именно поэтому я бы сделал это по-другому… В принципе, я бы просто включил эти значения в качестве аргументов в конструкторе).

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

Ответ №1:

Это лучшее, что я могу сделать на данный момент.

 var _var1:Boolean;
var _var2:Boolean;

public function MyClass(first:Boolean,second:Boolean):void{
    this._var1 = first;
    this._var2 = second;
    if (_var1 == true) {
    // stuff
    }
    if (_var2 == true){
    // etc.
    }
 

Это передает ваши аргументы из в код конструктора и сохраняет значения в свойствах этого экземпляра класса.

Или еще проще

 var _level:int;
public function MyClass(lev:int=1):void{
     this._level = lev;
     if (lev == 1){
     // do stuff
     } else if (lev==2){
     // etc
     }
 

Здесь вы заметите, что я установил _level значение, равное lev аргументу. Это действительно необходимо только в том случае, если вам нужно, чтобы экземпляр этого класса имел _level свойство для других вещей. Видите ли, я мог бы с таким же успехом сделать это:

 public function MyClass(lev:int=1):void{
     if (lev == 1){
     // do stuff
     } else if (lev==2){
     // etc
     }
 

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

А затем, когда вы создаете новый экземпляр этого класса, просто выполните

 var myInstance = new MyClass(true, false); // using the first example
 

или в моей лучшей, более простой версии

 var myInstance:MyClass = new MyClass(2); // for the second example
 

Комментарии:

1. Это то, что я пытался выяснить, как это сделать. Все еще борюсь, но я продолжаю пробовать новые способы. Я дам вам знать, как это происходит. итак, в моем машинном классе я создаю эти переменные. Тогда я смогу изменить их в своем основном классе, когда добавлю новую машину?

2. Эй, я все понял. Спасибо, чувак, я ценю всю помощь и быстрые ответы.

3. Никаких проблем. Приятно слышать, что вы разобрались.