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,
6Falling
7}

Her durumdan hangi durumlara gidilebileceğini tanımla:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1class StateTransition {
2currentState: CharacterState
3nextState: CharacterState
4condition: () => boolean
5}
6
7const 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)
5
6if (validTransitions.length > 0) {
7const nextState = validTransitions[0].nextState
8onStateChange(currentState, nextState)
9currentState = nextState
10playAnimation(getAnimationFor(nextState))
11}
12}

Her durum farklı davranış gösterir:

1function onStateChange(from, to) {
2switch(to) {
3case Running:
4character.speed = 5
5break
6case Jumping:
7character.velocity.y = 15
8break
9case Landing:
10character.speed = 0
11break
12}
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

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz