Exempel på indata från mus: WordSearch

Flash Player 9 och senare, Adobe AIR 1.0 och senare

I detta exempel visas användarinteraktion med mushändelser. Användarna ska bygga så många ord som möjligt i ett slumpmässigt rutnät av bokstäver. Bokstäverna visas vågrätt eller lodrätt i rutnätet och användarna får inte använda samma bokstav två gånger. Med detta exempel visas hur du använder ActionScript 3.0 för att göra följande:

  • Bygger ett dynamiskt rutnät för komponenter

  • Besvarar mushändelser

  • Upprätthåller poängställning baserad på användarinteraktion

Programfilerna för det här exemplet finns på www.adobe.com/go/learn_programmingAS3samples_flash_se . WordSearch-programfiler finns i mappen Samples/WordSearch. Programmet består av följande filer:

Fil

Beskrivning

WordSearch.as

Klassen som innehåller de flesta funktioner för programmet.

WordSearch.fla

eller

WordSearch.mxml

Huvudprogramfilen för Flex (MXML) eller Flash (FLA).

dictionary.txt

En fil som används för att kontrollera om ordet är rättstavat och om det ger poäng.

Läsa in ordboken

En ordbok behövs om du skapar ett spel där det gäller att hitta ord. I detta exempel ingår en textfil med namnet dictionary.txt som innehåller en lista med ord separerade med radmatningstecken. Sedan du skapat en array med namnet words begärs filen från funktionen loadDictionary() , och när den har lästs ändras filen till en lång sträng. Med metoden split() kan strängen läggas i en array med ord som bryts vid varje förekomst av ett radmatningstecken (teckenkod 10) eller tecknet för ny rad (teckenkod 13). Detta görs i funktionen dictionaryLoaded() :

words = dictionaryText.split(String.fromCharCode(13, 10));

Skapa ett användargränssnitt

När orden har lagrats gör du inställningarna för användargränssnittet. Skapa två Button-instanser: en för att skicka ett ord och den andra för att rensa ett ord som har stavats. I båda fallen måste du svara på en användares inmatningar genom att avlyssna händelsen MouseEvent.CLICK , som knappen sänder, och sedan anropa en funktion. I funktionen setupUI() skapas avlyssnarkoden för båda knapparna:

submitWordButton.addEventListener(MouseEvent.CLICK,submitWord); 
clearWordButton.addEventListener(MouseEvent.CLICK,clearWord);

Skapa ett spelbräde

Spelbrädet består av ett rutnät med slumpmässiga bokstäver. Ett tvådimensionellt rutnät skapas med funktionen generateBoard() genom att en slinga kapslas in i en annan. Den första slingan ökar raden med ett och den andra ökar antalet kolumner per rad med ett. Varje cell som skapas av dessa rader och kolumner innehåller en knapp som representerar en bokstav på brädet.

private function generateBoard(startX:Number, startY:Number, totalRows:Number, totalCols:Number, buttonSize:Number):void 
{ 
    buttons = new Array(); 
    var colCounter:uint; 
    var rowCounter:uint; 
    for (rowCounter = 0; rowCounter < totalRows; rowCounter++) 
    { 
        for (colCounter = 0; colCounter < totalCols; colCounter++) 
        { 
            var b:Button = new Button(); 
            b.x = startX + (colCounter*buttonSize); 
            b.y = startY + (rowCounter*buttonSize); 
            b.addEventListener(MouseEvent.CLICK, letterClicked); 
            b.label = getRandomLetter().toUpperCase(); 
            b.setSize(buttonSize,buttonSize); 
            b.name = "buttonRow"+rowCounter+"Col"+colCounter; 
            addChild(b); 
             
            buttons.push(b); 
        } 
    } 
}

Trots att en avlyssnare lagts till på endast en rad för en MouseEvent.CLICK -händelse tilldelas den till varje Button-instans eftersom den finns i en for -slinga. Varje knapp ges dessutom ett namn som härleds för dess rad- och kolumnposition, vilket gör det lätt att senare i koden referera till raden och kolumnen för varje knapp.

Bygga upp ord från användarinmatningar

Ord byggs upp genom att bokstäver som ligger lodrätt eller vågrätt intill varandra markeras, men man får inte använda samma bokstav två gånger. Varje klickning genererar en mushändelse då ordet som användaren skriver kontrolleras för att se om det fortsätter från bokstäver som tidigare markerades. Om så inte är fallet tas det föregående ordet bort och ett nytt påbörjas. Den här kontrollen görs i metoden isLegalContinuation() .

private function isLegalContinuation(prevButton:Button, currButton:Button):Boolean 
{ 
    var currButtonRow:Number = Number(currButton.name.charAt(currButton.name. indexOf("Row") + 3)); 
    var currButtonCol:Number = Number(currButton.name.charAt(currButton.name.indexOf("Col") + 3)); 
    var prevButtonRow:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Row") + 3)); 
    var prevButtonCol:Number = Number(prevButton.name.charAt(prevButton.name.indexOf("Col") + 3)); 
     
    return ((prevButtonCol == currButtonCol && Math.abs(prevButtonRow - currButtonRow) <= 1) || 
             (prevButtonRow == currButtonRow && Math.abs(prevButtonCol - currButtonCol) <= 1)); 
}

Metoderna charAt() och indexOf() i klassen String hämtar rätt rad och kolumn från både den senast klickade knappen och den knapp som klickades på tidigare. Metoden isLegalContinuation() returnerar true om raden eller kolumnen är oförändrad och om den inte har ändrats mer än ett steg från föregående. Om du vill ändra spelets regler och tillåta diagonala ord, tar du bort kontrollen av oförändrad rad eller kolumn. Den sista raden kommer då att få följande utseende:

return (Math.abs(prevButtonRow - currButtonRow) <= 1) && Math.abs(prevButtonCol - currButtonCol) <= 1));

Kontrollera skickade ord

När du vill slutföra koden för spelet behövs mekanismer för att kontrollera ord som skickats och för att hålla ordning på poängen. Metoden searchForWord() innehåller båda dessa mekanismer:

private function searchForWord(str:String):Number 
{ 
    if (words && str) 
    { 
        var i:uint = 0 
        for (i = 0; i < words.length; i++) 
        { 
            var thisWord:String = words[i]; 
            if (str == words[i]) 
            { 
                return i;     
            } 
        } 
        return -1; 
    } 
    else 
    { 
        trace("WARNING: cannot find words, or string supplied is null"); 
    } 
    return -1; 
}

I funktionen gås alla ord i ordboken igenom. Om användarens ord överensstämmer med ett ord i ordboken returneras ordets position i denna. Med metoden submitWord() kontrolleras sedan svaren, och poängen uppdateras om positionen är giltig.

Anpassningar

I början av klassen finns flera konstanter. Du kan förändra spelet genom att ändra dessa variabler. Du kan exempelvis ändra tiden för spelet genom att öka variabeln TOTAL_TIME . Du kan också öka variabeln PERCENT_VOWELS något för att öka sannolikheten för att hitta rätt ord.