Android oyunumu nasıl verimli bir şekilde geliştirmeliyim? [kapalı]


11

Boyada yaptığım bir akış şemasının resmini ekledim. Oyun kavramının akış şeması

Resim, oyunumu nasıl geliştirmek istediğimi gösteriyor. Güncellemesi kolay akıllı kodlama ve zaman içinde reklam özellikleri ile harika çalışan bir oyun istiyorum. Hedef platformum Android akıllı telefon ve tüm kodlar XML ile şişirilmiş kaynaklarla java olarak yazacak. Sahte kod yardımcı olacaktır, ancak ben daha çok öneri tercih ve artılarını tavsiye sabit kod arıyor değilim.

Sorularım:

Bu bir oyunu programlamanın iyi bir yolu mu yoksa bunu yapmanın daha iyi yolları var mı? Yapılması gereken değişiklikler var mı? Herhangi bir öneri yararlı olacaktır çünkü ben oyun programlama deneyimli değilim, bu yüzden birkaç oyun yazdı ve verimli bir şekilde çalıştırmak için kodlarını ayarlamak hakkında nasıl bir deneyim gerektiğini bilen birinden tavsiye tercih ediyorum.

Yanıtlar:


12

Android oyunlarının birçoğu, kaydetme / yükleme veya seçenekleri / tercihleri ​​haklı çıkarmak için yeterince büyük değil, sadece tren evinde 10 dakika boyunca hazırlıksız oynandıkları için özel karakterleri ve benzerlerini boş ver.

İlk android oyun için geniş bir kapsamda bir şey yapmaya başladığım hatayı yapma. Bir sürü küçük oyun yapın ve daha büyük bir şey yapın

Android özellikleri akıllıca:

Yapısı:

Hemen hemen tüm oyunu tek bir aktivite sınıfına almanızı tavsiye ederim. Android, her etkinliğin uygulamadaki diğer etkinliklerden yarı bağımsız olarak bir mini uygulama gibi olduğu fikri üzerinde çalışır. Uygulama, kullanıcı en iyi olanı görerek, temelde bir etkinlik yığınıdır.

En üste çıktığınızda, genellikle yok edilir ve kullanıcı yeni bir etkinlik başlattığında (startActivity amacı) yeniden oluşturulur. Bu, faaliyetler arasındaki durumları korumayı zorlaştırır ve tek bir etkinlik mimarisine yol açar

Ana ekranda "Yeni Oyun / Oyunu Yükle / Seçenekler" menüsüyle bir ana ekran türü etkinliği gerçekleştirmek ve başlatma etkinliğini gerçekleştirmek isteyebilirsiniz. Bununla birlikte, oyun etkinliğinizde de aynı işlevlerin çoğuna sahip olacak bir oyun içi menüye sahip olmanız gerekir.

Kendi uygulamam, yeni bir oyun başlatan, kaydet, yükle, seçenekleri değiştir işlevlerine sahip bir "MenuActivity" yaptım. Daha sonra HomeActivity'm, GameActivity'm gibi bunu genişletiyor.

Her şey bir Etkinlik sınıfında olduğundan, etkinlik sınıflarından bir heirarşi yapmayı ve özel, korumalı ve varsayılan kapsam lotlarını kullanmanızı tavsiye ederim. Bunu yaparak, yönetilemez bir Etkinlik dosyasına sahip olmaktan vazgeçmek için en azından işleri farklı bir dosyaya bölebilirsiniz. Örneğin, kendi uygulamam için:

GraphicsEngine extends MenuActivity.

PhysicsEngine extends GraphicsEngine.

GameLogicActivity extends PhysicsEngine.

UIActivity extends GameLogicActivity.

Uygulamam 3D opengl-es olduğundan, yaptığım birçok şey çapraz aktiviteler yapmıyor, bu yüzden her şey aynı aktivitede, bu yüzden belki bir aktivite mimarisi kullanmaya eğilimliyim

-

Threading

Oyun etkinliği için, iki iş parçacığına sahipsiniz (veya 3B opengl şeyler yapıyorsanız 3). Bir iş parçacığı UI / ana iş parçacığıdır. Bu faaliyet başlar ve içinde çalışır ve android tarafından size verilen ipliktir.

Bu UI iş parçacığı, UI öğelerini (görünümler, düzenler vb.) Güncelleyebileceğiniz tek öğedir. Ayrıca, kullanıcı girişi için herhangi bir dinleyicinin çalışacağı da budur. UI iş parçacığının mekaniğini görmüyorsunuz, sadece arka planda bir yerde bir döngü halinde çalışıyor.

İkinci iplik, kendinizi ( tüm eksikliklerine rağmen AsyncTask kullanmanızı tavsiye ederim ) olun. Bu, hareketi güncellemek, çarpışmaları hesaplamak, savaş hesaplamaları vb.Gibi normal bir oyun döngüsünde yaptığınız tüm UI olmayan şeyleri yapar.

Bu AsyncTask iş parçacığını / sınıfını etkinliğinizin bir iç sınıfı olarak yaparsınız. Bu şekilde, Vector<Spaceship>hem kullanıcı arabirimi iş parçacığı hem de oyun döngüsü iş parçacığı tarafından erişilebilen etkinlik çapında bazı nesneleriniz ( ) olabilir.

