2D Animasyon Markerlarını Frame Atlayışında Güvenli Tetikle

Bir karakterin adım sesini animasyon markerine bağladığında, sadece güncellenmiş son frameyi kontrol etmek yeterli değil. Eğer güncelleme yavaşsa, örneğin 60 FPS yerine 30 FPS'de çalışıyorsa, marker geçilip birkaç frame ileride sonlanabilir. Hatta loop döngüsünün sonunu aşabilir.

Liangqi Zhao'nun yaklaşımı basit ama etkili: animasyon zamanını milisaniye cinsinden sürekli artan bir tamsayı olarak tut. Döngü süresi marker konumlarını tanımlamaya devam eder, ama saat kendisi asla sıfırlanmaz.

Temel fikir, eski ve yeni zaman arasında geçilen her markeri toplamak. Bunu yapmak için yarı-açık aralık kullan: (eski_ms, yeni_ms]. Eski zamanı hariç, yeni zamanı dahil et. Bu şekilde ardışık güncellemeler sınırda çakışmaz ve aynı markeri iki kez tetiklemezsin.

Praktik olarak, 0 konumundaki bir marker her döngü başında ateşlenir. Animasyon ilk başladığında 0'da bir marker istiyorsan, bunu ayrı bir başlatma adımı olarak gönder.

1function fireMarkersInRange(oldMs, newMs, loopPeriodMs, markers) {
2const firedMarkers = [];
3for (const marker of markers) {
4const markerPos = marker.timeMs % loopPeriodMs;
5// Aralık içinde mi kontrol et
6if (oldMs < newMs) {
7// Normal durum
8if (oldMs < markerPos && markerPos <= newMs) {
9firedMarkers.push(marker);
10}
11} else {
12// Loop geçişi: eski > yeni (saat sıfırlandı)
13if (oldMs < markerPos || markerPos <= newMs) {
14firedMarkers.push(marker);
15}
16}
17}
18return firedMarkers;
19}

Bu yöntem frame atlayışında güvenilir çünkü zaman hiç geri gitmez ve her marker tam olarak bir kez tetiklenir. Oyun motorunun hızı ne olursa olsun, ses efektleri doğru zamanda oynatılır.

konu hakkında tepkinizi verebilirsiniz