ML Kit El Hareketi Algılama ve Ashley Sistem Kütüphanesi ile LibGDX Demo Oyun Uygulaması Bölüm 1

Erdal Kaymak
Huawei Developers - Türkiye
5 min readApr 19, 2022

Giriş

Bu demo uygulamada, ML Kit El Hareketi Algılama ve Ashley Sistem kütüphanesi ile LibGDXDemo Oyun Uygulaması oluşturacağız. LibGDX hakkında hiçbir şey bilmiyorsanız, bu bağlantıdan LibGDX ile ilgili ilk makalemi okuyabilirsiniz. İlk olarak, LibGDX Ashley Sistem kütüphanesini ve bu kütüphanenin LibGDX’te nasıl kullanılacağını ve uygulanacağını anlatacağım. Sonrasında ML(Makine öğrenmesi) Kit El Hareketi Algılama ve nasıl uygulanacağını anlatacağım. Son olarak, oyunu oynarken el hareketi algılamayı kullanmak için özel bir kamera görüntüsü oluşturacağız.

Uygulamalarınıza Huawei Hms Core Entegre Edin

Huawei mobil servisleri ile bir uygulama geliştirmeye başlamak için uygulamanızı HMS Core entegre etmeniz gerekir. Uygulamanızı entegre etmek için aşağıdaki bağlantıyı kontrol edin, ayrıca AppGallery Connect’ten ML(Makine öğrenmesi) Kit’i etkinleştirmeyi unutmayın.

Ashley Sistem Kütüphanesi

Ashley Sistem Kütüphanesi , LibGDX organizasyonu altında yönetilen ve oyun geliştirmeye çok uygun bir sistem kütüphanesidir. LibGDX yardımcı program sınıflarına bağlıdır. Varlık sistemleri, nesne sınıflarını kalıtımla zenginleştirmek zorunda kalmadan büyük nesne kümelerine yönelik verileri ve işlevleri yönetmek için farklı bir yol sağlar. Ashley kütüphanesini kullanmak, Unity oyun motorunun sağladığı nesne model yaklaşımına benzer bir yöntemle oyun geliştirme yapmaya olanak sağlar.

Ashley Kütüphanesi, Entity (objeler), System (sistem), Component(bileşen) ve Engine(oyun motorununu) birleşiminden oluşur.

Oyun objeleri (Entity): Oyun dünyamızda bulunan ve bir bileşenler (components) ile kullanılan oyun nesneleridir.

Bileşenler (Component) : Oyun verileridir, oyun objeleri ve sistemlerle birlikte kullanılır.

Sistemler(System): Belirli varlıkları kullanmak için aile(family) ile birlikte kullanılan oyun mantığının oluşturulduğu yerdir. Ashley Kütüphanesinde üç sistem vardır. Bunlar Aralık Sistemi (Interval System), Oyun Objeleri Sistemi (Entity System), Yineleme Sistemidir (Iterating System).

Aile (Family): Aileler, bileşen gruplarıdır. belirli bir sistemde hangi bileşenlerin(component) kullanılması gerektiğini tanımlar. Sistemler yalnızca bu bileşenlerle çalışır.

Oyun Motoru (Engine): Motor sınıfı, Ashley kütüphanesi temel sınıfı ve merkezidir. Motor Sınıfını kullanarak sistemler(systems) ve oyun objeleri(entity) ekleyebiliriz.

ML Kit El Hareketi Algılama

Bu hizmet iki yetenek sağlar: el anahtar noktası algılama ve el hareketi tanıma. Eldeki kilit noktaları algılama özelliği, 21 el anahtar noktasını (parmak uçları, eklemler ve bilekler dahil) algılayabilir ve anahtar noktaların konumlarını geri döndürebilir. El hareketi tanıma özelliği, görüntülerden ve videolardan elin tüm dikdörtgen alanlarının konumlarını ve bir hareketin türünü ve güvenini algılayabilir ve döndürebilir. Bu yetenek, başparmak yukarı/aşağı, OK işareti, yumruk, parmakla kalp ve 1'den 9'a kadar olan sayı hareketleri dahil 14 hareketi tanıyabilir. Her iki yetenek de statik görüntülerden ve gerçek zamanlı kamera akışlarından algılamayı destekler. Bu projede oyuncuyu hareket ettirmek için el hareketi algılamayı kullandım ve bir numaralı işareti seçtim.

Manifest Dosyasında İzinleri Atama

ML Kit SDK El Hareketi Hizmetleri bazı izinler gerektirir.AndroidManifest.xml dosyasındaki izinleri aşağıdaki gibi bildirmeliyiz:

Kod Kısmına Geçmeden Önce Yapılması Gerekenler

AndroidManifest.xml dosyasına izin ekledikten sonra Project/build.gradle dosyasına ML Kit El Algılama Servis bağımlılığını (dependency) eklememiz gerekiyor.

Android’e özel hizmetlerimizi Libgdx Uygulaması için android başlığında Project/build.gradle altında tanımlamalıyız.

Project(“: android”) bağımlılıklarında (dependency) ML (makine ögrenmesi) Kit Hand Gesture Service (el hareketi algılama) bağımlılığını tanımlayabiliriz.

Lens Engine Preview Class

Lens Motorunu ve Grafik Yerleşimini kontrol etmek için bu sınıfı kullanıyoruz. Lens Motorunu başlatmak veya durdurmak için başlat ve durdur işlevlerini kullanabiliriz.

Lens Engine: Lens Engine, kamera başlatma, çerçeve elde etme ve mantık kontrol işlevlerine sahip bir sınıftır.

Grafik Overlay Sınıfı

Bu sınıfı, ilişkili bir önizlemenin (yani kamera önizlemesinin) üzerine yerleştirilecek bir dizi özel grafik oluşturmak için kullanıyorum. Oluşturan, görünüm içinde uygun çizimi ve geçersizliği tetikleyerek grafik nesneleri ekleyebilir, nesneleri güncelleyebilir ve kaldırabiliriz. Kameranın önizleme özelliklerine göre grafiklerin ölçeklenmesini ve aynalanmasını destekler. Buradaki fikir, algılama öğelerinin bir önizleme boyutu olarak ifade edilmesidir, ancak tam görünüm boyutuna ölçeklendirilmeleri ve ayrıca ön kamera durumunda yansıtılması gerekir.

İlişkili [Grafik] öğeleri, çizilen grafiklerin koordinatlarını görüntülemek için dönüştürmek için aşağıdaki yöntemleri kullanmalıdır:
[Graphic.scaleX] ve [Graphic.scaleY], görüntünün boyutunu ayarlar.
Önizleme ölçeğinden görünüm ölçeğine sağlanan değer.
[Graphic.translateX] ve [Graphic.translateY] koordinatı ayarlar
önizlemenin koordinat sisteminden görünüm koordinat sistemine.

Custom Camera View Sınıfı

Bu sınıfı, oyun ekranındaki el hareketlerini ve cihaz kamerasını kullanarak hareket dikdörtgenlerini tanımak için oluşturdum.

Kamerayı oyun ekranında göstermek için iki dinamik Layout oluşturuyorum. Dinamik layoutları oluşturmak için Layout parametreleri (layout params) ve Layout kurallarını (rules) tanımlamalıyız. Layoutların genişliğini ve yüksekliğini tanımlamak için Layout parametreleri(params) kullanıyorum. Ayrıca, ekrandaki ilgili düzenlerin konumunu tanımlamak için kurallar (rules) kullanıyorum.

Hand Analyzer Transactor Sınıfı

Tanıma sonuçlarını işlemek için HandAnalyzerTransactor sınıfını oluşturuyorum. Bu sınıf, MLTransactor<MLGesture> API’sini uygular ve tanıma sonuçlarını almak ve belirli hizmetleri uygulamak için bu sınıftaki transactResult metodunu kullanır.

(12. satırda) Sonuç noktalarının gerçek koordinatını almak için mGraphicOverlay parametresi ve liste parametresi(list param) ile HandGestureGraphic sınıfını çağırıyorum.

Hand Gesture Graphic Sınıfı

Bu sınıfı, sonuç noktalarını almak ve önizlemenin (preview’s coordinates) koordinat sisteminden görünüm koordinatları (view coordinates) sistemine koordinatları ayarlamak için kullanıyorum.

(5–6. satırlarda) her üyenin sonuç listelerini alıyorum ve bu dikdörtgeni translateRect yöntemi yardımıyla gerçek görünüm koordinatlarına çeviriyorum. (8–13. satırlarda). MlGesture.category’yi alıyorum ve elle hareket eden koordinatları almak için rect.centerX() yöntemini kullanıyorum ve oynatıcıyı hareket ettirmek için bu koordinatları sabit değerime veriyorum.

ML Kit Sınıfı

Bu sınıfı android klasörü altında oluşturmalıyız.

Kit Module Objesi

ML Kit sınıfımızı kullanarak Dagger Hilt bağımlılık enjeksiyonu için bu modülü obje olarak oluşturuyoruz.

Android Launcher Sınıfı

Bu sınıfı kamera iznini kontrol etmek ve ML Kit işlevlerini tetiklemek için kullanıyorum. Bu sınıf, oyunu android cihazda oynamak için Android’in ana sınıfıdır.

(15. satırda) ML Kit sınıfı için @Inject enjeksiyonu kullanıyorum. (23. satırda) LensEnginePreview ve GraphicOverlay’i başlatmak için MLKit sınıfı initPreviewAndOverlay yöntemini kullanıyorum. (28–34. satırlarda) İlk olarak kamera iznini kontrol ediyorum ardından MLKit sınıfı yardımıyla LensEngine’i oluşturup başlatıyorum. (37–41. satırlarda) initializeForView yöntemini kullanarak oyun görünümünü oluşturuyorum. Bundan sonra, MLKit sınıfını özel görünümü oyun görünümünün bir parametresiyle başlatmak için kullanıyorum. (133–136. satırlarda) OnPause yönteminde LensEnginePreview’i durduruyorum ve (140. satırda) Lens motorunu bırakıyorum ve onDestroy yönteminde analizörü durduruyorum.

Sonuç

Şimdi LibGDX uygulamasıyla ML Kit El Hareketi Servislerini nasıl uygulayacağımızı ve kullanacağımızı öğrendik. Ayrıca LibGDX oyunu ile özel bir kamera görüntüsünün nasıl oluşturulacağını öğrendik. LibGDX ve hizmetleri hakkında daha fazla bilgi edinmek istiyorsanız bu bağlantıya göz atabilirsiniz. Bu makalenin sonraki bölümünde Libgdx Oyun ekranımızı oluşturarak ve LibGDX Ashley Entity System Library’yi anlayarak LibGDX demo uygulamasına devam edeceğiz. Ayrıca obje (entity) fabrika sınıfı ile oyuncu nesnemizi oluşturacağız, LibGDX oyun demo uygulamasındaki bileşenleri(compnents), sistemleri(systems), motorları(engine) vb. öğrenip kullanacağız.

Bir dahaki yazımda görüşmek üzere…

--

--