उन्नत जावा गेम में मुझे कुंजी / माउस इनपुट कैसे होना चाहिए?


9

मैं एक आत्म सिखाया प्रोग्रामर हूं, इसलिए मुझे चीजों को करने के उचित तरीके नहीं पता हैं। मैंने क्षुद्रग्रहों और साँप जैसे सरल खेल बनाए हैं, लेकिन उन खेलों में, आप आसानी से कीवेंट कार्यों के भीतर चर को संशोधित कर सकते हैं। यहाँ मैं अपने साधारण क्षुद्रग्रहों के खेल में यह कैसे किया है:

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

अगर मैं एक अधिक उन्नत गेम (मुख्य मेनू, विकल्प, मुख्य गेम, आदि के साथ) बनाने के लिए था, तो मुझे कुंजी / माउस इनपुट कैसे करना चाहिए?

इसके अलावा, अगर मुझे एकल-खिलाड़ी में जाना है, तो क्या मुझे गेमप्ले कोड के सभी को एक कक्षा में रखना चाहिए? क्या एकल खिलाड़ी कोड को एक अलग वर्ग में रखने का एक तरीका है और किसी भी तरह कुंजी इनपुट को अभी भी चर और इस तरह से संशोधित करना है?


+1 आपके जवाब ने मुझे भालू के जवाब से कुछ नया सीखने की अनुमति दी। पूछने के लिए धन्यवाद! =)
मार्कॉइलर

जवाबों:


3

मैं कोई विशेषज्ञ नहीं हूं, और फिर भी मैं नियंत्रण और व्यवसाय / खेल / मेनू (इसे नाम) तर्क दोनों को अलग करने का सुझाव देता हूं।

मैंने पहले ही कक्षाओं के साथ डिजाइन किए गए गेम में एक सांप को दिशा देने के संबंध में इसी तरह के सवाल का जवाब दिया है। जावा एक वस्तु-उन्मुख भाषा होने के नाते, मुझे लगता है कि आप पर्याप्त कक्षाएं और सामान लिखने में सक्षम हैं। फिर, जब आपने अपनी ऑब्जेक्ट क्लास लिखी हो, अगर ऐसा है कि आपकी ऑब्जेक्ट को कुछ कुंजियों और माउस क्लिक पर प्रतिक्रिया करने की आवश्यकता है, तो मैं एक कंट्रोलर क्लास के साथ जाऊंगा जो जानता है कि वर्तमान में स्क्रीन पर क्या प्रदर्शित है, तो इस ऑब्जेक्ट को बताएं कि इसे क्या करना चाहिए उस कुंजी पर निर्भर करता है जिसे दबाया गया है या जिस क्षेत्र को क्लिक किया गया है।

यहां उस प्रश्न का लिंक दिया गया है जिसके बारे में मैंने आपको बताया था कि मैंने ऑब्जेक्ट लॉजिक से नियंत्रणों को अलग करने के बारे में उत्तर दिया है। इसमें एक कोड नमूना भी शामिल है जो मेरे विचार को दिखाता है।

वर्गों का उपयोग करके XNA में मेरे स्प्राइट को स्थानांतरित करना

( दुर्भाग्य से, जवाब में से कोई भी अभी तक ओपी द्वारा स्वीकार नहीं किया गया था, इसलिए हम यह सुनिश्चित करने के लिए नहीं जानते हैं कि क्या यह उसकी चिंताओं को हल करता है। इसके अलावा, मैं हमेशा इस तरह से डिजाइन कर रहा हूं और अब तक ऐसा करने से कोई परेशानी नहीं हुई है। )

अब मुझे पता है, यह XNA टैग है। विचार या डिज़ाइन, उपयोग की जाने वाली तकनीक की तुलना में एक उच्च वास्तुकला स्तर है, इसलिए इस डिज़ाइन को केवल जावा सिंटैक्स के अनुकूल बनाया जा सकता है। सामान्य विचार वही रहता है। =)

मुझे आशा है कि यह मदद करता है! जब मैं कर सकता हूं तो मुझे और मदद करने में खुशी होगी, बस पूछें! =)


5

विल का जवाब आपको दिखाता है कि संभवतः सबसे लचीला और सीधा क्या है, और मैं आपको सलाह दूंगा कि अगर आपको ज़रूरत है तो सीधे-सीधे इनपुट मतदान करें।

लेकिन, अगर आपको बड़े पैमाने पर स्विच से बचते हुए बटन प्रेस के विभिन्न संयोजनों की जांच करने के लिए एक आसान तरीका चाहिए और यदि कथन हैं, तो आप बिट फ्लैग एनम का उपयोग कर सकते हैं।

मुझे पता है कि आप बिट वैक्टर के बारे में क्या जानते हैं, इसलिए यहां एक सिंहावलोकन है: मूल रूप से, आपके पास एक एनम वर्ग है जो सभी संभव कुंजियों का प्रतिनिधित्व करता है। प्रत्येक एनम का एक मान होना चाहिए जो पूर्णांक में थोड़ा सा मेल खाता है। (अर्थात: 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0011, 0x0012, 0x0014, आदि)। ( जावा में ऐसा करने के लिए लिंक )।

अब, जब से आप लगभग 32 (या 64 तक की जानकारी अगर आप लोंगो का उपयोग करते हैं) पास कर सकते हैं, तो आपके पास एक हैश टेबल हो सकती है, जो बिट वैक्टर (int या long) को समेटे हुए हैं, जो किसी प्रकार की KeyComboCallback इंटरफ़ेस को गिराने वाली वस्तुओं से युक्त हैं, जिसमें यह शामिल है सिंगल मेथड कॉल, डू (), जिसे कॉल किया जाता है जब कुंजियों का संबद्ध संयोजन दबाया जाता है।

अब जब आप अपने प्लेयर ऑब्जेक्ट या अपने मेनू ऑब्जेक्ट को तुरंत / इनिशियलाइज़ करते हैं, तो आप किसी प्रकार के इनपुट मैनेजर को कॉल कर सकते हैं और इसे अपने इच्छित सभी कुंजी संयोजन बिट वैक्टर को पास कर सकते हैं और उन्हें अनाम आंतरिक कक्षाओं के साथ जोड़ सकते हैं।

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

यह C ++ और C # में वास्तव में त्वरित और सुविधाजनक है, लेकिन जावा एनम विशेष हैं, इसलिए आपको KeyCombination क्लास या ऐसा कुछ बनाने के लिए अधिक सुविधाजनक मिल सकता है जो इन सभी जानकारी को एनम की चिंता किए बिना संग्रहीत करेगा। लेकिन विचार अभी भी वही है। मैं एक एक्सएनए गेम में इसका उपयोग कर रहा हूं, और मुझे सुविधा बहुत पसंद है। आप इसे इनपुट क्षेत्रों को अलग करने के लिए भी उपयोग कर सकते हैं, जो कि कीबोर्ड या गेमपैड के विभिन्न हिस्सों की स्वतंत्र रूप से तुलना करने के लिए उपयोगी है (एक कीबोर्ड पर दो खिलाड़ियों के लिए उपयोगी हो सकता है)।


मुझे आपकी पोस्ट पसंद है, विशेष रूप से "this.DoCrazyAwesomeComboAttack ();" एक्सडी। आपका रास्ता जटिल सामान के लिए बेहतर तरीका है, इसलिए आसान सामान के साथ छड़ी करने जा रहा है। आपके सहयोग के लिए धन्यवाद!
स्टीवन रोजर्स

+1 बहुत दिलचस्प जवाब! मैंने इस जवाब से सीख लिया है और अपने शौक के खेल के विकास में खर्च करने के लिए अधिक समय होने पर मैं इस पर नज़र रखूंगा। और यह बताने के लिए धन्यवाद कि मेरा जवाब अच्छा है, हालांकि यह सरल सामान के लिए है, जो कि मैं बहस नहीं करूंगा, क्योंकि मैं जीडी में शुरुआती हूं। =) धन्यवाद!
विल मार्कॉइलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.