JavaFx Game
Разработка игры на Java / #1 – Как сделать игру на JavaFx?
Представляем вам курс по разработке мини игр на базе языка Java. За курс вы с нуля построите несколько игр на базе JavaFx библиотеки и научитесь строить приложения с графическим интерфейсом.
Видеоурок
Полезные ссылки:
- Курс по языку Java ;
- Скачать JDK ;
- Программа Intellij IDEA
Немного информации про Java
Язык Java уже много лет является одним из лидеров среди языков программирования. Не мудрено что как лидер он позволяет выполнять разработку приложений из разных сфер. На базе языка Java вы можете строить веб проекты, приложения под мобильные игры, ботов, серверные системы и всевозможные приложения, а также игры под ПК.

На сегодняшний день язык Джава является одним из самых популярных и востребованных языков в мире. Разработанные проекты на его основе компилируются в байт код (byte-code), что позволяет выполнять их позже на любой ОС вне зависимости от того где проект был создан.
Такая особенность языка используется и при построении ПК приложений, а также игр. Проект, что разработан на Джава или на одной из его библиотек может быть запущен на разных устройствах с разными операционными системами. Главное чтобы на устройствах был установлен JVM (Java Virtual Machine).
Информация про JavaFx
В ходе курса мы будем использовать JavaFx, но помимо этой библиотеки есть и многие другие, что выполняют схожую роль и позволяют строить приложения под ПК с графическим интерфейсом.
Одной из таковых библиотек является Java Swing. Возможно, ранее вы уже про нее слышали. Джава Свинг очень популярна и её популярность обусловлена датой её выхода. Дело все в том, что Джава Свинг является одной из первых библиотек, что были разработаны под язык Джава для построения приложений с графическим интерфейсом.
Если сравнить их на сегодняшний день, то JavaFx является более новой и современной библиотекой в сравнении с Java Swing. В JavaFx вы можете создавать интерфейс программы через специальную отдельную программу и процесс построения дизайна превращается в нечто очень простое и увлекательное. Вы сможете создавать интерфейс программы словно вы работаете в Фотошоп, но в более облегченном интерфейсе. К сожалению, Джава Свинг не может таким похвастаться и там дизайн проекта вам нужно будет прописывать самостоятельно.
Как раз по причине того что JavaFx куда более новая, удобная и более мощная библиотека – именно потому мы будем изучать её для построения проектов с графическим интерфейсом.
План курса
За курс мы с вами ознакомимся с основными концепциями JavaFx и научимся на его основе строить программы. В качестве приложений мы будем создавать небольшие игры, что будут иметь графический интерфейс и набор функций описанных на базе языка Джава.
Перед изучением курса вам нужно уметь работать с языком программирования Джава. Если вы не знакомы с этим языком, то можете пройти наш бесплатный курс по этому языку.
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Игра на java для начинающих


Привет, друзья и будущие коллеги! Совсем недавно я проходил тестирование для участия в реальном проекте, прошел его, но так уж сложилось, что я по личным обстоятельствам не смог принять участие в самом РП. После таких интересных задач, как тест на РП, обычные задачи курса стали менее привлекательным времяпрепровождением, тем более, большую часть я уже решил. Поэтому чтобы талант не пропадал зря продолжать обучение, я решил создать многопользовательскую веб-игру. Ссылки на другие игры:
- продолжение этой статьи
- 2048
Самой простой игрой мне показались крестики нолики, я решил разбить задачу на ряд подзадач:
- Консольное приложение для отработки игровой логики
- Мультиплеер
- Прикручивание базы данных игроков к консольному приложению
- Создание дизайна фронтенда, написание шаблонов страниц, игрового интерфейса
- Сборка «всего» воедино
Есть вероятность, что меня поругают, за такую последовательность, и скорей всего все серьезные проекты строятся в совсем иной последовательности, отвечу сразу, напишите об этом пост «для начинающих», чтобы все (и я в том числе) научились этому 🙂 Чтож.. приступим к написанию консольного приложения! Я пойду по тем же шагам, что и в больших задачах 20-х уровней. Что есть в игре крестики-нолики?!
- поле
- два игрока, которые ходят по очереди, один ставит крестик, второй нолик. всё просто.
Поле делаем стандартное поле 3х3. В чем можно хранить такое поле? первый вариант — двумерный массив. Какие элементы должны содержаться в этом массиве? ответ – нужно подумать, что мы будем делать с этими элементами, это вывод на экран и сравнение для поиска победителя. Если бы мы их только выводили на экран, то логично было бы держать их в виде строки, тогда сам массив и вывод на экран в цикле выглядели бы как-то так:
String[][] strings = , , , for (String [] ss : strings) < for (String s : ss) System.out.print(s + " "); System.out.println(); //для перевода строки >
на экране бы отобразилось:
O O _ _ X O X X X
Но кроме отображения, у нас есть еще сравнение значений, а тут уже возможны варианты. Можно сравнивать строки, можно создать специальный класс-перечисление ( enum ), но я предпочел бы сравнивать числа, а на «Х» и «О» заменять их только при выводе на экран. Пусть будет, например, 1 — «Х», 2 — «О», 0 — «_». итак, как же проверять поле на тройное совпадение Х или О?
Самый первый алгоритм — это проверка всего поля
int[][] canvas = , , >
Комбинации для выигрыша:
00-01-02, 10-11-12, 20-21-22, 00-10-20, 01-11-21, 02-12-22, 00-11-22, 20-11-02 — всего 8.

