1 Kasım 2015 Pazar

GreenFoot Tutorial-6

Bir Objeden Diğerine Erişmek

Greenfoot'a yeni başlayanların en çok sordukları sorulardan biri :

   Bir objenin içindeki koddan diğerinin içindeki bir değişkene ya da metoda erişmek.

Fakat yeni başlayan birinin bu soruyu sorma şekli biraz değişik olur, çünkü yeni başlayanlar obje ve değişken kavramlarını tam olarak anlamamışlardır. Bu durumda soru şu şekilde gelir:



    Acaba bir astroid roket tarafından yok edilince skor değerini nasıl artırabilirim?



Şimdi yukarıdaki GreenFoot senaryosuna bir bakalım.

tut-access-p1 senaryosunu 'Open in Greenfoot' linkini tılayarak indirin ve GreenFoot'da açın.

Bu basit bir oyun programı , aralık çubuğuna bastıkça roket yukardan geçen astreoidlere ateş ediyor. Bir skor sayıcısı var ve şu anda çalışmıyor.

Bu örnekte farklı class'lar var , "Counter" , "Astroid" , "Rocket" , "Shot". Counter sınıfı 'bumpCount' adında bir metoda sahip. Bu metod ekranda görünen skoru verilen miktarda arttırıyor.
void bumpCount(int amount)
{
    totalCount += amount;
    setImage(new GreenfootImage("" + totalCount));
}
Kodun ayrıntılarını şimdilik anlamanıza gerek yok. Bilmeniz gereken, bu metod her çağrıldığında ekrandaki skor değeri verdiğimiz miktar kadar artar. Denemek için world üzerindeki skorun üstüne sağ tıklayın ve 'void bumpCount(int amount)' metodunu seçin, size miktarı soracağı diyalog penceresinde girdiğiniz değer kadar skorun arttığını görmelisiniz.

Şimdi Shot class'ı içinde act() metodunda bir yerde astroidi vurduğunda skor değiştirmek için çağırılan bir rutin olmalı.
void hitAnAsteroid()
{
    // What goes here????
    // We want to call the "bumpCount" method from the Counter class -
    // but how??!!
}
Shot class'ı editörde açın. Şimdi soru Shot class kodundan Counter class içindeki "bumpCount()" metodunu nasıl çağıracağız?

Bunu basitçe direk yazarak yapsak bir hata mesajı alırız.
void hitAnAsteroid()
{
    bumpCount();
}
Hadi deneyi , şuna benzer bir hata mesajı gelir :
Cannot find symbol - method bumpCount()
Biz bu hata mesajını alıyoruz çünkü derleyici aynı class içinde arıyor metodu yani Shot class içinde. Bir şekilde derleyiciye gidip Counter class'ına bakmasını ifade etmemiz gerekiyor.

Devam etmeden önce 'bumpCount()' metodunu çağırdığımız satırı ya silelim ya başına '//' koyarak bu satırı yorum satırına döndürelim ki derleyici hata vermesin.

Çözüm: Bir objeyi üretirken world kodunda ona bir referans oluşturun.

Bu çözümle counter objesine world kodu içinde bir referans oluşturuyoruz ki daha sonra bu referans üzerinden counter objesine ulaşalım.

Space class yapılandırma bölümüne bir göz atalım :
public Space()
{
    super(600, 400, 1);
    addObject(new Rocket(), 300, 200);  // add the rocket
    addObject(new Counter(), 5, 5);  // add the counter
}
İki şey yapacağız, ilk önce Counter objesine referans olacak bie değişken tanımlayacağız, sonra üretilen Counter objesini bu değişkene saklayacağız :
private Counter theCounter;

public Space()
{
    super(600, 400, 1);
    addObject(new Rocket(), 300, 200);
    theCounter = new Counter();
    addObject(theCounter, 5, 5);
}
Devam etmeden önce kodunuzun hatasız derlendiğini görün.

Dikkat ettiyseniz theCounter adında bir değişken tanımladık. Bu tanımlama metod tanımı dışında. Bunun anlamı bu bir instance değişken (oluşum değişkeni), yani Space objesi var oldukça bu değişken değerini koruyacak (fakat SpaceWorld class içinde).

Şimdi Space class'ına Rocket tarafından sorulduğunda değeri dönecek bir metod ekleyelim :
public Counter getCounter()
{
    return theCounter;
}
Şimdi shot üzerinden world'e ulaşabilir ve 'getCount' metodunu kullanarak counter objesine erişebiliriz. Sonra da counter'ın 'bumpCount' metodunu çağırarak skoru değiştirebiliriz. Shot class içindeki 'hitAnAstroid' metodu şu şekle gelecektir :
void hitAnAsteroid()
{
    Space spaceWorld = (Space) getWorld();  // get a reference to the world
    Counter counter = spaceWorld.getCounter();  // get a reference to the counter
    counter.bumpCount(5);
}
Hadi bu değişiklikleri kendi senaryonuza da uygulayın ve hatasız olarak derleyin.

İşte artık sorunumuz çözüldü. Shot ne zaman skor counter değerini artırmak isterse, world üzerinden counter objesine bir refrans oluşturuyoruz. Sonra bu counter objesinin içindeki metoda ve değerine bu referans üzerinden müdahale ediyoruz.

Çözümün en son hali buradan indirilebilir.


Görüşmek üzere..




Hiç yorum yok:

Yorum Gönder