Android threads kesulitan membungkus kepala saya di sekitar desain


9

Saya mengalami kesulitan membungkus kepala saya di sekitar desain game. Pada platform android, saya memiliki aktivitas dan mengatur tampilan kontennya dengan tampilan permukaan khusus. Tampilan permukaan kustom bertindak sebagai panel saya dan saya membuat contoh dari semua kelas dan melakukan semua gambar dan perhitungan di sana.

Pertanyaan: Haruskah saya membuat instance kelas lain dalam aktivitas saya?

Sekarang saya membuat kelas utas khusus yang menangani loop game.

Pertanyaan: Bagaimana saya menggunakan kelas yang satu ini dalam semua kegiatan saya? Atau apakah saya harus membuat turunan terpisah dari kelas utas setiap kali?

Dalam permainan saya sebelumnya, saya memiliki beberapa level yang harus membuat turunan dari kelas utas dan di kelas utas saya harus menetapkan metode konstruktor untuk setiap tingkat yang terpisah dan dalam loop menggunakan pernyataan pergantian untuk memeriksa level mana yang perlu dirender. dan perbarui. Maaf jika itu terdengar membingungkan.

Saya hanya ingin tahu apakah metode yang saya gunakan tidak efisien (yang mungkin) dan bagaimana cara mendesainnya dengan cara yang benar. Saya telah membaca banyak tutorial di luar sana dan saya masih mengalami banyak masalah dengan topik khusus ini. Mungkin tautan ke beberapa tutorial yang menjelaskan hal ini? Terima kasih.

Jawaban:


13

Saya sangat merekomendasikan bahwa Anda memiliki utas render (menggunakan Canvas/ OpenGL ES, Canvasmungkin sedikit lebih mudah untuk diatur) dan utas permainan tempat Anda meletakkan logika permainan Anda.

Untuk benar-benar "memuat" game, Anda dapat membuat kelas GameEngine dan menjadikannya sebagai titik pusat aplikasi Anda. Saat penyaji Anda siap, Anda dapat membuat panggilan balik ke instance GameEngine yang akan membuat dan memulai dua utas menggunakan Runnablerendering Runnableuntuk yang lain dan yang lain untuk logika game.

Kode sampel:

Aplikasi dimulai

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.
}

Wow Terimakasih. Saya suka bagaimana Anda menjelaskannya. Satu penjelasan itu menerangi seluruh konsep bagi saya.
semajhan

@semajhan: Tanyakan saja apakah Anda memiliki lebih banyak masalah. :)

Inilah yang ada di kepala saya: kelas GameEngine yang bertindak sebagai "tautan" atau "referensi" ke semua kelas lain dengan panel. Activity> Panel> GameEngine> semua kelas lainnya.
semajhan

@semajhan: Tepat. Hanya untuk pengetahuan Anda: jika Anda memutuskan untuk pergi dengan OpenGL ESAnda harus tahu bahwa penyaji di OpenGL ESsudah memiliki utas sendiri dan dalam hal ini Anda tidak perlu secara manual membuat dan memulai yang baru Threaddan Runnableuntuk sistem itu.

Abaikan komentar ini.
semajhan

3

Biasanya, loop game Anda mandiri di dalam satu Aktivitas.

saat Anda berganti Activity, Anda menghentikan / mematikan game-loop Anda. Aktivitas terpisah harus sesuai dengan menjeda permainan (misalnya karena Anda telah beralih ke aktivitas "kirim email ke teman" atau "menu utama")

Untuk level tambahan, Anda seharusnya tidak membuat atau merusak semua utas baru ... kecuali jika Anda beralih ke "level-selesai, memuat level berikutnya, harap tunggu" Aktivitas, dan Anda harus memulai kembali "main game" "Aktivitas tetap. Tetapi bahkan dalam kasus itu, Anda tidak benar-benar membuat utas "ekstra", Anda hanya membuat satu utas dalam satu Aktivitas tersebut, dan secara berurutan membunuh / memulai kembali / membunuh / memulai kembali ... dll. Aktivitas tersebut. setiap kali level selesai.


3

Jika Anda mengerti bahasa Jerman, tutorial ini sangat bagus.

Untuk bahasa inggris saya bisa merekomendasikan tutorial ini

Mengenai kelas utas: Saya tidak tahu apakah benar-benar perlu bahwa Anda dapat referensi dari semua kelas dalam aplikasi Anda. Dalam permainan saya, saya memecahkannya seperti itu:

Kelas yang bertanggung jawab untuk menggambar GUI utama memiliki metode render utama. Dalam metode ini disebut kelas utas yang memperbarui semua elemen GUI dan memproses input pengguna.

Thread juga bertanggung jawab untuk mempertahankan framerate yang konstan. Tergantung pada gim yang Anda kembangkan, ini bisa jadi penting.


Tutorial bahasa Jerman itu bagus tetapi diterjemahkan secara kasar oleh google jadi agak sulit untuk dimengerti.
semajhan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.