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.
|
|
|