CodeGym /Java Blog /अनियमित /CodeGym पर गेम्स सेक्शन: इवेंट हैंडलिंग
John Squirrels
स्तर 41
San Francisco

CodeGym पर गेम्स सेक्शन: इवेंट हैंडलिंग

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

1. माउस के साथ काम करना

गेम इंजन में माउस के साथ काम करने के दो तरीके हैं:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);

आप बस इन विधियों को अपनी कक्षा में घोषित करते हैं जो विरासत में मिलती है Game, और आप जो भी कोड चाहते हैं उसे जोड़ते हैं। जब उपयोगकर्ता माउस बटन क्लिक करेगा तो गेम इंजन उन्हें कॉल करेगा।
  1. onMouseLeftClick(int x, int y)— माउस के बाएँ बटन को क्लिक करने पर इंजन द्वारा कॉल किया जाता है। इसके पैरामीटर खेल के मैदान के सेल के निर्देशांक हैं जहां क्लिक हुआ। ऊपरी बाएँ सेल में निर्देशांक (0, 0) हैं। इसका उपयोग करने के लिए आपको इस विधि को ओवरराइड करने की आवश्यकता है।

  2. onMouseRightClick(int x, int y)- दायाँ माउस बटन क्लिक करने पर कॉल किया जाता है। यह तरीका onMouseLeftClick(int x, int y)मेथड की तरह ही काम करता है।

यहाँ इन विधियों का उपयोग करने का एक उदाहरण दिया गया है:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onMouseLeftClick(int x, int y) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        setCellValue(x, y, "");
    }
}

2. कीबोर्ड के साथ काम करना

कीबोर्ड के साथ काम करने के लिए गेम इंजन के दो तरीके हैं:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);

यदि आप कुछ करना चाहते हैं जब उपयोगकर्ता एक कुंजी दबाता है, तो इन विधियों को अपनी कक्षा में घोषित करें जो गेम को प्राप्त करता है, और अपना कोड उनमें जोड़ें। जब उपयोगकर्ता कुंजी दबाता है या जारी करता है तो गेम इंजन उन्हें कॉल करेगा।
  1. onKeyPress(Key key)- जब कोई कुंजी दबाई जाती है तो कॉल किया जाता है। कुंजी पैरामीटर दबाया गया कुंजी (या Key.UNKNOWN) है।

  2. onKeyReleased(Key key)- जब कोई कुंजी जारी की जाती है तो कॉल किया जाता है। कुंजी पैरामीटर संबंधित कुंजी (या Key.UNKNOWN) है।

यहाँ इन विधियों का उपयोग करने का एक उदाहरण दिया गया है:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Set the size of the playing field to 3x3
        setScreenSize(3, 3);

        // Paint the playing field white
        for (int x = 0; x < 3; x++) {
            for (int y = 0; y < 3; y++) {
                setCellColor(x, y, Color.WHITE);
            }
        }
    }

    @Override
    public void onKeyPress(Key key) {
        // When the space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
महत्वपूर्ण! गेम इंजन के वर्तमान संस्करण में, कुंजी प्रकार में नौ मानों का सीमित सेट होता है:
कीमत उपयोगकर्ता द्वारा दबाई गई कुंजी
कुंजी। दर्ज करें उपयोगकर्ता ने एंटर दबाया
की.एस्केप उपयोगकर्ता ने Esc दबाया
की.रोकें उपयोगकर्ता ने पॉज़ दबाया
की.स्पेस उपयोगकर्ता ने स्पेस दबाया
कुंजी।बाएं उपयोगकर्ता ने बायां तीर कुंजी दबाया
चाभी।ठीक है उपयोगकर्ता ने दायां तीर कुंजी दबाया
तनाव के स्थिति में उपयोगकर्ता ने ऊपर तीर कुंजी दबाई
चाबी नीचे उपयोगकर्ता ने डाउन कुंजी दबाई
की.अज्ञात उपयोगकर्ता ने ऊपर दी गई कुंजी के अलावा कोई अन्य कुंजी दबाई है

3. टाइमर के साथ काम करना

कई खेल वास्तविक समय में होते हैं, यानी यदि उपयोगकर्ता कुछ नहीं करता है, तब भी खेल में घटनाएं घटित होती हैं। आपको ऐसे खेलों को लागू करने में सक्षम बनाने के लिए, हमने गेम इंजन में एक टाइमर जोड़ा है। यह कुछ इस तरह काम करता है: आप टाइमर चालू करते हैं और टाइमर अंतराल सेट करते हैं। उदाहरण के लिए, 500 मिलीसेकंड। फिर, हर आधे सेकंड में गेम इंजन onTurnTimer()विधि को कॉल करता है। बार-बार हमेशा के लिए - जब तक टाइमर बंद नहीं हो जाता। तो आप टाइमर का उपयोग कैसे करते हैं?
  1. टाइमर चालू करें।

    ऐसा करने के लिए, एक विशेष विधि है । विधि एक तर्क के रूप में मिलीसेकंड (1 मिलीसेकंड = 1/1000 सेकंड) में कॉल के बीच अंतराल लेती है। आपको इसे केवल एक बार कॉल करने की आवश्यकता है, और गेम इंजन हर बार Ms मिलीसेकंड में विधि को कॉल करना शुरू कर देगा।void setTurnTimer(int timeMs)onTurn()

  2. ऑनटर्न (इंट) विधि को ओवरराइड करें।

    ऐसा करने के लिए, आपको विरासत में मिली कक्षा में एक विधि घोषित करने की आवश्यकता है । इस विधि को गेम इंजन द्वारा कॉल किया जाएगा। क्या अधिक है, प्रत्येक कॉल के साथ गेम इंजन विधि को कॉल के लिए एक अनुक्रमिक पहचानकर्ता (1, 2, 3, …) पास करेगा।void onTurn(int step)Game

  3. टाइमर बंद कर दें।

    यदि टाइमर की अब आवश्यकता नहीं है, उदाहरण के लिए, जब उपयोगकर्ता गेम पूरा करता है, तो आप इसे बंद कर सकते हैं। ऐसा करने के लिए, आपको बस विधि को कॉल करने की आवश्यकता है।stopTurnTimer()

  4. टाइमर को तेज करें या बदलें।

    कुछ खेलों में, घटनाओं की दर लगातार बढ़ रही है, इसलिए हमारे टाइमर को गति देना सुविधाजनक होगा (कॉल के बीच का समय कम करें)। कुछ भी आसान नहीं हो सकता: setTurnTimer(int timeMs)एक बार फिर से एक नए मूल्य के साथ कॉल करें, और कॉल के बीच का समय onTurn()बदल जाएगा।

उदाहरण के लिए:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
इस सरल उदाहरण में, हमने एक फ़ील्ड बनाया है जो 3 सेल x 3 सेल है। onTurn()फिर हमने एक टाइमर शुरू किया जो हर आधे सेकेंड में विधि को कॉल करेगा । हर आधे सेकेंड में सेल का रंग बदल जाएगा, लेकिन इसकी सामग्री नहीं बदलेगी। 50 सेकंड के बाद, रंग नहीं बदलेगा। अभी के लिए इतना ही! यदि आप "गेम्स" अनुभाग के बारे में अधिक जानना चाहते हैं, तो यहां कुछ उपयोगी दस्तावेज दिए गए हैं जो मदद कर सकते हैं:
टिप्पणियां
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION