| 278857 KB | 15.11.2004 | 00:00:00 | |
| 20600 KB | 15.11.2004 | 00:00:00 | |
| 17084 KB | 15.11.2004 | 00:00:00 | |
PS(First Person Shooter) olarak bilinen karakterin gözünden çevreye baktığımız oyun tarzında, bir türlü içinden çıkılamayan “En iyi kaç fps’de oynanır?” sorusuna artık bir cevap bulmanın zamanı geldi diyorum. Bu yazıda bildiğim ölçüde nacizane birtakım fikirler öne sürüp, görüşlerimi sizlerle paylaşacağım.Öncelikle kendim 1998 yılında Türkiye’de henüz 56K dial-up bağlantısı varken, 250 ping ile sanane.com sunucularında Quake2 oynayarak yarı profesyonel anlamda FPS camiasına katıldım. O dönemde zaten bir elin parmakları kadar, wolfenstein, doom, shadow warrior, duke nukem ve quake gibi FPS oyunları vardı ki sanırım hepsini de saydım. (:
Aradan yıllar geçti ve görüyorum ki FPS oyunları dünyayı kasıp kavuruyor. En büyük ödüllü turnuvalar, en geniş organizasyonlar kısaca en büyük profesyonel oyuncu kitlesi hala FPS oyunlarında… Bu dalda önce Half-Life sonra da Counter-Strike oyun dünyasına öyle bir dalış yaptı ki, dönemin tartışmasız en kral oyunu olan Quake resmen kenara itildi ve o tarihten sonra sadece müdavimleri tarafından teke tek veya takım oyunları olarak oynandı, hala az da olsa oynanmakta. Artık yeni kral CS oldu ve orta, lise öğrencilerinin hatta üniversiteye hazırlanan gençlerin bile okul çıkışı koşa koşa internet cafelere akın ettiğini devasa bir kitleyi kendi ekseninde tutmayı başardı. Gerçi halen birçok yerde CS 1.x’ler ısrarla oynanmakta, ona da bir anlam veremiyorum ama saygı duyuyorum tabiki…
FPS oyunlarının ülkemizdeki gelişim sürecine kısaca değindikten sonra gelelim şu meşhur kafa kurcalayan teknik konuya…
Bütün PC oyunlarında saniye başına gösterilen kare sayısı denilen bir kavram vardır ve monitör aynı çizgi film sayfalarını hızlıca çevirerek hareket oluşturmak gibi bu resim karelerini peşpeşe oynatır ve bize hareketli bir görüntü sunar. Peki görüntünün akıcı olması için saniyede kaç fps(frame per second: bunu oyun türü olan FPS ile karışmasın diye ufak yazacağım) görmek gerekir? Teorik olarak insan gözünün 30 fps’nin üstünü algılayamadığı yönünde deli saçması bir inanış vardır ki aslında böyle birşey bana göre söz konusu bile değildir.
İnsan gözünün görüntüleri tam olarak nasıl algıladığı hala bütün detaylarıyla çözülememiş olsa da askeri araştırmalar için yapılan deneylerde, jet pilotlarının 1/200 saniyeden daha kısa sürede sadece jeti algılamakla kalmayıp ne tür bir jet olduğunu da anladıkları tespit edilmiştir. Bu gözümüzün yetenekleri ve kapasite limiti hakkında net bir fikir veriyor.
İnsanların aklını karıştıran asıl mesele şu; kimi oyun 30 fps ile gayet akıcıyken kimi oyun 60 fps ile kasılıyor gibi gelebiliyor. İşte bu durumun sebebi oyunların yapıldığı grafik motorlarının yapısal olarak büyük farklılıklar göstermesidir. Örneğin Double ve Triple Buffer diye iki kavram vardır. Bunlara genel olarak görüntüde titremeyi önleyici mekanizmalar da denebilir. Oyundaki kareler bir slide show misali peşpeşe hızlıca görüntülenmek istendiğinde, geçişlerde resim tamamen kaybolup yenisi geleceğinden görüntüde bir titreme varmış gibi algılanır. Bunu engellemek için de buffer kullanılır. Önceki kareler buffer’a kaydedilir ve yeni kare geldiğinde eskisi görüntüden kalkmadan yenisi üzerine bindirilerek görüntülenir. Bunu bir nevi, paint’te bir resmin üzerine başka bir resmi yapıştırmak gibi düşünebiliriz. Double-buffer kendinden önceki iki kareyi, Triple-buffer ise üç kareyi hafızasında tutar ve aralarda çok pürüzsüz bir geçiş sağlarlar. Oyundaki fps miktarı çok yüksekse, kareler düzensizce üst üste biner ve görüntüde yırtılma dediğimiz olayla karşılaşırız. Bunu engellemek için de oyunu monitörün dikey tarama frekansına uygun bir fps miktarına sınırlar veya VSync olarak bilinen dikey senkronizasyonu açarak, donanımsal olarak oyunu monitörün dikey tarama değerine limitleriz.
Demek ki, oyunun grafik motorunda kullanılan filtrelemeler görüntü akıcılığı için çok önemlidir ve bu filtreleri kullanan oyunlarda 150 hatta daha üstü fps değerlerini bile hissedebiliriz. Günümüzde ise filtreleme yöntemleri daha değişik bir hal almıştır. Artık yeni çıkan hemen her oyunda kullanılan bir olgu vardır ki o da; “motion blur”. Bence olayın en can alıcı noktası bu motion blur denilen olay. Bu efekti kullanan oyun olsun, film olsun kesinlikle hiç kırıksız yani kusursuz bir akıcılıkla görüntülenecektir. Çünkü bu yöntem, kareler arasındaki geçişleri uzatarak bize sanki bir rüzgar etkisinde gibi savrulan ve hızlıca akan bir görüntü sunar. İşte bu yöntemi kullanan bir oyun 25 fps ile de olsa bunu kullanmayan bir oyunun 200 fps’deki akıcılığına denk bir görüntü sunabilir. Tabi bu kullanılan motion blur efektinin yoğunluğuna da bağlı ama sonuçta akıcılık yönünden oyuna çok büyük katkı yaptığını hiçkimse inkar edemez. Motion blur oyunlarda kenar bölgelerde en yoğun şekilde kullanılır. Çünkü zaten bize bir oyunun takılıyo gibi gelmesinin nedeni namlunun ucundaki bölge değil, çevrenin sağa sola bakarken veya ilerlerken ki akıcı olmayan hareketidir. Motion blur da bu geçişleri yumuşatarak kusursuz bir hareket gibi sunabiliyor. Fakat bu tarz FPS oyunları pro-gamerlara yani işin ustalarına pek gelmez, çünkü çok hızlı hareket ederken görüntüdeki blur efekti iyice kendini hissettirmeye başlar ve bulanıklıktan dolayı rakibi seçmek büyük oranda zorlaşır. Bu nedenle motion blur araba yarışlarında daha çok işe yarıyor bence. FPS oyunlarında da çok büyük etkisi var ama yukarıda belirttiğim gibi oyunun eğlencelik olmasından başka bir getirisi olmuyor. Bu efekti kapatıp oynarken de; oyunda zaten motion blurla akıcılığın rahatlıkla sağlanması buna bağlı olarak da fazla optimize edilmeye gerek duyulmadığından, son derece atlamalı-takılmalı bir FPS oyununa tabi oluyoruz.
Kendi görüşüm motion blur efektinin; yerinde ve yeteri kadar kullanıldığında çok başarılı olduğu fakat yine de 200 fps’de oynanılan bir FPS oyunundaki hazzı asla vermeyeceğidir. Herkese bol fps’li oyunlar dilerim…
bilgiustam.com
1. FLASH EDİTÖRÜNÜN TANITIMI.:
Bir doküman, filminizin karelerini, katmanlarını ve sahnelerini içeren bir Timelinedan (zaman çizelgesi); filminizin gösterildiği bir stageden (sahne ) ve her yandan stagein ötesine uzanan, ancak filmin son hali oynatılırken görülebilir karede görünmeyen çalışma alanından (work area)dan oluşur.
Şekil 1
1.1. Tımelıne Hakkında
Flash filminizi bir kitap gibi düşünürseniz, timeline etkileşimli içindekiler dizini olabilir: her sahne (scene) bir bölüm, her kare(frame) bir sayfa gibidir. İçindekiler listesinde 10 bölümü işaretlediğinizi ve kitabın o bölümün ilk sayfasını açmak üzere çevrildiğini hayal edin. Flash2da timelineda bir kareye tıkadığınızda doküman pencerenizde o kare görünür. Tabi ki bir Flash filmi bir kitaptan çok daha fazla karmaşıktır. Her film sayfası, bir birinin üstüne yerleştirilmiş çok sayıda şeffaf kağıttan oluşabilir. Flaş bu şeffaf kağıtları katman (layer) adını verdiği şeyler olarak izler. İçindekiler dizini içinde hareket ederken, tüm kitap hareket halinde gözükür ve görünmeyen bir el sayfaları çevirir.
Timeline karışık bir organizasyondur. Animasyonlarınızı oluştururken onu yoğun olarak kullanacaksınız.
1.2. Tımelıne Gezintisi
Timeline, filminize ait eksiksiz bir kayıttır. Filminizi oluşturan her sahne, kare ve katmanı temsil eder. Kareler, kronolojik sırayla görülür. Timlineda herhangi bir kareye tıklamanız, sizi doğrudan o kareye götürür ve stagede içeriğini gösterir
ŞEKİL 2 : Timline
1.3. Stage Hakkında
Stage, bir flash filmini oluşturan tüm grafiksel öğeleri içeren alandır. Bunu filminizi oynatacağınız film gibi düşünün. Bir sinema salonun da perde o sinema alanı içinde satın alabildiği herhangi bir boyda olabilir. Flashta, perdenizin büyüklüğünü, rengini ve diğer parametrelerini kontrol edebilir, bunların tümünü her filimde değiştirebilirsiniz.
Stagein boyunu ve büyüklüğünü Movie Properties (Film Özellikleri) iletişim kutusunu kontrol edebilirsiniz.
1.4. Araç Çubuğu Hakkında
Flashın çizim araçlarını ve animasyon için nesneleri oluşturup düzenlemekte kullanacağınız diğer araçları içerir. Windowsta araç çubuğunu sbitleye bilir ve herhangi bir anda hangi araçların görüleceği üzerinde daha fazla denetim sahibi olabilirsiniz.
2. MENÜLERİN TANITIMI.:
Flash editöründe yer alan menüler bizim sıkça kullanacağımız araçlardandır.İşte şimdi bu menüleri tanımanın tam zamanı ;
2.1. FILE MENÜSÜ :
New : Yeni bir dosya açmaya yarar.
Open : Önceden yapılmış dosyaları açmaya yarar.
Open as Library… : Önceden tasarlanmış projelerde kullanılan kütüphaneleri yeni projelerde de kullanmaya yarar.
Close : O anki projeyi kapatır.
Save : Projeyi saklamaya yarar.
Import : Projelerimize her hangi bir formatta yapılmış bir resim dosyası, daha önceden tasarlanmış bir projeyi,mov dosyalarını vb … projeleri kendi projenizde kullanmaya yarar.
Export Movie …. : Film yapımı için kullanılır.
Export İmage …. : Resim Yapımı için kullanılır.
Publish Settings : Burada Flash projemizin ekran görüntüsü için ayar yapmamızı sağlar.
Publish Preview : Yapılan ayarları test etmemizi sağlar.
Publish………….. : Flash projemizi çalıştırır ve swf dosyası haline getirir.
Page Setup…….. : Sayfa ayarları yapmamıza yarar.
Print Priview…..: Yazıcıdan çıkaracağımız Belgenin ön izlenimini verir.
Print……………….: Yazıcıya gönderme işlemine yarar.
Asistans………….: Çizgilerinizi düzenleştirmede,monitörünüzün çözünürlüğünü ayarlamada size yardımcı olur.
2.2. EDIT MENÜSÜ:
Edit menüsü yaptığımız bir işlemi geri almada, kesip, kopyalama vs. gibi işlemleri yaptığımız kısımdır.
Undo…: Yanlışlıkla yapılan işlemi geri almamıza yarar.
Redo…: Yapılan işlemi bir ileri alma işlemine yarar.
Cut…..: İşaretlenmiş kısmı kesmeye yarar.
Copy..: İşaretlenen kısmı kopyalamaya yarar.
Paste..: Daha önceden copy veya cut işlemleri ile yapılmış işlemi yapıştırmaya yarar.
Paste in Place: Panonun içeriğini Flash dosyanıza yapıştırır ve orijinal dosyaya bir bağlantı oluşturur.
Paste Special.: İletişim kutusunda göreceğiniz seçenekler, panonun içeriğine göre farklılık gösterir.
Clear..: Yapıştırılan belgeyi silmeye yarar.
Duplicate.: İşaretlenmiş kısmın ikizinden yapmaya yarar.
Select All..: Sayfada olan seçeneklerin hepsini işaretlemeye yarar.
Deselect All……: İşaretlenmiş kısmın hepsini iptal etmeye yarar.
Copy Frames…: Timlineda yer alan çerçevelerin (oynatım göstergesi) kopyalanmasını sağlar.
Paste Frames…: İşaretlenen kısmı yapıştırmamıza yarar.
2.3. VIEW MENÜSÜ…:
Ekranımızın görüntüsünü ayarlamaya yarar.
Goto…: İstenilen satıra gitmemize yarar.
Outlines: Çizilen karakterlerin dış çizgilerini verir.
Fast…: Outlines dan çıkmaya yarar.
Anatialias.: Görünümde analitikliğini sağlar.
Timeline…: Timlineın görünüp görünmemesini sağlar.
Workarea.: Çalışma alanının görünüp görünmemesini sağlar.
Rules………: Cetvelini görünüp görünmemesini sağlar.
Grid……….: Scene yardımcı çizgilerin konulmasını sağlar.
Snap………: Çizim yaparken bir çizgi ile diğer çizgiyi kolaylıkla birleştirmeye yarar.
2.4. INSERT MENÜSÜ :
Yaptığımız işlemlerde ençok kulandığımız layer, frame, movie ve symbolleri üretmemizi sağlar.
Convert To symbol.: İşaretli olan symbolden aynı özelliklere sahip başka bir symbol oluşturur.
New Symbol..: Yeni buton ,movie ve grafik sahneleri açmak için kullanılır.
Layer…:
Yeni layer açmak için
Motion Guide..: Motion Guide oluşturur.
Frame…: Frame Oluşturur
Delete Frame..: Oluşturulan framei silmeye yarar.
Keyframe…: Boş KeyFrame açar.
Blank Keyframe: Özel bir keyframe açar.
Clear Keyframe: Keyframeleri temizlemeye yarar.
Creat Motion Tween: Film Hareketi için kullanılır.
Scene..: Yeni Sahne oluşturur.
Remove Scene: Oluşturulan sahneyi siler.
2.5. MODIFY MENÜSÜ:
Bir Proje oluştururken kullandığımız tüm araçların özelliklerini değiştire bileceğimiz bölümdür.
Frame….: Frame ayarlarını yapmaya yarar.
Layer……: Layer ayarlarını yapmaya yarar.
Scene……: Sahne ayarlarını yapmaya yarar.
Movie…..: İşletim hızını ve çalışma sayfasının ayarları buradan yapılır.
Font……..: Kullanılacak fontun seçimine yarar.
Paragraph..:Yazının hangi çerçeve de olacağını ve
Paragraf aralığını belirler.
Style………: Yazının hangi formatta yazılacağını belirlememize yarar.
Kerning….: İstenilen belgeyi veya Sahneyi siler.
Transform….: İstenilen belgeyi veya
şekli döndürmemize yönünü değiştirmemize yarar.
Arrange..: İstenilen yazının veya şeklin Önde Veya arkada olmasına karar verilen yerdir.
Curves….: Çizilen çizgilerin yumuşak mı? yoksa kesin çizgili mi? Olacağının ayarlarını yapar.
Frames…: Frameler de yer alan bilgileri ters çevirmeye yarar.
Aling……..: Yazının veya şeklin nerede olacağının ayarlamalarını yapar.
Group……: Farklı şekilleri tek parçaymış gibi göstermek için kullanılır. Onları bir araya toplar.
Ungroup..: Aynı şekilmiş gibi görünen parçaları ayırmaya yarar.
2.6. CONTROL MENÜSÜ :
Yapmış olduğumuz hareketli resmin oynatımının ve ayarlamasının yapılmasını sağlar.
Play..: Hareketli sahnemizin oynatılmasına yarar.
Rewind..: Bir oynatım sahnesinde en baş frame dönmeye yarar.
Step Forward..: adım adım ileriye götürür.
Step backward..: Adım adım geriye gelmemize yarar.
Test Movie..: Yaptığımız filmi test etmeye yarar.
Test Scene..: Yapılan sahneyi test etmeye yarar.
Loop Playback..: İşletilen harekelerin hiç durmadan devam etmesine yarar.
Play all Scenes..: Bütün sahnelerin oynatılmasına yarar.
Enable Frame Actions : Kare eylemlerini aktifleştirir.
Enable buttons…: Düğmeleri etkinleştirir.
Mute Sounds…: Kullanılan bütün ses dosyalarını kapatır.
2.7. LIBRARIES MENÜSÜ.:
Flash programının içinde hazır bulunan bizim kullanmamız için yapılmış örnekler.
Buttons………………: Hazır buton örnekleri bulunmaktadır.
Button-Advanced.: Hazır ileri buton örnekleri bulunmaktadır.
Graphics…….: Grafik önekleri yer alır.
Movie Clips..: Haraketli klipler örnekleri yer alır.
Sounds……….: Ses örnekleri yer alır.
2.8. WINDOW MENÜSÜ.:
New Window…: Yeni pencere açmamıza yarar.
Arrange All……: Bütün pencereleri tek pencerede gösterir.
Cascade………..: Pencereleri küçülterek ard arda sıralar.
Toolbar………..: Araç Kutusunun ayarlanmasına yarar.
Inspector……….: Scenelerin müfettişliğini denetlemesini yapar onlar hakkında bilgi verir.
Controller………: Kontrol tablosunun çıkmasına yarar.
Colars……: Renk ayarlaması yapmaya yarar.
Output……: Çıkışta verilerin alınmasına yarar.
Library…..: Kendi çalıştığımız penceredeki kullandığımız buton, movie vs. burada saklar.
2.9. YARDIM MENÜSÜ.:
Bu menü de flash hakkında bilmediğiniz yanlarını dersler halinde görerek öğrenebilirsiniz. Tabi ki ingilizce bilenler için.
3. BIRDEN FAZLA KATMAN ÜZERİNDEKİ NESNELER VE BU KATMANLARIN KULLANILMASI
Nesneleri üst üste bindirerek bir üçüncü boyut yanılsaması yapılır.Bir Katman da (Layer) sembolleri üst üste yığarak oluştururuz.Ancak filmimizde daha fazla öğe kullandığımız için bir tek katman öğelerin yığılma sırasını denetleyemez ve izlemek güçleşir.Katmanlar bu işi kontrol ederler.
3.1. Timeline Katmanı :
3.1.1. Yeni Bir Katman Eklemek :
Insert menüsünden layerı seçin.Ya da timelineda Add Layer düğmesine basarak yeni bir katman elde ederiz.Timeline da bir katman seçin.Flash ,her zaman yeni katmanı seçili olanın üstüne ekler.
3.1.2. Bir Katmanı Silmek :
Timeline da silinecek katman seçilir. Çöp tenekesi sembolüne basılarak silme işlemi yapılır. Bir den fazla katmanı silmek içinde Ctrl tuşuna basılı tutarak silmek istediklerimizi seçip çöp tenekesi sembolüne tıklayarak silme işlemi sona erer.
3.1.3. Katmanların özellik ayarları :
Modify menüsünden Layerı seçelim.Layer Properties iletişim kutusu açılır.Burada katmanın ayarlarıyla oynama yapabiliriz.
İpucu :
Katmanların bağlam menüsü, Timeline daki düğmelerle ulaşamayacağınız bazı seçenekler sağlar
3.1.4. Kılavuz (Guide) Katmanlar :
İki tip kılavuz katman vardır.Bunlar:
Guide (kılavuz) ve motion guide (hareket kılavuzu) Şeklindedir.
Guide türünde her hangi bir içerik bulunabilir.Flash , bu tip kılavuzları son, üretilen filme katmaz.Ancak hareket kılavuzları bir nesnenin, son filmin bir parçasıdır.
3.1.5. Maske Katmanı Yaratmak :
Altlarındaki katmanlardaki nesnelerin kesin bir şekilde göstermenizi veya gizlemenizi sağlayan özel katmanlardır.Bir maske katmanı pencereli bir zarf gibidir.Bu zarfın içinde sayılarla dolu pek çok kağıt bulunabilir,ancak dışarıdan sadece isim ve adresin görüldüğü küçük bir pencereye sahip boş bir alan görülür.Maske katmanı pencereli zarftır,bağlı veya maskelenmiş katmanlar da zarfın içindeki kağıtlardır.
3.1.6. Maske Katmanı Oluşturmak :
Timeline da Add düğmesiyle yeni bir katman oluşturalım.Daha sonra modify menüsünden layer ı seçerek layer properties iletişim kutusunu açalım.Bu rada type kısmına maskı seçip enterleyin.İşlem tamamlanmıştır.
3.1.7. Katmanları Maskeye Bağlamak :
Timeline da kelemek istediğimiz alan seçilir.Modify menüsünden layer ı seçerek layer properties iletişim kutusu açılır.Type kısmında masked seçilir ve ok tuşuna basılır.
İpucu :
Belirli bir katman için bir maske yaratmak ve bu katmanı maskeye tek adımda bağlamak için bağlam menüsünü kullanın.Maskelemek istediğimiz katmana Ctrl tuşuna basılı tutarak tıklayın.Açılan menüden Maskı seçin.Flash, seçilen katmanın üstüne otomatik olarak bir maske katmanı ekler.
İpucu :
Timelineı kullanarak Dikey olarak sabitlemeniz, çok sayıda katmana aynı anda erişebilmemizi sağlar.
İpucu :
Proje görüntüsünü ayarlarken ; Show Frame (kareyi göster) ve Show All (tümünü göster) modlarını seçebiliriz.
4. ADIM ADIM ANİMASYON YAPIMI..:
4.1. Tımeline (Zaman çizgisi) :
Yandaki şekilde görüldüğü gibi timeline filmimizin hazırlanıp oynatıldığı ve karelerden oluşan alandır. Bir çizgi filmi düşünün bunun göz yansımasını çizmek için her kareye ayrı ayrı resim çizerek bunları belli bir zaman aralığında ard arda göstererek hareketlendirebiliriz.İşte buradaki mantıkta aynıdır. Her kareye aynı resmin varyanslarını yerleştirerek hareketlendirebiliriz.
4.2. Stage :
Stage , bir flash filmini oluşturan tüm grafiksel öğeleri içeren alandır. Stagenin gerekli ayarlarını yapabilmek için menüden Modify / Movieyi seçeriz. Aşağıdaki şekilde de gözüktüğü gibi move properties araç kutusu açılır. Stagenin boyutunu dimesions kutucuğuna pixell cinsinden ayarlayabiliriz.Frame Rate ye atayacağımız değer ile her karenin oynatma hızını belirleriz.En ideal olanı 12 dir. Grid spacing değeri Stagemiz de kullanacağımız gridin boyutunu belirler.Default olarak bu değer 18 dir.Grid, stagemizi eşit ölçülerde karelere bölen çizgilerdir.Grid çizgiler, sahnemize grafikleri düzgün yerleştirmemizi ayrıca ölçülü grafik çizmemizi sağlar.Gridi menüden View / Grid seçerek ulaşabiliriz. İlgili kutucuğa tıklarsak bir renk paleti açılır oradan dilediğimizi seçebiliri veya RGB/HEXI olarak tanımlayabiliriz.
4.3. Kare Kare Animasyon:
Kare kare animasyon, bilgisayardan önceki zamanlarda kullanılan geleneksel animasyon şekliydi.Canlı aksiyon filmleri aslında bir kare kare animasyon şeklidir.Film kamerası, oldukça fazla resim çekerek hareketi aktarır.Animasyonlar, bir hareketin farklı aşamalarında nesnelerin çizimlerini göstererek hareketi taklit ederler.
Flash ta farklı içeriği farklı karelere yerleştirerek kare kare animasyonlar hazırlayabiliriz.Flash, yeni içeriği içeren karelere (keyframe) anahtar kare adının verir.
4.4. Tımelıne ın Kullanılması:
Bütün İşlemlerimizi gerçekleştirdiğimiz alandır.Projelerimizde tamamen timelineları kullanırız.
Bir katmanı ilk kez oluşturduğumuzda timelineda gördüğümüz kareler olan ana kareler (protoframe) , filminizde yaratacağımız kareler için yer tutucudur. Flash , varsayılan durumda her katmanın ilk karesini anahtar kare (keyframe) olarak tanımlanır. Her filmde en az bir karenin bulunması gerekir.Daha sonraki karelere içerik eklemek için, anahtar kareler eklememiz gerekir.
Flash anahtar karelerin oluşturulması için insert blank keyframe , tümüyle boş bir anahtar kare tanımlar ve insert Keyframe o kamandaki bir önceki anahtar karenin içeriğinin kopyasına sahip bir anahtar kare tanımlar. insert Blank Keyframe komutunu, Stage in içeriğini tümüyle değiştirmek istediğimizde kullanmalıyız. Insert Keyframe i, önceki anahtar karenin içeriğini kopyalamak istediğimiz zaman kullanırız.
İpucu :
Genellikle , menü çubuğuna gitmek yerine , Timeline daki bir kareye Ctrl ile sağ tıklayarak karenin bağlam menüsünü açabiliriz.
İpucu :
Bazı kısa yol tuşları yardımıyla keyframelleri oluşturabilir ve düzenleyebiliriz.
Bunlar ;
F5 : Boş bir keyframe açar.
F6 : KeyFrame açar.Önceden keyframe varsa aynısını buraya kopyalar.
F7 : İşaretli bir KeyFrame açar.
Shift+F5 : Keyframei siler.
Shift+F6 : Keyframei temizler.
Ctrl+Alt+C : Kopyasını alır.
Ctrl+Alt+V : Yapıştırır.
4.5. Animasyonların Yumuşatılması:
Kabaca yaptığımız animasyonlar çok hızlı hareket etmektedir.Bunu önlemek gerekir.Bu işlemi yapabilmek için daha fazla keyframe eklememiz gerekir. Keyframeleri eklerken nesnemizin konumun da hafifçe değiştirmemiz lazımdır.
4.6. Animasyona Keyframeler Ekleme:
Bir önceki paragraf da anlattığım olayları yapmak için gerekir.İlk kare seçelim.Daha sonra menüden insert / Frame tıklayalım.Bu olayı birkaç kez tekrarlayalım.Her tekrarlamamızda yeni ve dolu kareler oluşacaktır. Dikkat edersek hepsi işaretli olan karenin aynı özelliklere sahiptir.
4.7. Onion Skin (Soğan Zarı) Modu:
Flash 4.0ın bu özelliği ile oluşturduğumuz animasyonun tüm karelerindeki nesnelerin durumunu görmemizi sağlar.Ancak komşu karelerin içeriğini donuk renkte ve tel kafes konumunda görürüz.Onion Skin timelinenın hemen alt kısmında bulunur.Aşağıdaki şekilde gösterilmiştir.
İpucu :
Donuk renkteki komşu kareleri kesinlikle düzenleyemeyiz.
4.8. Onion Skin Outlines Modu:
Timeline durum çubuğunda onion skin outlines düğmesine tıklayarak kullanıma açılır.Onion skin işaretçilerinin arasında kalan tüm karelerin içeriği , dış hatlar şeklinde gösterilir. Dış hat nesnelerinini düzenleyemeyiz.
4.9. Edit Multiple Frames Modu:
Bu modda Flash skin işaretçilerinin belirttiği karelerdeki tüm nesneleri görebilir ve düzenleyebiliriz.Bu hareketli bir nesnenin tüm anahtar karelerde aynı anda taşınabilmesini sağlar.
Bu modda bir seçim dikdörtgenini kullanarak onion skin işaretçilerin arasındaki karelerin herhangi birindeki nesneleri seçebiliriz.Ayrıca burada hareketli bir nesnenin yerini tamamen değiştirebiliriz.
Onion skin ve Edit Multiple Onion Skin Outlines ve Edit Multiple
Kullanımı Kulnanımı
4.10. Yapılan Animasyonların Test Edilmesi:
Control menüsünden play menusunu seçerek yaptığımız animasyonu test etmemiz mümkündür.
5. MOTION TWEEN İLE ANİMASYON.:
Kare kare animasyonun iki ana dezavantajı bulunmaktadır. Bunlardan birincisi yoğun emek harcanması, ikincisi de dosya boyutlarının büyük olmasıdır. Flash ara doldurma kareleri ile her iki problemi hafifletmiştir.
Bir nesneye TWEEN (ara doldurma) uygulamak için , flash o nesnede bir dizi artımlı değişiklikler oluşturur.Bu değişikler yeterince basittir , bu sayede flash bunların tümünü matematiksel olarak tanımlayabilir.Flash iki tipte TWEEN gerçekleştirir.Bunlar MOTION (hareket) ve SHAPE (şekil) dir
Flash 4.0 Motion tweendeki adımları kolaylaştıran Create motion Tween (Hareket için ara doldurma oluştur) komutunu sunar. CMT komutu Tween dizisinin başında ve sonunda birer anahtar kareye almamızı ve sembolleri kullanmamızı sağlar.
5.1. Motion Tween ve Shape Tween:
Motıon Tween (hareket için ara doldurma) veya shape tween (şekil için ara doldurma ) arasında seçim yapmanın anahtarı kendinize bu değişimi bir iletişim kutusu veya denetçi (inspector) penceresiyle yapıp yapmayacağını sormaktadır. Bu sorunun cevabı evetse , Flash değişikliği Motion Tween ile yapabilir. Cevap hayırsa , (değişiklik vektörel bir nesnenin şeklinin yeniden çizilmesi gerekiyorsa) , Flasın Shape Tweeni kullanması gerekir.
Motion ve Shape Tween arasındaki bir diğer önemli fark , motion tween in sadece gruplar veya semboller üzerinde kullanılmasıdır.Shape tween , sadece düzenlenebilir şekillerde kullanılabilir.Bazen motion veya shape tween kullanarak aynı etkiyi elde edebiliriz.
5.2. Motion Tweene Bir Örnek:
Yeni bir flash dosyası oluşturalım ve bir isim verelim.
Timelineda birinci kareyi seçelim.Oval aracını kullanarak line color yani çizgi olmayan stagemizin yani sahnemizin üst tarafına bir yuvarlak çizelim.Eğer yuvarlağın topa benzemesini istersek fill color yani doldurma rengi olarak radyant kullanırız.
Timelineda birinci kare seçili iken insert menüsünden create motion tweeni seçelim.
Flash stagedeki nesnelerden bir sembol oluşturur ve bu sembolde o filmde yaratılan tween nesnelerinin sayısına bağlı olarak varsayılan bir isim verir. Örneğimizde 1 top kullandığımıza göre tween1 ismini verelim.Bu ismi sonra sağ tıklayarak değiştirebiliriz.
Şimdi timelinede 5.kareyi seçelim ve insert / frame komutunu tıklayalım. Flash 2.kareden 5. kareye kadar kesik çizgiler içeren kareler ekler.Bunun anlamı şudur:Bu karelerin bir motion tween içermek üzere ayarlandığını ancak flashın ara doldurma işlemini tamamlayamadığını belirtir.Burada animasyonumuzun sonunda topun nerede bulunacağını belirten anahtar kareyi eklememiz gerekir.
5. karede topumuz aşağıya doğru tıklayacağına göre topu bir miktar aşağıya taşıyalım. Bu işlemden sonra timeline 1.ve 5. kareler arasında bir okun belirdiğini görürüz.yani5.karede eksik olan anahtar karemizin tamamlandığı anlamını verir.
Şimdide 10.kareyi seçelim ve insert / Frame komutunu verelim. 5 . maddeden itibaren aynı şeyleri tekrarlayalım.10. karede iken topu bu kez yukarıya doğru taşıyalım.10. karemizdeki eksik olan anahtar karemizi de böylelikle tamamlamış olduk .Artık Control menüsünden Play veya Ctrl+Enter tuşu ile filmimizi keyifle seyredebiliriz.
5.2.1. Tween Özelliğinin Ayarlanması:
Çalışan bir motion tween elde etmek için üç şeye ihtiyacımız olacak.Bir grup veya bir sembol içeren bir başlangıç anahtar karesi .Motion Tween olarak tanımlanmış ara doldurma kareleri ve değişiklik uyguladığımız aynı grubu veya sembolü içeren bir bitiş karesi.
5.2.2. Frame Properties İletişim Kutusunu Kullanarak MOTION TWEEN Tanımlamak:
Yeni bir doküman açalım.Timeline 1. kareyi seçelim ve oraya bir içi dolu bir top çizelim.
Topu seçip Modify menüsünden GRUP komutunu seçelim.
timeline 5.kareyi seçelim ve insert / Keyframe komutunu tıklayalım.
Timelinede 10.kareyi seçelim insert / Keyframe komutunu seçelim.
5. kareyi seçelim ve topu sahnenin alt tarafına doğru sürükleyelim.Şimdide 10. kareyi seçelim ve topu sahnenin üst tarafına doğru sürükleyelim.
1.kareyi çift tıklayalım.Bu eylemden sonra Frame Properties iletişim kutusu açılır.Bu kutudan tweening kulakçığına tıklayalım.
Tweening menüsünden motionu seçelim.Motion Tween parametreleri görülür.Daha sonrada tamamı tıklayalım.Flash 1. ve 5. karelerde motion tween yaratır.
Şimdide 5. kareyi seçelim ve 6. adımda işlemi aynen tekrar edelim.Bu işlemden sonra 5. ve 10. kareler arasında da sıçrayan topumuzun ikinci yarısı olan tween oluşturulur.
5.3. Renk Efeklerinin Canlandırılması:
Tweening , sadece bir nesnenin sahnedeki yerini değiştirmekten ibaret değildir.Bir nesnenin rengine de Tween değişimleri uygulayabiliriz.
Yeni bir flash dosyası oluşturalım.
Timelinede 1. kareyi seçilim ve sahnede bir sembol yada gruplanmış bir nesne yerleştirelim.
Timelinede 5. kareyi seçelim ve insert / Keyframe komutunu çalıştıralım.
1. kareyi veya onunla ilişkili ara doldurma karelerinden herhangi birimi (yani 2den +e kadar olan kareler) seçin. Menüden İnsert / Create Motion Tweeni seçelim.Flash , Nesneyi üç geçerli adımda yeniden renklendirir.Her ara doldurma karesinde bir adım kullanılır.
5.4. Boyu Değişen Nesnelerin Canlandırılması:
Yeni bir flash dosyası oluşturalım.
Timelinede 1. kareyi seçelim ve sahnede bir nesne oluşturalım.
1.kare seçiliyken İnsert / Create Motion Tween i seçelim.Bu şekilde flash nesnemizi bir sembole dönüştürür.
Timelinede 5. kareyi seçelim ve insert / Keyframe komutu ile bir anahtarkare ekleyelim.5. karedeyken, scale aracı ile nesnemizin boyunu biraz büyütelim.
Timelinede 1. veya onunla ilişkili karelerden (2-3-4) birine çift tıklayalım.Frame properties iletişim kutusundan tweening kulakçığına tıklayalım.Görünen motion tweening parametrelerinden tween scalingi seçerek oke tıklayalım.Bu eylemden sonra flash 1.kareden 5.kareye kadar nesnemizin boyunu eşit olarak artırır veya azaltır.
Şimdide nesnemizi küçültelim. Timeline 10. kareyi ve insert / Keyframe komutunu çalıştırır.10. karede iken scale aracı ile nesnemizin boyunu küçültelim.bir önceki adımı tekrarlayalım.
5.5. Nesnelerin Döndürülmesi:
5.5.1 - Bir Nesneyi 360 Dereceden Az Döndürmek:
Yeni bir flash dosyası açalım.
Timelinede 1. karede iken bir nesne oluşturalım.
Eğer yeni bir nesne oluşturduysak nesnemizi seçelim ve modify / group veya insert / Conwert To Symbol ü tıklayalım.Motion Tweenleri sadece gruplanmış veya sembolleri kullanarak yaratabileceğimizi unutmayalım.
Timelinede 5.kareyi seçelim ve insert/ Keyframe yapalım.5.kare seçiliyken nesnemize ROTATE aracı ile 90 derece sağa döndürelim.
Timelinede 1. kare veya onunla ilişkili olan 2-3-4. karelerden birini seçelim ve çift tıklayalım. Bu işlemden sonra açılan frame properties iletişim kutusundan tweening kulakçığına tıklayalım.Açılan menüden motionu seçelim.Burada dönüş için flasha bir yön vermeliyiz.
AUTOMATIC : Nesneyi en az hareket gerektiren yönde döndürmesini sağlar.
CLOCKWISE : Nesne saat yönünde döner.
COUNTERCLOCKWISE : Nesne saat yönünün tersine döner.
ClockWise ı seçerek entere basalaım.
5.5.2 Bir Nesneyi Çevirmek:
Rotate açılır menüsünden clockwisei seçelim.Times kutusuna 1 değerini girelim.Buraya gireceğimiz değer flashın nesneye ara doldurmayı nasıl uygulayacağını belirler.
5.6. Tween Hızının Değiştirilmesi:
Frame Properties iletişim kutusunda EASE IN / EASE OUT kaydırma çubuklarını kullanarak bir animasyonun bir tween serisinin başında ve sonundaki hızını değiştirebiliriz.
Easing kaydırma çubuğunu sola , in kelimesine doğru sürüklenmesi halinde Flash easing alanına negatif bir değer girer.Ease in animasyonun yavaş başlamasını ve sona doğru hızlanmasını sağlar.Easing alanına girilecek değer 1 ile 100 arasında değişir.Hızlı başlayıp sonra yavaşlaması içinde in yerine out kullanılır.
6. KARMASIK ANİMASYON:
Önceki bölümlerde nesneleri düzenlemeyi ve bir tek layer üzerinde tek tek hareketlendirmeyi anlattım.
6.1. Scene (Sahneler) Hakkında :
Şimdiye kadar timeline üzerinde fazla işlem yapmamıştım.Ama flash da bir site hazırladığınızı düşünürsek ,yüzlerce kare üzerinde işlem yapmamız gerekecektir.Bu da baya zor bir iştir.Oysa scene yani sahneler ile çalışmak hem kolay hem de filmimize tam anlamıyla hakim olmamızı sağlar.Her sahne kendi içinde bir film gibidir.Tabi sahne hazırlamak da zor bir iştir.
Flash sahneleri oynatmak için komutlarımızı bekler. Flash 4.0ın SCENE ISNPECTOR penceresi, filmimizde hangi sahnelerin bulunduğunu görmemizi ve yeni sahneler oluşturmamızı sağlar.
Filmimiz karmaşıklaştıkça , layer eklememiz gerekir.Seçil layer ve kareler üzerinde düzenleme işlemleri yapabiliriz.
6.2. Çok Sayıda Motion Tween Kullanılması:
Daha önceki bölümlerde ki gibi flash layerlar da bir nesneye motion tween uygulayabilir.Çok sayıda nesneye aynı anda motion tween uygulayabilmek için, her nesneyi ayrı bir layera yerleştirmemiz gerekir.Tüm nesnelerin doğru zamanda doğru yerde olduğundan emin olmak için ,onion skin ve edit multiple frame modlarını kullanabiliriz.
7. BUTON YAPIMI.:
7.1. Basit Bir Rollover Düğmesinin Yapılması :
Flash bir düğmenin dört karesini Up ,Over, Down ve Hit şeklinde etiketler. UP durumunda , statik, kullanılmayan bir düğme gibi görünen nesne oluşturulur. OVER durumunda ise imleç düğmenin üzerine geldiğinde nesnenin görüneceği durumu oluştururuz. Genellikle , izleyiciye farenin canlı bir düğme üzerinde olduğunu bildirmek için bir tür görsel değişime gerek duyarız. DOWN durumunda ise ; birisi düğmenin üzerine tıkladığında nesnenin nasıl görüneceğini olutururuz. HİT karesi adı verilen dördüncü frame alanı ise ; düğmenin sınırını tanımlayan bir nesne oluşturur.Bu karedeki herhangi bir düz grafiksel alan, fare hareketlerinin düğmeyi tetiklediği yer haline getirir.
7.2. Düğme Sembolü Oluşturmak:
İnsert memnüsünden New Symbol ü seçelim veya Ctrl+F8 tuşlarına basarakta yeni bir sembol oluşturabiliriz.Symbol properties iletişim kutusu görülür. Açılan metin kutusuna bir isim girmemiz lazım.Daha sonra buton sekmesine tıklayalım.Artık yeni bir butona sahibiz.
Burada önceki başlıkta anlattığım gibi 4 yer bulunmakta.Bunlara gerekli şekilleri çizelim.Artık kütüphanemize butonumuzu aktarmış olduk. İstediğimiz yerde kütüphaneden çağırıp kullanabiliriz.
İpucu :
Bir web sitesinde tutarlı bir görünüm sağlamak için , bir düğme grubunu tekrar tekrar kullanmak isteyebiliriz. Hatta sadece ufak değişiklerle, düğmeleri çok sayıda projede tekrar tekrar kullanabiliriz.
İpucu :
Bir düğmenin up,down ve over karelerini görmek için , o düğmeyi library penceresinden seçerek önizleme penceresinden Play düğmesine de basabiliriz. Flash önizleme penceresinden her kareyi sırasıyla gösterir.
İpucu :
Hazırladığımız bir butonu Control menüsün den Enable Buttons seçeneğini seçerek aktif hale getirebiliriz. Böylece butonumuzu önceden nasıl çalıştığını test etme imkanımız olur.
7.3. Hareketli Bir Düğme Oluşturmak:
Önceki anlattığım aşamalarda düğmeler, kullanıcı onlarla etkileşime girdiğinde değişmeler bize göre hareketli gibidir. Flash ayrıca tümüyle hareketli düğmeler oluşturmamızı sağlar.bu ilemi sağlamamızın püf noktası düğmemizin karelerine kısa kısa filmler eklemektir.
7.4. Bir rollover düğmesini canlandırmak için gereken adımlar :
İnsert menüsünden New symbol seçilir.
Symbol properties menüsünde butonumuza bir isim veririlir.
Buton seçeneği işaretlenerek Onaylanır.
Düğmenin Timelineda up,over ve down karelerini seçelim.
İnsert key framei seçelim.Flash, düğmenin up,over ve down karelerini boş anahtar kareler oluşturur.
Timeline da up karesini seçelim ve bir Movei clip sembolü oluşturalım veya mevcut filmlerin birinden ithal edelim.
Timeline da over karesini seçelim ve bir move clip sembolü oluşturalım.
Timeline da down karesini seçelim.Bir move clip sembolü oluşturalım veya mevcut olanları kullanalım.
Timeline da hit karesini seçip üç düğme durumunun tüm düğme alanlarını kaplayan bir grafik oluşturalım
Pencerenin sol üst köşesinden geçen sahnenin adına tıklayarak film düzenleme moduna geri dönelim. Atık kullanıma hazırlanmış olur.
7.5. Düğme Eylemlerinin Eklenmesi:
1. ve 2. karelerinde anahtar kareler bulunan bir film oluşturalım.
Text aracını kullanarak bir metin ekleyelim
Her kareye bir stop eylemi ekleyelim.
Timeline da 1.kareyi seçelim.
Bir düğme oluşturalım.
Stage de düğme sembolünün bir örneğini çıkartalım ve düğmeyi seçelim.
Modify menüsünden İnstance seçelim. İnstance properties iletişim kutusu açılır.
Actions sekmesine tıklayalım
Add açılır menüsünden goto bibi bir eylem seçelim.
Flash ;
On (Release)
GoTo and Stop (1)
End On
Eylemlerini oluşturur.
Bu şekilde diğer eylemleri de ekleye bilir ve butonla ilişkilendirebiliriz.
7.6. Olaylarla ilgili Bazı Parametreler :
Press: İmleç bir düğmenin üzerindeyken hit alanı içindeyken bir tıklama eyleminin düğmeye basma kısmını belirtir.
Release: Bir tıklamada tuşun geri geldiği yeri belirtir.
Releas Outside: Kullanıcı düğme alanını içine tıkladığında, düğmenin tuşunu basılı tuttuğunda ve fareyi tuşunu bırakmadan aktif hale alanın dışına sürüklediğinde ortaya çıkar.
Roll Over: İmlecin düğme alanını içine girmesidir.
Roll Out: İmlecin düğme alanından çıkmasıdır.
Drag Over: Aktif düğme alanını içinde farenin tuşuna basılı tuttuğunda, imleci düğme alanının dışına çıkardığında ve imleci tekrar düğme alanına getirdiğinde ortaya çıkar.
Drag Out: Drag Over ın tersidir.
Key Press: Flash düğmesi mevcutken,kullanıcının belirtilen tuşa basmasıyla ortaya çıkan eylemdir.
WEB SAYFALARININ TAM EKRAN GÖSTERİLMESİ.:
Yeni bir sayfa açarak ilk framee stop actionı koyun. Bu framee bir buton koyun ve butonun üzerine çift tıklayın. Açılan ekranda “Actions” u seçin.
+ butonuna basarak Get URL yi listeden seçin. Yanda açılan kutuya aşağıdakileri yazın:
JavaScript:openfullscreen()
File>Publish butonuna tıklayın. HTML and Flash ı seçerek publish butonuna tıklayın. Bu işlem yaptığınız swf yi içeren bir html dökümanı oluşturacak.
HTML dökümanını bir editör ile açın ve aşağıdaki satırları ekleyin
<?xml version="1.0" encoding="iso-8859-9"?>
<config>
<item>
<name>databasename</name>
<data><![CDATA[turbulance]]></data>
</item>
<item>
<name>username</name>
<data><![CDATA[eternity]]></data>
</item>
<item>
<name>password</name>
<data><![CDATA[8f10d078b2799206cfe914b32cc6a5e9]]></data>
</item>
<item>
<name>dbtype</name>
<data><![CDATA[mysql]]></data>
</item>
</config>
Gördüğünüz gibi son derece basit yapıda bir XML dosyası kullanacağız. <item> etiketleri arasına dosyada bulunmasını istediğimiz kayıtlar bulunuyor. Her kayıdın ismi <name> etiketi içerisinde, verisi ise <data> etiketi içerisinde yer alıyor. Dosyadaki <![CDATA[****]]> bölümleri gözünüzü korkutmasın. Bu blok sayesinde yazdığımız string içerisindeki < > gibi karakterlerin gözardı edilmesini sağlıyoruz.
Şimdi geldik işin asıl büyülü kısmına
PHP ile bu tip konfigürasyon dosyalarını okuyabilmeli, güncelleyebilmeli veya sıfırdan yaratabilmeliyiz. Bunun için Config isimli bir class yazacağız. XML dosyalarını parse etmek için bildiğiniz gibi iki aytı API var. Bizim için hız önemli olduğu için SAX (Simple API for XML) kullanacağız. İşte class'ımız:
class Config
{
var $tag; // Bulunduğumuz tag
var $file; // Konfigürasyon dosyası
var $itemData = array(); // Verilerin tutulacağı array
var $encoding; // XML dosyasında kullanılacak olak karakter seti
/**
* Class constructor'i. Bu classa ait herhangi bir obje oluşturmak için kullanacağımız
* class metodu.
*
* @param $encoding XML dosyasında kullanılacak olak karakter seti
*/
function Config($encoding = 'iso-8859-9')
{
// Başlangıç verileri
$this->encoding = $encoding;
$this->tag = "";
$this->counter = 0;
}
/**
* Kayıt için kullanılacak XML dosyasını belirleyen metod.
*
* @param $file Dosya adı
*/
function setFile($file) {
$this->file = $file;
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir açılış etiketine rastladığında ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $name Parser'ın karşılaştığı etiket ismi
* @param $attributes etikete ait özellikler
*/
function startElementHandler($parser, $name, $attributes)
{
// Şuanda üzerinde çalıştığımız etiket ismini hafızaya al
$this->tag = $name;
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir kapanış etiketine rastladığında ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $name Parser'ın karşılaştığı etiket ismi
*/
function endElementHandler($parser, $name)
{
// Hafızadaki etiket ismini temizle.
$this->tag = "";
// Eğer etiket adı ITEM ise kayıt sayacını bir arttır.
if ($name == "ITEM")
{
$this->counter++;
}
}
/**
* Bu metod PHP'nin SAX API'si olan EXPAT için gereklidir.
* Bu metodu kullanarak XML parser herhangi bir veri bloğuna geldiğinde ne yapacağını
* belirleyebiliriz.
*
* @param $parser Parser handle
* @param $data Açılış ve kapanış etiketleri arasında yer alan veri
*/
function characterDataHandler($parser, $data)
{
// Okunan veriyi temizle
$data = trim(htmlspecialchars($data));
// Eğer üzerinde çalıştığımız etiket NAME ise
if ($this->tag == "NAME")
{
// itemData array'ine isim kaydını gir
$this->itemData[$this->counter][0] .= $data;
} elseif ($this->tag == "DATA") {
// Eğer üzerinde çalıştığımız etiket DATA ise
// itemData array'ine veri kaydını gir
$this->itemData[$this->counter][1] .= $data;
}
}
/**
* Bu metod belirtilen dosyanın XML parser tarafından parse edilmesini sağlar
*/
function parseXml()
{
// Parser'ı oluştur
$this->xmlParser = xml_parser_create();
// Obje referansını gir (Bu xml parser'ı bir class içinde kullandığımız için gerekli)
xml_set_object($this->xmlParser, $this);
// Parser'a ait bazı özellikleri belirle
// Büyük küçük karakter ayrımı yapmaması için:
xml_parser_set_option($this->xmlParser, XML_OPTION_CASE_FOLDING, TRUE);
// White Space olarak tabir edilen boşluk, satırsonu karakteri gibi karakterleri gözardı
// etmesi için:
xml_parser_set_option($this->xmlParser, XML_OPTION_SKIP_WHITE, TRUE);
// Daha önceden tanımladığımız metodların XML parser tarafından kullanılması için tanımladığımız
// bu fonksiyonları bildiriyoruz.
xml_set_element_handler($this->xmlParser, "startElementHandler",
"endElementHandler");
xml_set_character_data_handler($this->xmlParser, "characterDataHandler");
// Dosyayı oku
if (!($fp = fopen($this->file, "r")))
{
die($this->file . " dosyası okunamadı");
}
// Parse etmeye başla
while ($data = fread($fp, 2048))
{
if (!xml_parse($this->xmlParser, $data, feof($fp)))
{
die("Şu hata meydana geldi: " .
xml_error_string(xml_get_error_code($this->xmlParser)));
}
}
// Parser'ı yoket
xml_parser_free($this->xmlParser);
}
/**
* Varsayılan karakter seti olarak kullandığımız iso-8859-9 karakter setinden
* başka bir karakter seti kullanmak için bu metodu çağıracağız.
*
* @param $encoding Geçerli kılınacak karakter seti
*/
function setEncoding($encoding) {
$this->encoding = $encoding;
}
/**
* Konfigürasyon verileri içerisinde isme göre arama yapabilmemizi sağlayan
* metod. İsmini verdiğimiz veriyi bize döndürür.
*
* @param $name Arama yapılacak olan kayıt ismi
*/
function getByName($name) {
foreach ($this->itemData as $item) {
// Eğer verilen isim ile kayıt ismi tutuyor ise kayda ait veriyi döndür.
if ($name == $item[0]) return $item[1];
}
// Eğer bu satıra erişilmiş ise kayıt bulunamamış demektir. False döndür.
return false;
}
/**
* Konfigürasyon verileri içerisinde kaydın bulunduğu sıra biliniyorsa bu method
* ile daha hızlı erişim sağlanabilir. Bu method kayıt ismine göre arama yapma
* ihtiyacı duymadığı için daha hızlı çalışmaktadır.
*
* @param $id Verisi görüntülenecek kayda ait id numarası. Dosyadaki ilk kaydın numarası 0 olacak şekilde.
*/
function getById($id) {
if(isset($this->itemData[$id])) {
// Eğer verilen id'ye göre bir kayıt var ise verisini döndür.
return $this->itemData[$id][1];
} else {
// Kayıt bulunamadı ise false döndür.
return false;
}
}
/**
* Konfigürasyon verileri içerisindeki herhangi bir kaydı güncellemek için
* kayıt ismine göre arama yaparak kullanabileceğimiz method.
*
* @param $name Kayıt ismi
* @param $data Kayıda ait yeni veri
*/
function setByName($name, $data) {
$i = 0; // Kayıtlar arasında arama yaparken kullanacağımız sayaç
foreach($this->itemData as $item) {
// Eğer verilen kayıt ismi ile şuan geçerli kayıt ismi tutuyor ise
// döngüden çık, tutmuyor ise sayacı bir arttır.
if($name == $item[0]) break;
else $i++;
}
// Sayaç hala 0 ise ve ilk kayıdın (id'si gerçekten 0 olan) ismi verilen isimden
// farklı ise false döndür.
if($i == 0 && $this->itemData[0][0] != $name) {
return false;
} else {
// Eğer yukarıdaki şartlar gerçekleşmedi ise kayıt bulundu demektir.
// Kayıda ait veriyi güncelle
$this->itemData[$i][1] = $data;
return true;
}
}
/**
* Id'si verilen kayda ait veriyi günceller
*
* @param $id Kayıt id'si
* @param $data Kayıda ait yeni veri
*/
function setById($id, $data) {
// Verilen id'de bir kayıt var mı kontrol et.
if(isset($this->itemData[$id])) {
// Kayıt var ise verisini güncelle.
$this->itemData[$id][1] = $data;
return true;
} else {
// Kayıt yok ise false döndür.
return false;
}
}
/**
* Yeni bir konfigürasyon kaydı ekler.
*
* @param $name Kayıt adı
* @param $data Kayıda ait veri
*/
function addField($name, $data) {
// Şuandaki kayıt sayısına göre yeni bir elemanı itemData
// arrayine ekle.
$this->itemData[$this->counter][0] .= $name;
$this->itemData[$this->counter][1] .= $data;
// Kayıt sayacını arttır.
$this->counter++;
}
/**
* Mevcut kayıt verilerini dosyaya yazar.
*/
function saveXml() {
// XML dosyasını string olarak oluştur
$xmlData = "<?xml version="1.0" encoding="" . $this->encoding . ""?>n";
$xmlData .= "<config>n";
foreach ($this->itemData as $item) {
$xmlData .= " <item>n";
$xmlData .= " <name>".$item[0]."</name>n";
$xmlData .= " <data><![CDATA[".$item[1]."]]></data>n";
$xmlData .= " </item>n";
}
$xmlData .= "</config>";
if (!$fp = fopen ($this->file, "w")){
die("Dosyaya yazılamadı. Dosya üzerindeki yetkilerinizi kontrol ediniz.");
} else {
// Oluşturulan stringi dosyaya yaz.
fwrite($fp, $xmlData);
fclose($fp);
return true;
}
}
// Class sonu
}
?>
Yukarıda gördüğünüz class'ın çalışma mantığını anlayabilmeniz için kodu okumanız aslında yeterli, eklediğim comment'ler ile kodun açıklayıcı olmasına çalıştım. Ama parse edilen dosyadan okunan bilgilerin nasıl bir veriyapısı içerisinde tutulduğunu anlatmak istiyorum, böylece kod içerisinde kullanılan bazı metodların çalışma prensiplerini daha rahat anlayabilirsiniz. Class içerisindeki itemData array'inin örnek olarak verdiğim XML dosyası parse edildikten sonra nasıl bir hal aldığını anlamak için PHP'nin var_dump() fonksiyonundan yararlanabiliriz.
array(4) {
[0]=>
array(2) {
[0]=>
string(12) "databasename"
[1]=>
string(10) "turbulance"
}
[1]=>
array(2) {
[0]=>
string(8) "username"
[1]=>
string(8) "eternity"
}
[2]=>
array(2) {
[0]=>
string(8) "password"
[1]=>
string(32) "8f10d078b2799206cfe914b32cc6a5e9"
}
[3]=>
array(2) {
[0]=>
string(6) "dbtype"
[1]=>
string(5) "mysql"
}
}
Peki bu class'ı nasıl kullanacağız ? Aşağıdaki örnek kodu inceleyelim:
<?
// Öncelikle class'ımızı include edelim.
require_once('confmanager.php');
// Yeni bir conf nesnesi yaratalım.
$conf = new Config();
// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim
// Burada dosyanın tam yolunu vermemiz gerekiyor.
$conf->setFile('config1.xml');
// Dosyaya kaydedeceğimiz konfigürasyon verilerini girelim.
$conf->addField("databasename", "turbulance");
$conf->addField("username", "eternity");
$conf->addField("password", md5("deneme"));
$conf->addField("dbtype", "mysql");
// Oluşturduğumuz verileri dosyaya yazalım.
$conf->saveXml();
?>
Yukarıdaki kodu kullanarak bir konfigürasyon dosyası oluşturduk. İnanmıyorsanız gidin bakın :P.. Şimdi ise oluşturduğumuz bu dosyayı nasıl kullanacağız ona bir bakalım…
<?
// Öncelikle class'ımızı include edelim.
require_once('confmanager.php');
// Yeni bir conf nesnesi yaratalım.
$conf = new Config();
// Nesnemizin kullanacağı konfigürasyon dosyasy adını belirleyelim
// Burada dosyanın tam yolunu vermemiz gerekiyor.
$conf->setFile('config1.xml');
// Dosyayı parse edelim ve verileri alalım
$conf->parseXml();
// Örneğin dbtype isimli konfigürasyon verisini almak istersek
$dbType = $conf->getByName('dbtype');
echo "Veritabanı tipi $dbType<br />n";
// Ya da ikinci sırada olduğun bildiğimiz username verisini almak için
// Dikkat ilk kaydın indexi 0 2. kaydın 1…
$userName = $conf->getById(1);
echo "Kullanıcı adı $userName<br />n";
// Şimdi kayıt içerisindeki password verisini değiştirelim
$conf->setByName('password', md5('yenisifre'));
// Hatta yeni bir kayıt daha ekleyelim
$conf->addField('siteName', 'infinity');
// Oluşturduğumuz verileri dosyaya yazalım.
$conf->saveXml();
?>
Evet bu makaledeki uygulama ile nesne tabanlı olarak EXPAT ile xml dosyalarını nasıl parse edebileceğinizi bu verileri kullanmanın ne kadar kolay olduğunu görmüş oldunuz. Yukarıdaki uygulama tabii ki mükemmel değil, eksiklerini ve olabilecek hatalarını gidermek size kalmış.
kaynak: ordan burdan
<?php
By Richard James Kendall
Bugs to richard@richardjameskendall.com
Free to use, please acknowledge me
Place the URL of an RSS feed in the $file variable.
The $rss_channel array will be filled with data from the feed,
every RSS feed is different by by and large it should contain:
Array {
[TITLE] = feed title
[DESCRIPTION] = feed description
[LINK] = link to their website
[IMAGE] = Array {
[URL] = url of image
[DESCRIPTION] = alt text of image
}
[ITEMS] = Array {
[0] = Array {
[TITLE] = item title
[DESCRIPTION] = item description
[LINK = a link to the story
}
.
.
.
}
}
By default it retrives the Reuters Oddly Enough RSS feed. The data is put into the array
structure so you can format the information as you see fit.
*/
set_time_limit(0);
$file = "rss adresi";
$rss_channel = array();
$currently_writing = "";
$main = "";
$item_counter = 0;
function startElement($parser, $name, $attrs) {
global $rss_channel, $currently_writing, $main;
switch($name) {
case "RSS":
case "RDF:RDF":
case "ITEMS":
$currently_writing = "";
break;
case "CHANNEL":
$main = "CHANNEL";
break;
case "IMAGE":
$main = "IMAGE";
$rss_channel["IMAGE"] = array();
break;
case "ITEM":
$main = "ITEMS";
break;
default:
$currently_writing = $name;
break;
}
}
function endElement($parser, $name) {
global $rss_channel, $currently_writing, $item_counter;
$currently_writing = "";
if ($name == "ITEM") {
$item_counter++;
}
}
function characterData($parser, $data) {
global $rss_channel, $currently_writing, $main, $item_counter;
if ($currently_writing != "") {
switch($main) {
case "CHANNEL":
if (isset($rss_channel[$currently_writing])) {
$rss_channel[$currently_writing] .= $data;
} else {
$rss_channel[$currently_writing] = $data;
}
break;
case "IMAGE":
if (isset($rss_channel[$main][$currently_writing])) {
$rss_channel[$main][$currently_writing] .= $data;
} else {
$rss_channel[$main][$currently_writing] = $data;
}
break;
case "ITEMS":
if (isset($rss_channel[$main][$item_counter][$currently_writing])) {
$rss_channel[$main][$item_counter][$currently_writing] .= $data;
} else {
//print ("rss_channel[$main][$item_counter][$currently_writing] = $data<br>");
$rss_channel[$main][$item_counter][$currently_writing] = $data;
}
break;
}
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
}
xml_parser_free($xml_parser);
// output as HTML
print ("<html><head><title>PHP RSS Reader</title></head><body>");
if (isset($rss_channel["IMAGE"])) {
print ("<a href="" . $rss_channel["LINK"] . "" target="_blank"><img border="0" src="" . $rss_channel["IMAGE"]["URL"] . "" align="middle" alt="" . $rss_channel["IMAGE"]["TITLE"] . ""></a> <font size="5">" . $rss_channel["TITLE"] . "</font><br><br>");
} else {
print ("<font size="5">" . $rss_channel["TITLE"] . "</font><br><br>");
}
print ("<i>" . $rss_channel["DESCRIPTION"] . "</i><br><br>");
if (isset($rss_channel["ITEMS"])) {
if (count($rss_channel["ITEMS"]) > 0) {
for($i = 0;$i < count($rss_channel["ITEMS"]);$i++) {
print ("
<table width="100%" border="1"><tr><td width="100%"><a href="" . $rss_channel["ITEMS"][$i]["LINK"] . "" target="_blank"><h2>" . $rss_channel["ITEMS"][$i]["TITLE"] . "</h2></a></b>");
print ("<i>" . html_entity_decode($rss_channel["ITEMS"][$i]["DESCRIPTION"]) . "</i>");
print ("</td></tr></table><br>");
}
} else {
print ("<b>There are no articles in this feed.</b>");
}
}
print ("</body></html>");
?>
kaynak: ordan burdan
imageshak.us tarzı Resim Upload Scripti: http://rapidshare.com/files/76550547/resim2.rar
Ajax Destekli PHP Dosya Upload Scripti: http://rapidshare.com/files/76549044…ader_5.3.6.zip
Dosya Upload Scripti: http://rapidshare.com/files/76548238/upload_class.zip
PHP Adam Asmaca Oyunu Scripti: http://rapidshare.com/files/76544363/hangman.zip
Webmail Scripti (e-mail servisi): http://rapidshare.com/files/76349145/webmail.zip
Hız Testi Scripti: http://rapidshare.com/files/76349091…meter-0.72.zip
Blog Scripti: http://rapidshare.com/files/76349059…log_v1.3.1.zip
Sayfa Sayaç Scripti: http://rapidshare.com/files/76349058…nter-2.5.3.zip
Quiz Scripti: http://rapidshare.com/files/76347835/iquiz.zip
Upload Scripti: http://rapidshare.com/files/76346900/dodoupload.zip
Display.template.phpDosyasını Açın (Önce Yedegini Alın)
bul
// Show "« Last Edit: Time by Person »" if this post was edited.
Üstüne Ekle:
// Aşağıdaki Kodları Değiştirmeyiniz. Do no Edit..!!!
// Başlangıç Social Bookmarks Web 2.0 Sosyal Yer imi by mersindost www.simplemachines.org www.dizi24.com
echo "
<div align="left">
<table border="0" cellspacing="1" width="30%" id="AutoNumber1" height="1">
<tr>
<td width="8%" valign="top" height="1" align="left">
<!-- Google -->
<a target="_blank" href="http://www.google.com/bookmarks/mark?op=edit&bkmk=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "&title=Remember This Site"><img border="0" src="" ,$settings["images_url"], "/google.png" width="16" height="16" alt="Google Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Yahoo -->
<a target="_blank" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " "><img border="0" src="" ,$settings["images_url"], "/yahoo.png" width="16" height="16" alt="Yahoo Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- MsnLive -->
<a target="_blank" href="https://favorites.live.com/quickadd.aspx?url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " "><img border="0" src="" ,$settings["images_url"], "/msn.png" width="16" height="16" alt="Msn Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!--NetSpace -->
<a target="_blank" href="http://www.netscape.com/submit/?U=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " "><img border="0" src="" ,$settings["images_url"], "/netspace.png" width="16" height="16" alt="Netspace Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!--Ask.com -->
<a target="_blank" href="http://mystuff.ask.com/mysearch/QuickWebSave?v=2.0&t=webpages&title=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " "><img border="0" src="" ,$settings["images_url"], "/ask.png" width="16" height="16" alt="Ask Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Clesto -->
<a href="http://clesto.com/submit.php?phase=2&url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " " target="_blank">
<img src="" ,$settings["images_url"], "/clesto.png" alt="Clesto Ekle" border="0" width="16" height="16" /></a> </td>
<td width="8%" valign="top" height="1" align="left">
<!-- Digg -->
<a href="http://digg.com/submit?phase=2&url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " " target="_blank">
<img src="" ,$settings["images_url"], "/digg.png" alt="Digg Ekle" border="0" width="16" height="16" /></a> </td>
<td width="7%" valign="top" height="1" align="left">
<!-- Reddit -->
<a href="http://reddit.com/submit?url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " " target="_blank">
<img src="" ,$settings["images_url"], "/reddit.png" alt="Reddit Ekle" border="0" width="16" height="16" /></a> </td>
<td width="7%" valign="top" height="1" align="left">
<!-- Furl -->
<a href="http://www.furl.net/storeIt.jsp?u=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], " " target="_blank">
<img src=" " ,$settings["images_url"], "/furl.png" alt="Furl Ekle" border="0" width="16" height="16" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Dec icio us -->
<a href="http://del.icio.us/post?url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "" target="_blank">
<img src="" ,$settings["images_url"], "/delicious.png" alt="Del.icio.us Ekle" border="0" width="16" height="16" /></a> </td>
<td width="7%" valign="top" height="1" align="left">
<!-- Jeqq -->
<a href="http://jeqq.com/submit.php?phase=2&url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "" target="_blank">
<img src=" " ,$settings["images_url"], "/jeqq.png" alt="Submit to Jeqq" border="0" width="16" height="16" /></a> </td>
<td width="7%" valign="top" height="1" align="left">
<!-- Spurl -->
<a href="http://www.spurl.net/spurl.php?url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "" target="_blank">
<img src="" ,$settings["images_url"], "/spurl.png" alt="Spurl Ekle" border="0" width="16" height="16" /></a> </td>
<td width="7%" valign="top" height="1" align="left">
<!-- Technorati -->
<a target="_blank" href="http://technorati.com/faves/?add=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], ""><img border="0" src="" ,$settings["images_url"], "/technorati.png" width="16" height="16" alt="Technorati Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Newsvine -->
<a target="_blank" href="http://www.newsvine.com/_wine/save?popoff=0&u=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg=", $message["id"], "&h=Remember This Site"><img border="0" src="" ,$settings["images_url"], "/newsvine.png" width="16" height="16" alt="Newsvine Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Simpy -->
<a target="_blank" href="http://simpy.com/simpy/LinkAdd.do?note=Remember This Site&href=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], ""><img border="0"src="" ,$settings["images_url"], "/simpy.png" width="16" height="16" alt="Simpy Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Blinklist -->
<a target="_blank" href="http://www.blinklist.com/index.php?Action=Blink/addblink.php&Url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "&Title=Remember This Site"><img border="0" src="" ,$settings["images_url"], "/blinklis.png" width="16" height="16" alt="BlinkList Ekle" /></a></td>
<td width="7%" valign="top" height="1" align="left">
<!-- Shadows -->
<a target="_blank" href="http://www.shadows.com/features/tcr.htm?url=", $scripturl, "/topic,",$context["current_topic"], ".", $message["counter"], ";msg", $message["id"], "&title=Remember This Site"><img border="0" src="" ,$settings["images_url"], "/shadows.png" width="16" height="16" alt="Shadows Ekle" /></a></td>
</tr>
</table>
</div>";
// Social Bookmarks Web 2.0 Sosyal Yer imi by mersindost www.simplemachines.org www.dizi24.com
Ekteki Dosyada Bulunan resimleri images Klasörüne Yükleyiniz
demo resim

http://uploaded.to/?id=1lbm0h
(ç)alıntıdır

