CodeGym /Blog Java /rawak /Bahagian permainan pada CodeGym: Pengendalian acara
John Squirrels
Tahap
San Francisco

Bahagian permainan pada CodeGym: Pengendalian acara

Diterbitkan dalam kumpulan
"Permainan" daripada CodeGym ialah bahagian baharu dengan tugasan menarik yang besar di mana anda mencipta versi permainan popular anda sendiri. Ia mudah: setiap projek permainan dibahagikan kepada subtugas. Lengkapkan satu persatu dan permainan selesai. Anda boleh berkongsinya di rangkaian sosial dan menjemput rakan anda untuk bermain. Bahagian "Permainan" pada CodeGym: Pengendalian acara - 1Dalam artikel ini, kami akan menerangkan secara terperinci kaedah pengendalian acara yang digunakan untuk 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 anda yang mewarisi Game, dan tambahkan sebarang kod yang anda mahukan padanya. Enjin permainan akan memanggil mereka apabila pengguna mengklik butang tetikus.
  1. onMouseLeftClick(int x, int y)— dipanggil oleh enjin apabila butang kiri tetikus diklik. Parameternya ialah koordinat sel medan permainan tempat klik berlaku. Sel kiri atas mempunyai koordinat (0, 0). Anda perlu mengatasi kaedah ini untuk menggunakannya.

  2. onMouseRightClick(int x, int y)— dipanggil apabila butang kanan tetikus diklik. Kaedah ini berfungsi seperti onMouseLeftClick(int x, int y)kaedah.

Berikut ialah contoh menggunakan kaedah ini:

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) {
        // Set "X" in the cell where the left mouse click occurred
        setCellValue(x, y, "X");
    }

    @Override
    public void onMouseRightClick(int x, int y) {
        // Clear the cell where the right mouse click occurred
        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 sesuatu berlaku apabila pengguna menekan kekunci, isytiharkan kaedah ini dalam kelas anda yang mewarisi Permainan dan tambahkan kod anda padanya. Enjin permainan akan memanggil mereka apabila pengguna menekan atau melepaskan kekunci.
  1. onKeyPress(Key key)— dipanggil apabila sebarang kekunci ditekan. Parameter kekunci ialah kekunci yang ditekan (atau Kekunci.TIDAK DIKETAHUI).

  2. onKeyReleased(Key key)— dipanggil apabila sebarang kunci dilepaskan. Parameter kunci ialah kunci yang sepadan (atau Key.UNKNOWN).

Berikut ialah contoh menggunakan kaedah ini:

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 space bar is pressed, the center cell turns yellow
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.YELLOW);
        }
    }

    @Override
    public void onKeyReleased(Key key) {
        // When the space bar is released, the center cell changes back to white
        if (key == Key.SPACE) {
            setCellColor(1, 1, Color.WHITE);
        }
    }
}
Penting! Dalam versi semasa enjin permainan, jenis Kunci mempunyai set terhad sembilan nilai:
Nilai Kekunci ditekan oleh pengguna
Kunci.MASUKKAN Pengguna menekan Enter
Kunci.MELARIKAN DIRI Pengguna menekan Esc
Kunci.JEDA Pengguna menekan Jeda
Kunci.RUANG Pengguna menekan Space
Kunci.KIRI Pengguna menekan kekunci anak panah kiri
Kunci.KANAN Pengguna menekan kekunci anak panah kanan
Key.UP Pengguna menekan kekunci anak panah ke atas
Kunci. BAWAH Pengguna menekan kekunci bawah
Kunci.TIDAK DIKENALI Pengguna menekan kekunci selain daripada yang di atas

3. Bekerja dengan pemasa

Banyak permainan berlaku dalam masa nyata, iaitu walaupun pengguna tidak melakukan apa-apa, peristiwa masih berlaku dalam permainan. Untuk membolehkan anda melaksanakan permainan sedemikian, kami menambah pemasa pada enjin permainan. Ia berfungsi seperti ini: anda menghidupkan pemasa dan menetapkan selang pemasa. Contohnya, 500 milisaat. Kemudian, setiap setengah saat enjin permainan memanggil onTurnTimer()kaedah. Lagi dan lagi selama-lamanya — sehingga pemasa dimatikan. Jadi bagaimana anda menggunakan pemasa?
  1. Hidupkan pemasa.

    Untuk melakukan ini, terdapat kaedah khas. Kaedah ini mengambil sebagai hujah selang antara panggilan dalam milisaat (1 milisaat = 1/1000 saat). Anda hanya perlu memanggilnya sekali, dan enjin permainan akan mula memanggil kaedah setiap kaliCik milisaat.void setTurnTimer(int timeMs)onTurn()

  2. Gantikan kaedah onTurn(int).

    Untuk melakukan ini, anda perlu mengisytiharkan kaedah dalam kelas yang mewarisi . Kaedah ini akan dipanggil oleh enjin permainan. Lebih-lebih lagi, dengan setiap panggilan enjin permainan akan menghantar kepada kaedah pengecam berjujukan untuk panggilan (1, 2, 3, …).void onTurn(int step)Game

  3. Matikan pemasa.

    Jika pemasa tidak lagi diperlukan, contohnya, apabila pengguna menyelesaikan permainan, anda boleh mematikannya. Untuk melakukan ini, anda hanya perlu memanggil kaedah.stopTurnTimer()

  4. Mempercepatkan atau menukar pemasa.

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

Sebagai contoh:

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

public class MySuperGame extends Game {
    …
    @Override
    public void initialize() {
    	// Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        showGrid(false);
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

        setTurnTimer(500);   // Turn on the timer, the interval between calls is 500ms.
    }

    @Override
    public void onTurn(int step) {
        if(step == 100) {
            stopTurnTimer();  // If 100 calls have been made, turn off the timer
        }

        if (step % 2 == 1) {
            // If this call is odd, set the cell background to red
            setCellColor(1, 1, Color.RED);
        } 
        else {
            // If this call is even, set the cell background to blue
            setCellColor(1, 1, Color.BLUE);

        }
    }
    …
}
Dalam contoh mudah ini, kami mencipta medan iaitu 3 sel x 3 sel. Kemudian kami memulakan pemasa yang akan memanggil onTurn()kaedah setiap setengah saat. Setiap setengah saat, warna sel akan berubah, tetapi kandungannya tidak akan berubah. Selepas 50 saat, warna tidak akan berubah lagi. Itu sahaja buat masa ini! 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