1। পরিচিতি

একটি গেম ইঞ্জিন খুব কমই কাজে লাগবে যদি আমরা এটি শুধুমাত্র স্ক্রিনে কিছু আঁকতে ব্যবহার করতে পারি। একটি পূর্ণাঙ্গ গেম লিখতে, ব্যবহারকারীর সাথে যোগাযোগ করার জন্য আমাদের এটি প্রয়োজন! আরও সুনির্দিষ্টভাবে বলতে গেলে, আমাদের প্রোগ্রামের উচিত ব্যবহারকারীর ক্রিয়াকলাপ ট্র্যাক করা এবং তাদের প্রতিক্রিয়া জানানো।

এটি করার জন্য, কোডজিম গেম ইঞ্জিনে বিশেষ পদ্ধতি রয়েছে যা ব্যবহারকারী মাউস বোতাম বা কীবোর্ড কীগুলিতে ক্লিক করলে এটি কল করে।

ক্লাসের বিষয় হল যে আপনি নিজেই এই পদ্ধতিগুলি লিখুন এবং তারপরে কোডজিম গেম ইঞ্জিন তাদের কল করার জন্য দায়ী। আপনার যা দরকার তা হল আপনার কোডে এই পদ্ধতিগুলি ঘোষণা করা। এটি শোনার চেয়ে এটি করা সহজ।


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()পদ্ধতিগুলিকে কল করে, তখন এটি চাপা (মুক্ত) কী সম্পর্কে তাদের কাছে তথ্য পাঠায়। এটি করার জন্য, কোডজিম ইঞ্জিনের একটি বিশেষ প্রকার রয়েছে যাকে বলা হয় 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

এখানে সমস্যাটি হল যে বিদ্যমান কোডজিম গেমগুলি একটি ফোনে চালানোর জন্য ডিজাইন করা হয়েছিল। স্ট্যান্ডার্ড কীবোর্ডের পরিবর্তে, আমাদের 8টি ভার্চুয়াল বোতাম রয়েছে:


5. একটি টাইমার সঙ্গে কাজ

অনেক গেম রিয়েল টাইমে সংঘটিত হয়, অর্থাৎ ব্যবহারকারী হয়তো কিছুই করতে পারে না, কিন্তু কিছু ঘটনা এখনও গেমটিতে ঘটে থাকে। আপনাকে এই জাতীয় গেমগুলি বাস্তবায়নের অনুমতি দেওয়ার জন্য, আমরা গেম ইঞ্জিনে একটি টাইমার যুক্ত করেছি।

এটি কীভাবে কাজ করে তা এখানে: আপনি টাইমার চালু করুন এবং সময় সেট করুন যার পরে এটি ট্রিগার করা উচিত। উদাহরণস্বরূপ, 500 ms তারপর, প্রতি অর্ধেক সেকেন্ডে, কোডজিম গেম ইঞ্জিন onTurn()পদ্ধতিটি কল করবে। টাইমার বন্ধ না হওয়া পর্যন্ত অসীম সংখ্যক বার।

আপনি কিভাবে একটি টাইমার ব্যবহার করবেন?

1. টাইমার চালু করুন

টাইমার চালু করার জন্য, আমাদের void setTurnTimer(int timeMs)পদ্ধতি আছে। পদ্ধতিটি একটি যুক্তি হিসাবে কলব্যাকের মধ্যে ব্যবধানের সময়কাল (মিলিসেকেন্ডে বা এক সেকেন্ডের 1/1000s) নেয়৷ আপনাকে এই পদ্ধতিটি একবার কল করতে হবে, এবং গেম ইঞ্জিন 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 কলব্যাক), রঙ পরিবর্তন করা বন্ধ হবে এবং টাইমার বন্ধ হয়ে যাবে।