Helpers - компьютеры, интернет, программирование

AS3 - Доступ к переменной в корне из класса

Как получить доступ к переменной на корневой временной шкале из класса? В корневой временной шкале есть переменная с именем myblocks, из которой мне нужно прочитать значение.

Это связанная часть класса:

package myclasses
{

public final class Bcoder extends EventDispatcher
    {

private function getBlocks():void
        {

            for (var i:int = _getNumBlocks; i--; ){
            // how to get the myblocks value from here?

            }}

Это из корневой временной шкалы: (ActionScript стоит в ключевом кадре)

    import myclasses.Bcoder;
var myblocks:Number=20
08.05.2012

  • Почему вы объединяете временную шкалу AS3 с классом AS3? Я не очень хорошо знаком с AS3 или AS в целом, но это кажется странным. 08.05.2012

Ответы:


1

Это полная ерунда и действительно плохая практика. Вам следует избегать такого способа кодирования!!!

Это действительно не ООП и заставляет меня думать о плохих AS1/2 и 3 вместе взятых!!!

Однако это возможно, если у вас нет класса, определенного в свойствах документа в качестве основного класса.

пример: в папке "com" класс ObjectOnStage.as:

package com {
    import flash.display.Stage;
    import flash.display.Sprite;
    import flash.events.Event;
    public class ObjectOnStage extends Sprite{

    public function ObjectOnStage() {
                this.addEventListener(Event.ADDED_TO_STAGE,onAddedToStage,false,0,false);
                this.addEventListener(Event.ACTIVATED,onActivate,false,0,false);
    }
    public function onAddedToStage(e:Event):void{
                    // will output null for both
            trace("\n       added " + e.target + "\n");
            trace(e.target.parent["nonSense"]);
            trace(e.target.parent["nonsense"]);
        }
    public function onActivate(e:Event):void{
                    // will output the values.
            trace("\n       added " + e.target + "\n");
            trace(e.target.parent["nonSense"]);
            trace(e.target.parent["nonsense"]);
        }
    }

}

На кадре 1 временной шкалы:

import com.ObjectOnStage;
var nonSense:int = 1;
var nonsense:String = "This is a nonsense";
var oos:ObjectOnStage = new ObjectOnStage();
this.addChild(oos);

Вам лучше изменить весь сценарий!

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

MyClass.getInstance();

Это позволит что-то вроде:

package com {
public class MyMainObject {
    private static var instanceOfMainObject;
    private function MyMainObject(args:Vector.<String>){
                    // or MyMainObject(...args)
        trace("new Instance of MyMainObject created with " + args.toString());
    }
    public static function main(args:Vector.<String>):void{
        instanceOfMainObject = MyMainObject.getInstance(args);
        trace("arguments.length = " + args.length);
        for(var i:int = 0 ; i < args.length ; i++){
            trace( i + " = " + args[i]);
        }
    }
    public static function getInstance(args:Vector.<String>):MyMainObject{
        var instance:MyMainObject = new MyMainObject(args);
        return instance;
        }
    }
}

Теперь этот код выдает ошибку:

1153: A constructor can only be declared public.

Возможно так и будет в AS4???

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

Пример: в MyClass.as

    package com {
    import flash.display.DisplayObjectContainer;
    import flash.events.EventDispatcher;
    public class MyClass extends EventDispatcher{
        public function MyClass(doc:DisplayObjectContainer) {
            trace(doc["nonSense"]);
            trace(doc["nonsense"]);
            // but this is again not OOP even if you use the "class" KEYWORD.
        }
    }
}

на временной шкале: var nonSense:int = 1; var бред:String = "Это бред"; var mclss:MyClass = новый MyClass(этот);

Что касается EventDispatcher, вы также можете прочитать мой ответ о EventDispatcher здесь

09.05.2012
  • Я не заставляю это работать для моего класса. Ваш первый пример с Event.ADDED_TO_STAGE также работает, если класс поставляется с EventDispatcher? public final class Bcoder extends EventDispatcher { Спасибо. 09.05.2012
  • Да, это не зависит от типа класса, который вы пытаетесь расширить. Однако если класс не является объектом, который вы добавляете в рабочую область, вы не можете вызвать [e:Event].parent, поскольку это не объект, помещенный в рабочую область. Затем вы должны передать контейнер DisplayObject, как в этой вставке: pastie.org/3885542 Если это работает, вы можете отметить этот пост как решенный, или, пожалуйста, расскажите мне больше о коде и о том, что вы хотите сделать. 09.05.2012

  • 2

    Я думаю, вам стоит взглянуть на это: http://www.kirupa.com/forum/showthread.php?349086-AS3-Question-Accessing-a-main-timeline-variable-from-a-class

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

    08.05.2012
    Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

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

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..