Soru - Cevap Bölümü
/ Kategori: Programlama
Selamlar
Öncelikle forumun tüm Flash alemine hayırlı olmasını dileyeyim ve bir soruyla bu kategorideki açılışı yapayım.
Bu aralar Çizim API leri ile fazlasıyla ilgileniyorum ve her çizim şekli için prototipler tanımlıyorum. Bildiğim kasarıyla .prototype olayı Flash 5 stili.
Gerçi benim için yazımı çok kolay oluyor ama bu prototipleri ileriye dönük uyumluluk açısından class dosyaları haline getirmek istiyorum. işte bu noktada çok takıldım ve bir türlü başarılı olamadım.
Aşağıda örnek olarak vereceğim prototipin class biçimini benim için tanımlarsanız fazlasıyla memnun olurum :D
MovieClip.prototype.kareCiz = function(x,y,w,h){
//parametreler string geliyor
//number a çevriliyor
var x = parseFloat(x); //x eksendeki nokta
var y = parseFloat(y); //y eksendeki nokta
var w = parseFloat(w); //genişlik
var h = parseFloat(h); //yükseklik
this.moveTo(x,y);
this.lineStyle(1, 0x000000, 100);
this.lineTo(w,y);
this.lineTo(w,h);
this.lineTo(x,h);
this.lineTo(x,y);
}
.
Cevaplar
( Faydalı Cevapları Göster )
Çok çok teşekkürler flame.
Elimde bir AS 2.0 kitabı var ve class konusunu o kadar dikkatli okumama rağmen constructor function ın bir değer döndürmediğini ilk defa senin mesajında farkına vardım.
Bu benim için önemli, çünkü değer döndürmesini istediğim satırları hep constructor kısmına yazıyordum ve sonrasında nerde yanlış yaptım diye dövünüp duruyordum.
Tekrar teşekkürler.
AS1’ de yazılan prototype lar AS2 de kullanılabilir. Bu yüzden MovieClip için ayrıca class yaratmanıza gerek yok. Çünkü aslında,internal olarak hala AS1 e çevriliyor AS2 :
/*
AS1+AS2
*/
// ->prototype üzerinde
MovieClip.prototype.rotate = function(){
this.onEnterFrame = function(){
this._rotation--
}
}
polygon_mc.rotate()
// direkt sınıf üzerinde
MovieClip.testClip = 'test...'
trace(MovieClip.testClip)
Söylediklerimizin işlemeyeceği durumlar var. Şöyle ki : AS2 deki sınıfları buradaki sorun açısından iki gruba ayırabiliriz :
* ( dinamik olmayan ) sınıflar
class Gazete {
// yapılacaklar ...
}
Bu sınıfın kendisine ( prototype ına değil) ve bu sınıfın örneği( instance ı) olan nesnelere yeni bir metod veya özellik ekleyemeyiz. output ta derleyici hatası verecektir (compile error)
* dinamik sınıflar
dynamic class OnlineGazete {
// yapılacaklar
}
Bu sınıfın kendisine ve bu sınıfın örneği( instance ı) olan nesnelere yeni bir metod veya özellik ekleyebiliriz.
Tüm AS2 sınıflarının prototype larını kullanabilirsin. Kullanamayacağın durumlar :
Mesela AS2’ de Stage ve Math nesnelerine yeni metodları AS1 stilinde ekleyemezsin. Aslında öncelikle, bu iki sınıfa zaten prototype yazılmaz ( öyle denir ama…). Çünkü bunlar statik sınıftır, daha açık olarak söylenirse, bunları kullanmak için bunların instance larını oluşturmaz, direkt kullanırız. örnek olarak :
// AS1 ->yanlış
Math.prototype.isNatural = function(number)
var isPositive = ( number>=0)
var isInteger = (number%1 == 0)
return isPositive && isInteger
}
// AS1 ->doğru
Math.isNatural = function(number)
var isPositive = ( number>=0)
var isInteger = (number%1 == 0)
return isPositive && isInteger
}
var x = Math.isNatural(4)
trace(x)
zaten basit çerçevede, mantık olarak ne Math ın ne de Stage in örneğini oluşturmanın bir anlamı yoktur. Misal olarak Stage bir tanedir o esnada ( o swf için ). Haliyle onun instance ını oluşturabiliyor olmak da manasız olurdu. Uzatmadan sadede gelirsek, AS2 deki internal sınıfların,("built-in" olarak tabir edilenler)bazıları dinamiktir, bazıları da dinamik değildir.işte Math ve Stage dinamik olmayan ve instance ları oluşturulmaayan sınıflardan, haliyle arıza çıkartıyorlar. Ama verdiğim örnekte de olduğu gibi MovieClip ve diğer sınıflar için prototype yazabilir ve AS2 de kullanabilirsin.Yani prototype a yeni metod ve özellikler ya da eventhandler lar eklemede sınıfın dinamik veya dinamik olmayışının bir önemi yok.
Hoşuma giden bir konu olduğu için uzattım sanırım. Eğer Math veya Stage gibi dinamik olmayan instance ı oluşturulmadan kullanılan sınıflara ( nesnelere) metod veya özellikleri nasıl ekleyebileceğini merak ediyorsan bunu da yazmaya çalışırım, çünkü bir kaç yolu var (biraz detaylı…)
iyi çalışmalar…
lostchild ilgin için teşekkürler.
Öncelikle dinamik/dinamik olmayan sınıflar hakkında yazdıkların bilgim dahilindeydi. Fakat dinamik olmayan sınıflara metod ve özellik eklenebileceğini bilmiyordum. istersen anlatabilirim demişsin, neden olmasın! Seve seve okurum.
Elimde Savaş Tekin in kitabı var ve orada prototype ların ileride desteklenmeyeceği yazıyor. Macromedia nın ileriye dönük politikalarında gerçekten böyle bir şey var mı?
Saygılarımla…
Ne yazık ki sadece AS2’ ye yönelik olan çözüm hiç de yaratıcı değil.Ayrı bir sınıf yaratıp içine yazmak :))
class newMath
{
function isNatural(num:Number):Boolean
{
var isNotNegative:Boolean = ( number>=0)
var isInteger:Boolean = (number%1 == 0)
return isNotNegative && isInteger
}
}
aklımıza muhtemel olaarak gelecek olan diğer çözüm şu olabilirdi : yeni yarattığımız newMath adlı sınıfın, Math sınıfının metodlarını kullanabilmesi, yani şöyle :
class Math2 extends Math
{
// kod...
}
Fakat bu da ne yazık ki işe yaramamakta.diğer iki çözüm AS1 ile ilgili. ilki, "intrinsic" anahtar kelimesi sayesinde gerçekleşmekte. Elimizde bir AS1 sınıfı varsa ve onu AS2 sınıfı gibi kullanmak istiyorsak, ( aslında sınıf değil datatype tanımı olan ) bir sınıf yaratıp onun içine sadece data type ları yazıyoruz.
Flash zaten internal olarak halen AS1 sınıflarını kullanıyor ( ve bunu yapıyor ) Flash mx2004 ün kurulu olduğu klasör altında "Flash MX 2004\EN\First Run\Classes"klasörünü açıp Math.as dosyasına bakarsak şunu görürüz :
( Aslında core class ların hepsinde görüyoruz )
intrinsic class Math
{
static var E:Number;
static var LN10:Number;
static var LN2:Number;
static var LOG10E:Number;
static var LOG2E:Number;
static var PI:Number;
static var SQRT1_2:Number;
static var SQRT2:Number;
static function abs(value:Number):Number;
static function acos(value:Number):Number;
static function asin(value:Number):Number;
static function atan(value:Number):Number;
static function atan2(value1:Number,value2:Number):Number;
static function ceil(value:Number):Number;
static function cos(value:Number):Number;
static function exp(value:Number):Number;
static function floor(value:Number):Number;
static function log(value:Number):Number;
static function max(value1:Number,value2:Number):Number;
static function min(value1:Number,value2:Number):Number;
static function pow(value1:Number,value2:Number):Number;
static function random():Number;
static function round(value:Number):Number;
static function sin(value:Number):Number;
static function sqrt(value:Number):Number;
static function tan(value:Number):Number;
}
Burada yapılanı, "intrinsic" kullanarak biz de yapabiliriz.
/*
AS1 static method
Math nesnesi zaten var Flash da
flash dosyasında alttaki kod :
*/
Math.isNatural = function(num)
var isNotNegative = ( num >=0)
var isInteger = (num %1 == 0)
return isNotNegative && isInteger
}
// Math.as -> varolan AS2 sınıf dosyası
intrinsic class Math
{
/*
Diğer satırların altına
... aşağıdaki satır eklencek ...
*/
static function isNatural(num:Number):Boolean
}
Sonuncusu da benim böyle bir yol ararken bulduğum bir yöntem,ama normalde işlememesi gerekiyor, ama yine de işliyor (-: Niye işlediğini ben de merak ediyorum … !!
// AS1+AS2
var newMath = Math
// --->
newMath.isNatural = function(num)
var isNotNegative = ( num >=0)
var isInteger = (num %1 == 0)
return isNotNegative && isInteger
}
// test
trace (newMath.isNatural(7))
Tek tek denemeye vaktim olmadı. ( sanmıyorum ama .. )umarım çalışmayan bir şey olmaz…
"prototype" mevzusu ise şöyle sanırım : Macromedia nın yeni sürümlerini artık tümüyle yeni kod mimarisine göre yapılandırmak isteyeceği doğru olsa gerek ve normal bir yaklaşım ama AS’de de, JS gibi ECMA model alınıyor.
http://www.mozilla.org/js/language/es4
ECMA da halen "prototype" var. Bilgi için : http://www.mozilla.org/js/language/es4/core/definitions.html#prototype
Bir de şunu eklemek gerek AS2 sınıflarında halen prototype var, hatta ECMA da olmayan proto var. hatta constructor , constructor var ( son iki özelliği sınıf dosyalarında göremezsin ama internal olarak kullanılıyor ).
Bu koşullarda, yakın bir gelecekte ( bir sürüm sonra örneğin ) prototype ın çıkarılması bana çok da mümkün görünmüyor.Öncelikle macromedia için bu bir risk ( geriye yönelik uyumsuzluk ) Çünkü pozisyonları aynı olmasa da, halen Flash 3/4/5 ten kalma AS elemanları desteklenmekte.
Kaldı ki halen AS1 ile iş yapan bir çok kişi var. Baktığımızda AS1 halen çok daha esnek bir yapıda bu tür metodları özellikleri eklemek açısından. ( Bunun örneklerini yukarıda yapmaya çalıştığımız şeyden görebiliriz )
iyi çalışmalar …
merhaba, öncelikle bu konu ile ilgili bir şey eklemeyeceğimi belirtmek isterim. Sonra da bu forumda elektrik ya da elektronikle uğraşan arkadaşlardan yardım talep ediyorum.
bir sorum var ve bu başlık altında sormayı uygun gördüm.
bir anahtar, sigorta, direnç, ampermetre, voltmetre, almaç ve bir kaynaktan oluşan bir devre düşünün. Toplamda 14 adet bağlantı noktası mevcut. Belki elektronik tasarım programlarından görmüşsünüzdür, bir noktanın üzerine gelince imleç değişmekte ve fare tıklanıp başka bir noktanın üzerinde bırakılınca iki nokta arasına bir çizgi (kablo) çizmekte. Aslında buraya kadar bilindik konular. Problem bundan sonra.
Şöyle ki: Örneğin kullanıcı sadece kaynak, anahtar ve alıcı arasında doğru bağlantıyı gerçekleştirince ve anahtarı kapattığında (örneğin lamba ışık verecek) alıcı çalışacak. Bağlantı yanlış olduğunda alıcı çalışmayacak. Ampermetreyi devreye doğru bağladığında ampermetre devrenin akımını gösterecek. Voltmetreyi devreye seri bağladığında devrenin çalışması durdurulup voltmetrenin seri bağlanamayacağı konusunda kullanıcı uyarılacak. Buna benzer daha bir sürü kombinasyon mevcut bu basit devre için. Elbette uzun satırlar halinde koşul ve döngü kontrolü ile bunu yapmak mümkün. Ancak bunun daha kısa ve işlevsel bir yolunu bulabilirmiyiz?
Mesleyi tam olarak izah edemedimse ilgilenen arkadaşlara yapmak istediğim şeyin bir örneğini gönderebilirim. sanırım o zaman daha iyi anlaşırız.
herkese iyi çalışmalar.
MMIstanbul Adobe UG
ColdFusion, Flex, AIR, Flash, PDF, Dreamweaver, Fireworks, Photoshop, Illustrator, INdesign, Premiere, Soundbooth, Lightroom, InCopy, JRun, LiveCycle, Acrobat, AfteEffects, Resmi Adobe Kullanıcı Grubu.
Etkinlikler
Konferans
2. Ulusal Yazılım Mimarisi Konferansı - UYMK'08
2. Ulusal Yazılım Mimarisi Konferansı - UYMK'08
2.Ulusal Yazılım Mimarisi Konferansı (UYMK’08), 11 – 12 Eylül 2008 tarihlerinde Ege Üniversitesi Bilgisayar Mühendisliği Bölümü ev sah...
Kategori:
Konferans
Kimler Burada? 
Son 1 dakika içinde MMIstanbul' da 205 (2 kayıtlı, 203 ziyaretçi) kullanıcı varmış. Login durumda olanlar aşağıda:
MMIstanbul Blog'undan
500 Hatası Hakkında!
merhaba arkadaşlar, bir önceki yazıda bahsettiğimiz üzere sunucunun ram ihtiyacını yavaş yavaş gidermeye başladık. An itibariyle 2 Giga d ...
Reklam, MMIstanbul ve Yeni Projeler (Durumumuz Bu Tarzında)
Ne Nedir Kampanyası Başlıyor!
Çok Merak Edenler için; MMIstanbul Geliştirme Ekibi ve Çalışma Ortamımız
MMIstanbul Online Seminerlerine Nasıl Katılabilirim?




Evet bu yarattığımız class ımız. Peki olayı kullanmak istersek ne yapıcaz..
Bu arada constructor hakkında kısa bir bilgi vermek istiyorum. Bazen yeni başlayan arkadaşların kafası karışıyor. Bir function yaratılıyor ama geri döndürme tipi yok yada "return" komutu yok.
Constructorlar sadece komutlar işleme konduğunda istenilen tipleri ve değişkenleri oluşturur başka bir kullanım amaçları yoktur.
Güzel günnerde kullanmanız dileğiyle…