JavaRush-dan "Oyunlar" populyar oyunların öz versiyalarını yaratmaq üçün maraqlı və geniş miqyaslı tapşırıqları olan yeni bölmədir. Bu sadədir: hər bir oyun layihəsi alt tapşırıqlara bölünür. Onları bir-bir tamamlayın və oyun hazırdır. Siz onu sosial şəbəkələrdə paylaşa və dostlarınızı oynamağa dəvət edə bilərsiniz. Bu yazıda oyunlar yazarkən hadisələrin işlənməsiFəsil üsulları haqqında ətraflı danışacağıq .

1. Siçan ilə işləmək

Oyun mühərrikində siçan ilə işləmək üçün iki üsul var:
  • void onMouseLeftClick(int x, int y);

  • void onMouseRightClick(int x, int y);
Siz sadəcə olaraq bu metodları -dən miras qalan oyun sinfində elan edirsiniz Gamevə onlara istənilən kodu yazırsınız. İstifadəçi siçan düymələrini basdıqda oyun mühərriki özü onları çağıracaq.
  1. onMouseLeftClick(int x, int y)— siçanın sol düyməsini sıxdığınız zaman mühərrik tərəfindən çağırılır. Arqumentlər olaraq, klik baş verdiyi oyun sahəsinin xanasının koordinatlarını alır. Yuxarı sol xananın koordinatları (0,0) var. Bu metoddan istifadə etmək üçün onu ləğv etmək lazımdır.

  2. onMouseRightClick(int x, int y)— sağ kliklədiyiniz zaman zəng edilir. Metodla oxşar işləyir onMouseLeftClick(int x, int y).
Metodlardan istifadə nümunəsi:
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 ilə işləmək

Oyun mühərrikində klaviatura ilə işləmək üçün iki üsul var:
  • void onKeyPress(Key key);

  • void onKeyReleased(Key key);
İstifadəçi klaviaturada düyməni basdıqda hərəkətlərin baş verməsini istəyirsinizsə, bu üsulları Game-dən miras qalan oyun sinifinizdə elan edin və onlara kodunuzu yazın. İstifadəçi klaviatura düyməsini basdıqda və ya buraxdıqda oyun mühərriki özü onları çağıracaq.
  1. onKeyPress (Key key)— istənilən klaviatura düyməsi basıldıqda çağırılır. Basılan düymənin (və ya Key.UNKNOWN) dəyəri əsas arqument kimi metoda ötürülür.

  2. onKeyReleased (Key key)— istənilən klaviatura düyməsi buraxıldıqda çağırılır. Açar arqument müvafiq açarın (və ya Key.UNKNOWN) qiymətini alır.
Metodlardan istifadə nümunəsi:
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);
        }
    }
}
Vacibdir! Mühərrikin cari versiyasında Açar növü yalnız məhdud dəyərlər dəstini qəbul edə bilər (9 ədəd):
Məna İstifadəçinin klik etdiyi şey
Açar.ENTER İstifadəçi Enter düyməsini sıxdı
Açar. ESCAPE İstifadəçi Esc düyməsini sıxdı
Açar.PAUSE İstifadəçi Pause düyməsini sıxdı
Açar. SPACE İstifadəçi Space düyməsini sıxdı
Açar.SOL İstifadəçi Sol Oxa basdı
Açar.SAĞ İstifadəçi Sağ Oxa basdı
Key.UP İstifadəçi Yuxarı Oxa basdı
Açar. AŞAĞI İstifadəçi Aşağı Oxa basdı
Açar.Naməlum Yuxarıda sadalananlardan başqa istənilən açar

3. Taymerlə işləmək

Bir çox oyun real vaxt rejimində baş verir, yəni istifadəçi heç nə etməsə belə, oyundakı hadisələr hələ də icra olunur. Bu cür oyunları həyata keçirə bilməniz üçün oyun mühərrikinə taymer funksiyası əlavə etdik. Bu, belə işləyir: siz taymeri yandırırsınız və onun sönəcəyi vaxt müddətini təyin edirsiniz. Məsələn, 500 millisaniyə. Bundan sonra hər yarım saniyədə Game Engine onTurnTimer(). Taymer söndürülənə qədər sonsuz sayda. Taymeri necə istifadə etmək olar?
  1. Taymeri yandırın.

    Bunun üçün xüsusi bir üsul var void setTurnTimer(int timeMs). Arqument olaraq, metod zənglər arasındakı intervalın müddətini millisaniyələrlə (1/1000 saniyə) götürür. Bir dəfə zəng etmək kifayətdir və oyun mühərriki onTurn()hər dəfə Ms millisaniyəlik metodu çağırmağa başlayacaq.

  2. OnTurn(int) metodunu ləğv edirik.

    void onTurn(int step)Bunu etmək üçün, sinifdən miras qalmış bir sinifdə metodu elan etməlisiniz Game. Bu üsul oyun mühərriki tərəfindən çağırılacaq. Bu halda, mühərrik hər dəfə belə bir çağırışın seriya nömrəsini (1,2,3, ...) metoda köçürür.

  3. Taymeri söndürün.

    Taymer artıq lazım deyilsə, məsələn, istifadəçi oyunu bitirdikdə onu söndürmək olar. Bunu etmək üçün sadəcə zəng etmək lazımdır stopTurnTimer().

  4. Taymeri sürətləndirin və ya dəyişdirin.

    Bəzi oyunlarda hadisələr daim sürətlənir, ona görə də taymerimizi sürətləndirmək (zənglər arasındakı vaxtı azaltmaq) rahat olardı. Daha sadə bir şey yoxdur: setTurnTimer(int timeMs)yeni bir dəyərlə yenidən zəng edin və zənglər arasındakı vaxt onTurn()dəyişəcək.

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

        }
    }}
Bu sadə nümunədə biz 3x3 xanalardan ibarət bir sahə yaratdıq. Sonra hər yarım saniyədən bir metodu çağıracaq taymeri işə saldıq onTurn(). Hər yarım saniyədə hüceyrənin rəngi dəyişəcək, lakin məzmunu dəyişməyəcək. 50 saniyədən sonra rəng dəyişməyi dayandıracaq. Hamısı budur! Oyunlar bölməsi haqqında daha çox öyrənmək istəyirsinizsə, burada kömək edə biləcək bəzi faydalı sənədlər var: