Actionscript 3.0 — проверьте, не остались ли плитки

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

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

Может кто-нибудь помочь с тем, где мне нужно разместить код, чтобы проверить, нет ли больше плиток на сцене? А также какой код мне нужно использовать?

А также, когда он проверил, не осталось ли плиток и есть ли не осталось, он должен перейти ко второму кадру, где он попросит воспроизвести снова или вернуться на домашний экран.

Мой код:

package {
// importing classes
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.text.*;
// end of importing classes
public class Main extends Sprite {
    private var pickedTiles:Array = new Array();  
    private const NUMBER_OF_TILES:uint=24;
    private var pause_game:Timer;
    private var canPick:Boolean=true;
    // scorebord
    private static const pointsForMatch:int = 100; 
    private static const pointsForMiss:int = -5; 
    private var gameScoreField:TextField; 
    private var gameScore:int; 
    public function Main() {
        gameScoreField = new TextField();
        addChild(gameScoreField); 
        gameScoreField.x = 810; 
        gameScoreField.y = 50;
        gameScoreField.width = 200;
        var format:TextFormat = new TextFormat();
        format.size = 50;
        gameScoreField.defaultTextFormat = format;
        gameScoreField.textColor = 0xFF0000;

        // variables and constants
        // no more NUMBER_OF_TILES here
        const TILES_PER_ROW:uint=6;
        var tiles:Array=new Array();
        var tile:tile_movieclip;
        // end of variables and constants
        // tiles creation loop
        for (var i:uint=0; i<NUMBER_OF_TILES; i++) 
        {
            tiles.push(Math.floor(i/2));
        }
        trace("My tiles: "+tiles);
        // end of tiles creation loop
        // shuffling loop
        var swap,tmp:uint;
        for (i=NUMBER_OF_TILES-1; i>0; i--) 
        {
            swap=Math.floor(Math.random()*i);
            tmp=tiles[i];
            tiles[i]=tiles[swap];
            tiles[swap]=tmp;
        }
        trace("My shuffled tiles: "+tiles);
        // end of shuffling loop
        // tile placing loop
        for (var i:uint=0; i<NUMBER_OF_TILES; i++) 
        {
            tile=new tile_movieclip();
            addChild(tile);

            tile.cardType=tiles[i];
            tile.x=5+(tile.width+5)*(i%TILES_PER_ROW);
            tile.y=5+(tile.height+5)*(Math.floor(i/TILES_PER_ROW));
            tile.gotoAndStop(NUMBER_OF_TILES/2+1);
            tile.buttonMode=true;
            tile.addEventListener(MouseEvent.CLICK,onTileClicked);
        }
        // end of tile_placing_loop
    }
        private function onTileClicked(e:MouseEvent) 
        {
            if(canPick)
            {
                var picked:tile_movieclip=e.currentTarget as tile_movieclip;
                trace("you picked a "+e.currentTarget.cardType);
                // checking if the current tile has already been picked
                if (pickedTiles.indexOf(picked)==-1) {
                    pickedTiles.push(picked);
                    picked.gotoAndStop(picked.cardType+1);
                }
                // end checking if the current tile has already been picked
                // checking if we picked 2 tiles
                if (pickedTiles.length==2) 
                {
                    canPick=false;
                    pause_game=new Timer(1000,1);
                    pause_game.start();
                    if (pickedTiles[0].cardType==pickedTiles[1].cardType) 
                    {
                        // tiles match!!
                        trace("tiles match!!!!");
                        pause_game.addEventListener(TimerEvent.TIMER_COMPLETE,removeTiles);
                    } 
                    else 
                    {
                        // tiles do not match
                        trace("tiles do not match");
                        pause_game.addEventListener(TimerEvent.TIMER_COMPLETE,resetTiles);
                    }
                    // no more pickedTiles = new Array();
                }
                // end checking if we picked 2 tiles
            }
        }
        private function removeTiles(e:TimerEvent) 
        {
            pause_game.removeEventListener(TimerEvent.TIMER_COMPLETE,removeTiles);
            pickedTiles[0].removeEventListener(MouseEvent.CLICK,onTileClicked);
            pickedTiles[1].removeEventListener(MouseEvent.CLICK,onTileClicked);
            removeChild(pickedTiles[0]);
            removeChild(pickedTiles[1]);
            pickedTiles = new Array();
            gameScore += pointsForMatch; // +100 points
            showGameScore(); // shows new score
            canPick = true;
        }
        private function resetTiles(e:TimerEvent) 
        {
            pause_game.removeEventListener(TimerEvent.TIMER_COMPLETE,resetTiles);
            pickedTiles[0].gotoAndStop(NUMBER_OF_TILES/2+1);
            pickedTiles[1].gotoAndStop(NUMBER_OF_TILES/2+1);
            pickedTiles = new Array();
            gameScore += pointsForMiss; // -5 points
            showGameScore(); //shows new score
            canPick = true;
        }
    public function showGameScore() 
    {
        gameScoreField.text = String(gameScore);
    }
}}

person user2445658    schedule 02.06.2013    source источник


Ответы (2)


Я считаю это скорее быстрым «хаком», но, поскольку вы знаете количество плиток, вы можете создать счетчик. Затем каждый раз, когда с доски убирается пара плиток, добавляйте 2 к счетчику (по одной на каждую плитку). Когда счетчик совпадет с количеством плиток, которые у вас были в начале, это будет означать, что все плитки были сопоставлены и, следовательно, удалены с доски.

person mitim    schedule 03.06.2013

Моя идея заключалась бы в том, что, поскольку вы сохраняете плитки в массиве плиток, у вас может быть что-то, что, когда пользователь нажимает на плитки, вы удаляете элементы из массива с помощью свойства splice, поэтому, когда свойство array.length равно нулю, вы можете закончить игру.

ps не уверен, что свойство splice — это то, что вам нужно, но вот веб-сайт actionscript, который расскажет вам все о массивах и их свойствах Сайт ActionScript 3

person Sam Haley    schedule 03.06.2013