JavaRush /Blog Java /Random-MS /Bahagian "Permainan" di JavaRush: Pengendalian Acara

Bahagian "Permainan" di JavaRush: Pengendalian Acara

Diterbitkan dalam kumpulan
“Permainan” daripada JavaRush ialah bahagian baharu dengan tugasan yang menarik dan berskala besar untuk mencipta versi permainan popular anda sendiri. Ia mudah: setiap projek permainan dibahagikan kepada subtugas. Lengkapkan satu persatu dan permainan sudah siap. Anda boleh berkongsinya di rangkaian sosial dan menjemput rakan untuk bermain. BabDalam bahan ini kita akan bercakap secara terperinci tentang kaedah pemprosesan acara semasa menulis permainan.

1. Bekerja dengan tetikus

Enjin permainan mempunyai dua kaedah untuk bekerja dengan tetikus:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
Anda hanya mengisytiharkan kaedah ini dalam kelas permainan yang diwarisi daripada Game, dan tulis sebarang kod di dalamnya. Dan enjin permainan itu sendiri akan memanggil mereka apabila pengguna menekan butang tetikus.
  1. onMouseLeftClick(int x, int y)— dipanggil oleh enjin apabila anda mengklik butang kiri tetikus. Sebagai hujah, ia menerima koordinat sel medan permainan tempat klik berlaku. Sel kiri atas mempunyai koordinat (0,0). Untuk menggunakan kaedah ini, ia mesti ditindih.

  2. onMouseRightClick(int x, int y)— dipanggil apabila anda klik kanan. Berfungsi serupa dengan kaedah onMouseLeftClick(int x, int y).
Contoh penggunaan kaedah:
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. Bekerja dengan papan kekunci

Enjin permainan mempunyai dua kaedah untuk bekerja dengan papan kekunci:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
Jika anda mahu tindakan berlaku apabila pengguna menekan butang pada papan kekunci, isytiharkan kaedah ini dalam kelas permainan anda yang mewarisi daripada Permainan dan tulis kod anda di dalamnya. Enjin permainan itu sendiri akan memanggilnya apabila pengguna menekan atau melepaskan kekunci papan kekunci.
  1. onKeyPress (Key key)— dipanggil apabila sebarang kekunci papan kekunci ditekan. Nilai kekunci yang ditekan (atau Key.UNKNOWN) dihantar kepada kaedah sebagai hujah kunci.

  2. onKeyReleased (Key key)— dipanggil apabila sebarang kekunci papan kekunci dilepaskan. Argumen kunci mengambil nilai kunci yang sepadan (atau Key.UNKNOWN).
Contoh penggunaan kaedah:
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);
        }
    }
}
Penting! Dalam versi enjin semasa, jenis Kunci hanya boleh menerima set nilai terhad (9 pcs):
Maknanya Perkara yang diklik oleh pengguna
Kunci.MASUKKAN Pengguna menekan butang Enter
Kunci.MELARIKAN Pengguna menekan butang Esc
Kunci.JEDA Pengguna mengklik butang Jeda
Kunci.RUANG Pengguna menekan Space
Kunci.KIRI Pengguna menekan Anak Panah Kiri
Kunci.KANAN Pengguna menekan Anak Panah Kanan
Key.UP Pengguna menekan Anak Panah Atas
Kunci. BAWAH Pengguna menekan Anak Panah Bawah
Kunci.TIDAK DIKENALI Mana-mana kunci kecuali yang disenaraikan di atas

3. Bekerja dengan pemasa

Banyak permainan berlaku dalam masa nyata, bermakna walaupun pengguna tidak melakukan apa-apa, acara dalam permainan masih dilaksanakan. Supaya anda boleh melaksanakan permainan sedemikian, kami telah menambah fungsi pemasa pada enjin permainan. Ia berfungsi seperti ini: anda menghidupkan pemasa dan menetapkan tempoh masa selepas itu ia sepatutnya dimatikan. Contohnya, 500 milisaat. Selepas itu, setiap setengah saat Enjin Permainan memanggil onTurnTimer(). Bilangan yang tidak terhingga kali sehingga pemasa dimatikan. Bagaimana untuk menggunakan pemasa?
  1. Hidupkan pemasa.

    Terdapat kaedah khas untuk ini void setTurnTimer(int timeMs). Sebagai hujah, kaedah mengambil tempoh selang antara panggilan dalam milisaat (1/1000 saat). Ia cukup untuk memanggilnya sekali, dan enjin permainan akan mula memanggil kaedah onTurn()setiap kaliCik milisaat.

  2. Gantikan kaedah onTurn(int).

    Untuk melakukan ini, anda perlu mengisytiharkan kaedah void onTurn(int step)dalam kelas yang diwarisi daripada kelas Game. Kaedah ini akan dipanggil oleh enjin permainan. Dalam kes ini, enjin akan setiap kali memindahkan nombor siri panggilan tersebut (1,2,3, ...) kepada kaedah.

  3. Matikan pemasa.

    Jika pemasa tidak lagi diperlukan, apabila, sebagai contoh, pengguna telah menyelesaikan permainan, ia boleh dimatikan. Untuk melakukan ini, anda hanya perlu memanggil stopTurnTimer().

  4. Percepatkan atau tukar pemasa.

    Dalam sesetengah permainan, acara sentiasa dipercepatkan, jadi lebih mudah untuk mempercepatkan pemasa kami (mengurangkan masa antara panggilan). Tiada yang lebih mudah: panggil setTurnTimer(int timeMs)semula, dengan nilai baharu, dan masa antara panggilan onTurn()akan berubah.

Contoh:
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);

        }
    }}
Dalam contoh mudah ini, kami mencipta medan sel 3x3. Kemudian kami menghidupkan pemasa yang akan memanggil kaedah setiap setengah saat onTurn(). Setiap setengah saat warna sel akan berubah, tetapi kandungannya tidak akan berubah. Selepas 50 saat warna akan berhenti berubah. Itu sahaja! Jika anda ingin mengetahui lebih lanjut tentang bahagian Permainan, berikut ialah beberapa dokumentasi berguna yang boleh membantu:
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION