JavaRush /Java blogi /Random-UZ /JavaRush-dagi "O'yinlar" bo'limi: Voqealar bilan ishlash

JavaRush-dagi "O'yinlar" bo'limi: Voqealar bilan ishlash

Guruhda nashr etilgan
JavaRush-dan "O'yinlar" - bu mashhur o'yinlarning shaxsiy versiyalarini yaratish uchun qiziqarli va keng ko'lamli vazifalarga ega yangi bo'lim. Hammasi oddiy: har bir o'yin loyihasi kichik vazifalarga bo'lingan. Ularni birma-bir to'ldiring va o'yin tayyor. Siz uni ijtimoiy tarmoqlarda baham ko'rishingiz va do'stlaringizni o'ynashga taklif qilishingiz mumkin. Ushbu maqolada biz o'yinlarni yozishda voqealarni qayta ishlashBob usullari haqida batafsil gaplashamiz .

1. Sichqoncha bilan ishlash

O'yin dvigatelida sichqoncha bilan ishlashning ikkita usuli mavjud:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
Siz shunchaki meros qilib olingan o'yin sinfida ushbu usullarni e'lon qilasiz Gameva ularga istalgan kodni yozasiz. Va foydalanuvchi sichqoncha tugmachalarini bosganda, o'yin dvigatelining o'zi ularni chaqiradi.
  1. onMouseLeftClick(int x, int y)— sichqonchaning chap tugmasini bosganingizda vosita tomonidan chaqiriladi. Argumentlar sifatida u bosish sodir bo'lgan o'yin maydonining katak koordinatalarini oladi. Yuqori chap katakda koordinatalar (0,0) mavjud. Ushbu usuldan foydalanish uchun uni bekor qilish kerak.

  2. onMouseRightClick(int x, int y)- sichqonchaning o'ng tugmachasini bosganingizda chaqiriladi. Usulga o'xshash ishlaydi onMouseLeftClick(int x, int y).
Foydalanish usullariga misol:
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. Klaviatura bilan ishlash

O'yin dvigatelida klaviatura bilan ishlashning ikkita usuli mavjud:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
Agar foydalanuvchi klaviaturadagi tugmachani bosganida harakatlar sodir bo'lishini istasangiz, ushbu usullarni O'yindan meros bo'lgan o'yin sinfingizda e'lon qiling va ularga kodingizni yozing. Foydalanuvchi klaviatura tugmachasini bosganda yoki qo'yib yuborganda, o'yin dvigatelining o'zi ularni chaqiradi.
  1. onKeyPress (Key key)— istalgan klaviatura tugmasi bosilganda chaqiriladi. Bosilgan tugmaning qiymati (yoki Key.UNKNOWN) kalit argumenti sifatida usulga uzatiladi.

  2. onKeyReleased (Key key)— istalgan klaviatura tugmasi bo'shatilganda chaqiriladi. Kalit argumenti tegishli kalit (yoki Key.UNKNOWN) qiymatini oladi.
Foydalanish usullariga misol:
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);
        }
    }
}
Muhim! Dvigatelning joriy versiyasida Kalit turi faqat cheklangan qiymatlar to'plamini qabul qilishi mumkin (9 dona):
Ma'nosi Foydalanuvchi nima bosdi
Klaviatura.ENTER Foydalanuvchi Enter tugmasini bosdi
Kalit.QOCHISH Foydalanuvchi Esc tugmasini bosdi
Tugma. PAUSE Foydalanuvchi Pauza tugmasini bosdi
Key.SPACE Foydalanuvchi Space tugmasini bosdi
Klaviatura.CHAP Foydalanuvchi chap o'qni bosdi
Kalit. O‘ng Foydalanuvchi o'ng strelkani bosdi
Key.UP Foydalanuvchi yuqoriga o'qni bosdi
Klaviatura. DOWN Foydalanuvchi pastga o'qni bosdi
Kalit. noma'lum Yuqorida sanab o'tilganlardan tashqari har qanday kalit

3. Taymer bilan ishlash

Ko'pgina o'yinlar real vaqtda sodir bo'ladi, ya'ni foydalanuvchi hech narsa qilmasa ham, o'yindagi voqealar baribir bajariladi. Bunday o'yinlarni amalga oshirishingiz uchun biz o'yin mexanizmiga taymer funksiyasini qo'shdik. Bu shunday ishlaydi: siz taymerni yoqasiz va u o'chadigan vaqtni belgilaysiz. Masalan, 500 millisekund. Shundan so'ng, har yarim soniyada Game Engine onTurnTimer(). Taymer o'chirilgunga qadar cheksiz ko'p marta. Taymerdan qanday foydalanish kerak?
  1. Taymerni yoqing.

    Buning uchun maxsus usul mavjud void setTurnTimer(int timeMs). Argument sifatida, usul qo'ng'iroqlar orasidagi intervalning davomiyligini millisekundlarda (1/1000 soniya) oladi. Uni bir marta chaqirish kifoya va o'yin mexanizmi onTurn()har safar Ms millisekundlarda usulni chaqira boshlaydi.

  2. Biz onTurn(int) usulini bekor qilamiz.

    void onTurn(int step)Buni amalga oshirish uchun siz sinfdan meros qilib olingan sinfdagi usulni e'lon qilishingiz kerak Game. Ushbu usul o'yin mexanizmi tomonidan chaqiriladi. Bunday holda, vosita har safar bunday qo'ng'iroqning seriya raqamini (1,2,3, ...) usulga o'tkazadi.

  3. Taymerni o'chiring.

    Agar taymer endi kerak bo'lmasa, masalan, foydalanuvchi o'yinni tugatganida, uni o'chirib qo'yish mumkin. Buning uchun siz shunchaki qo'ng'iroq qilishingiz kerak stopTurnTimer().

  4. Tezlashtiring yoki taymerni o'zgartiring.

    Ba'zi o'yinlarda voqealar doimiy ravishda tezlashadi, shuning uchun bizning taymerimizni tezlashtirish qulay bo'ladi (qo'ng'iroqlar orasidagi vaqtni qisqartirish). Oddiyroq narsa yo'q: setTurnTimer(int timeMs)yangi qiymat bilan qayta qo'ng'iroq qiling va qo'ng'iroqlar orasidagi vaqt onTurn()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 клетки
        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);

        }
    }}
Ushbu oddiy misolda biz 3x3 hujayralar maydonini yaratdik. Keyin biz har yarim soniyada usulni chaqiradigan taymerni yoqdik onTurn(). Har yarim soniyada hujayraning rangi o'zgaradi, lekin uning tarkibi o'zgarmaydi. 50 soniyadan keyin rang o'zgarishni to'xtatadi. Ana xolos! Oʻyinlar boʻlimi haqida koʻproq maʼlumotga ega boʻlishni istasangiz, bu yerda yordam berishi mumkin boʻlgan foydali hujjatlar mavjud:
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION