AS3: addChild несколько экземпляров библиотеки mc не отображаются - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь создать небольшое доказательство концепции, в котором TextField присоединяется к mc, хранящемуся в библиотеке, и создается (с помощью addChild). Я могу заставить скрипт работать для одного экземпляра, но если я попытаюсь сделать четыре копии (как показано ниже), отобразится только третий (?) Экземпляр TextField. (изображение actionScript удалено) Спасибо за ваше время.

Код следует:

import flash.display.MovieClip;
flash.display.Sprite;

var i:uint = 0;
var str:String = ""; // to be used to give the textField some values
var aGroup:Sprite = new Sprite(); //used to be some holder other than stage to get all the addChild (don't know if this is absolutely necessary
var aUFO:Array = new Array(); // these are arrays that will hold the instantiated copies of the same object
var aField:Array = new Array();

//main process for creating instances
for (i=0; i<4; i++) {
    var mcUFO:Saucer = new Saucer(); //mcUFO resides in the library with a MovieClip "Saucer" linkage
    aGroup.addChild(mcUFO);
    aUFO[i] = mcUFO;

    aUFO[i].addChild(tFormula); //tFormula is a textField defined elsewhere (previous frame)
    aField[i] = tFormula;

    str = "FillText"+String(i); //used just to temporarily load the textField with some values
    aField[i].text = str;

    aField[i].x -= 21.5; //this is just a rough, quick offset of the textfield to a better postion within the mcuFO
    aField[i].y -= 8;

    var mcDome:Sprite = new Dome(); //mcDome exists in the library with a Sprite linkage
    mcUFO.addChild(mcDome);
    mcDome.x -= 54; //this is just a quick way to relatively reposition the dome over the mcUFO
    mcDome.y -= 35;
}

Затем я приведу небольшой код, чтобы переместить четыре экземпляра так, чтобы они образовали стек 2x2.

for (i=0; i<4; i++) {
    if ((i == 0) || (i ==1)) {
        aUFO[i].x = 200 + i*200;
        aUFO[i].y = 200;
    }else{
        aUFO[i].x = 200 + (i-2)*200;
        aUFO[i].y = 100;
    }
}

stage.addChild(aGroup);//I don't know if this sprite is necessary, but I read somewhere that we're not supposed to add instances directly onto stage, but rather add to a sprite and then addChild that to the stage

this.stop();

1 Ответ

0 голосов
/ 02 июля 2018

Ваша ошибка не в понимании того, как работают экземпляры.

Библиотека - это не хранилище, это как коллекция чертежей. Каждый раз, когда вы используете оператор new , вы создаете новый экземпляр в соответствии с вашим планом в Библиотеке (или новым экземпляром класса, который не связан с каким-либо конкретным объектом библиотеки, например пустым ). новый контейнер Sprite ).

С другой стороны, все, что вы заранее спроектировали на сцене, существует как финальные экземпляры. Если вы спроектировали один TextField , на самом деле нет ничего, кроме одного TextField .

Представьте, что у вас есть одно яблоко ( TextField экземпляр) и машина, которая производит ( новое блюдце ) бумажные пакеты. Вы делаете бумажный пакет и кладете свое яблоко. Вы делаете другой пакет и кладете свое яблоко во второй пакет. Теперь вы получаете картину, верно? Первая сумка теперь пуста, даже если вы явно не указали удаление яблока из первой сумки.

Чтобы решить эту проблему, вам нужно иметь TextField , уже спроектированный внутри Блюдце в Библиотеке. Таким образом, когда вы создаете экземпляр новой тарелки , у вас будет TextField , также созданный для новой тарелки из библиотеки. Дайте этому TextField имя экземпляра (например, "Формула") и адресуйте его по нему. Ваш код будет выглядеть так:

// Content container.
var aGroup:Sprite = new Sprite;

// The list of Saucers.
var aUFO:Array = new Array;

// The list of Saucer's TextFields.
var aField:Array = new Array;

// Instantiation loop.
for (var i:int = 0; i < 4; i++)
{
    // Create a new instance of Saucer object.
    var mcUFO:Saucer = new Saucer; 
    aGroup.addChild(mcUFO);
    aUFO[i] = mcUFO;

    // Obtain the unique TextField reference from the Saucer
    // you are currently working on.
    aField[i] = mcUFO.getChildByName("Formula");

    // Assign text to the TextField.
    aField[i].text = "FillText" + i;

    // No need, TextField is already positioned by design.
    // aField[i].x -= 21.5; // aField[i].y -= 8;

    // Instantiate a Dome from the library
    // (but you can do the same and pre-design Dome into the Saucer).
    var mcDome:Sprite = new Dome;
    mcUFO.addChild(mcDome);

    // Position the Dome.
    mcDome.x -= 54;
    mcDome.y -= 35;
}

С другой стороны, вы можете использовать все сценарии и создавать новые TextField экземпляры, но имейте в виду, что вам нужно будет установить каждое свойство этого нового экземпляра, иначе вы можете не увидеть ни текста, ни чего-либо еще всего:

var textArea:TextField;

textArea = new TextField;

textArea.x = 10;
textArea.y = 10;

textArea.border = true;
textArea.wordWrap = false;
textArea.multiline = true;
textArea.selectable = true;
textArea.background = true;

var aFormat:TextFormat;

aFormat = textArea.getTextFormat();
aFormat.font = "_typewriter";
aFormat.size = 12;
aFormat.align = TextFormatAlign.LEFT;

textArea.setTextFormat(aFormat);
textArea.defaultTextFormat = aFormat;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...