Gerçek zamanlı bar oluşturma prensipleri aynıdır. Yüklenen karelerin yüklenecek karelere bölümünün 100 ile çarpılma esasına dayanır. Önce alttaki butona tıklayarak örneğe bir göz atın.

Uygulamanın önizlemesi içn tıklayınız

Uygulama :

1- Üç katman oluşturun. Üstteki katmana aksiyon, altındaki yüzde ve en alttakine bargrafik adını verin.

2- Yüzde katmanın ilk karesine yükleniyor % yazın ve hemen yanına küçük bir dinamik metin kutusu ekleyin. Metin kutusunu seçin properties panelinde sağ alttaki variable alanına kutu yazın.(instance adı değil)

3- Şimdi bargrafik katmanına gelelim. Dikdörtgen aracı ile sahneye ince uzun bir dikdörtgen çizelim. Bu dikdörtgenin iç kısmını tek tıklama ile seçelim.(dış kenarlar dahil edilmeyecek)



İç kısım seçilmişken klavyeden F8 tuşuna basın. Açılan panelden movie clip seçeneğini işaretleyin.İnstance name kutusuna bar adını yazalım.Şimdi bu film klibinin merkez noktası tam ortası olacaktır.Bu durumda bar orta noktadan itibaren ilerleyecektir. Biz en soldan sağa doğru ilerlemesini istiyoruz. Bu durumda merkez noktasını en sola almamız lazım. Bunu 2 şekilde yaparız.

- En pratik yol F8 tuşuna basıp film tanımını yaparken kutunun sağ alt kısmındaki registration alanını kullanmaktır. Alttaki resimde göreceğiniz gibi varsayılan merkez noktası tam ortasıdır.Bunun hemen sol tarafındaki kutuya tek tıklama ile merkez noktasını en sol kısma almış olursunuz.



- İkinci yol sembole çevrilen barı seçip araç kutusunda free transform aracını tıklamaktır. Buna tıkladığınızda klibin etrafı seçilecektir.Fare ile orta noktadaki daireyi çekerek en sola getirin.

Klibin merkez noktasını sola aldıktan sonra yine klibi tek tıklayarak seçin ve properties paneline bakın, burada klip eninin yazıldığı "H" kutusunun karşısındaki değeri silip 2 yazın.Böylece klip 2. piksellik genişlikten itibaren başlayacaktır.

4- Herşey hazır, artık kodları yazalım. Aksiyon katmanında 1. kareyi seçerek script panelini açın. Şu kodları yazın:

yuklenen=_root.getBytesLoaded();
filmboyutu=_root.getBytesTotal();
bar._xscale=Math.round((yuklenen/filmboyutu)*100);
kutu=bar._xscale;

Önemli Uyarı= Şayet animasyonda tek sahne değil birden fazla sahne varsa _root yerine level0 yazmalısınız. Aksi takdirde sadece 1. sahnedeki animasyon boyutu esas alınır

İlk dizinde yüklenen animasyonun byte cinsinden miktarını alıyoruz.

İkinci dizinde yüklenmesi gereken byte miktarını alıyoruz.

Üçüncü dizinde basit bir matematik kuralını uyguluyoruz. Yüklenen byte miktarını yüklenecek byte miktarına bölüp 100 ile çarparsak yüzde değerini bulunur. Math.round((yuklenen/filmboyutu)*100) Buradaki Math.round çıkacak küsuratlı değeri en yakın tamsayıya yuvarlaması içindir.

Çıkan bu değeri bar klibinin _xscale değeri olarak atıyoruz. Böylece bar yüklenme değeri arttıkça sağa doğru ilerliyor.

Son olarak aynı değeri son dizinde kutu değişkenine atayarak dinamik metin kutusunda yüzde değerini rakamsal olarak görüyoruz.

5- Şimdi aksiyonlar katmanına iki keyframe daha ekleyin ekleyin.3.karedeki keyframe`i seçin ve properties panelinden basla etiket (label) adını verin.Ve bu 3. kare dahil olmak üzere asıl animasyonunu hazırlayın.

Aynı katmanda 2. kareyi seçin ve şu kodları yazın:

if (yuklenen==filmboyutu) {
gotoAndPlay("basla");
} else {
gotoAndPlay(1);
}

Bu bölümü anlamak kolaydır. Flash 2 kareye geldiğinde yüklenen byte miktarı ile yüklenmesi gerekeni karşılaştıracak bu değer eşit ise basla etiketli kareye geçerek animasyonu gösterecektir, eşitlik yoksa 1. kareye gönderilecek yüklenme işi devam edecektir.


--------------------------------------------------------------------------------

Yukarıdaki çalışma flash5 versiyonundan itibaren her versiyonda kullanılabilir.Şayet flash-mx ve üstü versiyon kullanıyorsanız çok daha pratik bir kod grubu kullanabilirsiniz.

Bu çalışmada 1.karede bar ve yüzdeyi gösteren dinamik metin kutusu ,basla etiket ismine sahip ikinci karede ise asıl animasyonumuz mevcuttur.1.kareye alttaki kodları atayıp aynı çalışmayı daha kısa bir yol ile oluşturabilirsiniz:

this.onEnterFrame=function(){
yuklenen=_root.getBytesLoaded();
filmboyutu=_root.getBytesTotal();
if (yuklenen==filmboyutu) {
gotoAndPlay("basla");
delete onEnterFrame;
} else {
bar._xscale=Math.round((yuklenen/filmboyutu)*100);
kutu=bar._xscale;
}
}
stop();

Uygulama download için Tıklayınız

Çalışmada kolaylık olması için aynı sayfaya alındı. Siz tüm swf dosyasını ayrı ayrı bir HTML sayafasına alıp kullanabilirsiniz.Ayrı HTML sayfasına gömülmüş swf dosyalarında bağlantı kurulabilmesi için herüç sayfanın da açık olması gereklidir. Önce bir sayfayı açıp mesajı göndermek sonra diğer sayfayı açıp mesajı alma şansımız yoktur.

Örnek macromedia`nın sayfasından alınmış ve modifiye edilmiştir. Bu örneği bana hatırlatan fuad_all arkadaşıma teşekkür ederim. Aşağıdaki çalışmada 1.swf dosyasına yazdığımız verileri butona tıklayarak 2.swf dosyasına aktarıyoruz. Bu aktarma gerçekleştiğinde 2. dosyadan 3. ye yine bir mesaj gönderiliyor ve bağlantının kurulduğu uyarısı çıkıyor.

Gönderilecek mesajda Türkçe karakter ve birden fazla satır kullanabilisiniz. 2. dosyada tüm mesajın gözükmesi için scroll kullanılmıştır.

Uygulama:

Önce mesajın yazıldığı 1. swf dosyasını oluşturalım:

1- Sahneye bir input metin kutusu (instance name giden_mesaj ) ve verileri göndermek için bir buton (instance name butonumuz) yerleştirin .

2- 1. kareye şu komutları verin.

//Bir buton olayı başlatılıyor
butonumuz.onRelease = function() {
//Önce bir localConnection oluşturuluyor
//Ve bir değişkene atanıyor
baglanti_gonder = new LocalConnection();
//Metin kutusunun içeriği send() metoduyla gönderiliyor
baglanti_gonder.send("baglanti_adi", "yazdir", giden_mesaj.text);
//Mesaj gönderildikten sonra bağlantı siliniyor
delete baglanti_gonder;
};

Buradaki baglanti_adi ve yazdir fonksiyonunu 2. swf dosyasında kullanacağız.

Mesajın alındığı 2. swf dosyasını oluşturalım:

1- Sahneye dinamik bir metin kutusu (instance name gelen_mesaj) ve 2 adet scroll için buton yerleştirin .

2- 1.kareye şu komutları verelim:

//Yeni bir localConnection oluşturuluyor
//ve bir değişkene atanıyor
baglanti_al = new LocalConnection();
//Bir bağlantı oluştuğunda işlemi başlatacak bir fonksiyon tanımlanıyor
baglanti_al.yazdir = function (metin) {
//Metin kutusunun içeriği ayarlanıyor
//Diğer klipten gönderilen mesajı alan parametreye atanıyor
gelen_mesaj.text = metin;
}
//Bağlantı yapılıyor
baglanti_al.connect("baglanti_adi");

//2 swf dosyasında haberleşme kuruldu
//Şimdi 3 swf dosyasına mesaj gönderilecek
this.onEnterFrame=function(){
if(gelen_mesaj.text.length>0){
baglanti_gonder2 = new LocalConnection();
metin2="Bağlantı Kuruldu"
baglanti_gonder2.send("baglanti_adi2", "yazdir2", metin2);
delete baglanti_gonder2;
}
}

Butonlara şu komutu verelim:

on (release) {
gelen_mesaj.scroll = gelen_mesaj.scroll + 1;
}

ve

on (release) {
gelen_mesaj.scroll = gelen_mesaj.scroll -1;
}



Kodların 2. bölümü sadece 3. swf dosyası içindir.Bu kodlar silindiğinde yine ilk 2 swf dosyası aralarında haberleşebilir. 3. swf dosyasına mesaj göndermek için önce 2. dosyanın mesajı alıp almadığı değerlendiriliyor. Bu denetimin devamlı yapılabilmesi için olay enterFrame şeklinde sunuluyor. Şayet 2. swf dosyasındaki metin kutusuna herhangibir mesaj eklenmişse buradaki stringin değeri sıfırın üstünde olacağından yine ilk swf dosyasında gördüğümüz yöntemlerle 3. swf dosyasına mesaj gidecektir.

Yalnız buradaki mesajı biz belirleyerek metin2 değişkenine atıyoruz. İlk swf dosyasında ise farklı olarak metin kutusundaki değerler gönderilmişti.

Uyarı mesajı verecek 3. swf dosyasını oluşturalım:

1- Yine sahneye dinamik bir metin kutusu yerleştirin. İnstance name son_gelen olsun. Yanıp sönme efekti için sahneye ilk karesinde stop(), son karesinde gotoAndPlay(2); yazan basit bir animasyon ekleyelim. Şayet bağlantı kurulmuşsa bu klip yanıp sönme efekti sağlayacaktır. Klibin instance name kısmına klip yazalım

2- 1.kareye şu komutları atayın:

baglanti_al2 = new LocalConnection();
baglanti_al2.yazdir2 = function (metin2) {
son_mesaj.text = metin2;
}
baglanti_al2.connect("baglanti_adi2");

klip.onEnterFrame=function(){
if(son_mesaj.text.length>0){
this.gotoAndPlay(2);
delete this.onEnterFrame;
}
}

Komutların 2. kısmı film klibinin başlatmak için kullanılıyor. Yine yukarda anlatıldığı gibi mesaj kutusu boş değilse film klibi 2. kareye geçip efekti başlatacaktır.

Artık tüm dosyalar haberleşebilir. Bu yöntemi farklı çalışmalarda veri gönderme amaçlı kullanabilirsiniz.

Uygulamanın download için tıklayınız

Uygulamaya geçmeden evvel yukardaki dosyaya sağ klik yapın. Farklı 4 seçeneğin eklendiğini göreceksiniz:

1- Animasyonu başlatmak

2- Animasyonu durdurmak

3- Arkaplan rengini değiştirmek ve yine eski şekline getirmek

4- Köpek sembolünün rengini değiştirmek ve eski şekline getirmek.

Açılan bu menülere tıklayarak swf dosyasının özelliklerini değiştirebilirsiniz. Animasyonu başlatabilir, durdurabilir veya sembol ve araplan renklerini değiştirebilirsiniz.

Yukardaki çalışma sağ klik menüsü ile yapılabilecek en basit işlemdir. Çok daha komplike çalışmalar yapılabilir. özellikle javascript desteği ile sağ-click menüsüne çok faklı özellikler eklemek mümkündür. Bunun için alttaki linkten dosyayı indirip inceleyebilirsiniz.

http://shock.globbo.org/tmp/rightclick/

Yukardaki dosyayı indirmek için burayı tıklayın.

Ayrıca Flash MX 2004 örneklerinde de benzer çalışmalar vardır.

C:\Program Files\Macromedia\Flash MX 2004\en\First Run\Samples\CustomizingContextMenu.fla dosyasını incelemenizi öneririm.

UYGULAMA:

1- Başlangıcında stop() komutu olan animasyonunuzu bir film klibi içinde oluşturun ve klibi sahneye yerleştirin. Instance name kısmına animasyon yazın. Bizim çalışmamızda köpek sembolünün rengini değiştirmek için resme Break Apart uygulanarak sembol özelliği kırıldı ve iç dolgu Magic Wand ile seçilip kesildi bir film klibi içine yerleştirilerek tam kesildiği alana yerleştirildi. Bundan amaç sembolün renk değişimi sırasında sadece iç alanındaki bölümün bu komuttan etkilenmesiydi. Bu iç dolguyu içeren klibin instance name alanına deri yazın.

2- 1.kareye şu komutu atayın:

yeni_menu = new ContextMenu();
yeni_menu.hideBuiltInItems();

//yeni_menu.builtInItems.print = true

yeni_menu.customItems.push(new ContextMenuItem("Animasyonu Başlat", basla));
yeni_menu.customItems.push(new ContextMenuItem("Animasyonu Durdur", durdur));
yeni_menu.customItems.push(new ContextMenuItem("Arkaplanı Mavi Renk Olsun ", mavi));
yeni_menu.customItems.push(new ContextMenuItem("Köpek Yeşil Renk Olsun", yesil));
yeni_menu.customItems.push(new ContextMenuItem("Köpek Eski Rengini Alsın", kopek));
yeni_menu.customItems.push(new ContextMenuItem("Arkaplan Eski Rengine Dönsün", arka));

function basla() {
_root.animasyon.play();
}

function durdur() {
_root.animasyon.stop();
}

function yesil() {
renk=new Color(_root.animasyon.deri);
renk.setRGB(0x6FD280)
}

function mavi() {
renk=new Color(_root.arkaplan);
renk.setRGB(0x007DBD);
}

function arka() {
renk=new Color(_root.arkaplan);
renk.setRGB(0xFFCF9C);
}

function kopek() {
renk=new Color(_root.animasyon.deri);
renk.setRGB(0xFFFF00);
}

_root.menu = yeni_menu;

Kod gruplarına Built-in Classes-->Movie-->Context Menu yoluyla ulaşabilirsiniz.

Önce yeni_menu = new ContextMenu(); komutu ile yeni_menu adında bir sağ klik menüsü oluşturuyoruz. Sonraki kod grubu olan yeni_menu.hideBuiltInItems(); opsiyonel bir uygulamadır.Sağ klik menüsünün orjinalinde olan tüm alanları kapatır(about,settings kısmı hariç). Üçüncü dizindeki aktif olmayan kod grubunda yeni_menu.builtInItems.print = true orjinal sağ klik menüsünden bulunmasını istediğiniz alanları göstermek için ekleyebilirsiniz. Burada print alanı korunmuştur.

İkinci bölümde bu yeni menümüze gerekli eklentilere yapacağız.
yeni_menu.customItems.push(new ContextMenuItem("Animasyonu Başlat", basla)); Bu dizinde "Animasyonu Başlat" adını taşıyan yeni bir sağ klik menü elemanı oluşturuluyor ve bu eleman yeni_menu adlı context menümüze ekleniyor. Parantez içindeki basla ise bir alt dizinde oluşturulacak fonksiyonun adıdır. Bu fonksiyonda oluşturulan sağ klik menüsüne tıklanınca yapılması gereken işlemler yazılır. Bu işlem basla fonksiyonunda yazıldığı gibi (_root.animasyon.play();) animasyonu başlatma komutudur. Şayet bu eklentiyi yapmazsanız menüde animasyonu başlat yazısını görürsünüz ama tıkladığınızda hiçbir fonksiyon oluşmaz. Diğer eklenti menülerde benzer şekilde oluşturulmuştur.

En son dizin _root.menu = yeni_menu; şeklindedir. Oluşturduğumuz menü sahneye atanmış ve uygulamaya girmiştir. Bu dizini eklemezseniz yukarda yazılan hiçbir kod çalışmayacaktır.

Uygulamayı download için tıklayınız

Flash MX2004 versiyonu ile gelen bu sınıf, loadMovie ve loadMovieNum komutunun yerini alması için planlanmış ve bu komurtlardan çok daha geniş özellikler sunan bir sınıftır.loadMovie() bir swf ve standart formatta jpg dosyasını sahneye yükler.Yüklenecek dosyanın yerinde olup olmadığı, hangi boyutta olduğu,yüklemenin başladığı veya bittiği ile ilgilenmez ve bu özellikleri denetleyemez.MovieClipLoader sınıfı ise yüklenecek dosyanın başından sonuna kadar yüklenmesini denetler.Dosyanın yüklenecek dizinde bulunup bulunmadığı,yüklemenin başladığı, hangi oranda yüklendiği(preloader oluşturulabilir),yüklemenin bittiği ve ilk karenin oynamaya başladığı ana kadar en detaylı şekilde değerlendirme yapabilir.

Bu kadar güzel ve detaylı komutun olumsuz yanı olabilir mi? Maalesef 2004 versiyonunda sıkça gördüğümüz bug lardan bu sınıfta nasibini almıştır.Versiyon 7.0 ve 7.0.1 de aşağıdaki örneği yapmanız mümkün olmayacaktır. Sahneye birden fazla klip yerleştirildiğinde sorun çıkmaktadır.Bu nedenle bu versiyonlarda bir bar klip kullanma yerine sadece bir metin kutusunda yükleme yüzdesini göstermekle yetinmelisiniz. Veya bizim çalışmada uyguladığımız gibi versiyon 7.0.2 yi kullanmalısınız.

