Exemplo de entrada de mouse: WordSearchFlash 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:
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:
Carregamento de um dicionárioPara 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árioDepois 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 jogoA 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árioPara 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 palavrasPara 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çãoNo 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. |
|