Actionscript 3 сбрасывает игру? - PullRequest
0 голосов
/ 29 марта 2012

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

Моя проблема - когда я нажимаю кнопку сброса, он возвращает меня на главную страницу игры, он делает всякие странные вещи.

Кроме того, когда я захожу на страницу игры поверх, у меня появляются ошибки с таймером.

Вот мой код:

package {
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.display.MovieClip;
import flash.text.TextField;

public class MemoryGame extends MovieClip{

private var firstTile:cards;
private var secondTile:cards;
private var pauseTimer:Timer;
private var score:int;
private var cardCount:int;
var seconds:Number;
var minutes:Number;


var numberDeck:Array = new Array(1,1,2,2,3,3,4,4,5,5,6,6);


public function MemoryGame(){

    //TIMER FUNCTION
    var levelTimer:Timer = new Timer(1000, 180);
    levelTimer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
    levelTimer.addEventListener(TimerEvent.TIMER, timerHandler);

    // LEVEL FUNCTION
    easyBtn.addEventListener(MouseEvent.CLICK, easyButtonClicked);
    medBtn.addEventListener(MouseEvent.CLICK, medButtonClicked);
    hardBtn.addEventListener(MouseEvent.CLICK, hardButtonClicked);

    score = 0;
    txtScore.text=""+score;

    //Level button events
    function easyButtonClicked(e:MouseEvent):void{
        removeChild(levelText);
        trace("easy button clicked!");
        seconds = 0;
        minutes = 1;
        txtTime.text = "1:00";
        levelTimer.start();
        setupTiles();
    }

    function medButtonClicked(e:MouseEvent):void{
        removeChild(levelText);
        trace("medium button clicked!");
        seconds = 30;
        minutes = 0;
        txtTime.text = "0:30";
        levelTimer.start();
        setupTiles();
    }

    function hardButtonClicked(e:MouseEvent):void{
        removeChild(levelText);
        trace("hard button clicked!");
        seconds = 15;
        minutes = 0;
        txtTime.text = "0:15";
        levelTimer.start();
        setupTiles();
    }


    //Timer handlers
    function timerHandler(e:TimerEvent):void {
        if (seconds > 00) {
        seconds -=1;
        }

        else {
            if (minutes > 0) {minutes -=1;seconds = 59;}
    }
            txtTime.text = minutes+":"+(seconds >= 10 ? seconds : "0"+seconds);
        }

    function timerCompleteHandler(e:TimerEvent):void {
        e.target.reset();
        e.target.stop();

    }



    //Tiles set up
    function setupTiles(){
    for(x=1; x<=4; x++) {
        for (y=1; y<=3; y++){
            var randomCard = Math.floor(Math.random()*numberDeck.length);
            var tile:cards = new cards();
            tile.card = numberDeck[randomCard];
            numberDeck.splice(randomCard,1);
            tile.gotoAndStop(9);
            tile.x = (x-0.5) * 150;
            tile.y = (y-0.5) * 200;
            tile.addEventListener(MouseEvent.CLICK,tileClicked);
            addChild(tile);
            cardCount = cardCount + 1
        }
    }
}


}




public function tileClicked(event:MouseEvent) {
    var clicked:cards = (event.currentTarget as cards);
    if (firstTile == null){
        firstTile = clicked;
        firstTile.gotoAndStop(clicked.card);
    }

    else if (secondTile == null && firstTile != clicked){
        secondTile = clicked;
        secondTile.gotoAndStop(clicked.card);
        if (firstTile.card == secondTile.card){
            pauseTimer = new Timer(1000, 1);
            pauseTimer.addEventListener(TimerEvent.TIMER_COMPLETE,removeCards);
            pauseTimer.start();

        }
        else {
            pauseTimer = new Timer(1000, 1);
            pauseTimer.addEventListener(TimerEvent.TIMER_COMPLETE,resetCards);
            pauseTimer.start();
        }
    }

    if (seconds == 0){
        pauseTimer.stop();
        this.gotoAndStop(3);


    }
}


public function resetCards(event:TimerEvent) {
    firstTile.gotoAndStop(9);
    secondTile.gotoAndStop(9);
    firstTile = null;
    secondTile = null;
    pauseTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,resetCards);
    score = score - 2;
    txtScore.text=""+score;
}


public function removeCards(event:TimerEvent){
    removeChild(firstTile);
    removeChild(secondTile);
    firstTile = null;
    secondTile = null;
    pauseTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,removeCards);
    score = score + 10;
    txtScore.text=""+score;
    cardCount = cardCount - 2;
    trace("Cardcount: " + cardCount);

    if (cardCount == 0){


        this.gotoAndStop(2);
        txtFinalScore.text=" "+score;
        pauseTimer.stop();          
        }
            }
}   
}

А вот мой код для кнопки сброса:

button_3.addEventListener(MouseEvent.CLICK, resetGame);

function resetGame(event:MouseEvent):void
{
score = 0;
seconds = 0;
pauseTimer.stop();

this.gotoAndStop(1);

}

1 Ответ

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

Убедитесь, что вы удалили все прослушиватели событий в методе сброса ДО этого.gotoAndStop ();

button_3.addEventListener(MouseEvent.CLICK, resetGame);

function resetGame(event:MouseEvent):void
{
score = 0;
seconds = 0;
pauseTimer.stop();

levelTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteHandler);
levelTimer.removeEventListener(TimerEvent.TIMER, timerHandler);

this.gotoAndStop(1);

}

Это только пример. Вы должны удалить все прослушиватели событий, которые можете, потому что this.gotoAndStop (1); только добавит больше слушателей, не удаляя тех из предыдущего кадра. Вот почему все идет наперекосяк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...