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 :