Bagaimana seharusnya saya memiliki input kunci / mouse dalam game java lanjutan?

9

Saya seorang programmer otodidak, jadi saya tidak tahu cara yang tepat untuk melakukan sesuatu. Saya telah membuat game sederhana seperti asteroid dan ular, tetapi dalam game itu, Anda dapat dengan mudah memodifikasi variabel dalam fungsi keyevent. Inilah cara saya melakukannya di game Asteroid sederhana saya:

/*
* key listener events
*/
public void keyReleased(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = false;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = false;
            break;

        case KeyEvent.VK_UP:
            accel = false;
            break;

        case KeyEvent.VK_1:
            cls = true;
            break;
        case KeyEvent.VK_ENTER:
            break;
        case KeyEvent.VK_SPACE:
            fire = false;
    }
}
public void keyTyped(KeyEvent K){}
public void keyPressed(KeyEvent k){
    int keyCode = k.getKeyCode();

    switch(keyCode){

        case KeyEvent.VK_LEFT:
            turnLeft = true;
            break;

        case KeyEvent.VK_RIGHT:
            turnRight = true;
            break;

        case KeyEvent.VK_UP:
            accel = true;
            break;

        case KeyEvent.VK_1:
            cls = false;
            break;
        case KeyEvent.VK_ENTER:
            clearAllBullets();
            break;
        case KeyEvent.VK_SPACE:
            fire = true;
    }
}

Jika saya membuat game yang lebih maju (dengan menu utama, opsi, main game, dll.), Bagaimana saya harus melakukan input tombol / mouse?

Juga, jika saya masuk ke pemain tunggal, haruskah saya memasukkan semua kode gameplay ke dalam satu kelas? Apakah ada cara untuk menempatkan kode pemain tunggal ke dalam kelas yang terpisah dan entah bagaimana input kunci masih memodifikasi variabel dan semacamnya?

Steven Rogers
sumber
+1 Jawaban Anda memungkinkan saya mempelajari sesuatu yang baru dari jawaban bearcdp. Terima kasih untuk bertanya! =)
Will Marcouiller

Jawaban:

3

Saya bukan ahli, dan saya menyarankan untuk memisahkan kontrol dan logika bisnis / permainan / menu (beri nama).

Saya sudah menjawab pertanyaan serupa sehubungan dengan memberikan arahan kepada Snake dalam game yang dirancang dengan kelas. Java menjadi bahasa berorientasi objek, saya kira Anda dapat menulis kelas dan hal-hal yang memadai. Kemudian, ketika Anda telah menulis kelas objek Anda, jika itu agar objek Anda perlu bereaksi terhadap beberapa tombol dan klik mouse, saya akan pergi dengan kelas Controller yang tahu apa yang saat ini ditampilkan di layar, kemudian beri tahu objek ini apa yang seharusnya lakukan tergantung pada tombol yang telah ditekan atau wilayah yang telah diklik.

Inilah tautan ke pertanyaan yang saya katakan tentang yang saya jawab tentang memisahkan kontrol dari objek logika. Ini juga termasuk contoh kode yang menggambarkan pemikiran saya.

Memindahkan sprite saya di XNA menggunakan kelas

( Sayangnya, belum ada jawaban yang diterima oleh OP, jadi kami tidak tahu pasti apakah itu menyelesaikan masalahnya. Selain itu, saya selalu merancang cara ini dan tidak menemukan masalah dengan melakukan sejauh ini. )

Sekarang saya tahu, ini ditandai XNA. Ide atau desain adalah tingkat arsitektur yang lebih tinggi daripada teknologi yang digunakan, sehingga desain ini dapat dengan mudah disesuaikan dengan sintaksis Java. Gagasan umum tetap sama. =)

Saya harap ini membantu! Saya akan senang membantu lebih lanjut ketika saya bisa, tanyakan saja! =)

Will Marcouiller
sumber
5

Jawaban Will menunjukkan kepada Anda apa yang mungkin paling fleksibel dan langsung, dan saya akan merekomendasikan itu jika yang Anda butuhkan adalah polling input langsung.

Tetapi, jika Anda memerlukan cara mudah untuk memeriksa berbagai kombinasi penekanan tombol sambil menghindari sejumlah besar saklar dan jika pernyataan, Anda dapat menggunakan bit flag enum.

Saya tidak tahu apa yang Anda ketahui tentang bit vektor, jadi inilah gambarannya: Pada dasarnya, Anda memiliki kelas enum yang mewakili semua kunci yang mungkin. Setiap enum harus memiliki nilai yang sesuai dengan bit dalam integer. (yaitu: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014, dll). ( Tautan untuk melakukan ini di Jawa).

Sekarang, karena Anda dapat menyampaikan informasi sekitar hingga 32 (atau 64 jika Anda menggunakan tombol lama), Anda dapat memiliki tabel hash yang mengaitkan vektor bit (int atau panjang) dengan objek yang jatuh semacam antarmuka KeyComboCallback, yang hanya berisi panggilan metode tunggal, Do (), yang dipanggil ketika kombinasi tombol yang terkait ditekan.

Sekarang ketika Anda instantiate / menginisialisasi objek pemain Anda atau objek menu Anda, Anda dapat membuat panggilan ke beberapa jenis manajer input dan meneruskannya semua vektor bit kombinasi kunci yang Anda inginkan dan mengaitkannya dengan kelas dalam anonim.

// ... in your init code for Player

InputManager.map(
    KeyMap.A.val() | KeyMap.B.val() | KeyMap.C.val(), 
    new KeyComboCallback(KeyMap keys) {
        public void Do() {
           this.DoCrazyAwesomeComboAttack();
        }
    });

// ...  continue init

Ini sangat cepat & nyaman di C ++ dan C #, tetapi Java enum adalah khusus, jadi Anda mungkin merasa lebih nyaman untuk membuat kelas KeyCombination atau sesuatu yang akan menyimpan semua informasi ini tanpa khawatir tentang enum. Namun idenya masih sama. Saya menggunakan ini dalam game XNA, dan saya sangat suka fasilitasnya. Anda juga dapat menggunakannya untuk memisahkan daerah input, yang berguna untuk membandingkan berbagai bagian keyboard atau gamepad secara terpisah (mungkin berguna untuk dua pemain pada satu keyboard).

michael.bartnett
sumber
Saya suka posting Anda, terutama "this.DoCrazyAwesomeComboAttack ();" XD. Jalanmu tampaknya menjadi cara yang lebih baik untuk hal-hal rumit, jadi aku akan tetap dengan hal-hal yang lebih mudah. Terima kasih untuk bantuannya!
Steven Rogers
+1 Jawaban yang sangat menarik! Saya telah belajar dari jawaban ini dan akan melihatnya ketika saya memiliki lebih banyak waktu untuk dihabiskan dalam pengembangan game hobi saya. Dan terima kasih telah memberi tahu bahwa jawaban saya baik, meskipun itu untuk hal-hal yang lebih sederhana, yang saya tidak akan membantah, karena saya seorang pemula di GD. =) Terima kasih!
Will Marcouiller