Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Непонятно работает addChild (http://www.flasher.ru/forum/showthread.php?t=151702)

Irishman 04.03.2011 06:54

Непонятно работает addChild
 
Здравствуйте. Извините, что обращаюсь с подобным вопросом, просто, наверное, нужен "незамыленный" взгляд на код. Вроде бы простой кусочек программы, который должен наполнять массив 20ю объектами класса Smile и выводить их на экран. Привожу самый упрощенный уже вариант, потому что и он не работает.
Код AS3:

package smilegame 
{
        import flash.display.*;
 
        /**
        * ...
        * @author Irishman
        */

        public class MainClass extends Sprite
        {
                var smile:Smile;
                var masSmile:Array = new Array();
 
                public function MainClass()
                {
                        init();
                }
                internal function init():void
                {
                        trace("start stage child= " + stage.numChildren);//1
                        for (var i = 0; i < 10; i++)
                        {
                                smile = new Smile();
                                masSmile.push(smile);
                                masSmile.unshift(smile);
                                trace("mas len= " + masSmile.length);//2
                        }
                        k = 0;
                        trace(masSmile.length);//3
                        for (var q = 0; q < 20; q++)
                        {
                                masSmile[k].y = q * 10 + 10;
                                stage.addChild(masSmile[k]);
                                trace(k,stage.contains(masSmile[k]),stage.numChildren);//4
                                k++;
                        }
                }
 
        }
 
}

В итоге, первый trace выдает начальное значение 1, цикл вторых трейсов показывает исправное увеличение массива за каждый шаг на 2 элемента, третий трейс выдает количество элементов в массиве равно 20(сколько и нужно), а вот 4 трейс ведет себя странно. k исправно принимает значения до 19(+нулевой элемент, то есть проходим все 20 элементов массива), stage.contains выдает true все 20 раз, а вот numChildren перестает увеличиваться после 10го шага и остается равным 11. Уже не знаю на что подумать, руки прямее достать пока не судьба=)
Визуальный результат - добавляется всего 10 элементов, причем, такое ощущение, что из "середины" массива, так по идее, первой y-координатой должно быть 10, а на самом деле 50-60.

Hauts 04.03.2011 07:19

Код AS3:

internal function init():void
{
        for (var i = 0; i < 20; i++)
        {
                smile = new Smile();
                masSmile.push(smile);
                smile.y = i * 10 + 10;
                stage.addChild(masSmile[k]);
        }
}

addChild работает правильно. Вы в первом цикле делаете push и unshift, дублируя ссылку на новый Smile, поэтому и получаете после цикла с 10 итерациями массив с 20 повторяющимися элементами. А потом в цикле до 20 вставляете эти смайлы и видите только 10, потому, что фактически вы создали их ровно столько же. Нельзя один и тот же клип добавить в потомки сто раз и увидеть сто разных клипов, только один и останется.

Irishman 04.03.2011 07:27

О, спасибо огромное=) сам бы на это никогда не подумал!


Часовой пояс GMT +4, время: 12:20.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.