Film klibi oynatımını denetleme

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

Flash, animasyonu veya bir durum değişikliğini yürütmek için zaman çizelgesi benzetimini kullanır. Zaman çizelgesi kullanan herhangi bir görsel öğenin MovieClip nesnesi olması veya MovieClip sınıfından genişletilmesi gerekir. ActionScript herhangi bir film klibine durmasını, oynatmasını veya zaman çizelgesinde başka bir noktaya gitmesini bildirse de, dinamik olarak bir zaman çizelgesi oluşturmak ya da belirli karelere içerik eklemek için ActionScript kullanılamaz; bu yalnızca Flash geliştirme aracı kullanılarak mümkün olur.

Bir MovieClip oynatılırken, SWF dosyasının kare hızı tarafından dikte edilen bir hızda zaman çizelgesinde ilerler. Alternatif olarak, ActionScript'te Stage.frameRate özelliğini ayarlayarak bu ayarı geçersiz kılabilirsiniz.

Film kliplerini oynatma ve oynatmayı durdurma

play() ve stop() yöntemleri, zaman çizelgesi boyunca bir film klibinin temel denetimine olanak sağlar. Örneğin, Sahne Alanı'nda, örnek adı bicycle olarak ayarlanmış ve ekranda hareket eden bir bisiklet animasyonunu içeren bir film klibi sembolü olduğunu varsayın. Aşağıdaki kod, ana zaman çizelgesinde bir anahtar kareye eklenir,

bicycle.stop();

bisiklet hareket etmez. (Animasyonu oynatılmaz.) Bisikletin hareketi, bir kullanıcı etkileşimi yoluyla başlatılabilir. Örneğin, startButton adında bir düğmeniz varsa, ana zaman çizelgesi üzerinde anahtar karedeki şu kod, düğmenin tıklatılmasıyla animasyonun oynatılmasını sağlar:

// This function will be called when the button is clicked. It causes the  
// bicycle animation to play. 
function playAnimation(event:MouseEvent):void 
{ 
    bicycle.play(); 
} 
// Register the function as a listener with the button. 
startButton.addEventListener(MouseEvent.CLICK, playAnimation);

Hızlı ileri ve geri sarma

play() ve stop() yöntemleri, film klibinde oynatımı denetlemenin tek yolu değildir. nextFrame() ve prevFrame() yöntemlerini kullanarak da zaman çizelgesi boyunca oynatma kafasını elle ileri veya geri hareket ettirebilirsiniz. Bu yöntemlerden herhangi biri çağrıldığında oynatma durdurulur ve oynatma kafası sırayla bir kare ileri veya geri hareket ettirilir.

play() yönteminin kullanılması, film klibi nesnesinin enterFrame olayı her tetiklendiğinde nextFrame() öğesinin çağrılmasıyla aynıdır. Bu satırlar boyunca, aşağıdaki gibi, enterFrame olayı için bir olay dinleyicisi oluşturup bicycle öğesine dinleyici işlevinde bir önceki karesine gitmesini bildirerek bicycle film klibinin geriye doğru hareket etmesini sağlayabilirsiniz:

// This function is called when the enterFrame event is triggered, meaning  
// it's called once per frame. 
function everyFrame(event:Event):void 
{ 
    if (bicycle.currentFrame == 1) 
    { 
        bicycle.gotoAndStop(bicycle.totalFrames); 
    } 
    else 
    { 
        bicycle.prevFrame(); 
    } 
} 
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

Normal oynatımda, bir film klibi birden çok kare içeriyorsa, oynatma sırasında bu süresiz olarak döngü oluşturur; başka bir deyişle, son karesini geçerse Kare 1'e geri döner. prevFrame() veya nextFrame() öğesini kullandığınızda, bu davranış otomatik olarak oluşmaz. (Oynatma kafası Kare 1'deyken prevFrame() çağrılırsa, oynatma kafası son kareye taşınmaz.) Yukarıdaki örnekte if koşulu, oynatma kafasının birinci kareye doğru geri yönde ilerleyip ilerlemediğini kontrol eder ve oynatma kafasını son karesine ayarlayarak geriye doğru oynatılan film klibinin etkili şekilde sürekli bir döngüsünü oluşturur.

Farklı bir kareye atlama ve kare etiketleri kullanma

Yeni bir kareye film klibi gönderilmesi basit bir işlemdir. gotoAndPlay() veya gotoAndStop() öğesinin çağrılmasıyla, film klibi bir parametre tarafından belirtilen kare sayısına atlar. Alternatif olarak, bir kare etiketinin adıyla eşleşen bir dizeyi iletebilirsiniz. Zaman çizelgesindeki herhangi bir kare bir etikete atanabilir. Bunu yapmak için, zaman çizelgesinde bir kare seçin ve sonra Özellik denetçisinde Kare Etiketi alanına bir ad girin.

