JavaRush /مدونة جافا /Random-AR /قسم "الألعاب" في JavaRush: التعامل مع الأحداث

قسم "الألعاب" في JavaRush: التعامل مع الأحداث

نشرت في المجموعة
تعد "الألعاب" من JavaRush قسمًا جديدًا يحتوي على مهام مثيرة للاهتمام وواسعة النطاق لإنشاء إصداراتك الخاصة من الألعاب الشائعة. الأمر بسيط: كل مشروع لعبة مقسم إلى مهام فرعية. أكملها واحدة تلو الأخرى واللعبة جاهزة. يمكنك مشاركتها على الشبكات الاجتماعية ودعوة الأصدقاء للعب. الفصلفي هذا المقال سنتحدث بالتفصيل عن طرق معالجة الأحداث عند كتابة الألعاب.

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.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // Ставим символ "X" в клетку по которой кликнули левой кнопкой мыши
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Очищаем клетку по которой кликнули правой кнопкой мыши
        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.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;
import com.javarush.engine.cell.Key;

public class MySuperGame extends Game {
    @Override
    public void initialize() {
        // Устанавливаем размер игрового поля 3x3
        setScreenSize(3, 3);

        // Закрашиваем игровое поле белым цветом
        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) {
        // При нажатии пробела, центральная клетка становится желтой
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // При отпускании пробела, центральной клетке возвращается белый цвет
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
مهم! في الإصدار الحالي من المحرك، يمكن لنوع المفتاح أن يقبل فقط مجموعة محدودة من القيم (9 قطع):
معنى ما نقر عليه المستخدم
مفتاح.أدخل قام المستخدم بالضغط على زر Enter
مفتاح الهروب قام المستخدم بالضغط على زر Esc
مفتاح.إيقاف مؤقت قام المستخدم بالنقر على زر الإيقاف المؤقت
مفتاح الفضاء قام المستخدم بالضغط على مسافة
مفتاح. يسار قام المستخدم بالضغط على السهم الأيسر
مفتاح.يمين قام المستخدم بالضغط على السهم الأيمن
Key.UP قام المستخدم بالضغط على السهم لأعلى
زر أسفل قام المستخدم بالضغط على السهم لأسفل
مفتاح.غير معروف أي مفتاح باستثناء تلك المذكورة أعلاه

3. العمل مع الموقت

تجري العديد من الألعاب في الوقت الفعلي، مما يعني أنه حتى لو لم يقم المستخدم بأي شيء، فإن الأحداث في اللعبة لا تزال تُنفذ. لكي تتمكن من تنفيذ مثل هذه الألعاب، أضفنا وظيفة المؤقت إلى محرك اللعبة. يعمل الأمر على النحو التالي: تقوم بتشغيل المؤقت وتعيين الفترة الزمنية التي يجب أن ينفجر بعدها. على سبيل المثال، 500 مللي ثانية. بعد ذلك، كل نصف ثانية، يقوم محرك اللعبة باستدعاء onTurnTimer(). عدد لا نهائي من المرات حتى يتم إيقاف المؤقت. كيفية استخدام الموقت؟
  1. قم بتشغيل الموقت.

    هناك طريقة خاصة لهذا void setTurnTimer(int timeMs). كوسيطة، تأخذ الطريقة مدة الفاصل الزمني بين المكالمات بالمللي ثانية (1/1000 من الثانية). يكفي أن نسميها مرة واحدة، وسيبدأ محرك اللعبة في استدعاء الطريقة onTurn()في كل ميلي ثانية.

  2. نحن نتجاوز طريقة onTurn(int).

    للقيام بذلك، تحتاج إلى الإعلان عن طريقة void onTurn(int step)في فئة موروثة من الفئة Game. سيتم استدعاء هذه الطريقة بواسطة محرك اللعبة. في هذه الحالة، سيقوم المحرك في كل مرة بنقل الرقم التسلسلي لمثل هذه المكالمة (1،2،3، ...) إلى الطريقة.

  3. قم بإيقاف تشغيل الموقت.

    إذا لم تعد هناك حاجة للمؤقت، على سبيل المثال، عندما يكمل المستخدم اللعبة، فيمكن إيقاف تشغيله. للقيام بذلك، ما عليك سوى الاتصال بالرقم stopTurnTimer().

  4. تسريع أو تغيير الموقت.

    في بعض الألعاب، تتسارع الأحداث باستمرار، لذا سيكون من المناسب تسريع مؤقتنا (تقليل الوقت بين المكالمات). لا يوجد شيء أسهل: اتصل setTurnTimer(int timeMs)مرة أخرى بقيمة جديدة، onTurn()وسيتغير الوقت بين المكالمات.

مثال:
import com.javarush.engine.cell.Color;
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {@Override
    public void initialize() {
    	// Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   //Включаем таймер, интервал между вызовами – 500мс.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // если прошло 100 тактов, выключаем таймер
        }

        if (step % 2 == 1) {
            // Если данный такт нечётный, установить клетке красный фон
            setCellColor(1, 1, Color.RED);
        } else {
            //если данный такт чётный, установить клетке синий фон
            setCellColor(1, 1, Color.BLUE);

        }
    }}
في هذا المثال البسيط، قمنا بإنشاء حقل من الخلايا 3x3. ثم قمنا بتشغيل مؤقت يقوم باستدعاء الطريقة كل نصف ثانية onTurn(). كل نصف ثانية يتغير لون الخلية لكن محتواها لن يتغير. بعد 50 ثانية، سيتوقف اللون عن التغير. هذا كل شئ! إذا كنت تريد معرفة المزيد حول قسم الألعاب، فإليك بعض الوثائق المفيدة التي يمكن أن تساعدك:
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION