jeudi 28 mai 2015

Select pairs from an array (matching game) And add sound to that selection AS3 Flash CS4

I'm using a tutorial I found on Google - which works well. However, I have a few issues to make it work how I would like. This code uses a movieclip for the card faces with the back of the card on frame1 and 2-17 different pictures or movieclips.

The questions are - Is there a way to get the AScript to choose from the whole array? But still produce pairs to choose from. As it stands now - If I select the game to be 4 across by 2 down (8 cards in total) It has the back of card (frame1) and will then randomly select, but only from frames 2-5 . If I modify these lines...

public function MatchingGameObject10():void {
        // make a list of card numbers
        var cardlist:Array = new Array();
        for(var i:uint=0;i<boardWidth*boardHeight/2;i++) {
            cardlist.push(i);
            cardlist.push(i);
        }

to

public function MatchingGameObject10():void {
        // make a list of card numbers
        var cardlist:Array = new Array(0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,16,16,17,17);

I get random cards - but no pairs...

If I can ask another question here - it is - how to add a seperate sound to each card..So if it shows a Bee - the Bee.mp3 is played.. Here's the whole code..

package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
import flash.utils.getTimer;
import flash.utils.Timer;
import flash.media.Sound;
import flash.media.SoundChannel;

public class MatchingGameObject10 extends MovieClip {
    // game constants
    private static const boardWidth:uint = 4;
    private static const boardHeight:uint = 2;
    private static const cardHorizontalSpacing:Number = 500;
    private static const cardVerticalSpacing:Number = 700;
    private static const boardOffsetX:Number = 50;
    private static const boardOffsetY:Number = 70;
    private static const pointsForMatch:int = 10;
    private static const pointsForMiss:int = -1;

    // variables
    private var firstCard:Card10;
    private var secondCard:Card10;
    private var cardsLeft:uint;
    private var gameScore:int;
    private var gameStartTime:uint;
    private var gameTime:uint;

    // text fields
    private var gameScoreField:TextField;
    private var gameTimeField:TextField;

    // timer to return cards to face-down
    private var flipBackTimer:Timer;

    // set up sounds
    var theFirstCardSound:FirstCardSound = new FirstCardSound();
    var theMissSound:MissSound = new MissSound();
    var theMatchSound:MatchSound = new MatchSound();

    // initialization function
    public function MatchingGameObject10():void {
        // make a list of card numbers
        var cardlist:Array = new Array();
        for(var i:uint=0;i<boardWidth*boardHeight/2;i++) {
            cardlist.push(i);
            cardlist.push(i);
        }

        // create all the cards, position them, and assign a randomcard face to each
        cardsLeft = 0;
        for (var x:uint=0; x<boardWidth; x++) {// horizontal
            for (var y:uint=0; y<boardHeight; y++) {// vertical
                var c:Card10 = new Card10();// copy the movie clip
                c.stop();// stop on first frame
                c.x = x*cardHorizontalSpacing+boardOffsetX;// set position
                c.y = y*cardVerticalSpacing+boardOffsetY;
                var r:uint = Math.floor(Math.random()*cardlist.length);// get a random face
                c.cardface = cardlist[r];// assign face to card
                cardlist.splice(r,1);// remove face from list
                c.addEventListener(MouseEvent.CLICK,clickCard);// have it listen for clicks
                c.buttonMode = true;
                addChild(c);// show the card
                cardsLeft++;
            }
        }

        // set up the score
        gameScoreField = new TextField();
        addChild(gameScoreField);
        gameScore = 0;
        showGameScore();

        // set up the clock
        gameTimeField = new TextField();
        gameTimeField.x = 450;
        addChild(gameTimeField);
        gameStartTime = getTimer();
        gameTime = 0;
        addEventListener(Event.ENTER_FRAME,showTime);
    }

    // player clicked on a card
    public function clickCard(event:MouseEvent) {
        var thisCard:Card10 = (event.target as Card10); // what card?

        if (firstCard == null) { // first card in a pair
            firstCard = thisCard; // note it
            thisCard.startFlip(thisCard.cardface+2);
            playSound(theFirstCardSound);

        } else if (firstCard == thisCard) { // clicked first card again
            firstCard.startFlip(1);
            firstCard = null;
            playSound(theMissSound);

        } else if (secondCard == null) { // second card in a pair
            secondCard = thisCard; // note it
            thisCard.startFlip(thisCard.cardface+2);

            // compare two cards
            if (firstCard.cardface == secondCard.cardface) {
                // remove a match
                removeChild(firstCard);
                removeChild(secondCard);
                // reset selection
                firstCard = null;
                secondCard = null;
                // add points
                gameScore += pointsForMatch;
                showGameScore();
                playSound(theMatchSound);
                // check for game over
                cardsLeft -= 2; // 2 less cards
                if (cardsLeft == 0) {
                    MovieClip(root).gameScore = gameScore;
                    MovieClip(root).gameTime = clockTime(gameTime);
                    MovieClip(root).gotoAndStop("gameover");
                }
            } else {
                gameScore += pointsForMiss;
                showGameScore();
                playSound(theMissSound);
                flipBackTimer = new Timer(2000,1);
                flipBackTimer.addEventListener(TimerEvent.TIMER_COMPLETE,returnCards);
                flipBackTimer.start();
            }

        } else { // starting to pick another pair
            returnCards(null);
            playSound(theFirstCardSound);
            // select first card in next pair
            firstCard = thisCard;
            firstCard.startFlip(thisCard.cardface+2);
        }
    }

    // return cards to face-down
    public function returnCards(event:TimerEvent) {
        firstCard.startFlip(1);
        secondCard.startFlip(1);
        firstCard = null;
        secondCard = null;
        flipBackTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,returnCards);
    }

    public function showGameScore() {
        gameScoreField.text = "Score: "+String(gameScore);
    }

    public function showTime(event:Event) {
        gameTime = getTimer()-gameStartTime;
        gameTimeField.text = "Time: "+clockTime(gameTime);
    }

    public function clockTime(ms:int) {
        var seconds:int = Math.floor(ms/1000);
        var minutes:int = Math.floor(seconds/60);
        seconds -= minutes*60;
        var timeString:String = minutes+":"+String(seconds+100).substr(1,2);
        return timeString;
    }

    public function playSound(soundObject:Object) {
        var channel:SoundChannel = soundObject.play();
    }
}
}

Aucun commentaire:

Enregistrer un commentaire