Uyarı: MovieClipLoader sınıfı ile yapılan yüklemelere ait preloading işlemi test modunda çalışmaz. Bunun nedeni flash`ın yüklenen yüzdeyi harddiske yazılan veriyi değerlendirerek oluşturmasıdır. Lokal şartlarda veri yazılması sözkonusu olmadığından uyguladığınız preloading işlemi çalışmayacaktır. Deneme yapmak için servera yüklemekten başka çare yoktur.

Çalışmayı oluşturmak oldukça basittir. Önce sahneye boş bir klip yerleştirin. Bunu manuel olarak yapabileceğiniz gibi doğrudan kodlarla da oluşturabilirsiniz.Bunu:

_root.createEmptyMovieClip("bosklip",1); komutu ile sağlayabilirsiniz.

Klibi manuel hazırladı iseniz sahnede tıklayarak seçip bosklip instance name`ini atayınız. Üste yeni bir layer ekleyin ve buraya dinamik metin kutusu yerleştirin instance name olarak kutu adını verin. En üste 3 layerı ekleyin ve bar görüntüsü için sahneye 8 piksel yüksekliğinde ve 130 piksel genişliğinde (bu değerleri istediğinize göre değiştirebilirsiniz) bir dikdörtgen çizin. Dikdörtgenin dış çizgilerini tıklayarak seçin.(Shift tuşuna basılı tutarak tıklama yaparsanız birden fazla kenarı aynı anda seçme şansına sahip olabilirsiniz)



Ana menüden Edit-->Cut alanına tıklayıp dış çizgileri kesin ,en üst kısma 4.layerı yerleştirin ve yine ana menüden Edit-->Paste in Place şeçeneğini tıklayın kesilen dış kenar aynı alana yerleşecek ama bir üst layerda olacaktır.Şimdi bu dış kenarlar hala seçili iken F8 tuşuna basın ve çizgileri film klibine çevirin.İnstance name kısmına barcerceve yazın. Bir alt layerdaki dikdörtgenin iç kısmını tıklayarak seçin ve F8 tuşuna basın.Açılan panelden film klibi seçeneğini işaretleyin ve filmin merkesini sol dış kenara alın:



Bunun için yukarıdaki grafide gördüğünüz gibi sol ortadaki kutucuğu işaretleyin.Bunun amacı merkez nokta solda kalacağı için bar yükleme arttıkça sağa doğru ilerleyecektir.Bunu yapmaz merkez noktayı orta kısımda bırakırsanız bar hem sağa hem de sola doğru genişleme gösterir.Bu klibe de bar instance name`ini atayınız.

Şu an resmin yükleneceği boşklibimiz,bar ve dinamik metin kutumuz hazır.Artık kodlara geçebiliriz.Bu arada yüklenecek swf dosyamızın adı resim1.swf şeklinde hazırlanmıştır.İsterseniz bir jpg dosyası da yükleyebilirsiniz. En üste kodlar için bir layer ekleyin ve buraya alttaki kodları yazın:

var klipLoader = new MovieClipLoader();
klipLoader.onLoadStart = function (bosklip) {
kutu.text="veriler yükleniyor"
}

klipLoader.onLoadProgress = function (bosklip, yuklenen, total) {
yuzde=Math.floor( yuklenen/total*100);
bar._xscale=yuzde;
kutu.text="% "+yuzde+" yükleme yapıldı"
}

klipLoader.onLoadComplete = function (bosklip){
kutu._visible=false;
bar._visible=false;
barcervece._visible=false;
}

klipLoader.onLoadInit = function (bosklip) {
bosklip._width = 170;
bosklip._height = 170;
}

klipLoader.onLoadError = function (bosklip, hata) {
if(hata=="URLNotFound"){
kutu.text="Dosya bulunamadı";
}else if(hata=="LoadNeverCompleted"){
kutu.text="Bağlantı kesildi";
}
}

klipLoader.loadClip("resim1.swf","_root.bosklip");


Tüm çalışma bu kadar.Şimdi kodların detayına geçebiliriz:

var klipLoader = new MovieClipLoader(); Önce bir yeni bir movieClipLoader nesnesi oluşturulur.

klipLoader.onLoadStart = function (bosklip) {
kutu.text="veriler yükleniyor"
}
İlk yazılacak kod grubu onLoadStart komutudur.Buraya yüklemenin ilk başladığı anda ne yapılması gerektiğini bildiririz.Biz verilerin yüklendiğine dair bir uyarı yazısı çıkmasını istedik.Bu alan çok kısa süreli gözlendiğinden yüklenme hızı fazla ise bu metnin görünmesi atlanabilir.

klipLoader.onLoadProgress = function (bosklip, yuklenen, total) {
yuzde=Math.floor( yuklenen/total*100);
bar._xscale=yuzde;
kutu.text="% "+yuzde+" yükleme yapıldı"
}
Eğer yükleme bilgisi vermek istiyorsanız ikinci sıradaki kod grubu onLoadProgress() tir.Burada 3 parametre görüyorsunuz. İlki takip edilecek hedef klip(bizde yükleme yapılacak olan bosklip`tir) ,diğeri yüklenen verilerin sonuncusu ise toplam yüklenecek verilerin byte değeridir. Daha sonra klasik preloading kodları yazılır.

klipLoader.onLoadComplete = function (bosklip){
kutu._visible=false;
bar._visible=false;
barcervece._visible=false;
}
3.sıradaki kodumuz onLoadComplete`dir.Yükleme tamamlandığı anda yapılması gerekenler sıralanır.Çalışmamızda swf dosyası yüklendiği anda metin kutusunu bar ve barcerceve adlı film klibinin görülmemesini planladık.

klipLoader.onLoadInit = function (bosklip) {
bosklip._width = 170;
bosklip._height = 170;
}
4.sıradaki kod grubumuz onLoadInit() komutudur. Burada klibin yüklenmesi bitip ilk kare oynamaya başladığı andaki yapılması istenenler yazılır.Biz bosklip`in en ve boy oranını 170 piksele ayarladık.

klipLoader.onLoadError = function (bosklip, hata) {
if(hata=="URLNotFound"){
kutu.text="Dosya bulunamadı";
}else if(hata=="LoadNeverCompleted"){
kutu.text="Bağlantı kesildi";
}
}
5.sırada onLoadError komutu var.Burada hata adında bir parametre mevcut.Bir klibin yüklenmemesi için 2 neden vardır.İlki yüklenmesini istediğimiz dizinde bu klibin bulunmamasıdır.Şayet filmi şuradan indir dediğimizde flash orada filmi bulamazsa URLNotFound hatasını verir. İkinci yüklenememe nedeni ise internet bağlantısının kesilmesidir.Flash ilgili dizinde filmi bulur yüklemeye başlar.Bu arada aniden internet bağlantısı kesilirse flash LoadNeverCompleted hatasını verir. Bu bilgilere dayanarak hata parametresine bu değerleri atayarak bir if sorgusu yapılır.Bir sorun olduğunda buna ait bilgiler dinamik metin kutusunda bildirilir.Bu özellikleri sizde deneyerek görebilirsiniz.

klipLoader.loadClip("resim1.swf","_root.bosklip"); Son komutumuz loadClip komutudur. Buraya yüklenecek klibin adı ve yüklenme alanı yazılır.

---------------------------------------------------------

Dinamik yöntemle bu çalışmayı hazırlamak isterseniz :

Flash programını açıp 1.kareye şu kodları yazmanız yeterli olacaktır:

_root.createEmptyMovieClip("bosklip",0);
_root.createTextField("kutu",1,200,200,130,15);
var klipLoader = new MovieClipLoader();

klipLoader.onLoadStart = function (bosklip) {
kutu.text="veriler yükleniyor"
}

klipLoader.onLoadProgress = function (bosklip, yuklenen, total) {
yuzde=Math.floor( yuklenen/total*100);
kutu.text="% "+yuzde+" yükleme yapıldı"
}

klipLoader.onLoadComplete = function (bosklip){
kutu._visible=false;

}

klipLoader.onLoadInit = function (bosklip) {
bosklip._width = 170;
bosklip._height = 170;
}

klipLoader.onLoadError = function (bosklip, hata) {
if(hata=="URLNotFound"){
kutu.text="Dosya bulunamadı";
}else if(hata=="LoadNeverCompleted"){
kutu.text="Bağlantı kesildi";
}
}

klipLoader.loadClip("resim1.swf","_root.bosklip");

Uygulamaları download etmek için tıklayınız

Flash`ın asfunction protokolu fazla bilinen bir yöntem değildir. Ama bazı çalışmalarda çok faydalı olabilir. Bu protokol ile statik bir metinden frame üzerine yazılmış bir fonksiyona ulaşılarak buradaki kod grubu çalıştırılabilir. Ya da dinamik metin kutusundan HTML etiketleri kullanılarak yine frame üzerindeki fonksiyon grubu çalıştırılabilir.Metin kutusunu manuel olarak oluşturabileceğiniz gibi dinamik yöntemle de yaratabilirsiniz. Prototol yazımı alttaki gibidir:

asfunction:fonksiyon_adı,parametre

şeklindedir. Buradaki fonkisyon adı anasahnedeki ulaşmak istediğimiz fonksiyona verilen isimdir.şayet bu fonksiyona parametre göndermek isterseniz fonksiyon adından sonra bir virgül koyup sonrasına istediğiniz parametreyi ekleyin.

Ancak tek bir parametre gönderebilirsiniz. Virgülden sonra yazacağınız herşey tek bir parametre kabul edilir ve daima string olarak algılanır.Yani bir numerik değer gönderemezsiniz.örneğin virgülden sonra ali123,1/4=8a gibi bir değer yazdığınızda flash bunu basit tek bir string olarak "ali123,1/4=8a" algılar.

Altta basitten daha komplike çalışmaya doğru örnekleme yapılmıştır.

Yukardaki çalışmada link yazısına tıkladığınızda blank bir sayfa açılacaktır. Link yazısı bir buton olarak hazırlanmamıştır. Basitçe klavye ile yazılmış bir metinden ibarettir.

örnek 1 :

1-Flash programını açın ve sahneye istediğiniz boyutta bir statik metin yazın.Bu metni tek tıklama ile seçip properties paneline bakın:



2- Orta alt kısımdaki URL alanına asfunction:fonksiyonumuz yazın.Dikkat ederseniz hiç parametre kullanılmadı. Bir sonraki örnekte fonksiyona parametre göndereceğiz.

3- Şimdi sahneye dönüp timeline üzerindeki tek kareye çalıştırmak istediğimiz fonksiyonu yazalım:

function fonksiyonumuz(){
getURL("http://www.google.com","_blank")
}

Filmi test ettiğinizde metin adeta bir butonmuş gibi fonksiyon görecek ve üzerine tıklandığında google sayfasını açacaktır.

Şimdi 2.örneğimize geçelim.

2.örneğimizde metin üzerine tıklandığında parametre olarak gönderilen değerler dinamik metin kutusunda gösterilecektir.

örnek 2 :

1- Sahneye metninizi (listele) yazınız.Ve yanına bir dinamik metin kutusu çizin. Metin kutusuna properties panelinden kutu adını verin.

2- Metni tek tıklama ile seçip properties paneline baın:



URL alanına : asfunction:fonksiyonumuz,1.cümle,2.cümle,3.cümle yazınız. Burada fonksiyonumuz az sonra yazacağımız fonksiyon adıdır.Virgülden sonra kısım gönderilecek parametredir.Yani gönderilecek parametre 1.cümle,2.cümle,3.cümle şeklinde göreceğimiz tek bir string olacaktır.

3- Anasahneye dönüp 1.kareye şu kodları atayın:

kutu.multiline=true;
kutu.autoSize=true;
kutu.text="Soldaki butona basınız"


function fonksiyonumuz(parametre){
dizi = new Array;
dizi = parametre.split(",");
kutu.text="";
for (i=0; i< dizi.length; ++i){
trace("Eleman " + i + " = " + dizi[i]);
kutu.text+=dizi[i]+newline;
}
}

// Önce dinamik metin kutusu multiline ve otomatik genişleme özelliğine sahip oluyor ve içine soldaki butona basınız şeklinde bir metin ekleniyor. Daha sonra properties panelinde kullandığımız fonksiyon oluşturuluyor.Bu fonksiyonda adı parametre olan bir parametre kullanılıyor. Önce dizi isminde yeni bir dizi oluştururuyor. Ve bu diziye parametre olarak gönderilen string atanıyor. Gelen string 1.cümle,2.cümle,3.cümle şeklinde idi.bildiğiniz gibi split komutu bu stringi atanan karakterler arasından bölerek bir dizinin elemanlarını oluşturur. Burada kullanılan karakter virgüldür.String her virgülden sonra bölünerek bir dizinin elemanını oluşturur.Sonuç:

eleman1 = 1.cümle
eleman2= 2.cümle
eleman3= 3.cümle olacaktır.


sonraki dizinde metin kutusuna yazılan yazı temizlenir ve bir for döngüsü oluşturulur. Bu döngü ile split komutu ile elde edilen değerler metin kutusuna yazdırılır.Burada kullanılan newline komutu bir alt satıra geçişi sağlar ve dizi elemenları alt alta yazılır.

Şimdi 3.örneğimize geçelim.

Bu örneğimizde dinamik olarak oluşturulan metin kutusuna asfunction protokolünü kullanarak buton özelliğini gösteren metin dizileri yazdırılacak ve bu metinlere sahnedeki bir klibi yönlendirme ve bir adrese bağlanma fonksiyonu kazandırılacaktır.

örnek 3:

1- 1.layerda bir tween işlemi oluşturun .Çalışmamızda 100 frame`lik bir animasyon oluşturuldu.

2- Üste yeni bir layer ekleyin ve 1.kareye şu komutları yazın:

metinKutusu=function(komut){
if(komut=="durdur"){
_root.stop();
} else if (komut=="oynat") {
_root.play();
} else if (komut=="anasayfa") {
getURL("http://www.flashdersleri.com","_blank")
}
}

_root.createTextField("dinamik_kutu",1,240,110,50,50);
mesaj="Durdur

Oynat

Anasayfa
";

dinamik_kutu.html=true;
dinamik_kutu.multiline=true;
dinamik_kutu.autoSize=true;
dinamik_kutu.htmlText=mesaj;

3- Filmi test edebilirsiniz.

Kodları açıklarsak:

metinKutusu=function(komut){
if(komut=="durdur"){
_root.stop();
} else if (komut=="oynat") {
_root.play();
} else if (komut=="anasayfa") {
getURL("http://www.flashdersleri.com","_blank")
}
}

// Yukarıda önce metinKutusu isimli fonksiyonumuzu oluşturuyoruz.Komut isimli parametreye gelen değer durudr olursa animasyon stoplanacak,oynat olursa animasyon başlayacak ve anasayfa olursa bir url adresine bağlanacaktır.

_root.createTextField("dinamik_kutu",1,240,110,50,50);
mesaj="Durdur

Oynat

Anasayfa
";

dinamik_kutu.html=true;
dinamik_kutu.multiline=true;
dinamik_kutu.autoSize=true;
dinamik_kutu.htmlText=mesaj;

//Yukarıda dinamik yöntemle bir metin kutusu oluşturuluyor.Parantez içinde sıra ile yazılanlar,metin kutusu adı, derinliği, x poziyonu,y pozisyonu,en ve yüksekliği şeklinde sıralanır. Daha sonra mesaj adında bir değişken oluşturulup burada a tagı aracılığı ile 3 adet link oluşturulur.Ve asfunction protokolü hazırlanarak oluşturulandurdur,oynat ve anasayfa metinlerine tıklandığında metinkutusu isimli fonksiyonumuza gönderilecek parametreler ayarlanır. Bu parametreler metne tıklandığında fonksiyon içine alınarak yapılacak işlemi çalıştırır.kullanılan br tagı bir alt satıra geçmek için yazılmıştır.

Daha sonraki kodlarla metin kutusu html özelliği açılıp,multiline ve otomatik genişleme fonksiyonunu kazanır. Son komutlada mesaj değişkeninin tüm içeriği metin kutusuna aktarılır.

örnekleri download için tıklayınız

Çok sık istek aldığı için bu örneğe yer verilmiştir. Genel istek; il üzerine fare ile gelindiğinde renk değiştirmesi veya öne protrüze olması, tıklandığında ilin büyütülmüş görüntüsünün ayrı bir sayfa olarak açılması şeklinde idi.

Actionscript açısından basit kodlar kullanılır. Asıl zorluk haritanın çizimindedir. Bunun için en iyi yöntem grafik tabletlerinin kullanımıdır. Veya harita flash içine import edildikten sonra bulunduğu layer üzerine yeni bir layer eklenir. Line aracı ile alttaki illerin çizimleri işlenir, işlem bitince alttaki layer silinir.

Çalışmamızdaki örnek http://www.meb.gov.tr/ adresinden alınıp uyarlanmıştır.

Uyarı: Her il için bir sayfa hazırlama zahmetli olacağından il üzerine tıklandığında açılacak sayfa hazırlanmadığından sayfa açılamadı şeklinde uyarı alacaksınız. Çalışmanın sonunda her il için hazırlanacak sayfanın adı yazılacaktır.Kodlara göre sayfa adı verileceğinden açılacak sayfa isimlerinin size yazılanlardan farklı olmamasına dikkat etmelisiniz.

Uygulama:

Çalışmayı incelediğinizde çok fazla anlatılacak bir dosya olmadığını göreceksiniz.Burada en önemli konu çizimin yapılabilmesidir.Sahneye yerleştirilen her il bir film klibi şeklindedir ve bu klip üzerine gelindiğinde 2.kareye geçiş yaparak bir renk değişim efekti verir. Bu nedenle çalışmada sadece kodlardan bahsedilecek ve uyarlamayı nasıl yapacağınız tanımlanacaktır.

Fla dosyası açtığınızda sahnede harita adında tek bir klip ve bunun altında deniz ve kara çizgisini belirleyen bir arkaplan vardır. Harita klibine çift tıkladığınızda asıl çalışmanın içine girmiş olursunuz.Tüm kodlar bu bölümdedir. Burada alt layera dış kenarları çizilmiş haritamız yerleşmiş bunun üstünde de tüm şehir klipleri tek tek ilgili kısma eklenmiştir. Ayrıca sahne dışına şehirlerin isminin atanacağı bir dinamik kutu içeren film klibi eklenir.Bu klibin instance name`i balon` dur.

