JavaRush /Kurslar /All lectures for UZ purposes /Voqealarni qayta ishlash

Voqealarni qayta ishlash

All lectures for UZ purposes
Daraja, Dars
Mavjud
Bo'limBu lektsiyada loyihalar-o'yinlar yozishda voqealarni qayta ishlash usullari haqida batafsil gapiramiz.

1. Sichqoncha bilan ishlash

Sichqoncha bilan ishlash uchun o'yin dvijokida ikki metod bor:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
Bu metodlarni Game dan meros qilib olingan o'yin sinfida e'lon qilasiz va ularga istalgan kod yozasiz. Dvijok foydalanuvchi sichqoncha tugmachalarini bosganida o'z-o'zidan ularni chaqiradi.
  1. onMouseLeftClick(int x, int y) — sichqonchaning chap tugmasi bosilganda dvijok tomonidan chaqiriladi. Argumentlar sifatida klik sodir bo'lgan o'yin maydoni hujayrasining koordinatlarini oladi. Eng chap yuqori hujayra koordinatalarga ega (0,0). Bu metoddan foydalanish uchun uni qayta aniqlash kerak.

  2. onMouseRightClick(int x, int y) — sichqonchaning o'ng tugmasi bosilganda chaqiriladi. onMouseLeftClick(int x, int y) metodiga o'xshash ishlaydi.
Metodlardan foydalanish misoli:

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() {
        // O'yin maydoni o'lchamini 3x3 ga o'rnatamiz
        setScreenSize(3, 3);

        // O'yin maydonini oq rangga bo'yaymiz
        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) {
        // Sichqonchaning chap tugmasi bilan bosilgan hujayrada "X" belgisini o'rnatamiz
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Sichqonchaning o'ng tugmasi bilan bosilgan hujayrani tozalaymiz
        setCellValue(x, y, "");
    }
}

2. Klaviatura bilan ishlash

Klaviatura bilan ishlash uchun dvijokda ikki metod bor:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
Agar foydalanuvchi klaviatura tugmasini bosganida harakatlar amalga oshirilishini xohlasangiz, bu metodlarni Game'dan meros qilib olingan o'yin sinfida e'lon qiling va ularga o'z kodingizni yozing. O'yin dvijoki foydalanuvchi klaviatura tugmasini bosgan yoki bo'shatganida ularni chaqiradi.
  1. onKeyPress (Key key) — klaviaturaning istalgan tugmasi bosilganda chaqiriladi. Metodga argument sifatida bosilgan tugmaning qiymati (yoki Key.UNKNOWN) o'tkaziladi.

  2. onKeyReleased (Key key) — klaviaturaning istalgan tugmasi bo'shatilganda chaqiriladi. Argument sifatida tegishli tugmaning qiymati (yoki Key.UNKNOWN) oladi.
Metodlardan foydalanish misoli:

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() {
        // O'yin maydoni o'lchamini 3x3 ga o'rnatamiz
        setScreenSize(3, 3);

        // O'yin maydonini oq rangga bo'yaymiz
        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) {
        // Probel bosilganda, markaziy hujayra sariq bo'ladi
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // Probel bo'shatilganda, markaziy hujayraga oq rang qaytariladi
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
Diqqat! Dvigatelning hozirgi versiyasida Key turidagi argument qiymati faqat cheklangan qiymatlar to'plamini (9 ta) qabul qilishi mumkin:
Qiymat Foydalanuvchi nima bosdi
Key.ENTER Foydalanuvchi Enter tugmasini bosdi
Key.ESCAPE Foydalanuvchi Esc tugmasini bosdi
Key.PAUSE Foydalanuvchi Pause tugmasini bosdi
Key.SPACE Foydalanuvchi Probelni bosdi
Key.LEFT Foydalanuvchi Chapga oʻq tugmasini bosdi
Key.RIGHT Foydalanuvchi O'ngga oʻq tugmasini bosdi
Key.UP Foydalanuvchi Yuqoriga oʻq tugmasini bosdi
Key.DOWN Foydalanuvchi Pastga oʻq tugmasini bosdi
Key.UNKNOWN Yuqorida aytilganlardan boshqa istalgan tugma

3. Taymer bilan ishlash

Ko'p o'yinlar real vaqt rejimida sodir bo'ladi, ya'ni foydalanuvchi hech narsa qilmasa ham, o'yindagi voqealar amalga oshadi. Siz bunday o'yinlarni amalga oshirishingiz uchun biz o'yin dvijokiga taymer bilan ishlash imkoniyatini qo'shdik. Bu taxminan quyidagicha ishlaydi: taymerni yoqing va uni ishga tushishi kerak bo'lgan vaqti belgilab qo'ying. Masalan, 500 millisekund. Shundan keyin har yarim soniyada dvijok onTurnTimer() metodini chaqiradi. Cheksiz marta, taymer o'chirilganicha. Qanday qilib taymerdan foydalanamiz?
  1. Taymerni yoqing.

    Buning uchun maxsus void setTurnTimer(int timeMs) metod mavjud. Argument sifatida metod chaqiruvlar orasidagi interval davomiyligini millisekundlarda (1/1000 sekund) qabul qiladi. Uni bir marta chaqirish kifoya, va o'yin dvijoki onTurn() metodini har timeMs millisekundda chaqiradi.

  2. onTurn(int) metodini qayta aniqlash.

    Buning uchun void onTurn(int step) metodini Game sinfidan olingan sinfda e'lon qilish kerak. Bu metodni o'yin dvijoki chaqiradi. Shu bilan birga, dvijok har safar metodga chaqiruvning ketma-ket raqamini o'tkazadi (1,2,3, ...). Uni takt deb atash mumkin

  3. Taymerni o'chirish.

    Agar taymer kerak bo'lmasa, masalan, foydalanuvchi o'yinni o'ynab o'tib ketgan bo'lsa, uni o'chirish mumkin. Buning uchun faqat stopTurnTimer() metodini chaqirish kerak.

  4. Taymerni tezlashtirish yoki o'zgartirish.

    Ba'zi o'yinlarda voqealar doimo tezlashadi, shuning uchun taymerimizni tezlashtirish (chaqiruvlar orasidagi vaqtni qisqartirish) qulay bo'ladi. Buning uchun hech qanday qiyinchilik yo'q: setTurnTimer(int timeMs) ni yangi qiymat bilan yana bir marta chaqiring va onTurn() chaqiruvlari orasidagi vaqt o'zgaradi.

Misol:

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

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// 3x3 hujayrali o'yin maydonini yaratamiz
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   //Taymerni yoqing, chaqiruvlar orasidagi interval - 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // agar 100 takt o'tgan bo'lsa, taymerni o'chiring
        }

        if (step % 2 == 1) {
            // Agar bu takt juftsiz bo'lsa, hujayraga qizil fon o'rnatish
            setCellColor(1, 1, Color.RED);
        } else {
            //agar bu takt juft bo'lsa, hujayraga ko'k fon o'rnatish
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
Bu oddiy misolda biz 3x3 o'lchamli maydon yaratdik. Keyin har yarim soniyada onTurn() metodini chaqiradigan taymerni yoqdik. Har yarim soniyada hujayra rangi o'zgaradi, lekin uning mazmuni o'zgarmaydi. 50 soniyadan so'ng rang o'zgarishdan to'xtaydi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION