Gelişmiş bir java oyununda tuş / fare girişine nasıl sahip olmalıyım?


9

Kendi kendini yetiştirmiş bir programcıyım, bu yüzden bir şeyler yapmanın uygun yollarını bilmiyorum. Asteroitler ve yılan gibi basit oyunlar yaptım, ancak bu oyunlarda, temel işlevler içindeki değişkenleri kolayca değiştirebilirsiniz. Basit Asteroitler oyunumda şöyle yaptım:

/*
* 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;
    }
}

Daha gelişmiş bir oyun (ana menü, seçenekler, ana oyun vb. İle) yapsaydım, tuş / fare girişini nasıl yapmalıyım?

Ayrıca, eğer tek oyuncuya girecek olsaydım, tüm oyun kodunu bir sınıfa koymalı mıyım? Tek oyuncu kodunu ayrı bir sınıfa koymanın bir yolu var mı ve bir şekilde anahtar girdisi değişkenleri hala değiştiriyor mu?


+1 Cevabınız bearcdp'nin cevabından yeni bir şey öğrenmeme izin verdi. Sorduğunuz için teşekkürler! =)
Marcouiller

Yanıtlar:


3

Ben uzman değilim ve yine de kontrolleri ve iş / oyun / menü (isim) mantığını ayırmanızı öneririz.

Sınıflarla tasarlanmış bir oyunda bir Yılan'a yön verme konusunda benzer bir soruyu zaten yanıtladım. Java, nesne yönelimli bir dil olduğundan, yeterli sınıflar ve şeyler yazabileceğinizi tahmin ediyorum. Daha sonra, nesne sınıfınızı yazdığınızda, nesnenizin bazı tuşlara ve fare tıklamalarına tepki vermesi gerekiyorsa, o anda ekranda neyin görüntülendiğini bilen bir Controller sınıfıyla giderdim, sonra bu nesneye ne olması gerektiğini söylerim basılan tuşa veya tıklanan bölgeye göre yapın.

Kontrollerin nesne mantığından ayrılması hakkında cevap verdiğim, size bahsettiğim sorunun bağlantısı. Ayrıca düşüncemi gösteren bir kod örneği de içerir.

Sprite'ları sınıfları kullanarak XNA'da taşıma

( Ne yazık ki, cevabın hiçbiri OP tarafından henüz kabul edilmedi, bu yüzden endişelerini çözüp çözmediğinden emin değiliz. Ayrıca, her zaman bu şekilde tasarlıyorum ve şimdiye kadar hiçbir sorun bulamadım. )

Şimdi biliyorum, bu XNA olarak etiketlendi. Fikir veya tasarım kullanılan teknolojiden daha yüksek bir mimari düzeydir, bu nedenle bu tasarım sadece Java sözdizimine uyarlanabilir. Genel fikir aynı kalır. =)

Umarım bu yardımcı olur! Mümkün olduğunda daha fazla yardımcı olmaktan memnuniyet duyarız, sadece sor! =)


5

Will'in cevabı, muhtemelen en esnek ve anlaşılır olanı gösterir ve ihtiyacınız olan şey doğrudan giriş sorgulamasıysa bunu tavsiye ederim.

Ancak, büyük miktarda anahtardan kaçınırken farklı düğme basma kombinasyonlarını kontrol etmenin kolay bir yoluna ihtiyacınız varsa ve ifadeler varsa, bit bayrağı sıralarını kullanabilirsiniz.

Bit vektörleri hakkında bildiklerinizi bilmiyorum, bu yüzden genel bir bakış: Temel olarak, tüm olası tuşları temsil eden bir enum sınıfınız var. Her numaralandırma, tamsayıdaki bir bite karşılık gelen bir değere sahip olmalıdır. (örneğin: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014 vb.). ( Bunu Java'da yapmak için bağlantı ).

Şimdi, 32 (veya uzun kullanırsanız 64) tuşa kadar bilgi aktarabildiğiniz için, bit vektörlerini (int veya uzun) bir tür KeyComboCallback arabirimi düşen nesnelerle ilişkilendiren bir karma tablonuz olabilir İlişkili tuş bileşimine basıldığında çağrılan tek yöntem çağrısı Do ().

Artık oynatıcı nesnenizi veya menü nesnenizi başlattığınızda / başlattığınızda, bir tür giriş yöneticisini arayabilir ve istediğiniz tüm anahtar kombinasyon bit vektörlerini iletebilir ve bunları anonim iç sınıflarla ilişkilendirebilirsiniz.

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

Bu C ++ ve C # için gerçekten hızlı ve kullanışlıdır, ancak Java numaralandırmaları özeldir, bu nedenle bir KeyCombination sınıfı veya enumlar hakkında endişelenmeden tüm bu bilgileri depolayacak bir şey oluşturmayı daha uygun bulabilirsiniz. Ama fikir hala aynı. Bunu bir XNA oyununda kullanıyorum ve tesisi çok seviyorum. Ayrıca, klavyenin veya gamepad'in farklı bölümlerini bağımsız olarak karşılaştırmak için yararlı olan giriş bölgelerini ayırmak için de kullanabilirsiniz (bir klavyedeki iki oyuncu için yararlı olabilir).


Gönderinizi seviyorum, özellikle "this.DoCrazyAwesomeComboAttack ();" XD. Yolunuz karmaşık şeyler için daha iyi bir yol gibi görünüyor, bu yüzden daha kolay şeyler ile yapışacağım. Yardımın için teşekkürler!
Steven Rogers

+1 Çok ilginç bir cevap! Bu cevaptan öğrendim ve hobi oyunumun geliştirilmesinde daha fazla zamanım olduğunda bir göz atmalıyım. Ve cevabımın iyi olduğunu söylediğin için teşekkürler, yine de GD'ye yeni başlayan biriyim çünkü tartışmayacağım daha basit şeyler için. =) Teşekkürler!
Marcouiller
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.