1 परिचय

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

ऐसा करने के लिए, CodeGym गेम इंजन में विशेष विधियाँ हैं जो उपयोगकर्ता द्वारा माउस बटन या कीबोर्ड कुंजियों पर क्लिक करने पर कॉल करती हैं।

कक्षा की बात यह है कि आप इन विधियों को स्वयं लिखते हैं, और फिर उन्हें कॉल करने के लिए CodeGym गेम इंजन जिम्मेदार होता है। आपको केवल इन विधियों को अपने कोड में घोषित करना है। यह सुनने में जितना आसान लगता है, उससे कहीं ज्यादा आसान है।


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

गेम इंजन में माउस के साथ काम करने के दो तरीके हैं:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

आप बस इन विधियों को अपनी कक्षा में घोषित करते हैं जो Gameकक्षा को प्राप्त करती है। और फिर इन मेथड्स में आपको जो भी कोड चाहिए वो लिखे। जब उपयोगकर्ता माउस बटन पर क्लिक करेगा तो गेम इंजन इन विधियों को कॉल करेगा।

onMouseLeftClick(int x, int y)इंजन द्वारा कॉल किया जाता है जब बाईं माउस बटन क्लिक किया जाता है। इसके पैरामीटर खेल के मैदान के सेल के निर्देशांक हैं जहां क्लिक हुआ। शीर्ष बाएँ सेल के निर्देशांक हैं (0,0)। इस विधि का उपयोग करने के लिए, आपको @Overrideविधि नाम से पहले एनोटेशन रखकर इसे ओवरराइड करने की आवश्यकता है।

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) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

उपरोक्त उदाहरण में, हमने दोनों विधियों की घोषणा की: onMouseLeftClick()और onMouseRightClick()। पहली विधि को तब कहा जाएगा जब उपयोगकर्ता खेल के मैदान की कोशिकाओं पर बाईं माउस बटन पर क्लिक करेगा। दूसरी विधि तब कहलाएगी जब दायाँ माउस बटन क्लिक किया जाएगा।

तर्कों के रूप में, CodeGym गेम इंजन (x, y)प्लेयिंग फील्ड के उस सेल के निर्देशांकों को पास करेगा जहां माउस को क्लिक किया गया था।



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

कीबोर्ड के साथ काम करने के लिए गेम इंजन के दो तरीके हैं:

void onKeyPress(Key key);
void onKeyReleased(Key key);

यदि आप कुछ करना चाहते हैं जब उपयोगकर्ता एक कुंजी दबाता है, तो आपको कक्षा को प्राप्त करने वाली कक्षा में इन विधियों को घोषित करने की आवश्यकता होती है Game

आप इन विधियों में अपना कोड लिखते हैं, और जब उपयोगकर्ता कुंजी दबाता है (या रिलीज़ करता है) तो गेम इंजन उन्हें कॉल करेगा।

onKeyPress(Key key)जब कोई कुंजी दबाई जाती है तो उसे कॉल किया जाता है । दबाए गए कुंजी (या) का मान विधि को पैरामीटर के रूप में पारित किया जाता है। इस विधि का उपयोग करने के लिए, आपको विधि नाम से पहले एनोटेशन रखकर इसे ओवरराइड करने की आवश्यकता है।Key.UNKNOWNkey@Override

onKeyReleased(Key key)जब कोई कुंजी जारी की जाती है तो उसे कॉल किया जाता है । संबंधित कुंजी (या) का मान पैरामीटर को असाइन किया जाता है । इस विधि का उपयोग करने के लिए, आपको विधि नाम से पहले एनोटेशन रखकर इसे ओवरराइड करने की आवश्यकता है।Key.UNKNOWNkey@Override

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

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 spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. सभी समर्थित चाबियों की सूची

जब CodeGym इंजन onKeyPress()और onKeyReleased()विधियों को कॉल करता है, तो यह उन्हें दबाई गई (जारी) कुंजी के बारे में जानकारी देता है। ऐसा करने के लिए, CodeGym इंजन का एक विशेष प्रकार होता है जिसे Key.

इंजन के वर्तमान संस्करण में, Keyप्रकार केवल 9 मानों के सीमित सेट का समर्थन करता है:

कीमत यूजर ने क्या दबाया
Key.ENTER
उपयोगकर्ता ने एंटर कुंजी दबाई
Key.ESCAPE
उपयोगकर्ता ने Esc कुंजी दबाई
Key.PAUSE
उपयोगकर्ता ने पॉज कुंजी दबाई
Key.SPACE
उपयोगकर्ता ने स्पेस कुंजी दबाई
Key.LEFT
उपयोगकर्ता ने बायाँ तीर कुंजी दबाया
Key.RIGHT
उपयोगकर्ता ने दायाँ तीर कुंजी दबाया
Key.UP
उपयोगकर्ता ने अप एरो की को दबाया
Key.DOWN
उपयोगकर्ता ने डाउन एरो कुंजी दबाई
Key.UNKNOWN
ऊपर सूचीबद्ध के अलावा कोई भी कुंजी

यदि खिलाड़ी स्पेस बार दबाता है, तो विधि को पैरामीटर के रूप में onKeyPress()बुलाया जाएगा । Key.SPACEयदि उपयोगकर्ता बायाँ तीर दबाता है, तो पैरामीटर होगा Key.LEFT। यदि उपयोगकर्ता किसी भी कुंजी को दबाता है जो उपरोक्त सूची में नहीं है, तो विधि को पैरामीटर के रूप में onKeyPress()बुलाया जाएगा ।Key.UNKNOWN

यहाँ मुद्दा यह है कि मौजूदा CodeGym गेम्स को फोन पर चलाने के लिए डिजाइन किया गया था। मानक कीबोर्ड के बजाय, हमारे पास 8 वर्चुअल बटन हैं:


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

कई खेल वास्तविक समय में होते हैं, यानी उपयोगकर्ता कुछ नहीं कर सकता है, लेकिन खेल में कुछ घटनाएं अभी भी होती हैं। आपको ऐसे खेलों को लागू करने की अनुमति देने के लिए, हमने गेम इंजन में एक टाइमर जोड़ा है।

यहां बताया गया है कि यह कैसे काम करता है: आप टाइमर चालू करते हैं और समय निर्धारित करते हैं जिसके बाद इसे ट्रिगर किया जाना चाहिए। उदाहरण के लिए, 500 एमएस। फिर, प्रत्येक आधे सेकंड में, CodeGym गेम इंजन onTurn()विधि को कॉल करेगा। अनंत बार - जब तक टाइमर बंद नहीं हो जाता।

आप टाइमर का उपयोग कैसे करते हैं?

1. टाइमर चालू करें

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

2. onTurn(int)विधि को ओवरराइड करें

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

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 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

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

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

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

इस सरल उदाहरण में, हमने एक फ़ील्ड बनाया है जो 3 सेल गुणा 3 सेल है। फिर हमने एक टाइमर चालू किया जो onTurn()हर आधे सेकेंड में विधि को कॉल करेगा।

यहां सेंट्रल सेल का रंग हर आधे सेकेंड में बदल जाएगा। सेल का टेक्स्ट नहीं बदलेगा। 50 सेकंड (100 कॉलबैक) के बाद, रंग बदलना बंद हो जाएगा और टाइमर बंद हो जाएगा।