Şehir kliplerini tek tek seçerek baktığınızda hepsinde de aynı kodların bulunduğunu göreceksiniz. Bu kodlar birazdan anlatacağımız timeline üzerinde actionscript layerına yerleştirilmiş fonksiyonları çalıştırmaktadır.

on (rollOver) {
y = new String(_name);
a = y.slice(1, 3);
_parent.rbtxt(a);
}
on (rollOut) {
_parent.rbalon(a);
}
on (release) {
_parent.rpress(a);
}

Yukarıdaki kodları incelemeden evvel şehir kliplerine tek tek tıklayarak instance name alanına bakarsanız tüm kliplere önce x sonra plaka numarasının eklendiğini göreceksiniz. Örneğin Samsun il klibinin instance name`i x55 , İstanbul`un x34 dür. Bu isimlendirme çok önemlidir. Çünkü daha sonra yazılacak fonksiyonlarda bu kliplere ait x karakterinden sonra gelen rakam alınarak kullanılacaktır. Şimdi kodları irdeleyelim:

on (rollOver) {
y = new String(_name);
a = y.slice(1, 3);
_parent.rbtxt(a);
}
// Fare klip üzerine geldiğinde y değişkenine klibin adı atanıyor.Örneğin Samsun için y değişkeni x55 adını alır. Daha sonra a değişkenine slice metodu ile y değişken değerinin son iki karaktere atanıyor. Bu Samsun için 55 olur. a değişkenine ait 55 değeri daha sonra timelineda tanımlanacak olan rbtxt adlı fonksiyona gönderilecek ve bu fonksiyon çalıştırılacaktır.

on (rollOut) {
_parent.rbalon(a);
}
// Fare klip üzerinden çekildiğinde yine daha sonra anlatılacak olan rbalon fonksiyonuna a değeri gönderilip çalıştırılacaktır.

on (release) {
_parent.rpress(a);
}
// Klip tıklandığında rpress fonksiyonuna a değeri gönderilerek çalıştırılır.

Şimdi bunlar çalıştığında ne olacağını anlamak için timeline üzerindeki kodlara bakalım:

//Etiket için şehir isimleri
ilad = "a,Adana,Adıyaman,Afyon,Ağrı,Amasya,Ankara,Antalya,Artvin,Aydın,Balıkesir,Bilecik,Bingöl,Bitlis,Bolu,Burdur,Bursa,
Çanakkale,Çankırı,Çorum,Denizli,Diyarbakır,Edirne,Elazığ,Erzincan,Erzurum,Eskişehir,Gaziantep,Giresun,Gümüşhane,Hakkari,
Hatay,Isparta,Mersin,İstanbul,İzmir,Kars,Kastamonu,Kayseri,Kırklareli,Kırşehir,Kocaeli,Konya,Kütahya,Malatya,Manisa,Kahramanmaraş,
Mardin,Muğla,Muş,Nevşehir,Niğde,Ordu,Rize,Sakarya,Samsun,Siirt,Sinop,Sivas,Tekirdağ,Tokat,Trabzon,Tunceli,ŞanlıUrfa,Uşak,Van,Yozgat,
Zonguldak,Aksaray,Bayburt,Karaman,Kırıkkale,Batman,Şırnak,Bartın,Ardahan,Iğdır,Yalova,Karabük,Kilis,Osmaniye,Düzce";

//Gidilecek adres için şehir isimleri
ilurl = "a,adana,adiyaman,afyon,agri,amasya,ankara,antalya,artvin,aydin,balikesir,bilecik,bingol,bitlis,bolu,burdur,bursa,
canakkale,cankiri,corum,denizli,diyarbakir,edirne,elazig,erzincan,erzurum,eskisehir,gaziantep,giresun,gumushane,hakkari,
hatay,isparta,mersin,istanbul,izmir,kars,kastamonu,kayseri,kirklareli,kirsehir,kocaeli,konya,kutahya,malatya,manisa,kmaras,
mardin,mugla,mus,nevsehir,nigde,ordu,rize,sakarya,samsun,siirt,sinop,sivas,tekirdag,tokat,trabzon,tunceli,sanliurfa,usak,van,
yozgat,zonguldak,aksaray,bayburt,karaman,kirikkale,batman,sirnak,bartin,ardahan,igdir,yalova,karabuk,kilis,osmaniye,duzce";

//Buton üzerine gelince çalışacak olan fonksiyon
function rbtxt(a) {
var Register_1_ = a;
var Register_2_ = this;
balon._visible = true;
arbtxt = ilad.split(",");
balon.txt.text = arbtxt[Register_1_];
Register_2_[("x" + Register_1_)].play();
balon._x = Register_2_[("x" + Register_1_)]._x;
balon._y = (Register_2_[("x" + Register_1_)]._y - Register_2_[("x" + Register_1_)]._height / 2) - 25;
}

//Buton üzerinden ayrılınca çalışacak olan fonksiyon
function rbalon(a) {
balon._visible = false;
this[("x" + a)].gotoAndStop(1);
}

//Butona tıklanınca çalışacak olan fonksiyon
function rpress(a) {
arburl = ilurl.split(",");
getURL(arburl[a] + ".html", "_blank");
}


Önce ilad isimli bir değişkene tek bir string şeklinde tüm şehir adları virgül ile ayrılarak yazılır. Bu değer daha sonra split komutu ile virgülden itibaren ayrılacak. Ve tüm isimler arbtxt adlı bir dizi oluşturacaklardır. Bu dizi fare ile şehirler üzerine gelindiğinde isminin yazıldığı balon klibi içindeki dinamik metin kutusuna aktarılmak için kullanılacaktır.

Split komutu kullanılmadan da şehir isimleri doğrudan bir diziye aktarılarak kodlama yapılabilirdi ama hazırlayan yazarın tercihi bu yönde olduğundan değiştirilmedi. Çalışmaının sonunda split komutu kullanılmadan daha temiz bir kod grubu yazılacaktır

ilurl = yine aynı yöntemle ayrılarak şehir üzerine tıklandığında gidilecek adresin bir parçasını oluşturacaktır.

Yukarıdaki fonksiyonların ne amaçla oluşturulduğu üzerinde yazılmaktadır. Biz tüm çalışmanın oluşumunu bir örnekle anlatalım. Fare ile Samsun klibi üzerine geldiğimizde hangi fonksiyonlar çalışır ve neler olur bunu inceleyelim. Samsun klibi üzerine geldiğimizde bu klibe atanan rollOver kodları çalışır:,

