AS3 Произвольная загрузка видеоклипа из библиотеки без повторения - PullRequest
0 голосов
/ 27 марта 2012

У меня есть игра разницы, которая каждый раз, когда я решаю изображение, и я нажимаю «Далее», он загружает другой MC из библиотеки.

Ниже приведен мой код для случайной загрузки MC из библиотеки:

var showMcNum:Number = 0;
var movieList:Array = [mc1,mc2,mc3];
function getRandomMovie():MovieClip
{
    return new movieList[Math.floor(Math.random()*movieList.length)];
}
nextBtn.addEventListener(MouseEvent.CLICK, nextClick);
function nextClick(event:MouseEvent):void
{
    var mc:MovieClip = getRandomMovie();
    addChild(mc);
    mc.x = stage.stageWidth / 2;
    mc.y = stage.stageHeight / 2;
}

Я бы хотел, чтобы каждый раз, когда я нажимал следующую кнопку, он загружал другой MC из библиотеки без повторения этих MC.

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Если вы не хотите, чтобы MC повторялся, просто удалите его из списка при его возврате.

function getRandomMovie():MovieClip
{
    var index:int = Math.floor(Math.random()*movieList.length);
    var mcClass:Class = movieList.splice(index,1)[0];
    return new mcClass();
}

Вот версия, использующая второй массив, чтобы позволить вам повторить список каксогласно комментарию TheSHEEEP:

function getRandomMovie():MovieClip
{
    if(!movieList.length) {
        movieList = spareList;
        spareList = [];
    }
    var index:int = Math.floor(Math.random()*movieList.length);
    var mcClass:Class = movieList.splice(index,1)[0];
    spareList.push(mcClass);
    return new mcClass();
}

Удаление предыдущего мувиклипа

Чтобы удалить предыдущий мувиклип, необходимо сохранить его за пределами nextClickфункция, так что вы можете удалить его, прежде чем получить следующий:

//declare mc outside
var mc:MovieClip;
function nextClick(event:MouseEvent):void
{
    //remove mc first
    if(mc && mc.parent) removeChild(mc);
    //(optional) free up old mc for garbage collection
    //now replace the contents of mc with a new random instance
    mc = getRandomMovie();
    addChild(mc);
    mc.x = stage.stageWidth / 2;
    mc.y = stage.stageHeight / 2;
}

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

0 голосов
/ 28 марта 2012

Спасибо @shanethehat за ответ. Но после загрузки последнего MC и повторного нажатия следующей кнопки появится сообщение об ошибке, так как MC больше не загружается из библиотеки.

Я изменил abit кода так, чтобы, когда все MC из библиотеки были загружены, и кнопка знала об этом и не имела ошибок.

var showMcNum:Number = 0;
var movieList:Array = [mc1,mc2,mc3];

function getRandomMovie():MovieClip
{
    var index:int = Math.floor(Math.random() * movieList.length);
    var mcClass:Class = movieList.splice(index,1)[0];
    return new mcClass();
}

nextBtn.addEventListener(MouseEvent.CLICK, nextClick);

//declare mc outside;
var mc:MovieClip;
function nextClick(event:MouseEvent):void
{
    if (showMcNum < 3)
    {
        //remove mc first
        if (mc && mc.parent)
        {
            removeChild(mc);
        }//(optional) free up old mc for garbage collection
        //now replace the contents of mc with a new random instance
        mc = getRandomMovie();
        addChild(mc);
        mc.x = stage.stageWidth / 2;
        mc.y = stage.stageHeight / 2;
        showMcNum++;
    }
    else
    {
        //code what you wanna do here after all the MC is loaded
    }
}

mc = getRandomMovie();
addChild(mc);
mc.x = stage.stageWidth / 2;
mc.y = stage.stageHeight / 2;
showMcNum++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...