Проверка сравнением цифр, но это получается нужно каждый раз проверять ВСЁ поле, все 8 комбинаций. Конечно же, это не много, это не поиск чисел Армстронга в интервале от 0 до 1 млрд, здесь вычислений чуть более чем нет совсем, но всё равно хочется что-то более оптимальное, чем проверка всего поля. Вторая идея которая меня посетила, это проверять только ячейку, которую отметили на предыдущем ходе, так еще можно определить победителя, ведь мы будем знать кто сделал этот ход. Таким образом, вместо всех 8 комбинаций мы получаем всего 2, 3 или 4 комбинации, в зависимости от ячейки, см. рисунок: теперь нужно придумать, как определить какую комбинацию нужно запустить? Вот тут я понял, что использовать двухмерный массив не очень удобно. Я решил рассмотреть еще варианты. Сначала я придумал, что поле можно держать в девятизначной цифре, например, то самое поле, которое мы вывели на экран можно записать так 220012111, объясню на пальцах что это . Шифр прежний, 1 – «Х», 2 – «О», 0 – » «, значит 220012111 = «OO__XOXXX», или если после каждой третьей цифрой воткнуть перенос строки и добавить пробелы для наглядности:
О О _ _ Х О Х Х Х

вот опять, удобно для хранения, приспособу для отображения придумали, но неудобно для сравнения! Решение нашлось когда я пронумеровал ячейки 1-9, потом подумал, ведь в программировании отсчет начинается с 0 и пронумеровал как на картинке Не заметили никаких особенностей? если посмотреть на картинку выше, то станет ясно, что решения имеющие 2 комбинации, имеют нечетный порядковый номер, 4 комбинации — это порядковый номер 4, 3 комбинации – остальные. так я и пришел к тому, что нужно держать игровое поле в обычном массиве чисел: простая итерация между числами, возможность сравнения по алгоритму, который был выбран, простой вывод на экран. Что касается самого алгоритма сравнения. идем по порядку: во всех вариантах есть проверка строки и столбца, проверяем только их. если поиск не дел результатов, проверяем номер ячейки на чёт/нечёт, если нечетная то возвращаемся к игре, нет смысла проверять дальше, если четная, проверяем лежит ли на левой диагонали эта ячейка, номера этой диагонали при делении на 4 в остатке имеют 0. Если она лежит проверяем на совпадения, если совпадений не найдено, то проверяем на цифру 4, если нет – возврат в игру, если да идем дальше по коду и возвращаем результат проверки последней диагонали. Вероятно, для неподготовленного человека, это сложно понять прочитав набор букв выше, а кто-то может сказать, что много букв и в самом коде, что можно проще, буду рад обсудить это. С полем разобрались, теперь нужно разобраться с двумя пользователями, которые ходят по очереди и у каждого из них свой знак, Х или О. На первом этапе у нас нет никакой многопользовательности, значит проще всего будет использовать значки по очереди. Первый ход делает всегда Х, второй всегда О, потом снова Х и так далее. Напрашивается поставить флажок (true/false), и если true – то текущий игрок X, если false – то О и вначале каждого хода флажок=!флажок Осталось как-то принимать сигнал от игроков, о том какую ячейку они выбирают. Тут нам пригодится наш незабвенный BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); Игроки будут вводить номера ячеек, в консоль, и по нажатию Enter будет производиться ход. Ячейка соответствующая введенному номеру, будет менять значение с 0 на 1 или 2, в зависимости от текущего состояния флажка, который обсуждался абзацем выше. Вот тут важно сделать валидацию ввода, чтобы никто не смог поменять Х на О, когда ячейка уже заполнена 🙂 Что может ввести в консоль игрок?
- пустая строка
- буквы, знаки препинания, скобки.. одним словом неЦифры
- некорректные цифры — отрицательные или находящиеся за пределами размеров массива, занятые ячейки.
Стандартный метод получения цифры из строки это статический метод parseInt класса Integer Integer.parseInt(«2»); Он бросает исключение NumberFormatException , если не может получить цифру из заданной строки, защиту от первых двух пунктов мы сможем обеспечить перехватом этого исключения. Для третьего пункта я бы создал еще один метод, который проверяет введенное значение, но правильнее всего будет вынести запрос строки в отдельный метод, в котором будет производиться валидация, а возвращать он будет только число. Резюмируем, мы создали поле, сделали метод, который его отображает, сделали метод, который производит проверку «а не победил ли этот игрок часом?», сделали валидацию вводимых чисел. Осталось совсем немного, сделать проверку на ничью — отдельный метод, который пробегает по массиву и ищет 0, и отображение результатов игры. На этом всё, код готов, игра получилась небольшой, всего один класс, поэтому жесткие копипастеры могут не разбираясь, просто всё скопировать в свой проект и запустить его у себя, я и сам таким был, но сейчас стараюсь уже так не делать и никому не советую 🙂 Всем удачи в изучении JAVA! p.s. остальные пункты — мультиплейер и БД будут позже, я уже начал изучение материала 🙂
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class GameField < static int [] canvas = ; //012, 345, 678, 036, 147, 258, 048, 246 public static void main(String[] args) < boolean b; boolean isCurrentX = false; do < isCurrentX = !isCurrentX; drawCanvas(); System.out.println("mark " + (isCurrentX ? "X" : "O")); int n = getNumber(); canvas[n] = isCurrentX ? 1 : 2; b = !isGameOver(n); if (isDraw())< System.out.println("Draw"); return; >> while (b); drawCanvas(); System.out.println(); System.out.println("The winner is " + (isCurrentX ? "X" : "O") + "!"); > static int getNumber()< BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true)< try < int n = Integer.parseInt(reader.readLine()); if (n >= 0 && n < canvas.length && canvas[n]==0)< return n; >System.out.println("Choose free cell and enter its number"); > catch (NumberFormatException e) < System.out.println("Please enter the number"); >catch (IOException e) < >> > static boolean isGameOver(int n) < // 0 1 2 // 3 4 5 // 6 7 8 //поиск совпадений по горизонтали int row = n-n%3; //номер строки - проверяем только её if (canvas[row]==canvas[row+1] && canvas[row]==canvas[row+2]) return true; //поиск совпадений по вертикали int column = n%3; //номер столбца - проверяем только его if (canvas[column]==canvas[column+3]) if (canvas[column]==canvas[column+6]) return true; //мы здесь, значит, первый поиск не положительного результата //если значение n находится на одной из граней - возвращаем false if (n%2!=0) return false; //проверяем принадлежит ли к левой диагонали значение if (n%4==0)< //проверяем есть ли совпадения на левой диагонали if (canvas[0] == canvas[4] && canvas[0] == canvas[8]) return true; if (n!=4) return false; >return canvas[2] == canvas[4] && canvas[2] == canvas[6]; > static void drawCanvas() < System.out.println(" | | "); for (int i = 0; i < canvas.length; i++) < if (i!=0)< if (i%3==0) < System.out.println(); System.out.println("_____|_____|_____"); System.out.println(" | | "); >else System.out.print("|"); > if (canvas[i]==0) System.out.print(" " + i + " "); if (canvas[i]==1) System.out.print(" X "); if (canvas[i]==2) System.out.print(" O "); > System.out.println(); System.out.println(" | | "); > public static boolean isDraw() < for (int n : canvas) if (n==0) return false; return true; >>
Пишем 2d-игру на Java
В этой статье будет описываться создание 2D игры на Java. Сразу предупреждаю, вы должны хотя бы базово знать язык Java, поскольку на подробное объяснение каждой строки у меня нету времени. И очень прошу вас, не списывать просто код, а пытаться понять что означает каждая строка, и писать со смыслом. И еще, я использую Eclipse, но вы можете использовать любой IDE.
Задача:
Я планирую создать игру, напоминающую шутер с видом от 3 лица.
Начало:
Ну что, приступим!
Для начала создадим проект. Назовем его «Just game». И сразу создаем класс Display.java. В него пишем:
public static void main(String[] args) < JFrame frame = new JFrame(/* название нашей игры */); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true); frame.setVisible(true); >
Теперь разберемся, что мы сделали.
JFrame frame = new JFrame(/*название нашей игры*/);
мы создаем рамку, которая и будет отображаться при запуске нашей игры
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
устанавливаем операцию, которая будет происходить при нажатии на крестик. EXIT_ON_CLOSE — выйти из программы
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true);
устанавливаем нашей рамке максимальные размеры, убираем декорации(кнопки свернуть, закрыть, уменьшить/увеличить и т.п.), т.е. делаем игру на весь экран. Если вы хотите, чтобы игра не была бы на весь экран, то используйте:
frame.setSize(/*ширина*/,/*высота*/); frame.setResizable(false); //false чтобы нельзя было бы поменять размеры рамки, true -можно
frame.setVisble(true);
— делаем рамку видимой
Только не забудьте, все настройки рамки надо писать до того, как вы сделаете её видимой
Ну чтож, теперь нажимаем «Run» и пробуем запустить нашу игру. Если все написано правильно, у вас не должны возникать ошибки и должно появиться пустое, серое окно.
Серое окно… Как скучно… Давайте создадим что-нибудь поинтереснее.
Создадим новый класс, под названием «Main». Main класс у нас будет являться панелью, которую мы вставим в рамку, по этому он должен расширять JPanel. (Для тех, кто не знает, расширять пишется как extends после названия класса)
Возвращаемся в класс Display и после настроек рамки, но перед установлением её видимости, пишем:
frame.add(new Main());
Вы спросите — «Ну и зачем мы это сделали?». Представьте себе картину. Эта картина и является конечная наша игра. А теперь представьте рамку. Без ничего внутри, просто пустую рамку. На ней ничего нельзя нарисовать, она бесполезна. Для этого, мы вставили в картину пустой лист, на котором программа в дальнейшем может рисовать картину. На этом закончим наше лирическое отступление и вернемся к классу Main.
Нам нужно осуществить отрисовку, по этому мы должны добавить метод paint. Для этого пишем:
public void paint(Graphics g) < //отрисовка всех объектов >
Ну и для начала, можем написать внутри этого метода отрисовку линии. Для этого пишем:
g.drawLine(20, 20, 100, 100);
Теперь запускаем программу, и видим:

Даааааа, не густо…
Давайте отрисуем какую-нибудь картинку. Например эту:

Для начала, нам нужно указать путь к картинке. Для этого не в методе paint, пишем:
Image img = new ImageIcon("2.png").getImage();
(предварительно надо в наш проект скинуть картинку и назвать ее 2.png)
После этого удаляем строчку отрисовки линии, а вместо нее в метод paint пишем:
g.drawImage(img, 0, 0, null);
Разберемся поближе с методом drawImage, так как мы будем часто его затрагивать.
drawImage(картинка которую мы будем рисовать, которую мы объявили раннее, координата X с которой будет рисоваться картинка, координата Y с которой будет рисоваться картинка, paint);
Отдельно хочу поговорить о параметре paint. Лучше всего оставляйте его null. Я только однажды сталкивался, когда мне нужно было использовать paint. Это было когда я отрисовывал текст, и задавал ему размер шрифта. Но советую не лезть туда и использовать null.
Теперь запускаем программу, и видим:

Чего-то она маленькая, не правда ли? Давайте научимся увеличивать её размеры. Добавляем к drawImage() параметры так, чтобы вышло:
g.drawImage(img, 0, 0, 1920, 1080, null);
Что мы сейчас добавили? Эти два параметра растягивают картинку, до координат 1920 и 1080. Получается, что картинка на весь экран. Давайте запустим программу и это проверим.

