Android konuları başımı tasarımın etrafına sarmada sorun yaşıyor


9

Başımı oyun tasarımına dolamakta güçlük çekiyorum. Android platformunda bir etkinliğim var ve içerik görünümünü özel bir yüzey görünümü ile ayarlıyorum. Özel yüzey görünümü panelim gibi davranıyor ve tüm sınıfların örneklerini oluşturuyorum ve orada tüm çizim ve hesaplamaları yapıyorum.

Soru: Bunun yerine etkinliğimdeki diğer sınıfların örneklerini oluşturmalı mıyım?

Şimdi oyun döngüsünü işleyen özel bir iş parçacığı sınıfı oluşturuyorum.

Soru: Bu tek sınıfı tüm aktivitelerimde nasıl kullanırım? Yoksa her seferinde genişletilmiş iş parçacığı sınıfının ayrı bir örneğini oluşturmak zorunda mıyım?

Önceki oyunumda, iş parçacığı sınıfının bir örneğini oluşturmak zorunda olan birden çok düzeyim vardı ve iş parçacığı sınıfında her ayrı düzey için yapıcı yöntemleri ayarlamak zorunda kaldım ve döngüde hangi seviyeyi oluşturması gerektiğini kontrol etmek için bir anahtar deyimi kullandım ve güncelleyin. Kulağa kafa karıştırıcı geliyorsa özür dilerim.

Sadece kullandığım yöntemin verimsiz olup olmadığını (ki muhtemelen) ve nasıl doğru şekilde tasarlanacağını bilmek istiyorum. Orada birçok öğretici okudum ve hala bu konu ile ilgili çok sorun yaşıyorum. Belki bunu açıklayan bazı eğiticilere bir bağlantı olabilir? Teşekkürler.

Yanıtlar:


13

Bir render iş parçacığına ( Canvas/ OpenGL ES, kullanmak Canvasmuhtemelen biraz daha kolay) ve oyun mantığınızı koyduğunuz bir oyun iş parçacığına sahip olmanızı şiddetle tavsiye ederim .

Aslında oyunu "yüklemek" için bir GameEngine sınıfı oluşturabilir ve uygulamanızın merkezi noktası haline getirebilirsiniz. Oluşturucunuz kullanıma hazır olduğunda, GameEngine örneğine, oluşturma için a ve oyun mantığı için bir Runnablebaşka kullanarak iki iş parçacığı oluşturacak ve başlatacak bir geri arama oluşturabilirsiniz Runnable.

Basit kod:

Uygulama başlangıcı

private GameEngine engine;
private CanvasRenderer renderer;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   // Create instances of your two Runnable classes and pass that into
   // the GameEngine constructor.
   // Create an instance of the game engine.
   engine = new GameEngine(canvasRunnable, gamelogicRunnable);
   renderer = new CanvasRenderer(this, engine); 
   setContentView(renderer); 
}

CanvasRenderer

private GameEngine engine;    

// Save your instance from the GameEngine reference in your constrcutor and make
// a global initializion for your GameEngine instance.  

@Override
public void surfaceCreated(SurfaceHolder holder) {  
   // One time setup here.
   // When your view is ready, make this callback to the 
   // GameEngine.
   engine.surfaceIsReady();
}

GameEngine

private Thread canvasThread;
private CanvasRunnable canvasRunnable;
// You should be able to figure out how to create a second thread
// where you should put your game logic. :)

// Constructor stuff like creating instances of your threads
// and passing references as you wish to those.
// Don't start the threads here.
// Remember to set references from your Runnable's into your Thread's 
// instances here!

/**
 * Callback. Now your renderer is ready and you
 * can start your threads.
 */
public void surfaceIsReady() {
   thread.setName("Canvas");
   thread.start();
   // Same for game logic.
}

Vay canına, teşekkür ederim. Nasıl anlattığını sevdim. Bu açıklama bana tüm konsepti aydınlatıyor.
semajhan

@semajhan: Sadece daha fazla problemin olup olmadığını sor. :)

Bu kafamda ne var: GameEngine sınıf panel ile diğer tüm sınıflar için bir "bağlantı" veya "başvuru" olarak davranır. Etkinlik> Panel> GameEngine> diğer tüm sınıflar.
semajhan

@semajhan: Kesinlikle. Yalnızca sizin haberiniz için: ile gitmeye karar verirseniz OpenGL ESsize oluşturucusu bilmeli OpenGL ESzaten kendi iş parçacığı vardır ve bu durumda oluşturmak ve yeni bir başlangıç elle gerekmez Threadve Runnablebu sistem için.

Bu yorumu yoksay.
semajhan

3

Genellikle, oyun döngünüz tek bir Etkinlik içinde bağımsızdır.

Etkinliği değiştirdiğinizde oyun döngünüzü duraklatır / öldürürsünüz. Ayrı etkinlikler yine de oyunu duraklatmaya karşılık gelmelidir (örneğin, "arkadaşlarınıza e-posta gönder" veya "ana menü" etkinliğine geçtiğiniz için)

Ekstra seviyeler için, yeni bir konu oluşturmamalı veya destorying yapmamalısınız ... "seviye tamamlandı, bir sonraki seviyeye yükleniyor, lütfen bekleyin" Etkinliği ve ana oyunu yeniden başlatmanız gerekmedikçe "Yine de etkinlik. Ancak bu durumda bile, gerçekten "ekstra" iş parçacıkları yapmıyorsunuz, yalnızca bir Etkinlikte bir iş parçacığı oluşturuyorsunuz ve bu Etkinliği sırayla öldürüyor / yeniden başlatılıyor / öldürüyor / yeniden başlatıyorsunuz ... vb. her seviye tamamlandığında.


3

Almanca anlıyorsanız, bu eğitim çok güzel.

İngilizce dil için tavsiye ederim bu eğitimi

İş parçacığı sınıfı ile ilgili: Uygulamanızdaki tüm sınıflardan başvurabileceğinizin gerçekten gerekli olup olmadığını bilmiyorum. Oyunumda şu şekilde çözdüm:

Ana GUI'yi çizmekten sorumlu olan sınıf, geçersiz kılınmış bir oluşturma yöntemine sahiptir. Bu yöntemde, tüm GUI öğelerini güncelleyen ve kullanıcı girişlerini işleyen bir thread sınıfı çağrılır.

İplik ayrıca sabit bir kare hızı sağlamaktan da sorumludur. Geliştirdiğiniz oyuna bağlı olarak bu önemli olabilir.


Bu Alman öğretici güzel ama kabaca vai google çevrildi, bu yüzden anlamak biraz zor.
semajhan
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.