Temel olarak doğru yoldasınız - bir animasyonun bu tür şeyleri yapmak için ne kadar sürdüğünü bilmeniz gerekir. Animasyonlar sadece bir çerçeve koleksiyonundan daha fazlasıdır, etraflarında ihtiyacınız olan her türlü başka bilgi vardır. Örneğin kaç kare vardır, animasyon döngüsü ne kadar hızlı oynatılır (örneğin saniyede 10 animasyon karesi veya 25 veya 60?). Her animasyon, bazı genel animasyon kodlarının bakabileceği ve oynatabileceği birkaç veri parçası olarak tanımlanabilir. Animasyon bölümünü, bu animasyon tanımları ve tek tek görüntü çerçevelerinin nasıl görüntüleneceği dışında hiçbir şeyin farkında olmayan kendi kod bitinde kapsüllemelisiniz. Yani, yükleyebileceğiniz, oynatmaya başlayabileceğiniz, oynatmayı durdurabileceğiniz ve ekranda belirli bir yerde oluşturmayı söyleyebileceğiniz bir animasyon nesnesine sahip olun.
Esnek bir yaklaşım, bu tür bilgileri kapsüllemek için bir tür animasyon tanımı kullanmaktır. Yani sadece "animasyon X tüm bu karelerdir, sadece onlarla oynayın" demek yerine, biraz daha karmaşık bir şey elde edersiniz.
Örneğin bir çeşit sahte veri formatı ile
animasyonlar =
{
{name = "walk", dosyalar = "walk * .png", frameCount = "12", loop = "true"},
{name = "fire" dosyaları = "fire * .png" frameCount = "6",
events = {
{name = "bulletLeavesGun", çerçeve = "4", param1 = "43", param2 = "30"}
}
}
}
Kodunuz şöyle bir şey söylüyor:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
Olayları nasıl algıladığınız, sizi geri çağıran animasyon koduyla (yani animasyon belirli bir karede oynatıldığı için yeni bir olay algıladığında, yeni olay hakkında bilgi vermek için oyun kodunuzu çağırır) veya böyle animasyon:
List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
if (event.name == "bulletLeavesGun")
{
Vector2 bulletPosition = new Vector2(event.param1, event.param2);
Vector2 actualBulletPosition = new Vector2(
character.x + bulletPosition.x,
character.y + bulletPosition.y);
CreateBulletAt(actualBulletPosition);
}
}
Dikkat edilmesi gereken noktalar:
- Animasyon kodu oyun kodundan ayrı olmalıdır. Oyun kodunuzun animasyon oynatmanın somun ve cıvatalarına çok sıkı bağlı olmasını gerçekten istemiyorsunuz.
- Animasyon kodu, animasyon tanımına göre döngü yapıp yapmayacağını bilir
- Animasyon kodu, animasyonun ne zaman yapıldığını bilir ve 'hey, "ateş" adı verilen animasyon yeni bitti, şimdi ne yapmak istersiniz?
- Animasyon kodu, bir adı ve kendileriyle ilişkili bazı rastgele verileri (param1 ve param2) olması dışında olaylar hakkında hiçbir şey bilmiyor
- Animasyon kodu şu anda hangi karede olduğunu bilir ve yeni bir kareye dönüştüğünde 'oh, şimdi kare 4'teyim, yani "ateş" adı verilen bu etkinliğin yeni gerçekleştiğini, son olaylar listeme göre bunu soran herkese söyleyebilirim '.
Animasyon içinde mermi ateşlemesine ihtiyacınız yoksa, ancak sadece bittikten sonra, olay kavramı olmadan çok daha az karmaşık bir sistemden kurtulabilirsiniz. Ancak yine de animasyonların kendi başlarına oynattığı, ne kadar sürdüğünü bildiği ve bir animasyon tamamlandığında oyun kodunu geri çağırabileceği bir sistem isteyeceksiniz.