Fare girdisi örneği: WordSearch

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Bu örnek fare olayları işlenerek gerçekleştirilen kullanıcı etkileşimini gösterir. Kullanıcılar bir ızgara üzerindeki rastgele seçilmiş harfleri ızgara içerisinde yatay veya dikey olarak hareket ettirerek ve aynı harfi yalnız bir kere kullanarak mümkün olduğu kadar çok sözcük türetir. Bu örnek aşağıdaki ActionScript 3.0 özelliklerini gösterir:

  • Dinamik olarak bir içerik ızgarası oluşturma

  • Fare olaylarını yanıtlama

  • Kullanıcı etkileşimi tabanlı bir puan elde etme

Bu örneğin uygulama dosyalarını edinmek için bkz. www.adobe.com/go/learn_programmingAS3samples_flash_tr . WordSearch uygulama dosyalarını Samples/WordSearch klasörü içinde bulabilirsiniz. Uygulama aşağıdaki dosyaları içerir:

File

Açıklama

WordSearch.as

Uygulamanın temel işlevini sağlayan sınıf.

WordSearch.fla

veya

WordSearch.mxml

Flex (MXML) veya Flash (FLA) için ana uygulama dosyası.

dictionary.txt

Türetilen sözcüklere puan verilip verilmeyeceğini ve sözcüklerin doğru yazılıp yazılmadığını belirlemek için kullanılan dosya.

Bir sözlük yükleme

Sözcük türetme ile ilgili bir oyun oluşturmak için bir sözlük gereklidir. Örnek, satır başı karakteri ile ayrılmış kelimelerin bulunduğu dictionary.txt adlı bir metin dosyası içerir. words adlı bir dizi oluşturduktan sonra loadDictionary() işlevi bu dosyayı ister ve başarılı şekilde yükledikten sonra dosya uzun bir dize haline gelir. Bu dizeyi split() yöntemiyle satır başı (karakter kodu 10) veya yeni satır (karakter kodu 13) örneklerinin her birini atarak bir sözcük dizisine ayrıştırabilirsiniz. Ayrıştırma dictionaryLoaded() işlevinde gerçekleşir:

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

Kullanıcı arabirimini oluşturma

Sözcükler saklandıktan sonra kullanıcı arabirimini oluşturabilirsiniz. Biri türetilen sözcüğü göndermek diğeri de yazılmakta olan kelimeyi silmek için olmak üzere iki Button örneği oluşturun. Her iki durum için de düğmenin yayınladığı MouseEvent.CLICK olayını dinleyip bir işlev çağırarak kullanıcı girişine yanıt vermeniz gerekir. setupUI() işlevinde bu kod iki düğme üzerinde dinleyici oluşturur:

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

Bir oyun tahtası oluşturma

Oyun tahtası rastgele seçilmiş harflerden oluşan bir ızgaradır. generateBoard() işlevinde, iç içe iki döngüden oluşan iki boyutlu bir ızgara oluşturulur. İlk döngü sıraları artırırken ikinci döngü o sırada bulunan toplam sütun sayısını artırır. Bu sıra ve sütunlar ile oluşturulan hücrelerin her biri tahta üzerinde bir harfi temsil eden bir düğme içerir.

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

Sadece bir satırda MouseEvent.CLICK olayı için bir dinleyici eklenmiş olmasına rağmen for döngüsünde olduğundan Button örneklerinin her birine atanmıştır. Ayrıca her düğmeye sıra ve sütun konumundan derlenmiş bir ad verilmiştir ve bu şekilde kodun sonraki bölümlerinde düğmelerin sırasına ve sütununa dağa kolay başvurulabilir.

Kullanıcı girişinden sözcük oluşturma

Sözcükler alt alta veya yan yana olan harfler seçilerek türetilebilir ancak harflerin tümü yalnızca bir kez kullanılabilir. Her tıklatmayla bir fare olayı üretilir ve bu noktada kullanıcının türettiği sözcük daha önce tıklanan harflerden düzgün şekilde devam ettiğinden emin olmak için kontrol edilmelidir. Eğer devam etmiyorsa önceki sözcük silinir ve yeni sözcüğe başlanır. Bu kontrol, isLegalContinuation() yönteminde oluşur.

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

String sınıfının charAt() ve indexOf() yöntemleri hem tıklanmakta olan hem de daha önce tıklanmış olan düğmelerin uygun sıralarını ve sütunlarını getirir. Bir sıra veya sütun değişmemişse veya değişen sıra veya sütun öncekinden sadece bir farklıysa isLegalContinuation() yöntemi true değerini döndürür. Oyunun kurallarını değiştirmek ve çapraz sözcük türetmeye izin vermek isterseniz değişmeyen sıra veya sütunun işaretlerini kaldırabilirsiniz, bu durumda son satır aşağıdaki şekilde görünecektir:

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

Gönderilen sözcükleri kontrol etme

Oyun kodunu tamamlamak için, gönderilen sözcükleri kontrol etme ve puan hesaplama mekanizmaları gereklidir. searchForWord() yöntemi her ikisini de içerir:

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

Bu işlevin döngüsü sözlükteki tüm sözcükleri kapsar. Kullanıcının türettiği sözcüğün sözlükte bir karşılığı varsa sözlük içindeki pozisyonu döndürülür. Ardından submitWord() yöntemi yanıtı kontrol eder ve pozisyon geçerliyse puanı günceller.

Özelleştirme

Sınıf başlangıcında birkaç sabit vardır. Oyunu bu değişkenlerin değerleriyle oynayarak özelleştirebilirsiniz. Örneğin TOTAL_TIME değişkeninin değerini yükselterek oyun süresini değiştirebilirsiniz. Ayrıca sözcük bulmayı kolaylaştırmak için PERCENT_VOWELS değişkenini değerini de artırabilirsiniz.