y = new String(_name); klibin adı x55 olduğundan y değeri x55 olur.
a = y.slice(1, 3); y değişkeninin 2. ve 3. karakteri a değişkenine atandığından a=55 olur.
_parent.rbtxt(a);parent klibin bir üst seviyesini tanımlamak için kullanılır.(yani harita klibinin timeline`ını).55 olan a değeri rbtxt fonksiyonuna gönderilir ve bu fonksiyon çalıştırılır. Fonksiyon çalıştırıldığında:(fonksiyonun tamamı üstte yazılmıştır)

var Register_1_ = a; yani Register_1_ değeri 55 olur.(Çünkü klipten bu değer gönderilmişti.)
arbtxt = ilad.split(","); komutu ile en üstte yazılan isimler dizi haline getirilir.
balon.txt.text = arbtxt[Register_1_]; Sahne dışına eklediğimiz balon klibi içindeki txt adlı dinamik metin kutusuna arbtxt[Register_1_]; dizisinin adı yazdırılır. Register_1_ a değerine yani 55 e eşit olduğundan dizinin 55. elemanı olan Samsun adı dinamik metin kutusuna yazdırılır, diğer kodlarla da x ve y koordinatı ayarlanarak klibin adı kullanıcya gösterilmiş olur.Register_2_[("x" + Register_1_)].play(); bunun açılımı this.x55.play(); şeklindedir ve doğal olarak klip renk değişimi efekti verecektir.

Fareyi klip üzerinden çektiğimizde rollOut kodları çalışır. balon._visible = false; balon klibi yani yazı kaybolur ve this[("x" + a)].gotoAndStop(1); yani this.x55.gotoAndStop(1) ile klip eski rengine döner.

Son olarak fareyi tıkladığınızda çalışacak fonksiyon grubu:

function rpress(a) {
arburl = ilurl.split(",");
getURL(arburl[a] + ".html", "_blank");
}

a değerini 55 kabul etmiştik. Yine diğer fonksiyon gibi arburl adlı bir diziye split metodu ile bölünen ilurl isimleri atanır. arburl[a] + ".html" kodu şunu tanımlar arburl dizisinin 55. elemanını çağırır.Biz bunu samsun olarak yazdığımızdan o değer döner ve .html ile birleşerek şu adresi verir. samsun.html. Yani açılım:

getURL("samsun.html", "_blank"); olur. Ve bu sayfa blank olarak açılır. İstanbul tıklanırsa istanbul.html sayfası açılır.

ÖNEMLİ NOT: Sayfayı editlerken yani her tıklandığında açılacak şehir detaylarını gösteren sayfaların ismini üstte anlattığım nedenlerden dolayı ilurl değişkenindeki isimlerle aynı olmasına dikkat etmelisiniz. Örneğin Adıyaman ili tıklandığında açılacak sayfanın adı adiyaman.html , Elazığ için elazig.html şeklinde olmalıdır. Başka isimler yazılırsa anlatılan nedenlerden dolayı sayfa açılmayacaktır.

Uygun kodlama aşağıdaki gibidir:

Harita klibinin 1.karesinde bir seri gerek olmayan kod grubu vardır.Özellikle kullanılan split komutu flash`ı zorlayan komutlardandır ve amacı bir string`den aradaki bir ayraçı (burada virgül kullanıldı) kullanarak dizi yaratmaktır .O halde stringi yazmadan ve split komutunu kullanmadan ve gereği olmayan fazladan değişkenleri atarak (Register_1_ ,Register_2_, arbtxt ,arburl gibi) daha temiz bir kod grubu oluşturulabilir.1.karedeki kodları aşağıdakilerle değiştirip kullanabilirsiniz:

//Etiket için şehir isimleri
ilad =["","Adana","Adıyaman","Afyon",.........diğer 80 şehir adınıda girmelisiniz...............];
//Sadece 3 şehir yazılmıştır virgülden sonra diğer şehir isimlerini de eklemelisiniz

//Gidilecek adres için şehir isimleri
ilurl =["","adana","adiyaman","afyon",.........diğer 80 şehir adınıda girmelisiniz...............];
//Sadece 3 şehir yazılmıştır virgülden sonra diğer şehir isimlerini de eklemelisiniz

//Buton üzerine gelince çalışacak olan fonksiyon
function rbtxt(a) {
balon._visible = true;
balon.txt.text = ilad[a];
this[("x" + a)].play();
balon._x = this[("x" + a)]._x;
balon._y = (this[("x" + a)]._y - this[("x" + a)]._height / 2) - 25;
}

//Buton üzerinden ayrılınca çalışacak olan fonksiyon
function rbalon(a) {
balon._visible = false;
this[("x" + a)].gotoAndStop(1);
}

//Butona tıklanınca çalışacak olan fonksiyon
function rpress(a) {
getURL(ilurl[a] + ".html", "_blank");
}

Son olarak bu kod grubunda dizi içinde gördüğünüz ilk karakter olan "" ve yukarıda çalışmayı hazırlayan otörün eklediği a karakterinin nedeni şudur. Dizilerde ilk karakterin indexi sıfırdan başlar. Biz kliplerimizde şehir plakalarını esas aldığımızdan kodlama 1 den başlamaktadır.Bu nedenle ilk karakter hatalı okuma olmaması için boş bırakılmıştır veya a gibi kullanılmayan bir karakter eklenmiştir.

Uygulamanın dosyasını indirmek için Tıklayınız

Bu çalışmanın tamamı şu an adını hatırlayamadığım bir Çin sitesinden alınmıştır. Resimleri değiştirme dışında hiçbir katkım olmamıştır.

Flash bilindiği gibi 2D programdır. 3 Boyutlu işlemlerin yapılması konusu en sık sorulan sorulardandır. Bu nedenle çalışmaya ait hiçbir yorum ve açıklama yapmadan sayfaya eklemeyi uygun gördüm.

Dosyadaki küpün dönüşünü fare ile yönlendirebilirsiniz.

DOSYAYI İNDİR

Uygulama:

1- Flash programını açın 6 adet aynı ebadlardaki resmi kütüphaneye alın.(Sahne boş kalacak) .Her resmin üzerine sırası ile sağ klik yapıp linkage seçeneğini işaretleyin.Açılan panelde 1. ve 3. kutucukları işaretleyip en üstteki ID alanına image0 ve sırası ile image1,...........,image5 yazın. Bu isimler kodlarda daha sonra dizi içine alınarak kullanılacaktır.

2- Sahne hala boştur. Buraya hiçbir eklenti yapılmayacak. Sadece 1. kareye alttaki kodları yazmanız yeterli olacaktır.


import flash.geom.Matrix;
import flash.geom.Point;
Stage.scaleMode = 'noScale';

var oRotations:Object = {x:0, y:0, z:0};
var nUnit:Number = 100/2;
var boxPoints_array:Array = new Array();
boxPoints_array.push({x:-nUnit, y:-nUnit, z:-nUnit});
boxPoints_array.push({x:nUnit, y:nUnit, z:-nUnit});
boxPoints_array.push({x:-nUnit, y:nUnit, z:-nUnit});
boxPoints_array.push({x:-nUnit, y:-nUnit, z:nUnit});
boxPoints_array.push({x:nUnit, y:-nUnit, z:nUnit});
boxPoints_array.push({x:nUnit, y:nUnit, z:nUnit});

var faces_array:Array = new Array();
faces_array.push([2, 0, 3]);
faces_array.push([5, 1, 2]);
faces_array.push([0, 2, 1]);
faces_array.push([4, 3, 0]);
faces_array.push([3, 4, 5]);
faces_array.push([1, 5, 4]);

var images_array:Array = ["image0", "image1", "image2", "image3", "image4", "image5"];

var my_mc:MovieClip = this.createEmptyMovieClip("scene_mc", this.getNextHighestDepth());
my_mc._x = Stage.width/2;
my_mc._y = Stage.height/2;
var nSensitivity:Number = 1/1000;

xInitializeBox();
xCreateBox();

my_mc.onEnterFrame = xCreateBox;

function xInitializeBox() {
var nLength:Number = faces_array.length;
for (var i:Number = 0; ivar image_str:String = images_array[i];
var _mc:MovieClip = my_mc.createEmptyMovieClip(image_str, i);
faces_array[i].push(_mc);
var contents_mc:MovieClip = _mc.createEmptyMovieClip("contents", i);
contents_mc.attachBitmap(flash.display.BitmapData.loadBitmap(image_str), 1, "auto", true);
}
}

function xCreateBox() {
oRotations.x -= this._ymouse*nSensitivity;
oRotations.y += this._xmouse*nSensitivity;
var points2d:Array = xTransformPoints(boxPoints_array, oRotations);
var nLength:Number = faces_array.length;
for (var i:Number = 0; ivar face_array:Array = faces_array[i];
var n0:Number = face_array[0];
var n1:Number = face_array[1];
var n2:Number = face_array[2];
var _mc:MovieClip = face_array[3];
xTransformMovieClipPoints(_mc, points2d[n0], points2d[n1], points2d[n2]);
}
}

function xTransformPoints(points_array:Array, oRotations:Object):Array {
var points2D_array:Array = new Array();
var nSin_x:Number = Math.sin(oRotations.x);
var nCos_x:Number = Math.cos(oRotations.x);
var nSin_y:Number = Math.sin(oRotations.y);
var nCos_y:Number = Math.cos(oRotations.y);
var nSin_z:Number = Math.sin(oRotations.z);
var nCos_z:Number = Math.cos(oRotations.z);
var nLength:Number = points_array.length;
for (var i:Number = 0; ivar nX:Number = points_array[i].x;
var nY:Number = points_array[i].y;
var nZ:Number = points_array[i].z;
var nYx:Number = nCos_x*nY-nSin_x*nZ;
var nZx:Number = nSin_x*nY+nCos_x*nZ;
var nZy:Number = nCos_y*nZx-nSin_y*nX;
var nXy:Number = nSin_y*nZx+nCos_y*nX;
var nXz:Number = nCos_z*nXy-nSin_z*nYx;
var nYz:Number = nSin_z*nXy+nCos_z*nYx;
points2D_array[i] = new Point(nXz, nYz);
}
return points2D_array;
}

function xTransformMovieClipPoints(_mc:MovieClip, point0:Point, point1:Point, point2:Point):Void {
if (_mc._visible=xIsVisible(point0, point1, point2)) {
var myMatrix:Matrix = _mc.transform.matrix;
var contents_mc:MovieClip = _mc.contents;
var nWidth:Number = contents_mc._width;
var nHeight:Number = contents_mc._height;
var point1_0:Point = point0.subtract(point1);
var point1_2:Point = point2.subtract(point1);
myMatrix.tx = point1.x;
myMatrix.ty = point1.y;
myMatrix.a = (point1_0.x)/nWidth;
myMatrix.b = (point1_0.y)/nWidth;
myMatrix.c = (point1_2.x)/nHeight;
myMatrix.d = (point1_2.y)/nHeight;
_mc.transform.matrix = myMatrix;
}
}

function xIsVisible(point0:Point, point1:Point, point2:Point):Boolean {
var point0_1:Point = point1.subtract(point0);
var point0_2:Point = point2.subtract(point0);
var nX0_1:Number = point0_1.x;
var nY0_1:Number = point0_1.y;
var nX0_2:Number = point0_2.x;
if (!nX0_1) {
return ((0>nY0_1) != (nX0_2>0));
}
var nY0_2:Number = point0_2.y;
if (!nX0_2) {
return ((0>nY0_2) != (nX0_1<0));
}
return ((nY0_1/nX0_1nX0_2));
}

Verilerin TXT Dosyasından Yüklendiği Quiz Hazırlamak

Tüm verilerin haricen yüklendiği ve güncelleme için fla dosyasına dokunulmayacak bir çalışma hazırlamanın doğru yolu asp veya php`den yararlanmaktır. Bu destek serverda yoksa veya bu tür bir dosya bulunamıyorsa xml mükemmel bir çözümdür.Xml de olmasın diyorsanız geri kalan tek seçenek txt dosyasından veri yüklemektir.

Txt dosyasından veri yüklemek istediğinizde çok kısıtlı şartları kullanmak zorunda olacağınızı bilmeniz gerekir.Çünkü yapacağınız her işlem flash kodları ile olacaktır ve bu kodlar herzaman yeterli gelmeyebilir.

Çalışmamızın özellikleri şöyledir:

1- Tüm veriler txt dosyasından yüklenmektedir ve fla dosyasını açmadan soru sayısını azaltabilir, çoğaltabilir veya tamamen değiştirebilirsiniz.

2- Süre sınırlaması yapabilirsiniz ve zamanı txt dosyasından ayarlayabilirsiniz.Zaman bitiminde sonuçlar butonuna basmadan otomatik olarak flash sonuçlar sayfasına atlar. Çalışmamızda 4 soru ve 15 saniye zaman verilmiştir.

3- Sonuçlar kısmında doğru yanıtlar,yanlış yanıtlar ve boş bırakılan soru sayısı size verilir. Ayrıca sizin verdiğiniz yanıtlar ile soruların doğru yanıtları karşılaştırmak amaçlı size sunulur.

4- Buraya kadar olan uygulamalar zahmetli de olsa bir asp,php veya xml dosyasının vereceklerinden az değildir. Tek sorunumuz yeni sorular eklendiğinde sahne boyutunun yeterli gelmemesi riskidir.Örneğin bu dosya sayfa yüksekliği ancak 7 soru alacak kadardır.Siz 10 soru eklerseniz sorular flash sahnesi dışına kayacağından gözükmeyecektir.Aslında biraz daha çaba ile bu problemin üstesinden gelinebilir.Scroll eklenebilir veya her 4-5 soruda bir bir sonraki kareye geçiş sağlanabilir.Kısıtlı kodlarla bunun oldukça zahmetli olacağını belirtmek isterim. En basit yol ise fla dosyasını açıp sadece sahne yüksekliği artırmaktır. Şimdi çalışmamaıza göz atalım:

Uygulama:

1- Önce tüm elemanları sahneye çizelim.



Üstte sahne dışında 2 adet dinamik metin kutusu mevcut. Bunlardan birine txt dosyasından doğru yanıtlar diğerine ise sizin verdiğiniz yanıtlar eklenmektedir. Daha sonra bunlar karşılaştırılarak doğru ve hatalı yanıtlar tesbit edilir.Hemen altındaki 2 adet dinamik metin kutusunun soldakine soru sırası sağdakine ise soru metni yüklenmektedir.Bunun altında 3 tane radiobutton ve sonuçlar sayfasına gitmesi için bir buton mevcuttur.Dinamik metin kutularının ismine fla dosyasından bakınız.Yoksa kodları yorumlamak zor olabilir. Radiobuttonlara sırası ile r0,r1 ve r2 instance name`i atanır.Properties panelinde parameters alanından data değerleri vermeniz gerekir. Verilecek data değerleri hangi şık olduğunu gösterir. Örneğin ilk buton a şıkkı olduğundan data değeri a, sonraki b sonraki c dir.Sonra kodlarla kişinin yaptığı seçimin hangi şık olduğunu flash kodları ile bu data değerlerinden almaktayız..Label kısmına yükleniyor yazarsanız txt dosyasından veriler yüklenene kadar kullanıcı boş alana bakmaz bir yüklemenin olduğunu düşünür.

Yukarıda gördüğünüz gibi sahnedeki tüm sembolleri seçin ve F8 tuşuna basarak tümünü film klibi yapın.



Şimdi görüntü yukarıdaki gibi olacaktır. Klibe anaklip adını verin. Anaklip sembolümüz txt dosyasından yüklenecek soru sayısı kadar çoğaltılacak ve asıl klibimiz artık işimize yaramadığından kodlarla sahneden silinecektir.



Ana çalışma bukadar.Üstte gördüğünüz gibi verilerin yüklenmesine zaman ayırabilmek için 15.kareye sağ klik yapıp insert keyframe seçeneği ile kare ekleyin.



Şimdi üste bir layer ekleyin ve 15.kareye bir blank keyframe atayın.Sadece bu karede gözükecek olan kronometre klibimizi bu kareye kütüphaneden çekip yerleştirelim. Kronometre klibinin nasıl yapıldığı uygulamalar bölümüzde Digital saat ve kronometre hazırlama başlığı altında anlatılmıştır.



Sınav layerı 16. kareye yine blank keyframe atayın ve bu alana sonuçların gösterileceği dinamik metin kutularını yerleştirin.



Kutuların açıklamaları zaten yanında yazmaktadır. Tüm çalışma bu kadardır.

Bu bölümde kodlar hakkında bilgi verilmeyecektir. Oldukça karmaşık olduğundan yazarak anlatmak son derece zor, bu nedenle fla dosyasında kodların üzerine gerekli açıklamalar yazılmıştır. Kodları , dinamik metin kutusu ve buton instance namelerini bir yere kaydederek incelerseniz anlamanız kolaylaşacaktır.

Kodlarda _global ifadesi biraz aşırıya kaçacak şekilde kullanılmıştır.Bu kod bize çok kolaylık sağlamaktadır.Bir sembolün görüntüsüne,değerine veya kısaca yoluna ulaşabilmek için tanımlamanız gereken bir dizin olmalıdır.Örneğin iç içe dıştan içe doğru isimleri klip1,klip2,klip3 olan bir sembol paketinde en içteki klip3 de var deger=1 şeklinde bir değişken deklare ettiğimizi varsayalım.Buna ana timeline dan ulaşıp değerini değiştirebilmek için:

_root.klip1.klip2.klip3.deger=

şeklinde bir yol yazmalısınız.Halbuki ilk deklerasyonu _global.deger=1 şeklinde verseydiniz anasahneden

_global.deger=

şeklinde pratik olarak ulaşabilirdiniz.Bu başka sahneye geçseniz dahi çalışacak bir kod grubudur. Özellikle karmaşık çalışmalarda çok yararlıdır.Prensip olarak ulaşma zorluğu yoksa klasik yöntem olan _root, this veya _parent yöntemleri tercih edilmeldir.

Kodları siz fla dosyasından inceleyeceğinize göre txt dosyasına bir göz atalım:

/*Soru isimlerini yüklemek için kullanılır*/
&sorular=Soru-1,Soru-2,Soru-3,Soru-4,Soru-5&

/*Soru metinlerini yüklemede kullanılır*/
&soru_metni=Türkiye`nin başkenti hangisidir?,İngiltere`nin başkenti hangisidir?,Amerika`nın başkenti hangisidir?,Rusya`nın başkenti hangisidir?&

/*Tüm soruların a şıkkını yerleştirir*/
&a_grubu=Ankara,Liverpool,California,Tahran&

/*Tüm soruların b şıkkını yerleştirir*/
&b_grubu=İstanbul,Londra,Los Angeles,Amsterdam&

/*Tüm soruların c şıkkını yerleştirir*/
&c_grubu=Bursa,Manchester,Washington,Moskova&

/* Doğru yanıtlara ait değerler */
&dogru_cevaplar=a,b,c,c&

/*Soru sayısı değerine göre klip duplike edilirBurada 4 soru olacaktır*/
&soru_sayisi=4&

/*Soruları cevaplama süresidir.Milisaniye cinsinden verilir.
1 saniye 1000 milisaniyedir*/
&sure=15000&

değikenlerin eklenme nedeni üstünde yazmaktadır.

Son olarak siz yeni soru eklemek isterseniz ne yapmanız gerektiği anlatılacaktır:

&sorular=Soru-1,Soru-2,Soru-3,Soru-4,Soru-5&
&soru_metni=Türkiye`nin başkenti hangisidir?,İngiltere`nin başkenti hangisidir?,Amerika`nın başkenti hangisidir?,Rusya`nın başkenti hangisidir?,italya`nın başkenti hangisidir?&
&a_grubu=Ankara,Liverpool,California,Tahran,Floransa&
&b_grubu=İstanbul,Londra,Los Angeles,Amsterdam,Roma&
&c_grubu=Bursa,Manchester,Washington,Moskova,Milano&
&dogru_cevaplar=a,b,c,c,b&
&soru_sayisi=5&
&sure=20000&

Dosyayı indirdiğinizde 4 örnekli sınav görürsünüz.degisken.txt dosyasını açıp üstteki verileri kopyalayarak değiştirirseniz çalışmanıza otomatik olarak bir soru daha eklenir ve değerlendirmeye alınır. Bunu deneyerek gözlemleyebilir siniz.Kırmızı alanlar her yeni eklentide yapılması gerekenlerdir.İlk dizine soru sırasını ikinci dizine soru metnini üçüncü dizin a şıklarının değerini dördüncü dizin b şıklarının beşinci dizin c şıklarının değerini altıncı dizin soru sayısını 7. dizin kullanıcıya verilecek süreyi belirler.Burada dikkat edilecek en önemli konu değişkene her eklediğiniz değerden önce virgül karakterinin konmasıdır.Çünkü fla dosyasında split komutu ile her virgülden sonraki değer kesilerek ayrı bir değişkene atanacaktır.Konuyu kavramanız açısından bir açıklama getireyim. Bu txt dosyasını flash içine yüklediğinizde örneğin sorular değişkeninin değeri:

Soru-1,Soru-2,Soru-3,Soru-4,Soru-5

şeklinde olacaktır.Flash içindeki görüntüsü şöyle olur:

this.sorular= Soru-1,Soru-2,Soru-3,Soru-4,Soru-5;

bu değerleri virgülden itibaren almak ve ayrı bir dizi oluşturmak için split kodu kullanılır.Bu kod belli bir karakterden itibaren değeri alıp parçalayarak her birini bir değişken değeri olarak bir array(dizi) haline getirir.

var sorular_dizi=this.sorular.split(","); Bu kodla sorular_dizi isimli bir array oluşturularak parçalanan değerler bu diziye atanır.Virgül kullanmak şart değildir.Hangi karakterden itibaren bölmek isterseniz onu kullanırsınız.Bu dizinin elemanları soru-1 soru-2 soru-3 soru-4 olacaktır.Çalışma zaten bu kod sayesinde olmuştur.Şayet flashta split komutu olmasa idi bu işlemi yapmak çok zor olacaktı. Deneme yapmak için 1.kareye şu kodları yazın ve test edin.

var sorular="Soru-1,Soru-2,Soru-3,Soru-4";
var dizi= sorular.split(",");
for(var i=0;itrace("Dizinin "+(i+1)+".Elemanı: "+dizi[i])
}

Sonuç:

Dizinin 1.elemanı: Soru-1
Dizinin 2.elemanı: Soru-2
Dizinin 3.elemanı: Soru-3
Dizinin 4.elemanı: Soru-4

şeklinde olacaktır.Artık her elemana değer atayarak kullanabilirsiniz.

Flash aracılığı ile d osya upload işlemi Flash8 ile son derece kolaylıkla uygulanabilmektedir. FileReference nesnesi ve basit bir php dosyası uygulama için yeterli olmaktadır.

Alttaki upload çalışması doğal olarak şu haliyle çalışmamaktadır. Kullanıcıların deneme amaçlı dosya gönderme işlemi için yeterli server alanım bulunmamaktadır. Fakat indireceğiniz dosya hatasız çalışacaktır. Bu çalışmayı basit bir ftp programı olarak kullanabilirsiniz.

Uygulama:

1- Önce php dosyasına gözatalım:



if ($_FILES['Filedata']['name']) {
$uploadDir = "images/";
$uploadFile = $uploadDir . basename($_FILES['Filedata']['name']);
move_uploaded_file($_FILES['Filedata']['tmp_name'], $uploadFile);
}
?>

UYARI:
Burada tek değiştireceğiniz yer kırmızı ile yazılmış images kısmıdır. Bu serverınızda gönderilecek dosyanın yükleneceği klasörün ismidir. Yani bir ftp programı ile serverınıza girip burada images isimli boş bir klasör oluşturmalısınız. Hata olmaması açısından tekrarlamakta yarar var. Serverınızda oluşturduğunuz images isimli klasör ile upload işlemini yapacağınız swf ve html dosyası aynı dizinde olmalıdır. Şayet klasör farklı bir dizinde ise php dosyasına bu klasörün yolunu doğru ve tam olarak girmelisiniz.

2- Şimdi fla dosyasını inceleyelim. Kodlar üzerinde yeterli açıklama mevcuttur. Çalışmada kullanılan elemanlar:

- Gönderilecek dosyayı seçen bir buton (instance name= browse_butn)
- Gönderme işlemini yapan bir buton (instance name= upload_butn)
- Dinamik bir metin kutusu (instance name= name_txt)
- (opsiyonel) metin kutusu çevresinde rengi kodlarla düzenlenen ve yükleme yapıldıkça ilerleyen bir preload amaçlı kullanılan klip.( instance name= rec_mc)

Siz isterseniz bunun yerine ayrı bir dinamik metin kutusu kullanarak yükleme yüzdesini gösteren klasik bir preload ekleyebilirsiniz.Elemanlar yerleştirildikten sonra 1.kareye şu kodu ekleyin:

// FileReference nesnesi import ediliyor
import flash.net.FileReference;

//başlangıçta yükleme butonu fonksiyon görmüyor
upload_butn.enabled = false;

//Yeni fileReference nesnesi hazırlanıyor
var file_fr:FileReference = new FileReference();

//Bu nesne olayları için listener nesnesi oluşturuluyor
var list_obj:Object = new Object();

/*Bilgisayardan yüklenecek dosya seçimi yapıldığında
yükleme butonu aktifleşiyor ve dosya adı metin kutusuna
yazdırılıyor*/
list_obj.onSelect = function(){
upload_butn.enabled = true;
name_txt.text = file_fr.name;
}

/*Yükleme tamamlandığında;
-Metin kutusuna uyarı mesajı ekleniyor
-Renkli loader kaldırılıyor
-Gönder butonu inaktif oluyor*/
list_obj.onComplete = function(){
name_txt.text = "Dosya Yüklenmiştir";
rec_mc.clear();
upload_butn.enabled = false;
}

/* Veriler yüklenirken preloader çalıştırılıyor.Yükleme oranı metin
kutusunun çevresindeki klibin renk değişiminin ilerlemesi şeklinde
oluşturuluyor*/
list_obj.onProgress = function (bytesTotal, bytesLoaded){
var percent = bytesLoaded/file_fr.size;
drawRec(percent);
}

//Yükleme iptal edilirse uyarı mesajı yazılıyor
list_obj.onCancel = function(){
name_txt.text = "Yükleme iptal edildi";
}

//Yükleme hatası olursa hata uyarı mesajları: IQ Hatası
list_obj.onIOError = function(fileRef){
name_txt.text = "IO hatası oluştu ";
}

//Yükleme hatası olursa hata uyarı mesajları: Güvenlik Hatası
list_obj.onSecurityError = function(fileRef, error){
name_txt.text = "Güvenlik Hatası oluştu " + fileRef.name + ":" + error;
}

//Yükleme hatası olursa hata uyarı mesajları: Http Hatası
list_obj.onHTTPError = function(fileRef:FileReference, error:Number){
name_txt.text += "HTTP hatası oluştu: " + fileRef.name + ":hata #" + error;
}

//Listener atanıyor
file_fr.addListener(list_obj);

//Göster butonu kodları hazırlanıyor.Buraya istediğiniz kadar isim ve format ekleyebilirsiniz.
browse_butn.clickHandler = function(){
file_fr.browse([{description: "Resimler", extension: "*.jpg;*.gif;*.png"}, {description: "Sıkıştırılmış dosyalar", extension: "*.rar;*.zip"}, {description: "Metin Belgeleri", extension: "*.txt;*.doc;*.pdf"}]
);
}

//Yükleme butonu kodları oluşturuluyor
upload_butn.clickHandler = function(){
file_fr.upload("upload.php");
rec_mc.fillColor = Math.random()*0x1000000;
}

//Preload için klip renklendirmesi hazırlanıyor.
function drawRec (per){
rec_mc.clear();
rec_mc.lineStyle(0);
rec_mc.beginFill(rec_mc.fillColor, 70);
rec_mc.lineTo(per*rec_mc._width, 0);
rec_mc.lineTo(per*rec_mc._width, rec_mc._height);
rec_mc.lineTo(0, 30);
rec_mc.lineTo(0,0);
rec_mc.endFill();
}
//Kodların sonu

Burada önemli olan kısımlardan birisi gönderilecek dosyanın tip tayinidir. Bu alana bir ya da istediğiniz kadar eleman ekleyebilirsiniz.

file_fr.browse([{description: "Resimler", extension: "*.jpg;*.gif;*.png"}, {description: "Sıkıştırılmış dosyalar", extension: "*.rar;*.zip"}, {description: "Metin Belgeleri", extension: "*.txt;*.doc;*.pdf"}]

Biz resimler adı altında jpg,gif,png ; Sıkıştırılmış dosyalar altında zip ve rar ; Metin belgeleri adı altında txt,doc ve pdf dosyaları göndermeye programladık.

Mac için bu dizinin yazılımı farklıdır. Flash help kısmında FileReference şeklinde arama yaparsanız gerekli kodlara ulaşabilirsiniz.

Dosyayı download için tıklayınız

Toplam 18 adet Klayve, mouse kontrol ve ayarları hakkında örnek bulunmaktadır. Umarım işinize yarayacaktır.

Download için Tıklayınız

Alternatif Download için Tıklayınız