iMedre

SKAction Sınıfı Nedir? Sprite Kit Derinlikleri #25

Merhaba bu yazıda SKAction Sınıfını anlatacağım. Keyifli Okumalar.

Kısaca SKAction  Nedir?

Bir SKNode tarafından yapısını veya içeriğini değiştirmek için yürütülen bir nesne.

Genel Bakış

Bir SKAction nesnesi, sahnede bir düğüm tarafından yürütülen bir eylemdir (SKScene). Eylemler, çoğunlukla bağlı oldukları düğümün yapısını ve içeriğini değiştirmek için kullanılır, ancak sahnede başka değişiklikler de yapabilir. Son olarak, bir düğüm nesnenin çalışmasını, run (_ : ) yöntemi ile iletir.

Çoğu işlem, bir düğümün konumunu, rotasyonu veya ölçeği gibi özelliklerini değiştirmenize izin verir. Bazı eylemler, yalnızca bir sprite’ın rengini veya doku özelliklerini canlandırabilmenizi sağlayan, yalnızca SKSpriteNode nesnelerine uygulanır.

 

Bazı aksiyonlar birden çok aksiyon içerebilir:

  • Bir sequence eylemi birden fazla çocuk eylemine sahiptir. Sıradaki her eylem, önceki eylem bittikten sonra başlar.
  • Bir group eyleminde birden fazla çocuk eylemi vardır. Grupta saklanan tüm eylemler aynı anda yürütülmeye başlar.
  • Repeating bir eylem, tek bir çocuk eylemini saklar. Çocuk eylemi tamamlandığında, yeniden başlatılır.

Gruplar, arrayler ve repeating eylemler gruplanabilir. Eylemleri bir araya getirme yeteneği, bir düğüme çok karmaşık davranışlar eklemenizi sağlar.

Node’lara Aksiyon Ekleme

Her eylem, sahneyi yapmak istediğiniz değişikliği açıklayan opak bir nesnedir. Tüm eylemler SKAction sınıfı tarafından uygulanır; görünür alt sınıf yoktur. Bunun yerine, farklı türlerdeki eylemler, sınıf yöntemleri kullanılarak başlatılır. Örneğin, aşağıdakileri yapmak için kullanacağınız en yaygın şeyler şunlardır:

  • Bir düğümün konumunu ve yönünü değiştirme.
  • Bir düğümün boyutunu veya ölçekleme özelliklerini değiştirme.
  • Bir düğümün görünürlüğünü değiştirmek veya yarı saydam yapmak.
  • Bir sprite düğümünün içeriklerini değiştirerek bir array texture canlandırır.
  • Bir sprite düğümünü renklendirmek.
  • Basit sesler çalmak.
  • Düğüm ağacından bir düğümü çıkarma.
  • Bir blok çağırma.
  • Bir nesne üzerinde bir selector çağırmak.

Bir eylem oluşturduktan sonra, türü değiştirilemez ve özelliklerini değiştirmek için sınırlı bir yeteneğiniz vardır. SpriteKit, bunları çok verimli bir şekilde yürütmek için hareketlerin değişmez yapısından yararlanır.

Eylemler anlık veya anlık olmayabilir:

Anlık bir eylem, tek bir animasyon çerçevesinde başlar ve tamamlar. Örneğin, bir düğümü ebeveyninden kaldırma eylemi, bir düğümün kısmen kaldırılamadığından anlık bir işlemdir. Eylem yürütüldüğünde, düğüm hemen kaldırılır.

Ani olmayan bir eylemin, etkilerini canlandırdığı bir süresi vardır. Gerçekleştirildiğinde eylem, eylem tamamlanana kadar animasyonun her karesinde işlenir.

Node’lar Aksiyonları Çalıştırır

Bir eylem sadece bir düğümü çalıştırmak için söyledikten sonra yürütülür. Bir eylemi çalıştırmanın en basit yolu, düğümün run (_ 🙂 yöntemini çağırmaktır. Liste 3 yeni bir hareket eylemi oluşturur ve ardından düğümü yürütmesini söyler.

let moveNodeUp = SKAction.moveBy(x: 0.0,
                                 y: 100.0,
                                 duration: 1.0)
rocketNode.run(moveNodeUp)

 

Bir hareket eyleminin bir süresi vardır, bu nedenle bu eylem, eylemin süresini aşana kadar birçok animasyon karesi üzerinden sahne tarafından işlenir. Animasyon tamamlandıktan sonra, eylem düğümden kaldırılır.

Eylemleri istediğiniz zaman çalıştırabilirsiniz. Ancak, sahne işleme eylemleri sırasında bir düğüme eylemler eklerseniz, yeni eylemler aşağıdaki çerçeveye kadar yürütülmeyebilir.

Bir düğüm, farklı zamanlarda bu eylemler gerçekleştirilse bile, birden fazla eylemi aynı anda çalıştırabilir. Sahne, her bir eylemin ne kadar ilerlediğini izler ve eylemin düğümde yaptığı etkiyi hesaplar. Örneğin, aynı düğümü taşıyan iki eylemi çalıştırırsanız, her iki eylem de her karede değişiklikler uygular. Hareket eylemleri eşit ve zıt yönlerdeyse, düğüm durağan kalacaktır.

Eylem işleme sahneye bağlı olduğundan, sunulan bir sahnenin düğüm ağacının parçası olduğunda işlenir

Bir düğüm herhangi bir eylem gerçekleştiriyorsa, hasActions () metodu true değerini döndürür.

Çalışan Aksiyonları İptal Etme

Bir düğümün çalıştığı eylemleri iptal etmek için removeAllActions () yöntemini çağırın. Tüm eylemler hemen düğümden kaldırılır. Kaldırılan bir eylemin süresi varsa, düğümde halihazırda yapılan tüm değişiklikler bozulmadan kalır, ancak daha fazla değişiklik yapılmaz.

Bir Eylem Tamamlandığında Bildirim Alma

Run (_: completion: ) yöntemi, run (_: ) yöntemiyle aynıdır, ancak eylem tamamlandıktan sonra, bloğunuz çağrılır. Bu bildirim sadece eylem tamamlanmaya devam ederse çağrılır. Eylem tamamlanmadan önce kaldırılırsa, tamamlama işleyicisi asla çağrılmaz. Aşağıdaki kod bir hareketli grafik üzerinde bir fadeOut (withDuration: ) eylemini çalıştırarak bir hareketli çizgiyi ortadan kaldırır ve eylem tamamlandıktan sonra yeni bir sahne sunar:

let fadeOut = SKAction.fadeOut(withDuration:2)
node.run(fadeOut) {
    skView.presentScene(newScene)
}

Aksiyonlar Üzerinde Hassas Kontrol için Adlandırılmış Aksiyonlar Kullanma

Normalde, bir düğümün hangi eylemleri gerçekleştirdiğini göremezsiniz ve eylemleri kaldırmak isterseniz, tümünü kaldırmanız gerekir. Belirli bir eylemin belirli bir eylemi yürütüp yürütmediğini veya kaldırıldığını görmeniz gerekiyorsa, adlandırılmış eylemleri kullanmanız gerekir. Adlandırılmış eylem, eylemi tanımlamak için benzersiz bir anahtar adı kullanır. Bir düğümdeki adlandırılmış eylemleri başlatabilir, kaldırabilir, bulabilir ve değiştirebilirsiniz.

let moveNodeUp = SKAction.moveBy(x: 0.0,
                                 y: 100.0,
                                 duration: 1.0)
rocketNode.run(moveNodeUp,
               withKey: "ignition")

 

Aşağıdaki anahtar tabanlı yöntemler kullanılabilir:

  • eylemi çalıştırmak için run (_: withKey : ) yöntemini çalıştırın. Aynı anahtara sahip bir eylem zaten yürütülürse, yeni eylem eklenmeden önce kaldırılır.
  • Bu anahtarla bir eylemin zaten çalışıp çalışmadığını belirlemek için action (forKey : ) yöntemi.
  • eylemi kaldırmak için removeAction (forKey : ) yöntemi.

Bir hareketli grafiğin hareketini kontrol etmek için adlandırılmış bir eylemi nasıl kullanabileceğinizi gösterir. Kullanıcı sahneyi tıkladığında, yöntem çağrılır. Kod, tıklamanın gerçekleştiği yeri belirler ve ardından hareketli grafiğe o konuma geçmek için bir eylemi yürütmesini söyler. Süre, önceden hesaplanarak, hareketli grafiğin her zaman sabit bir hızla hareket ettiği görülmektedir. Bu kod, run (_: withKey 🙂 yöntemini kullandığı için, hareketli grafik zaten hareket halindeyse, önceki hareket akış ortasında durdurulur ve yeni eylem geçerli konumdan yeni konuma taşınır.

Diğer Aksiyonları Yürüten Aksiyonlar

SpriteKit, sahnenizdeki düğümlerin özelliklerini değiştiren birçok standart eylem türü sunar. Ama eylemler onları birleştirirken gerçek gücünü gösterir. Eylemleri birleştirerek, tek bir eylemi yürüterek çalıştırılan karmaşık ve etkileyici animasyonlar oluşturabilirsiniz. Bir bileşik eylem, temel eylem türlerinden herhangi biri ile çalışmak kadar kolaydır. Bunu akılda tutarak, dizileri, grupları ve tekrar eden eylemleri öğrenmenin zamanı geldi.

  • Bir sequence eylemi (veya sekansı) birden fazla çocuk eylemine sahiptir. Sıradaki her eylem, önceki eylem bittikten sonra başlar.
  • Bir group eylemi (veya grubu) birden fazla çocuk eylemine sahiptir. Grupta saklanan tüm eylemler aynı anda yürütülmeye başlar.
  • Repeating bir eylemin tek bir çocuk eylemi vardır. Çocuk eylemi tamamlandığında, yeniden başlatılır.

Sequensler Aksiyonları Seride Başlatır

Bir dizi, ardışık olarak çalışan bir dizi eylemdir. Bir düğüm bir sıra çalıştırdığında, eylemler ardışık sırada tetiklenir. Bir eylem tamamlandığında, sonraki eylem hemen başlar. Dizideki son eylem tamamlandığında, dizi eylemi de tamamlanır.

Aşağıdaki kod, bir dizi başka eylemler kullanılarak bir dizinin oluşturulduğunu gösterir. Bu örnekte dikkat edilmesi gereken birkaç şey vardır:

  • Bekleme eylemi genellikle yalnızca dizilerde kullanılan özel bir eylemdir. Bu eylem sadece bir süre bekler ve sonra hiçbir şey yapmadan biter; Bir dizinin zamanlamasını kontrol etmek için bunları kullanırsınız.
  • RemoveNode eylemi anlık bir işlemdir, bu nedenle yürütmek için zaman harcamaz. Bu eylemin dizinin bir parçası olmasına rağmen, aşağıdaki zaman çizelgesinde görünmediğini görebilirsiniz. Ani bir eylem olarak, fade eylemi tamamlandıktan hemen sonra başlar ve tamamlanır. Bu eylem diziyi sonlandırır.

Paralel Olarak  Aksiyonların Grup Çalışmaları

Grup eylemi, grubun yürütüldüğü anda tümünün çalıştırıldığı eylemler topluluğudur. Eylemlerin senkronize edilmesini istediğinizde gruplar kullanırsınız. Örneğin, aşağıdaki kod, ekran boyunca yuvarlanan bir tekerleğin yanılsamasını vermek için bir hareketli grafiği döndürür ve döndürür.

let wheel = scene.childNode(withName: "wheel") as! SKSpriteNode
let circumference = wheel.size.height * CGFloat.pi
let oneRevolution = SKAction.rotate(byAngle: -CGFloat.pi * 2,
                                    duration: 2.0)
let moveRight = SKAction.moveBy(x: circumference,
                                y: 0, duration: 2.0)
let group = SKAction.group([oneRevolution, moveRight])
wheel.run(group)

Bir gruptaki eylemler aynı anda başlasa da, gruptaki son eylem bitene kadar grup tamamlanmaz. Aşağıdaki kod, farklı zamanlama değerleriyle eylemleri içeren daha karmaşık bir grup gösterir. Sprite, dokuları boyunca canlandırır ve ekranı iki saniyelik bir süre boyunca hareket ettirir. Bununla birlikte, ilk saniyede, hareketli grafik tam saydamlıktan uzaklaşır ve katı bir görünüme geçer. Aşağıdaki kod, grafiği oluşturan iki eylemin grup animasyonunun yarısını bitirdiğini göstermektedir. Grup diğer iki eylem tamamlanana kadar devam eder.

sprite.setScale(0)
let animate = SKAction.animate(with: textures,
                               timePerFrame: 2 / TimeInterval(textures.count))
let moveDown = SKAction.moveBy(x: 0,
                               y: -200,
                               duration: 2)
let scale = SKAction.scale(to: 1,
                           duration: 1)
let fadeIn = SKAction.fadeIn(withDuration: 1)
let group = SKAction.group([moveDown, scale, fadeIn])
sprite.run(group)

 

Yinelenen Eylemler Başka Bir Hareketi Birden Çok Kez Yürütür

Yinelenen bir eylem, başka bir eylemi döngüye alır, böylece birden çok kez tekrarlanır. Yinelenen bir eylem yürütüldüğünde, içerdiği eylemi yürütür. İlmeklemiş eylem tamamlandığında, yinelenen eylem tarafından yeniden başlatılır. Aşağıdaki kod, yinelenen eylemleri oluşturmak için kullanılan oluşturma yöntemlerini gösterir. Bir eylemi sınırlı sayıda tekrar eden bir eylem veya süresiz olarak bir eylemi tekrarlayan bir eylem oluşturabilirsiniz.

let fadeOut = SKAction.fadeOut(withDuration: 1)
let fadeIn = SKAction.fadeOut(withDuration: 1)
let pulse = SKAction.sequence([fadeOut, fadeIn])
let pulseThreeTimes = SKAction.repeat(pulse,
                                      count: 3)
let pulseForever = SKAction.repeatForever(pulse)

 

Şekil 5, pulseThreeTimes eylemi için zamanlama düzenlemesini göstermektedir. Dizinin bittiğini görebilir, ardından tekrarlar.

Bir grubu tekrarladığınızda, grubun yeniden başlatılmasından önce tüm grubun tamamlanması gerekir. Liste 11 bir hareketli çizgiyi hareket ettiren ve dokularını canlandıran bir grup oluşturur, ancak bu örnekte iki eylemin farklı süreleri vardır. Şekil 6, grup tekrarlandığında zamanlama diyagramını göstermektedir. Doku animasyonunun tamamlandığını görebilir ve daha sonra grup tekrarlanana kadar hiçbir animasyon gerçekleşmez.

let animate = SKAction.animate(with: textures,
                               timePerFrame: 2 / TimeInterval(textures.count))
let moveDown = SKAction.moveBy(x: 0,
                               y: -200,
                               duration: 2)
let group = SKAction.group([animate, moveDown])

İstediğin şey, her eylemin kendi doğal frekansında tekrar etmesiydi. Bunu yapmak için bir dizi yinelenen eylem oluşturun ve sonra bunları birlikte gruplandırın. Liste 12, aşağıdaki şekilde gösterilen zamanlamayı nasıl uygulayacağınızı göstermektedir.

let animate = SKAction.animate(with: textures,
                               timePerFrame: 1 / TimeInterval(textures.count))
let moveDown = SKAction.moveBy(x: 0,
                               y: -200,
                               duration: 2)
let repeatAnimation = SKAction.repeatForever(animate)
let repeatMove = SKAction.repeatForever(moveDown)
let group = SKAction.group([repeatAnimation, repeatMove])

 

Aksiyon Zamanlamasını Yapılandırma

Varsayılan olarak, bir süreyi içeren bir eylem, değişikliklerini belirttiğiniz süre boyunca doğrusal olarak uygular. Bununla birlikte, animasyonların zamanlamasını birkaç özellikten ayarlayabilirsiniz:

Normalde, hareketli bir eylem doğrusal olarak çalışır. Bir animasyon için doğrusal olmayan zamanlama modunu seçmek için bir eylemin timeingMode özelliğini kullanabilirsiniz. Örneğin, eylemi hızlı bir şekilde başlatıp, kalan süreyi yavaşlatabilirsiniz.

Bir işlemin hız özelliği, bir animasyonun oynatma oranını değiştirir. Bir animasyonu varsayılan zamanlanmasından hızlandırabilir veya yavaşlatabilirsiniz.

Hızın 1.0, normal hızdır.

Bir eylemin hız özelliğini 2.0’a ayarlarsanız, eylem bir düğüm tarafından yürütüldüğünde, iki kat daha hızlı oynatılır. Eylemi duraklatmak için değeri 0 olarak ayarlayın. Diğer eylemleri içeren bir eylemin hızını ayarlarsanız (grup, sıra veya yinelenen eylem gibi),  içinde bulunan eylemlere uygulanır. Ekteki eylemler de kendi hız özelliklerinden etkilenir.

Bir düğümün hız özelliği, işlemin hız özelliği ile aynı etkiye sahiptir, ancak oran, düğüm tarafından işlenen tüm eylemlere veya sahne ağacındaki düğümün soyundan herhangi birine uygulanır. SpriteKit, bir animasyonun, eylem için geçerli olan tüm oranları bularak ve bunları çarparak

uygulayacağı hızı belirler.

Aksiyonlarla Çalışmak İçin İpuçlar

Eylemler, bir kez oluşturduğunuzda ve bunları birden çok kez kullandığınızda en iyi şekilde çalışır. Mümkün olduğunda, eylemleri erken oluşturun ve kolayca alınabildiği ve yürütülebileceği bir yere kaydedin.

Eylem türüne bağlı olarak, aşağıdaki konumlardan herhangi biri yararlı olabilir:

  • Bir düğümün userData özelliği
  • Düzinelerce düğüm, aynı eylemleri ve aynı üst öğeyi paylaşıyorsa, ana düğümün userData özelliği
  • Sahnenin genelinde birden çok düğümün paylaştığı eylemler için sahneyi userData özelliği
  • Alt sınıflar varsa, alt sınıfın bir özelliğinde

Bir düğümün özelliklerinin nasıl canlandırıldığı hakkında tasarımcı veya sanatçı girdisine ihtiyacınız varsa, eylem oluşturma kodunu özel tasarım araçlarınıza taşımayı düşünün. Ardından eylemi arşivleyin ve oyun motorunuza yükleyin.

Aksiyonları Ne Zaman Kullanmamalısınız

Her ne kadar eylemler verimli olsa da, bunları oluşturmak ve yürütmek için bir maliyet vardır. Bir düğümün özelliklerinde, animasyonun her karesinde değişiklik yaparsanız ve bu değişikliklerin her bir karede yeniden hesaplanması gerekiyorsa, değişiklikleri doğrudan düğümde yapmaktan ve bunu yapmak için eylemleri kullanmamaktan daha iyidir.

 

 

 

Erdem Özgür

Yorum Ekle

Bizleri Sosyal Medyadan Takip Edebilirsiniz

Utanmana gerek yok, bizimle iletişim kurabilirsin. İnsanlarla tanışmayı ve yeni arkadaşlar edinmeyi seviyoruz.