Animasyon Durum Makinesi: State Transitions Doğru Tasarımı
# Animasyon Durum Makinesi: State Transitions Doğru Tasarımı
Karakter animasyonlarını yönetmek karmaşıklaşır. Koşu sırasında zıplama, zıplama sırasında yön değiştirme, iniş sırasında durma, tüm bu geçişleri if-else'lerle yazmaya başladığında kod denetim dışına çıkar. Durum Makinesi (State Machine) bu kaos içinde düzen sağlar.
Durum makinesi, karakterin şu anda hangi durumda olduğunu takip eder: Boş (Idle), Koşu (Running), Zıplama (Jump), İniş (Landing). Her durumun kendi kuralları ve geçiş koşulları vardır.
Doğru tasarımda:
- Her durum bağımsız davranır
- Geçişler açık ve kontrollüdür
- Geçersiz kombinasyonlar engellenmiştir
Önce tüm durumları listele:
1enum CharacterState {2Idle,3Running,4Jumping,5Landing,6Falling7}Her durumdan hangi durumlara gidilebileceğini tanımla:
1class StateTransition {2currentState: CharacterState3nextState: CharacterState4condition: () => boolean5}67const transitions: StateTransition[] = [8{ currentState: Idle, nextState: Running, condition: () => inputX!== 0 },9{ currentState: Running, nextState: Jumping, condition: () => isJumpPressed },10{ currentState: Jumping, nextState: Falling, condition: () => velocity.y < 0 },11{ currentState: Falling, nextState: Landing, condition: () => isGrounded },12{ currentState: Landing, nextState: Idle, condition: () => landingAnimationFinished }13]Her frame'de hangi geçişin geçerli olduğunu kontrol et:
1function updateState() {2const validTransitions = transitions.filter(3t => t.currentState === currentState && t.condition()4)56if (validTransitions.length > 0) {7const nextState = validTransitions[0].nextState8onStateChange(currentState, nextState)9currentState = nextState10playAnimation(getAnimationFor(nextState))11}12}Her durum farklı davranış gösterir:
1function onStateChange(from, to) {2switch(to) {3case Running:4character.speed = 55break6case Jumping:7character.velocity.y = 158break9case Landing:10character.speed = 011break12}13}Karakter başında: Idle
Sol tuşu basılı: Running (animasyon: koşu)
Space basılı: Jumping Falling (animasyon: zıplama düşüş)
Yere temas: Landing Idle (animasyon: iniş durma)
Her geçiş yumuşak, hiçbir hata yok.
Yeni durumlar eklemek kolay
Geçişler merkezi bir yerde
Hata ayıklama basit
Kodu başkası anlayabilir
0 yorum