JavaRush /Blog Java /Random-MS /Bahagian "Permainan" pada JavaRush: Enjin permainan

Bahagian "Permainan" pada JavaRush: Enjin permainan

Diterbitkan dalam kumpulan
"Permainan" daripada JavaRush ialah bahagian baharu yang mengandungi projek tugasan besar untuk menulis permainan komputer yang popular. Membuatnya lebih mudah daripada yang kelihatan: setiap projek dibahagikan kepada dua dozen subtugas. Dengan melengkapkan tugasan langkah demi langkah, anda akan menulis permainan anda, dan kemudian anda boleh menambah "ciri" unik padanya dan berkongsi dengan rakan. BabPermainan menggunakan enjin permainan JavaRush yang mudah . Dalam artikel ini kita akan bercakap tentang ciri utamanya dan bagaimana rupa proses menulis permainan.
  1. pengenalan
  2. Permulaan permainan
  3. Mewujudkan padang permainan
  4. Program primitif
  5. Bekerja dengan sel-sel padang permainan
  6. Bekerja dengan warna
  7. Kotak dialog
  8. Kaedah Utiliti
  9. Had enjin permainan

1. Pengenalan

Terdapat tiga peringkat dalam pelaksanaan permainan komputer di pihak pembangun:
  1. Permulaan permainan adalah tindakan persediaan: menetapkan saiz dan lukisan padang permainan, mencipta dan memasang objek permainan dalam kedudukan awal, serta tindakan lain yang mesti dilakukan pada permulaan permainan.

  2. Proses permainan. Ini termasuk pergerakan objek permainan, tindakan pemain, mengira mata yang diperoleh, serta tindakan lain yang mesti dilakukan pada selang waktu tertentu atau dengan menekan butang.

  3. Menamatkan permainan. Ini termasuk menghentikan animasi, mengumumkan kemenangan atau kekalahan, dan tindakan lain yang perlu dilakukan pada penghujung permainan.

2. Permulaan permainan

Memulakan permainan hanya terdiri daripada dua langkah:

Langkah 1: buat kelas permainan utama.

Untuk membangunkan permainan anda berdasarkan enjin permainan JavaRush, anda perlu mencipta kelas dan mewarisinya daripada kelas Permainan (com.javarush.engine.cell.Game). Ini akan memberi kelas anda keupayaan untuk memanggil kaedah pada enjin permainan, dan keupayaan untuk enjin memanggil kaedah anda. Contoh:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {
    ...
}

Langkah 2: mengatasi kaedah initialize().

Dalam kaedah ini, semua tindakan yang diperlukan untuk memulakan permainan akan berlaku: mencipta padang permainan, mencipta objek permainan, dsb. Anda hanya perlu mengisytiharkan kaedah ini dalam kelas yang mewarisi daripada kelas Permainan . Contoh:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
        //  Тут выполняем все действия по инициализации игры и ее an objectов
    }
}
Kaedah initialize() ialah analog kaedah main() : ia adalah tempat semua kod yang ditulis untuk permainan mula dilaksanakan.

3. Mewujudkan padang permainan

Mewujudkan padang permainan juga terdiri daripada hanya dua langkah.

Langkah 1: bahagikan padang permainan kepada sel.

Seluruh padang permainan dibahagikan kepada sel oleh enjin permainan. Saiz minimum ialah 3x3, maksimum ialah 100x100. Skrin permainan mempunyai saiz yang tetap. Ia boleh dibahagikan kepada bilangan sel yang berbeza. Sebagai contoh, lebar 7 dan tinggi 9:
Bab
Sila ambil perhatian bahawa penomboran sel bermula dari sudut kiri atas. Untuk menetapkan saiz padang permainan, gunakan kaedah void setScreenSize(int width, int height) . Ia menetapkan saiz padang permainan. Ia mengambil sebagai parameter bilangan sel secara mendatar (lebar) dan menegak (tinggi). Ia biasanya dipanggil sekali apabila permainan bermula. Contoh:
import com.javarush.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
       //  задали размер поля 7x9 клеток
       setScreenSize(7, 9);
        ...
    }
}
Semasa menulis permainan, anda mungkin perlu mendapatkan lebar dan ketinggian semasa padang permainan. Kaedah int getScreenWidth() dan int getScreenHeight() berguna untuk ini .

Langkah 2: Hidupkan atau matikan grid (pilihan).

Jika anda tidak menyukai grid hitam yang memisahkan sel pada medan permainan, anda boleh mematikannya. Kaedah void showGrid(boolean isShow) menghidupkan dan mematikan sel pemisah grid. Secara lalai, grid dipaparkan. Untuk mematikannya, panggil kaedah ini dengan parameter palsu:
showGrid(false);
Keputusan:
Bab
Untuk menghidupkan semula grid, hubungi:
showGrid(true);

4. Program primitif

Contoh program:
public class MySuperGame extends Game {

    @Override
    public void initialize() {

        //  Создаем игровое поле 3x3 клетки
        setScreenSize(3, 3);
        //  Выключаем отображение сетки
        showGrid(false);
        //  Меняем фон центральной клетки на синий, и отображаем в ней “Х”
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
    }
}
Dalam contoh ini, saiz medan permainan ditetapkan kepada 3x3, paparan grid dimatikan dan simbol "X" bersaiz separuh sel oren ditetapkan di tengah pada latar belakang biru. Ini akan menjadi perkara pertama yang pemain lihat apabila memulakan permainan.

5. Bekerja dengan sel-sel padang permainan

Hakikat bahawa kita boleh membahagikan medan permainan kepada sel adalah hebat, tetapi apa yang boleh kita lakukan dengan sel itu sendiri? Setiap sel padang permainan boleh ditetapkan:
  • warna sel (warna latar belakang sel);
  • teks (teks atau nombor);
  • warna teks;
  • saiz teks sebagai peratusan berbanding saiz sel.
Mari kita pertimbangkan kaedah untuk bekerja dengan sel medan permainan :
  1. void setCellColor(int x, int y, Warna warna) — menetapkan warna sel dengan koordinat (x, y):

    setCellColor(0, 0, Color.RED);
    setCellColor(3, 6, Color.BLACK);
    setCellColor(6, 8, Color.NONE);

  2. Color getCellColor(int x, int y) - mengembalikan warna sel dengan koordinat (x, y):

    Color myColor = getCellColor(2, 0);

  3. void setCellValue(int x, int y, Nilai rentetan) - meletakkan nilai teks dalam sel dengan koordinat (x, y):

    setCellValue(3, 3, "text");
    setCellValue(0, 8, "W");
    setCellValue(4, 1, "2222");
    setCellValue(6, 6, "");

  4. String getCellValue(int x, int y) - mengembalikan teks yang terkandung dalam sel dengan koordinat (x, y):

    String s = getCellValue(3, 3);
    System.out.println(getCellValue(4, 1));

  5. void setCellTextSize(int x, int y, int size) - menetapkan saiz kandungan dalam sel dengan koordinat (x, y). saiz – ketinggian teks sebagai peratusan ketinggian sel:

    setCellTextSize(2 , 0, 70); //  70% высоты клетки

  6. int getCellTextSize(int x, int y) - mengembalikan saiz kandungan dalam sel dengan koordinat (x, y):

    int size = getCellTextSize(2 , 0);

  7. void setCellNumber(int x, int y, int value) - meletakkan nilai nombor dalam sel dengan koordinat (x, y):

    setCellNumber(3, 3, 40);
    setCellNumber(0, 8, -8);
    setCellNumber(4, 1, 2222);
    setCellNumber(6, 6, 0);

  8. int getCellNumber(int x, int y) - mengembalikan nombor yang terkandung dalam sel dengan koordinat (x, y). Jika sel tidak mengandungi nombor, mengembalikan 0:

    int i = getCellNumber(3, 3);
    System.out.println(getCellNumber(4, 1));

  9. void setCellTextColor(int x, int y, Warna warna) — menetapkan warna kandungan (teks) dalam sel dengan koordinat (x, y):

    setCellTextColor(2, 1, Color.GREEN);
    setCellTextColor(0, 1, Color.NONE);

  10. Color getCellTextColor(int x, int y) - mengembalikan warna kandungan (teks) dalam sel dengan koordinat (x, y):

    Color textColor = getCellTextColor(1, 3);
Untuk kemudahan, terdapat beberapa kaedah setCellValueEx() dengan set parameter yang berbeza:
  1. void setCellValueEx(int ​​​​x, int y, Color cellColor, String value) — menetapkan sel dengan koordinat (x, y) warna latar belakang cellColor dan nilai kandungan:

    setCellValueEx(0, 2, Color.BLUE, "56");

  2. void setCellValueEx(int ​​​​x, int y, Color cellColor, String value, Color textColor) — menetapkan sel dengan koordinat (x, y) warna latar belakang selColor, nilai kandungan dan kandungan warna teksColor:

    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN);

  3. void setCellValueEx(int ​​​​x, int y, Color cellColor, Nilai rentetan, Color textColor, int textSize); — menetapkan sel dengan koordinat (x, y) warna latar belakang selWarna, nilai kandungan, teks warna kandunganWarna dan saiz kandungan teksSaiz:

    setCellValueEx(0, 2, Color.BLACK, "56", Color.GREEN, 70);

6. Bekerja dengan warna

Warna dalam enjin permainan dikawal oleh Color enum , yang mengandungi nilai unik untuk 148 warna. Dan juga nilai istimewa TIADA - ketiadaan warna. Contoh kerja dengan warna:
Color myColor = Color.WHITE;  //  переменной myColor присваивается белый цвет.
Color redColor = Color.RED; //  переменной redColor присваивается красный цвет.
Color blueColor = Color.BLUE; //  переменной blueColor присваивается синий цвет.
Kadangkala anda mungkin ingin mendapatkan pelbagai warna sedia ada. Untuk melakukan ini, gunakan kaedah values() . Sebagai contoh:
//  переменной colors присваивается массив, содержащий все доступные цвета.
Color[] colors = Color.values();
Mendapatkan nombor warna dalam palet adalah sangat mudah:
Color color = Color.RED;
int redIndex = color.ordinal(); //  Номер красного цвета

int blueIndex = Color.BLUE.ordinal(); //  Номер синего цвета
Anda juga boleh mendapatkan warna dengan nombornya:
//  переменной color присваивается цвет с индексом 10 из enum Color.
Color color = Color.values()[10];

7. Kotak dialog

Pada akhir permainan, pemain mesti dimaklumkan tentang kemenangan atau kekalahan. Terdapat kaedah khas untuk ini yang memaparkan kotak dialog pada skrin permainan:
void showMessageDialog(Color cellColor, String message, Color textColor, int textSize)
di sini:
  • cellColor — warna latar belakang kotak dialog;
  • mesej — teks mesej;
  • textColor — warna teks mesej;
  • textSize — saiz teks mesej.
Dialog ditutup dengan sendirinya jika pengguna menekan bar ruang.

8. Kaedah utiliti

Nombor rawak sering digunakan semasa menulis permainan. Untuk memudahkan mendapatkan nombor rawak, anda boleh menggunakan kaedah enjin sekerap:
  1. int getRandomNumber(int max) - mengembalikan integer rawak daripada 0 hingga (maks–1) inklusif.

  2. int getRandomNumber(int min, int max) - mengembalikan integer rawak dari min kepada (maks–1) inklusif.

9. Had enjin permainan

Untuk menjalankan permainan di tapak, mereka diterjemahkan ke dalam JavaScript pada pelayan. Dalam hal ini, beberapa sekatan timbul. Khususnya, apabila menulis permainan menggunakan enjin JavaRush, anda tidak boleh bekerja dengan fail, atau menggunakan semua kaedah kelas Sistem , kecuali currentTimeMillis() , setOut() , setErr() , arrayscopy() . Anda juga boleh menggunakan medan ralat dan keluar . Dengan melanggar sekatan ini, permainan, sudah tentu, boleh disusun dan dijalankan, tetapi ia tidak akan mungkin untuk diterbitkan. Anda juga tidak akan dapat menerbitkan permainan dengan gelung tak terhingga. 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