Bu sayfadaki yazılar
Sayfanın metni
Sayfa 59
"Usta... ActionScript 3.0 üzerine pişmişinden OOP kes, az da MVC döküver..."
Property
AS3 öncesi property dediğimiz objelere ait değerlere erişim için
myClip mc. alpha 50;
şeklinde önünde işaretli bir yaklaşım uyguluyorduk. AS3 ile hem bu öndeki işareti kalkıyor, hem de 0-100 arası değerler artık 0...1 aralığında olacak şekilde veriliyor. AS2'ye kadar yüzde şeklinde cinsinden değer belirtmek, player'ın ilgili property değeri üzerinde çarpma ve sonra 100'e bölme işlemi yapmasını, dolayısıyla da hızın azalmasına sebep oluyordu.
Event
AS3 öncesi bir movieclip'in mouse ile etkileşimini sağlamak çok pratik idi; ilgili movieclip'in koduna şu türden bir kod eklemekle Flash'ın Button tanımlaması da tarih olmaya başlamıştı:
on
doSomething(); )
AS2 ile bu yöntem, timeline'da yazılabilecek şu şekilde bir kodla da sağlanabiliyordu:
myButton.onRelease function() 1
doSomething(); )
Ama artık AS3 ile her şey kurallara çok uygun olmak durumunda. Objeler arası etkileşim, bunların birbirini dinlemesi ve buna uygun tepki göstermesiyle olabilir. Bu yüzden listener (dinleyici) oluşturup istediğimiz durum gerçekleştiğinde bir işleyiş oluşturabiliriz.
function ClickHandlerFunction(event)
1 J
myButton.addEventListener( MouseEvent.CLICK, ClickHandlerFunction);
doSomething();
Aslında yaptığımız, klasik bir fonksiyon tanımlamasında parametre olarak bir event objesi getirecek şekilde dönüştürerek bunu bir dinleyiciye bağlamak. MouseEvent.CLICK, dinlenecek durum tipini tanımlanmasını sağlıyor. Fonksiyonda kullanmayacak olsanız bile parametre olarak event objesini belirtmeniz gerekiyor, yoksa durum gerçekleştiğinde parametresiz tanımlanmış fonksiyona parametre geçmeye çalıştığınız için hata verecektir. event objesini incelediğinizde bunun, durumu gerçekleştiren objeye refere eden bir obje olduğunu görürsünüz. Farklı durumları tek bir fonksiyon ile algılamak istediğinizde bu event objesini kontrol ederek öğrenebilirsiniz.
Inheritance
Gerçek bir OOP, class'ların birbirinden türetilebildiği bir kalıtım sistemini de barındırır. Kendisini oluşturan class'a ait metod ve property'lerin devralınmasına inheritance (kalıtım) denmektedir. Bu yaklaşım, var olan çeşitli class'ları kendi metodlarımızla geliştirmemizi sağlıyor. Önceden prototype ifadesi ile Array, Math, MovieClip gibi çok kullanılan class'lara ek fonksiyonlar tanımlıyorduk. AS3 artık prototype yaklaşımı yerine class inheritance kullandığından prototype genişletme yönteminin pabucu dama atıldı.
public class Circle extends MovieClip
şeklinde bir class tanımlaması, MovieClip class'ını genişleterek ona Circle isimli bir metod ekleyecektir. Aşağıdaki örnekte Circle metodu, MovieClip class'ına yeni bir fonksiyon olan daire çizmeyi ekliyor. radius ve fillColor, dışarıdan erişilebilen property'ler ve fonksiyon, bunları parametre olarak alarak daireyi MovieClip class'ının drawCircle() metodu ile çiziyor.
package ( import flash.display.MovieClip; public class Circle extends MovieClip
(
10;
public var radius public var fillColor public function drawTheCircle() ( this.graphics.clear(); this.graphies.beginFill1(fillColor); 0,
,
Timeline'da kullanılacağı zaman
import Circle; var myCircle myCircle.radius myCirele.fillColor 0x0000FF; myCircle.drawTheCircle();
new Circle(); 20;
yazmak yeterli olacaktır.
Static
Class'ın her yeni kullanımında değişmeyecek değerleri ve metodları Static kelimesi ile tanımlayabiliriz. Bu şekilde statik öge, class'dan oluşturulan her çocuk objede ayrı ayrı tutulmaz, tek değer/metod tüm o class'ın çocukları için geçerli olur. Bir obje yaratıldığında, class'da Static olmayan tüm property ve metotlar, her çocuk objeye kopyalanır. Ama Static tanımlanan property ve metotlar, sadece class'a ait olurlar, onun çocuklarına aktarılmazlar.
Statik ögeleri, bir class'dan kaç defa türetildiğini kontrol etmek için kullanabilirsiniz. Buna örnek olarak bir slideshow indeksini verebilirim. İleri ve geriye gidildiğinde kaçıncı resimde olduğumuz ve başa / sona ulaşıp ulaşmadığımızı, bu değerleri statik yaparak kontrol edebiliriz.
radius);
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 58
"Usta... ActionScript 3.0 üzerine pişmişinden OOP kes, az da MVC döküver..."
uint'in avantajı, negatif değerleri göstermek için bir bit harcamadığından daha büyük numaraları (int'in 2 katı) tanımlamakta kullanılabiliyor oluşu. Number'da olduğu gibi player bu değişkenin içerik tipini algılamaya çalışmadığından daha hızlı işlem yapabilecektir.
Erişim
Şimdiye kadar az-çok Flash ile uğraşan herkes aşağıdakine benzer bir kodu MovieClip'e kod ekleyerek bununla timeline'ın akışına müdahale etmişlerdir.
—parent.gotoAndStop(2);
Bunu AS3 ile çalıştırmaya kalktığınızda compiler tonla hata kusacaktır. Sebebi, AS3'ün artık class inheritance şeklinde çalışmamasıdır. AS2 prototype inheritance temelli olduğu için bu gibi pratik müdahaleler kolaylıkla yapılabiliyordu. AS3'e geçerken bunu kurallara uygun hale getirmek için
var myParent - parent; myParent.gotoAndStop(2);
şeklinde yazmamız, problemi çözecektir. Burada myParent ile yeni bir obje tanımlayarak erişimimizi onun üzerinden yapıyoruz. Elde etmek istediğimizi bu şekilde çok az değiştirerek OOP kurallarına tam bir uygunluk sağladığımızda AS3'e geçişte problemlerimiz de azalacaktır. Aynı yöntemle String ve fonksiyonlarda da değişken tipini önden tanımlamamız, daha hızlı ve hatasız çalışmamızı sağlayacaktır.
numOut numOut:int
15;
slowVar "myString"; fastVar:String "myString";
function slowFunc()
£ ) function fastFunc() :Number
)
return 100;
return 100;
Class
AS3'te görsel arabirim dahil her şey class üzerinden tanımlanmıştır. Flash'a ait temel class'lar, compile aşamasında otomatik olarak movie içine dahil edilir.
Class'ları oluştururken package ile oluşturacağımız metodları gruplayabiliriz:
package (
public class Circle
Temel class'lar dışında bir class kullandığınızda onu compiler'a tanıtmazsanız kullanamazsınız. Kullandığınız class'ları kullandığınız yerde import etmeniz -temel class'lardan olsalar da- temel bir alışkanlık olmalı. Bunun için import komutunu kullanıyoruz:
package ( import flash.display.MovieClip; public class Circle
(
Timeline üzerinde class import ederken birden fazla yerde aynı class'ı kullanacaksanız ya her kullanıldığı yerde import etmeniz ya da aşağıdaki gibi class'ı oluştururken erişim yolunu da tanımlamanız gerekiyor:
var myFoo:foo new macr.util.foo();
Public / Private
Günün birinde bir programcı, dünyadaki tüm edebiyatı, görsel sanatları, sayıları ve istatistikleri bir araya getiren sonsuz bir veritabanı oluşturdu. Sonra buna her türlü sorgulamayı kolaylıkla yapabileceği bir sorgulama sistemi tasarladı ve yazdı. Ondan sonra da çalışmasının meyvelerini tadabilmek için bilgisayarının karşısına oturdu.
3 dakika sonra başı ağrımaya başladı. 3 saat sonra rahatsızlık duymaya ve kötüleşmeye başladı. 3 gün sonra, tüm veritabanını imha etti. Sebebini sorduklarında "Bu sistem tüm verileri önüme getiriyor, her şeyi incelememi ve sorgulamamı sağlıyordu. Her türlü bilgiye erişebiliyor, her şeyi görebiliyordum, her yeri gezebiliyordum. Bu, bilinebilecek her şeyi öğrenmemem için bahanelerimi ortadan kaldırıyor. Yemek yiyemez, uyku uyuyamaz hale geldim. Tek yapabildiğim, bu sonsuz veritabanında gezinmekti. Artık dinlenebilirim."
Sonsuz açıklık ve erişilebilirlik, sağlıklı değildir. Kodunuza ait her şeyin açık ve erişilebilir olması, müdahalelerin yolunu açar. Sizin planladığınızın dışında müdahaleler de kodunuzun sağlıksız çalışmasına yol açar.
Public ile bir metodu ya da property'yi dışarıdan erişime açık tutmak istediğimizi belirtebiliriz. Bunun tersi Private özellikle class iç hesaplamalarında kullanılabilecek metod / property'ler içindir.