Як написати свій тетріс на java за півгодини

Нам, як завжди, знадобляться:
- 30 хвилин вільного часу;
- Налагоджена робоче середовище, тобто JDK і IDE (наприклад, Eclipse);
- Бібліотека LWJGL (версії 2.x.x) для роботи з графікою (опціонально). Зверніть увагу, що для LWJGL версій вище 3 потрібно написати код, що відрізняється від того, що наведено в статті;
- Спрайт, тобто картинки плиток всіх можливих станів (порожня, і зі ступенями двійки до 2048). Можна намалювати самому, або завантажити що використовувалися при написанні статті.
З чого почати?
Почати варто з головного керуючого класу, який в нашому проекті знаходиться вище за інших за рівнем абстракції. Взагалі відмінний рада - на початку роботи завжди пишіть код виду if (getKeyPressed ()) doSomething (). так ви швидко визначите фронт робіт.
Всі дані від введення ми просто зберігаємо в відповідні поля, дії на основі них буде виконувати метод logic ().
Тепер вже потихеньку стає зрозуміло, що нам необхідно. По-перше, нам потрібні клавіатурний і графічний модулі. По-друге, потрібно якось зберігати напрям, який гравець вибрав для зсуву. Друге завдання вирішується просто - створимо enum з трьома станами: AWAITING, LEFT, RIGHT. Навіщо потрібен AWAITING. Щоб зберігати інформацію про те, що зрушення не потрібно (використання в програмі null слід всіма силами уникати). Перейдемо до інтерфейсів.
Інтерфейси для клавіатурного і графічного модулів
Так як багатьом не подобається, що я пишу ці модулі на LWJGL, я вирішив в статті приділити час тільки інтерфейсів цих класів. Кожен може написати їх за допомогою тієї GUI-бібліотеки, яка йому подобається (або взагалі зробити консольний варіант). Я ж по-старому реалізував їх на LWJGL, код можна подивитися тут в папках graphics / lwjglmodule і keyboard / lwjglmodule.
Інтерфейси ж, після додавання в них всіх згаданих вище методів, будуть виглядати наступним чином:
Якщо ви вирішили не використовувати LWJGL і написали свої класи, що реалізують GraphicsModule і KeyboardHandleModule. то тут потрібно вказати їх конструктори замість, відповідно new LwjglGraphicsModule () і new LwjglKeyboardHandleModule ().
А ось тепер ми переходимо до класу, який відповідає за зберігання інформації про ігровому полі і її оновлення.
клас GameField
Цей клас повинен, по-перше, зберігати інформацію про поле і про падаючої фігурі, а по-друге, містити методи для їх поновлення, і отримання про них інформації - крім тих, які ми вже використали, необхідно написати метод, який повертає колір осередки по координатам, щоб графічний модуль міг отрисовать поле.
Почнемо по порядку.
Зберігати інформацію про поле ...
countFilledCellsInLine = new int [COUNT_CELLS_Y + OFFSET_TOP];
«Що це за OFFSET_TOP?» - запитаєте ви. OFFSET_TOP це кількість не відображаються осередків зверху, в яких створюються падаючі фігури. Якщо фігурі не зможе «випасти» з цього простору, і хоч одна осередків theField вище рівня COUNT_CELLS_Y буде заповнена, це буде означати, що поле переповнене і користувач програв, тому OFFSET_TOP повинен бути строго більше нуля.
Далі в конструкторі варто заповнити масив theField значеннями константи EMPTINESS_COLOR. а countFilledCellsInLine - нулями (друге в Java не потрібно, при ініціалізації масиву все int 'и рівні 0). Або можна створити кілька шарів вже заповнених осередків - на GitHub ви можете побачити реалізацію саме другого варіанту.
А що це там за spawnNewFigure (). Чому ініціалізація фігури винесена в окремий метод?
Ви правильно здогадалися, spawnNewFigure () дійсно инициализирует поле figure. А в окремий метод це винесено, тому що нам доведеться робити ініціалізацію кожен раз, коли буде створюватися нова фігура.