Exemplo de entrada de mouse: WordSearch

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

Este exemplo demonstra a interação do usuário por meio da manipulação de eventos de mouse. Os usuários criam o máximo de palavras possível a partir de uma grade aleatória de letras, movendo-se na horizontal ou vertical na grade, mas nunca usando a mesma letra duas vezes. Este exemplo demonstra os seguintes recursos do ActionScript 3.0:

  • Criação dinâmica de uma grade de componentes

  • Resposta a eventos de mouse

  • Manutenção da pontuação com base na interação do usuário

Para obter os arquivos de aplicativo desse exemplo, consulte www.adobe.com/go/learn_programmingAS3samples_flash_br . Os arquivos do aplicativo WordSearch estão localizados na pasta Amostras/WordSearch. O aplicativo consiste nos seguintes arquivos:

Arquivo

Descrição

WordSearch.as

A classe que fornece a funcionalidade principal do aplicativo.

WordSearch.fla

ou

WordSearch.mxml

O arquivo principal do aplicativo para Flex (MXML) ou Flash (FLA).

dictionary.txt

Um arquivo usado para determinar se as palavras criadas podem ser pontuadas e foram escritas corretamente.

Carregamento de um dicionário

Para criar um jogo que envolve a busca de palavras, um dicionário é necessário. O exemplo inclui um arquivo de texto chamado dictionary.txt que contém uma lista de palavras separadas por retornos de carro. Depois que uma matriz chamada words é criada, a função loadDictionary() solicita esse arquivo que, ao ser carregado com êxito, se transforma em uma longa string. É possível analisar essa string em uma matriz de palavras usando o método split() , quebrando-a em cada ocorrência de um retorno de carro (código de caractere 10) ou de uma nova linha (código de caractere 13). Essa análise ocorre na função dictionaryLoaded() :

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

Criação da interface de usuário

Depois de armazenar as palavras, você pode configurar a interface de usuário. Crie duas ocorrências de botão: uma para enviar uma palavra e outra para apagar uma palavra que esteja com erros ortográficos no momento. Em cada caso, responda à entrada do usuário ouvindo o evento MouseEvent.CLICK que o botão transmite e, em seguida, chamando uma função. Na função setupUI() , esse código cria os ouvintes nos dois botões:

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

Geração de uma placa de jogo

A placa de jogo é uma grade de letras aleatórias. Na função generateBoard() , uma grade bidimensional é criada, aninhando um loop em outro. O primeiro loop aumenta as linhas e o segundo aumenta o número total de colunas por linha. Cada célula criada por essas linhas e colunas contém um botão que representa uma letra na placa.

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); 
        } 
    } 
}

Embora um ouvinte seja adicionado para um evento MouseEvent.CLICK apenas em uma linha, por estar em um loop for , ele é atribuído a cada ocorrência de botão. Além disso, cada botão recebe um nome derivado de sua posição de linha e coluna, o que facilita a referência à linha e à coluna de cada botão posteriormente no código.

Criação de palavras a partir da entrada do usuário

Para criar palavras, é possível selecionar letras que estão próximas na vertical ou na horizontal, mas nunca se deve usar a mesma letra duas vezes. Cada clique gera um evento de mouse e, nesse momento, a palavra fornecida pelo usuário deve ser verificada para assegurar que esteja sendo corretamente formada a partir das letras clicadas antes. Em caso negativo, a palavra anterior é removida e uma nova é iniciada. Essa verificação ocorre no método 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)); 
}

Os métodos charAt() e indexOf() da classe String recuperam as linhas e colunas apropriadas do botão clicado atualmente e do botão clicado anteriormente. O método isLegalContinuation() retornará true se a linha ou coluna estiver inalterada e se a linha ou coluna que foi alterada estiver em um único incremento da anterior. Se desejar alterar as regras do jogo e permitir a formação de palavras na diagonal, remova as verificações de linhas ou colunas inalteradas; a linha final é similar a:

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

Verificação do envio de palavras

Para concluir o código do jogo, os mecanismos de verificação do envio de palavras e de cálculo da pontuação são necessários. O método searchForWord() contém os dois:

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; 
}

Essa função percorre todas as palavras do dicionário. Se a palavra do usuário coincidir com a do dicionário, sua posição no dicionário será retornada. O método submitWord() verifica a resposta e atualiza a pontuação se a posição for válida.

Personalização

No início da classe, existem várias constantes. Você pode modificar esse jogo modificando essas variáveis. É possível, por exemplo, alterar a quantidade de tempo disponível para jogar aumentando a variável TOTAL_TIME . Você também pode aumentar ligeiramente a variável PERCENT_VOWELS para aumentar a probabilidade de busca das palavras.