Рисованные растровые изображения исчезают после вызова функции для изменения вектора - PullRequest
0 голосов
/ 14 мая 2011

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

    private function initMovieClips():Vector.<MovieClip>                                                                                                                                                                                
    {                                                                                                                                                                                                                                   
        var initVec:Vector.<MovieClip> = new Vector.<MovieClip>();                                                                                                                                                                      

        for (var i:int = 0; i < Math.ceil(this.numBlocks / 2); i++)                                                                                                                                                                     
        {                                                                                                                                                                                                                               

            var typeVarianceChance:Number = Math.random();                                                                                                                                                                              
            var colorVarianceChance:Number = Math.random();                                                                                                                                                                             

            var ranType:Number = Math.floor(this.numTypes * Math.random());                                                                                                                                                             

            var coRanType:Number;                                                                                                                                                                                                       
            if (typeVarianceChance < .2)                                                                                                                                                                                                
            {                                                                                                                                                                                                                           
                coRanType = Math.floor(this.numTypes * Math.random());                                                                                                                                                                  
            } else {                                                                                                                                                                                                                    
                coRanType = this.typeHash[ranType];                                                                                                                                                                                     
            }                                                                                                                                                                                                                           

            var ranColor:Number = Math.floor(this.imageURLs.length * Math.random());                                                                                                                                                    

            var coRanColor:Number;                                                                                                                                                                                                      
            if (colorVarianceChance > .1)                                                                                                                                                                                               
            {                                                                                                                                                                                                                           
                coRanColor = Math.floor(this.imageURLs.length * Math.random());                                                                                                                                                         
            } else {                                                                                                                                                                                                                    
                coRanColor = ranColor;                                                                                                                                                                                                  
            }                                                                                                                                                                                                                           

            var mc:MovieClip = new MovieClip();                                                                                                                                                                                         
            var comc:MovieClip = new MovieClip();                                                                                                                                                                                       

            mc.type = ranType;                                                                                                                                                                                                          
            comc.type = coRanType;                                                                                                                                                                                                      

            mc.color = ranColor;                                                                                                                                                                                                        
            comc.color = coRanColor;                                                                                                                                                                                                    

            initVec.push(mc,comc);                                                                                                                                                                                                      
        }                                                                                                                                                                                                                               
        return initVec;                                                                                                                                                                                                                 
    } 

Затем растровые изображения загружаются и рисуются на каждом из изображений. Затем я вызываю эту функцию для случайного «перемешивания» вектора.

    private function shuffle(vec:Vector.<MovieClip>):Vector.<MovieClip>                                                                                                                                                                 
    {                                                                                                                                                                                                                                   
        var shuffled:Vector.<MovieClip> = new Vector.<MovieClip>();                                                                                                                                                                     
        var origLength:uint = vec.length;                                                                                                                                                                                               

        for (var i:int = 0; i < origLength; i++){                                                                                                                                                                                       
            var ranPos:uint = Math.floor(Math.random() * vec.length);                                                                                                                                                                   
            shuffled.push(vec[ranPos]);                                                                                                                                                                                                 
            delete vec[ranPos];                                                                                                                                                                                                         
        }                                                                                                                                                                                                                               
        return shuffled;                                                                                                                                                                                                                
    }

Если я не вызову функцию перемешивания, растровые изображения будут отображаться просто отлично. Но если я вызову функцию перемешивания в моем векторе. некоторые мувиклипы не отображаются на экране после того, как я добавляю их в список отображения (который я проверял и знаю, что происходит). Некоторые появляются случайно, а некоторые нет. Какие из них отображаются, а какие не кажутся случайными каждый раз, когда я запускаю свое приложение (может, это как-то связано с моей функцией initMovieClips, которая использует псевдослучайный код?).

Я пытался реализовать функцию shuffle в разных точках моего кода, в местах, где растровые изображения уже были нарисованы, и в местах, где я даже не вызывал функцию, чтобы начать загрузку растровых изображений (поэтому я не Не думаю, что это проблема с потоками). Я даже пытался вставить код, чтобы нарисовать простой тестовый круг в каждом графическом свойстве MovieClip. Просто чтобы увидеть, была ли это проблема с растровыми изображениями, но то, что не было нарисовано, не показывало растровое изображение или тестовый круг. Это наводит меня на мысль, что это проблема самого графического свойства. Что оставляет меня полностью в тупике. Любые идеи о том, что это может быть?

1 Ответ

0 голосов
/ 14 мая 2011

Я думаю, что, вероятно, находится в цикле for. Вы перебираете длину для своего vec (который в этом случае я предполагаю, что это initVec). Но чтобы получить индекс vec, вы делаете рандомизацию

var ranPos:uint = Math.floor(Math.random() * vec.length); 
shuffled.push(vec[ranPos]); 

так что теперь происходит то, что, хотя вы можете получать значения от 0 до длины vec, вы можете повторять одно и то же значение дважды. Так, если vec.length = 5, вы можете получить 1, 2, 3,2,4, в этом случае вы пропускаете 5 и получаете 2 дважды, этот порядок в основном «случайный», поэтому в больших масштабах вы можете не идти, хотя все ваши vec [] значения

еще один способ сделать это - использовать цикл while, и если в случайном порядке возвращается уже использованный индекс, повторите попытку до тех пор, пока не будут использованы все значения индекса (грубая сила), если ваш vec.length велик, попробуйте http://en.wikipedia.org/wiki/Shuffling#Shuffling_algorithms

...