修改阵列后,同时从阵列中删除同一影片剪辑的多个副本



这是一个记忆匹配游戏,我需要一个"重新启动"按钮。 游戏中的一切正常,甚至是重新启动按钮。我的问题是,在用户找到匹配项(并且卡数组发生变化(后,im 用于重新启动游戏的命令只会删除卡牌,直到它"击中"已经消失的牌,并停止删除它们......

这是我为按钮编写的代码

btnRestart.addEventListener(MouseEvent.CLICK, comecaOtraveh);
 function comecaOtraveh(e:MouseEvent):void
 {
    for each(var mc:MovieClip in virarCartas) 
    {                                                       
        if (mc != null)
        {
        mc.parent.removeEventListener(MouseEvent.CLICK, cartaClicada);   
        mc.parent.removeChild(mc);   // Cannot access a property or method of a null object           reference.
        //this.removeChild(mc);      // The supplied DisplayObject must be a child of the caller.
        //removeChild(mc);           // The supplied DisplayObject must be a child of the caller.
        }
    }
    clearInterval(intervalo);   
    myTimer.stop();
    myTimer.removeEventListener(TimerEvent.TIMER, iniciaTempo);
    channel.stop();
    channel.removeEventListener(Event.SOUND_COMPLETE, onComplete);
    removeChild(mcContagem);
    gotoAndStop(1)
}

我尝试了所有//的选项,并且也尝试了没有 IF 语句......没有一个工作...

这是将我的牌放入桌子,洗牌,向用户展示而不是将它们转过来以便游戏可以开始的代码。

for (var i: int = 0; i < QUANT_CARTAS; i++)
{
    cartas.push(i);
}
for (var moeda: int = QUANT_CARTAS - 1; moeda > 0; moeda--)
{
    var pos: int = Math.floor(Math.random() * moeda);
    var carta: int = cartas[moeda];
    cartas[moeda] = cartas[pos];
    cartas[pos] = carta;
}
for (i = 0; i < QUANT_CARTAS; i++)
{
    var novaCarta: Carta = new Carta();
    novaCarta.tipoCarta = cartas[i];
    novaCarta.x = 5 + (novaCarta.width + 2.7) * (i % CARTAS_POR_LINHA);
    novaCarta.y = 5 + (novaCarta.height + 2.7) * (Math.floor(i / CARTAS_POR_LINHA));
    novaCarta.gotoAndStop(cartas[i] + 1); // face pra cima
    novaCarta.buttonMode = true;
    novaCarta.addEventListener(MouseEvent.CLICK, cartaClicada);
    addChild(novaCarta);
    virarCartas.push(novaCarta);
    if (i == 35)
    {
    podeJogar = false;
    mcContagem.x = 884;
    mcContagem.y = 511;
    addChild(mcContagem);
    intervalo = setInterval(desviraCartas, 3000);
    function desviraCartas()
    {
        for (var j: int = 0; j < QUANT_CARTAS; j++)
        {
            virarCartas[j].gotoAndStop(QUANT_CARTAS + 1);
            if (j == 35)
            {
                clearInterval(intervalo);
                iniciaJogo();
                playSound();
            }
            }
        }
    }
 }

这是我用于鼠标点击的代码

function cartaClicada(e: MouseEvent)
{
    if (podeJogar == true)
    {
    SOM_memoClick.play();
    var carta: Carta = e.currentTarget as Carta;
    if (cartasColetadas.indexOf(carta) == -1)
    {
        cartasColetadas.push(carta);
        carta.gotoAndStop(carta.tipoCarta + 1);
    }
    if (cartasColetadas.length == 3) //APOS 3 CARTAS CLICADAS
    {
        podeJogar = false;
        var carta3: int = cartasColetadas[2].tipoCarta
        var carta2: int = cartasColetadas[1].tipoCarta
        var carta1: int = cartasColetadas[0].tipoCarta
        //0,1,2
        if (((carta1 == 0) || (carta1 == 1) || (carta1 == 2)) &&
            ((carta2 == 0) || (carta2 == 1) || (carta2 == 2)) &&
            ((carta3 == 0) || (carta3 == 1) || (carta3 == 2)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(amarelo, intervaloFim);
        }
        //3,4,5
        else if (((carta1 == 3) || (carta1 == 4) || (carta1 == 5)) &&
            ((carta2 == 3) || (carta2 == 4) || (carta2 == 5)) &&
            ((carta3 == 3) || (carta3 == 4) || (carta3 == 5)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(rosa, intervaloFim);
        }
        //6,7,8
        else if (((carta1 == 6) || (carta1 == 7) || (carta1 == 8)) &&
            ((carta2 == 6) || (carta2 == 7) || (carta2 == 8)) &&
            ((carta3 == 6) || (carta3 == 7) || (carta3 == 8)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(celeste, intervaloFim);
        }
        //9,10,11
        else if (((carta1 == 9) || (carta1 == 10) || (carta1 == 11)) &&
            ((carta2 == 9) || (carta2 == 10) || (carta2 == 11)) &&
            ((carta3 == 9) || (carta3 == 10) || (carta3 == 11)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(branco, intervaloFim);
        }
        //12,13,14
        else if (((carta1 == 12) || (carta1 == 13) || (carta1 == 14)) &&
            ((carta2 == 12) || (carta2 == 13) || (carta2 == 14)) &&
            ((carta3 == 12) || (carta3 == 13) || (carta3 == 14)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(prata, intervaloFim);
        }
        //15,16,17
        else if (((carta1 == 15) || (carta1 == 16) || (carta1 == 17)) &&
            ((carta2 == 15) || (carta2 == 16) || (carta2 == 17)) &&
            ((carta3 == 15) || (carta3 == 16) || (carta3 == 17)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(verde, intervaloFim);
        }
        //18,19,20
        else if (((carta1 == 18) || (carta1 == 19) || (carta1 == 20)) &&
            ((carta2 == 18) || (carta2 == 19) || (carta2 == 20)) &&
            ((carta3 == 18) || (carta3 == 19) || (carta3 == 20)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(preto, intervaloFim);
        }
        //21,22,23
        else if (((carta1 == 21) || (carta1 == 22) || (carta1 == 23)) &&
            ((carta2 == 21) || (carta2 == 22) || (carta2 == 23)) &&
            ((carta3 == 21) || (carta3 == 22) || (carta3 == 23)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(violeta, intervaloFim);
        }
        //24,25,26
        else if (((carta1 == 24) || (carta1 == 25) || (carta1 == 26)) &&
            ((carta2 == 24) || (carta2 == 25) || (carta2 == 26)) &&
            ((carta3 == 24) || (carta3 == 25) || (carta3 == 26)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(azul, intervaloFim);
        }
        //27,28,29
        else if (((carta1 == 27) || (carta1 == 28) || (carta1 == 29)) &&
            ((carta2 == 27) || (carta2 == 28) || (carta2 == 29)) &&
            ((carta3 == 27) || (carta3 == 28) || (carta3 == 29)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(dourado, intervaloFim);
        }
        //30,31,32
        else if (((carta1 == 30) || (carta1 == 31) || (carta1 == 32)) &&
            ((carta2 == 30) || (carta2 == 31) || (carta2 == 32)) &&
            ((carta3 == 30) || (carta3 == 31) || (carta3 == 32)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(marrom, intervaloFim);
        }
        //33,34,35
        else if (((carta1 == 33) || (carta1 == 34) || (carta1 == 35)) &&
            ((carta2 == 33) || (carta2 == 34) || (carta2 == 35)) &&
            ((carta3 == 33) || (carta3 == 34) || (carta3 == 35)))
        {
            SOM_trioInicio.play();
            intervalo = setInterval(vermelho, intervaloFim);
        }
        else
        {
            intervalo = setInterval(resetaCartas, 1150);
        }
    }
}
}

现在,在游戏过程中,这就是我删除它们的方式(假设我找到了 0、1、2 张牌,它调用了函数"amarelo"(

function amarelo(): void
{
    clearInterval(intervalo);
addChild(mcExplic);
mcExplic.gotoAndStop(1);
mcExplic.y = 384;
mcExplic.x = 512;
addChild(mcBotaoOk);
mcBotaoOk.y = 370;
mcBotaoOk.x = 512;
mcBotaoOk.visible = false;
cartasColetadas[0].removeEventListener(MouseEvent.CLICK, cartaClicada);
cartasColetadas[1].removeEventListener(MouseEvent.CLICK, cartaClicada);
cartasColetadas[2].removeEventListener(MouseEvent.CLICK, cartaClicada);
removeChild(cartasColetadas[0]);
removeChild(cartasColetadas[1]);
removeChild(cartasColetadas[2]);
cartasColetadas = new Array();
podeJogarTrio = true;
cursorTrio = true;
veramarelo();
mouseTipo();
}

所以。。。关于如何使该重置按钮工作的任何想法???(发布的第一个代码块(

我的变量等...

const QUANT_CARTAS: int = 36;
const CARTAS_POR_LINHA: int = 6;
var alturaTrio: int = -180;
var larguraTrio: int = -300;
var intervaloTrio: int = 500;
var intervaloFim: int = 800;
var intervalo: int;
var gameScore: int;
var pontoErro: int;
var pontoAcerto: int;
var erros: int = 0;
var acertos: int = 0;
var musicaOn: Boolean = true;
var podeJogar: Boolean = true;
var podeJogarTrio: Boolean = false;
var cursorTrio: Boolean = false;
var mcExplic: Explic = new Explic();
var mcContagem: Contagem = new Contagem;
var mcBotaoOk: BotaoOk = new BotaoOk;
var mcTrans: Transicao = new Transicao();
var virarCartas: Array = new Array();
var trio: Array = new Array(); 
var cartas: Array = new Array();
var cartasColetadas: Array = new Array();

您得到的错误是因为对象已从舞台中删除,而不是从virarCartas数组中删除,请查看以下示例:

var cards:Array = new Array()
// we create our cards and add it to cards array
for(var i=0; i < 6; i++){
    var card:Card = new Card()
        card.x = 50*i
        // we set and index to our card to identify it when we need to remove it from the cards array
        card.index = i      
        card.addEventListener(MouseEvent.CLICK, card_on_Press)  
    addChild(card)
    cards.push(card)
}
function card_on_Press(e:MouseEvent){
    var this_card = MovieClip(e.currentTarget)
        this_card.removeEventListener(MouseEvent.CLICK, card_on_Press)
        this_card.parent.removeChild(this_card)
    // remove our card = set it as null
    cards[this_card.index] = null
}
var btn_remove_all:Btn = new Btn()
    btn_remove_all.x = 10
    btn_remove_all.y = 80
    btn_remove_all.addEventListener(
        MouseEvent.CLICK, 
        function(e:MouseEvent){
            for each(var card:MovieClip in cards) { 
                if (card != null){
                    card.removeEventListener(MouseEvent.CLICK, card_on_Press)
                    card.parent.removeChild(card)
                    card = null
                }
            }
            cards = null
        }
    )
    addChild(btn_remove_all)

希望对您有所帮助。

编辑:

为了简化事情,您可以在卡片中添加索引(就像我在答案中所做的那样(,然后当您想要删除它时,您只需执行virarCartas[card.index] = null

var novaCarta: Carta = new Carta();
// we add an index, it's the virarCartas array length, of course you should add it to your Carta class
novaCarta.index = virarCartas.length;
novaCarta.tipoCarta = cartas[i];
novaCarta.x = 5 + (novaCarta.width + 2.7) * (i % CARTAS_POR_LINHA);
novaCarta.y = 5 + (novaCarta.height + 2.7) * (Math.floor(i / CARTAS_POR_LINHA));
novaCarta.gotoAndStop(cartas[i] + 1); // face pra cima
novaCarta.buttonMode = true;
novaCarta.addEventListener(MouseEvent.CLICK, cartaClicada);
addChild(novaCarta);
virarCartas.push(novaCarta);

并像这样编辑您的amarelo函数:

function amarelo(): void 
{
    ...
    removeChild(cartasColetadas[0]);
    removeChild(cartasColetadas[1]);
    removeChild(cartasColetadas[2]);
    virarCartas[cartasColetadas[0].index] = null;
    virarCartas[cartasColetadas[1].index] = null;
    virarCartas[cartasColetadas[2].index] = null;
    ...
}

最新更新