Sayı yerine kare etiketlerinin kullanılmasının avantajı, özellikle karmaşık bir olay klibi oluşturulurken daha belirgin olur. Animasyondaki karelerin, katmanların ve araların sayısı arttıkça, önemli kareleri, film klibinin davranışındaki kaydırmaları temsil eden bilgilendirici açıklamalarla (örneğin, "kapalı", "yürüyor", "çalışıyor") etiketleyin. Etiketlenmiş bir kareye giden ActionScript çağrıları, belirli bir kare sayısının değil, tek bir başvurunun (etiket) işaretçisi olduğundan bu, kodun okunabilirliğini artırır ve esneklik sağlar. Daha sonra animasyonun belirli bir parçasını farklı bir kareye taşımaya karar verirseniz, yeni konumda karelerin etiketlerini aynı tuttuğunuz sürece ActionScript kodunuzu değiştirmeniz gerekmez.

ActionScript 3.0, koddaki kare etiketlerini temsil etmek için FrameLabel sınıfını içerir. Bu sınıfın her örneği tek bir kare etiketini temsil eder ve Özellik denetçisinde belirtildiği gibi kare etiketinin adını temsil eden bir name özelliğine ve etiketin zaman çizelgesinde yerleştirildiği karenin kare sayısını temsil eden bir frame özelliğine sahiptir.

Bir film klibi örneğiyle ilişkilendirilmiş FrameLabel örneklerine erişmek için, MovieClip sınıfı doğrudan FrameLabel nesnelerini döndüren iki özellik içerir. currentLabels özelliği, bir film klibinin tüm zaman çizelgesi boyunca yer alan tüm FrameLabel nesnelerini içeren bir dizi döndürür. currentLabel özelliği, zaman çizelgesi boyunca en son karşılaşılan kare etiketinin adını içeren bir dize döndürür.

robot adında bir film klibi oluşturduğunuzu ve bunun animasyonunun çeşitli durumlarını etiketlediğinizi varsayın. Aşağıdaki kodda olduğu gibi, robot öğesinin geçerli durumuna erişmek için currentLabel özelliğini denetleyen bir koşul oluşturabilirsiniz:

if (robot.currentLabel == "walking") 
{ 
    // do something  
}

Flash Player 11.3 ve AIR 3.3, frameLabel olayını FrameLabel sınıfına ekledi. Bir kare etiketini temsil eden FrameLabel örneğine bir olay işleyicisi atayabilirsiniz. Oynatma kafası kareye girdiğinde olay gönderilir.

Aşağıdaki örnek, MovieClip'e yönelik kare etiketi dizisindeki ikinci kare etiketi için bir FrameLabel örneği oluşturur. Ardından frameLabel olayı için bir olay işleyicisi kaydeder:

var myFrameLabel:FrameLabel = robot.currentLabels[1]; 
myFrameLabel.addEventListener(Event.FRAME_LABEL, onFrameLabel); 
 
function onFrameLabel(e:Event):void { 
    //do something 
}

Sahnelerle çalışma

Flash geliştirme ortamında, SWF dosyasının ilerleyeceği zaman çizelgeleri dizisini ayırmak için sahneleri kullanabilirsiniz. gotoAndPlay() veya gotoAndStop() yöntemlerinin ikinci parametresini kullanarak, oynatma kafasının gönderileceği bir sahneyi belirtebilirsiniz. Tüm FLA dosyaları yalnızca başlangıç sahnesinde başlar ancak siz yeni sahneler oluşturabilirsiniz.

Sahnelerin birçok dezavantajı olduğundan, sahnelerin kullanılması her zaman en iyi yaklaşım olmayabilir. Birden çok sahne içeren bir Flash belgesinin korunması, özellikle de birden çok yazarın bulunduğu ortamlarda zor olabilir. Yayınlama işlemi tüm sahneleri tek bir zaman çizelgesinde birleştirdiğinden, birden çok sahne, bant genişliğinde de verimsiz olabilir. Bu da asla oynatılmasa da, tüm sahnelerin aşamalı indirilmesine neden olur. Bu nedenlerden dolayı, birden çok uzun zaman çizelgeli animasyonların organize edilmesi dışında, birden çok sahne kullanılması genellikle önerilmez.

MovieClip sınıfının scenes özelliği, SWF dosyasındaki tüm sahneleri temsil eden bir Scene nesneleri dizisini döndürür. currentScene özelliği, geçerli olarak oynatılan sahne alanını temsil eden bir Scene nesnesini döndürür.

Scene sınıfı, bir sahneyle ilgili bilgi veren birçok özelliğe sahiptir. labels özelliği, o sahnedeki kare etiketlerini temsil eden bir FrameLabel nesneleri dizisini döndürür. name özelliği, dize olarak sahnenin adını döndürür. numFrames özelliği, sahnedeki toplam kare sayısını temsil eden bir int öğesini döndürür.