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

Bahagian permainan pada CodeGym: Enjin permainan

Diterbitkan dalam kumpulan
"Permainan" daripada CodeGym ialah bahagian baharu dengan tugas besar yang melibatkan penulisan permainan komputer yang popular. Mereka lebih mudah dibuat daripada yang kelihatan: setiap projek dibahagikan kepada dua puluh subtugas. Menyelesaikan tugasan langkah demi langkah, anda akan menulis permainan anda sendiri, dan kemudian anda boleh menambah ciri unik dan berkongsi dengan rakan. Bahagian "Permainan" pada CodeGym: Enjin permainan - 1Permainan ini menggunakan enjin permainan CodeGym yang mudah . Dalam artikel ini, kami akan menerangkan ciri utamanya dan rupa proses penulisan permainan.

1. Pengenalan

Bagi pembangun, terdapat tiga peringkat untuk pelaksanaan permainan komputer:
  1. Permulaan permainan — Peringkat ini terdiri daripada tindakan persediaan: menetapkan saiz padang permainan, melukis padang permainan, mencipta objek permainan dan meletakkannya pada kedudukan awalnya dan tindakan lain yang mesti dilakukan pada permulaan permainan.

  2. Proses permainan. Peringkat ini termasuk objek permainan bergerak, tindakan pemain, menyimpan skor dan tindakan lain yang mesti dilakukan pada frekuensi tertentu atau apabila butang ditekan.

  3. Selesai permainan. Peringkat ini termasuk menghentikan animasi, melaporkan menang atau kalah, dan tindakan lain yang mesti dilakukan pada penghujung permainan.

2. Permulaan permainan

Permulaan permainan hanya terdiri daripada dua langkah: Langkah 1: Buat kelas utama permainan. Untuk membangunkan permainan anda sendiri menggunakan enjin permainan CodeGym, anda perlu mencipta kelas yang mewarisi kelas Game(com.codegym.engine.cell.Game). Ini memberikan kelas anda keupayaan untuk memanggil kaedah enjin permainan, dan memberikan enjin keupayaan untuk memanggil kaedah anda. Sebagai contoh:

import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
    ...
}
Langkah 2: Gantikan kaedah permulaan(). Semua tindakan yang diperlukan untuk memulakan permainan akan berlaku dalam kaedah ini: mencipta medan permainan, mencipta objek permainan, dsb. Anda hanya perlu mengisytiharkan kaedah ini dalam kelas yang mewarisi kelas Game. Sebagai contoh:

import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
        // Here we perform all actions to initialize the game and its objects
    }
}
Kaedah ini initialize()adalah sama dengan main()kaedah: ia adalah titik permulaan untuk semua kod yang ditulis untuk permainan.

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. Dimensi adalah skrin permainan adalah malar. Ia boleh dibahagikan kepada bilangan sel yang berbeza. Contohnya, 7 sel lebar dengan 9 sel tinggi: Bahagian "Permainan" pada CodeGym: Enjin permainan - 2Ambil perhatian bahawa sel dinomborkan bermula dari sudut kiri atas. Untuk menetapkan saiz padang permainan, gunakan void setScreenSize(int width, int height)kaedah. Ia menetapkan saiz padang permainan. Parameternya mewakili bilangan sel secara mendatar (lebar) dan menegak (tinggi). Ia biasanya dipanggil sekali apabila permainan dimulakan. Sebagai contoh:

import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {

    @Override
    public void initialize() {
       // Set the field size to 7 cells x 9 cells
       setScreenSize(7, 9);
        ...
    }
}
Semasa menulis permainan, anda mungkin perlu mendapatkan lebar dan ketinggian semasa padang permainan. Untuk melakukan ini, kaedah int getScreenWidth()dan int getScreenHeight()akan berguna. 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 grid. Secara lalai, grid dipaparkan. Untuk mematikannya, panggil kaedah ini dengan false sebagai hujah:

showGrid(false);
Keputusan: Bahagian "Permainan" pada CodeGym: Enjin permainan - 3Untuk menghidupkan semula grid, hubungi:

showGrid(true);

4. Program primitif

Berikut ialah contoh program:

public class MySuperGame extends Game {

    @Override
    public void initialize() {

        // Create a playing field that is 3 cells x 3 cells
        setScreenSize(3, 3);
        // Turn off the grid
        showGrid(false);
        // Change the background of the center cell to blue, and display an "X" in it.
        setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);
    }
}
Dalam contoh ini, medan permainan ditetapkan kepada 3x3, grid dimatikan dan "X" oren separuh saiz sel ditetapkan pada latar belakang biru dalam sel tengah. Ini akan menjadi perkara pertama yang pemain lihat apabila permainan bermula.

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? Anda boleh menetapkan sifat berikut untuk setiap sel medan permainan:
  • warna sel (warna latar belakang sel);
  • teks (teks atau nombor);
  • warna teks;
  • saiz teks sebagai peratusan saiz sel.
Mari lihat kaedah untuk bekerja dengan sel-sel padang permainan :
  1. void setCellColor(int x, int y, Color color)— 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, String value)— menetapkan teks sel dengan koordinat (x, y) sama dengan rentetan dalam parameter nilai:

    
    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 sel dengan koordinat (x, y). Parameter saiz ialah ketinggian teks sebagai peratusan ketinggian sel:

    
    setCellTextSize(2 , 0, 70); // 70% of the cell height
    

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

    
    int size = getCellTextSize(2 , 0);
    

  7. void setCellNumber(int x, int y, int value)— menetapkan teks sel dengan koordinat (x, y) sama dengan nombor dalam parameter nilai:

    
    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, Color color)— menetapkan warna kandungan (teks) 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) sel dengan koordinat (x, y):

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

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

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

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

  3. void setCellValueEx(int x, int y, Color cellColor, String value, Color textColor, int textSize)— menetapkan warna latar belakang (cellColor), kandungan (nilai), warna teks (textColor), dan saiz teks (textSize) sel dengan koordinat (x, y):

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

6. Bekerja dengan warna

Ia Color enumbertanggungjawab untuk warna dalam enjin permainan. Ia mempunyai nilai unik untuk 148 warna. Ia juga mempunyai nilai istimewa (TIADA) yang tidak mewakili warna. Berikut ialah contoh bekerja dengan warna:

Color myColor = Color.WHITE;  // The myColor variable is set to white.
Color redColor = Color.RED;  // The redColor variable is set to red.
Color blueColor = Color.BLUE;  // The blueColor variable is set to light blue.
Kadangkala anda mungkin perlu mendapatkan susunan semua warna sedia ada. Untuk melakukan ini, gunakan values()kaedah. Sebagai contoh:

Color[] colors = Color.values();  // The colors variable is assigned an array containing all available colors.
Sangat mudah untuk mendapatkan indeks warna dalam palet:

Color color = Color.RED;
int redIndex = color.ordinal();  // Index of red

int blueIndex = Color.BLUE.ordinal();  // Index of blue
Anda juga boleh mendapatkan warna dengan indeksnya:

Color color = Color.values()[10];  // The color variable is assigned the color with index 10 in the Color enum.

7. Kotak dialog

Pada akhir permainan, anda perlu melaporkan kemenangan atau kekalahan kepada pemain. Untuk melakukan ini, terdapat kaedah khas yang memaparkan kotak dialog pada skrin permainan:

void showMessageDialog(Color cellColor, String message, Color textColor, int textSize)
di sini:
  • cellColorialah warna latar belakang kotak dialog;
  • messageialah teks mesej;
  • textColorialah warna teks mesej;
  • textSizeialah saiz teks mesej.
Kotak dialog ditutup dengan sendirinya jika pengguna menekan bar ruang.

8. Kaedah utiliti

Apabila menulis permainan, nombor rawak banyak digunakan. Untuk memudahkan mendapatkan nombor rawak, anda boleh menggunakan kaedah utiliti berikut yang disediakan oleh enjin permainan:
  1. int getRandomNumber(int max)— mengembalikan integer rawak daripada 0 hingga (maks-1) termasuk.

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

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