Ну наконец-то. Теперь мы умеем любые картинки растягивать на весь экран. Но вот проблема. Метод paint вызывается только один раз. И как же его обновлять постоянно? Для этого существует очень полезная вещь — таймер. Давайте создадим его.
Для этого пишем:
Timer timer = new Timer(20, this);
(20 это частота с которой обновляется таймер, this- где выполнять метод при обновлении таймера
Это мы должны вписать сразу после строки определения класса, т.е. после:
public class Main extends JPanel
Также, надо дополнить строку определения класса таким образом:
public class Main extends JPanel implements ActionListener
После прописывания этой строки, у вас название класса должно подчеркнуться красным. Чтобы это исправить, в самом конце класса добавьте метод:
@Override public void actionPerformed(ActionEvent e) < // TODO Auto-generated method stub >
Этот метод будет выполняться при обновлении таймера. В него мы должны написать repaint(); чтобы при каждом обновлении таймера у нас все элементы бы стирались, и нарисовывались заново.
Дальше, мы должны запустить таймер. Для этого, создаем конструктор класса Main и в него пишем:
timer.start();
После этого, можете не запускать программу, ведь в ней ничего не изменится. Давайте заменим текстуру домика на нормальную текстуру карты. Её вы можете нарисовать сами, либо скопировать у меня пробную:

Размер картинки может быть любой, все равно её размер будет подгоняться прямо в программе. Ах да, разрешения компьютеров могут быть разные, так что добавим-ка в конструктор такие вещи:
public Main(JFrame frame)
И перед конструктором добавим:
JFrame frame;
И сходим еще в класс Display.java и там немного изменяем метод frame.add:
frame.add(new Main(frame));
Таким образом, наша рамка будет передаваться в класс Main.java. Переходим в этот класс, и там где у нас метод paint() меняем строку drawImage() на:
g.drawImage(img, 0, 0,frame.getWidth(), frame.getHeight(), null);
Таким образом, теперь наша игра будет отрисовывать картинку на весь экран, в независимости от его разрешения. Запускаем:

На сегодня все. Оставляю код, для тех, кто запутался:
Display.java
import javax.swing.JFrame; public class Display < public static void main(String[] args) < JFrame frame = new JFrame("JustGame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); frame.setUndecorated(true); frame.add(new Main(frame)); frame.setVisible(true); >>
Main.java
import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; public class Main extends JPanel implements ActionListener < Image img = new ImageIcon("2.png").getImage(); Timer timer = new Timer(20, this); JFrame frame; public Main(JFrame frame) < this.frame = frame; >public void paint(Graphics g) < g.drawImage(img, 0, 0,frame.getWidth(), frame.getHeight(), null); >@Override public void actionPerformed(ActionEvent e) < // TODO Auto-generated method stub repaint(); >>
Пишем игру “Dendy Tanks” на Java с нуля.
Мы подготовили для вас увлекательный онлайн тренинг по написанию графической игры “Танки”, который поможет легко и быстро познакомиться с практической стороной разработки на Java. Ноль теории, только практика. Если ты никогда не программировал – не проблема! Смотри и делай!
Кому это будет полезно:
- Новичкам. Отсутствие опыта в программировании не должно вас останавливать. Мы предоставляем вам шанс сделать свою первую программу на Java и получить опыт практического применения данного языка программирования в создании настоящей компьютерной игры.
- Начинающим Java разработчикам без опыта. Вы сможете углубить и применить на практике свои знания языка Java под руководством тренера.
Чему вы научитесь:
- Писать простые программы и подпрограммы с использованием языка Java
- Работать с массивами данных
- Использовать типы данных и классы Java
- Применять все базовые навыки (переменные, условные конструкции, циклы, методы) на практике
Формат тренинга
Вас ждёт прямой эфир на YouTube с Андреем Бондаренко в течение 3-х часов, общение в чате во время эфира и в специальном телеграм-канале вне эфира. Все примеры и исходные данные также будут в телеграм-канале, к которому вы сможете присоединиться после регистрации.
Программа тренинга:
- Создание карты поля боя
- Работа над передвижением танка
- Реализация стрельбы
- Обучение танка двигаться в указанный квадрант
- Добавление танка-противника
- Итог: танк проходит всё поле боя и чистит его
- Ответы на вопросы. Куда развиваться дальше?
Подарки
10 самых активных участников тренинга получат от CyberBionic Systematics Подарочные сертификаты на обучение стоимостью 1000 грн.
Учись вместе с друзьями
Регистрируйся на онлайн интенсив и поделись новостью с друзьями. Вместе учиться намного интереснее!
Покупай подписку с доступом ко всем курсам и сервисам
Библиотека современных IT знаний в удобном формате
Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.
- Все видеокурсы на 3 месяца
- Тестирование по 10 курсам
- Проверка 5 домашних заданий
- Консультация с тренером 30 мин