Oyun döngüsü iş parçacığında oyun mantığı devam ettiği için, değişkenlerin değerlerini gerçekten değiştirmesi gereken tek iş parçacığı budur (tank hızını güncelleme, oyuncu HP'sini azaltma). UI iş parçacığı sadece değerleri okuyor, bu nedenle en az eşzamanlılık sorunu olmalı.

Zor bit, oyun döngü iş parçacığının isteği üzerine güncellemeler yapmak için UI iş parçacığını alıyor. Bunu yapmak için bir çift yol var. AsyncTask belgelerini okursanız, publishProgress () / onProgressUpdate () yöntemine sahiptir. Bu aslında UI iş parçacığının sonraki döngüye yapılacaklar sırasına bir şeyler ekliyor.

Handler tam olarak aynı şeyi yapar, burada handleMessage () yöntemini uygularsınız ve bu yöntem aslında UI iş parçacığı sonraki döngü tarafından yürütülür.

Son olarak, UI iş parçacığında olan herhangi bir kullanıcı girişi, UI öğelerini hemen ondan güncelleyebilirsiniz (böylece herhangi bir onClick / onTouch dinleyicisinin uygulanması içinde). Oyun nesnelerini güncellemeniz gerekiyorsa, senkronize etme gibi şeyleri kullanabilir veya UI iş parçacığı gibi AsyncTask'a kendi güncelleştirme kuyruğunuzu uygulayabilirsiniz, oyun döngüsünü bir sonraki çalıştırdığında geçer

Android Diş Açma Kılavuzu .

-

UI

Tek etkinlik içindeki gerçek kullanıcı arayüzü yapısına gelince, temel düzeniniz olarak bir çerçeve düzenine sahip olmanızı öneririm. Çerçeve düzenindeki alt öğeler bir kuyruk gibi çalışır. İlk eleman ilk önce çizilir, ikincisi ilkin üzerine, üçüncüsü ikincinin üzerine çizilir.

Bu şekilde, birden çok XML mizanpaj dosyanız olabilir ve çerçeve mizanpajının çocuklarını yöneterek, görünüm kümelerini kolayca içeri ve dışarı değiştirebilirsiniz.

Her zaman altta SurfaceView varsa (çerçeve düzeninde ilk çocuk), o zaman yüzey görünümünün üst kısmında her zamanki android görünümlerini / widget'ları (düğmeler, metin görünümleri, kaydırma görünümleri) vb. Oyunun grafik kısmı.

Örneğin, bir şey yükleniyorsa, oyun döngüsünü duraklatabilir / her şeyi atlamasını sağlayabilir, çerçeve düzenine son çocuk olarak opak bir 'yükleme' ekranı ekleyebilirsiniz ve kullanıcı kendi ekranında 'yükleme' göründüğünü görecektir , diğer görünümlerin arkasında olduğunu bilmiyor. Bu şekilde, her eklendiklerinde / kaldırıldıklarında kurulumu uzun süren veya komplikasyonlara neden olan görünümleri kaldırmanız gerekmez.

Ayrıca View.setVisibility lotlarını kullanmanızı tavsiye ederim. Örneğin, temel çerçeve düzeninize tam bir 'envanter' düzeni ekleyebilir ve ardından kullanıcı envanterini görüntülemek için tıkladığında bunun üzerine setVisibility (View.Visible) ve tekrar kapattıklarında setVisibility (View.Gone) ayarını yapabilirsiniz. Bu şekilde, çerçeve düzeninin alt öğelerini, yalnızca her şeyi eklemek ve kullanıcının farklı şeyler yaptığı ve ne zaman görünür olduğu / görünmez hale getirdiği kadar yönetmezsiniz.

Bu tekrar diş açmaya yardımcı olur; kullanıcı envanterini açmak için tıkladığında, onCLickListener UI iş parçacığında işlenir, envanter burada görünür hale getirilir ve yine UI iş parçacığından, tüm oyun nesnelerindeki alıcılarla birlikte updateInventory yöntemi çağrılır

Tek bir etkinlik / çerçeve düzeni fikri hakkında daha önceki bir soru için yaptığım şema :

resim açıklamasını buraya girin


bu yüzden sizce tüm oyun döngüsü bileşenlerini tutmak için bir çerçeve düzenim olmalı, değil mi? Bunu yapsaydım, nasıl sanal bir d-pad / sanal analog diyelim, SurfaceView ile etkileşime sahip olmak için HUD sınıfındaki görünümleri nasıl alabilirim? Daha önce böyle şeyler yapmayı denedim ve hatalarla karşılaştım.
kdavis8

Biraz daha net hale getirmek için cevabımı yeniden yazacağım
Spoon Thumb

Cevabımı tekrar yazdım. Daha net hale getirmesini umuyoruz
Kaşık Thumb

Gerçekten şeyler
yazıyor

11

Diyagramınızda gördüklerimin çoğu UI ile ilgili ve bu oldukça makul görünüyor. Diyagramınızın gerçek oyun mantığı için ayrılmış küçük bir kısmı vardır ve bu çok belirsizdir.

Bence çok çalışıyorsun. Sadece kod yazmaya başlamanızı öneririm. Belirli bir problemi seçin ve çözmeye başlayın. O kadar çok şey öğreneceksiniz ki, zamanla sorun alanınız hakkında daha iyi bir fikre sahip olursunuz, tamamen farklı bir bakış açısına sahip olursunuz.


2
Buna daha fazla katlanamadım. Oyuna ve tercihlerinize uygun bir tasarım mimarisi seçin, sonra kodlamaya başlayın. Belirli bir performans engeline bastığınızda, çalışana kadar optimize edin. Oyununuzdaki her bir mekanizmanın kendi performans özellikleri ve potansiyel optimizasyonları olacak - bunları bir bütün olarak değil, bireysel olarak düşünmelisiniz.
Polinom

oyun mimarisi için bu tür kalıplar için bir rehber nerede bulunabilir? bu benim için gerçekten yararlı olurdu.
bot_bot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.