- На каком языке программирования написан Minecraft
- Java или C++?
- Почему Майнкрафт так нравится детям?
- Майнкрафт и детское программирование
- Сможет ли ребенок понять азы программирования с помощью Minecraft?
- Еще можно почитать
- Разработка собственного плагина для сервера Minecraft
- Идея плагина
- Создаем сам плагин
- Собираем все вместе
- Результат
На каком языке программирования написан Minecraft
Майнкрафт – знаменитая игра, в которой пользователю предстоит строить свой мир и защищаться от монстров. Этот программный продукт пользуется большой популярностью у детей. Именно по этой причине на базе Minecraft разработано большое количество курсов по программированию, в рамках которых ребенок учиться сам создавать отдельные элементы в игре и различные сценарии. В этой статье мы расскажем о том, на каком языке программирования написан Minecraft, а также рассмотрим процесс обучения программированию с помощью этого приложения.
Java или C++?
Изначально, Майнкрафт был написан на Java. Кстати, это чуть ли не единственная игра, созданная при помощи этого языка программирования. Именно благодаря этому, Java, который языком энтерпрайза, стал еще более популярным. Многие приходили в мир программирования именно через эту игру.
К тому же, на Java было написано множество модификаций Майнкрафта, что также повышало интерес как с самому языку, так и к игре. Однако в 2017 году стало известно о том, что базовая версия Minecraft будет на языке C++. С чем это связано?
Дело в том, что Java отлично подходил для этой игры до тех пор, пока разработчики не решили, что необходимо объединить все версии, в том числе для мобильных устройств. В итоге пользователи смогут играть в Майнкрафт на различных платформах, включая iOS. Здесь и кроется основная проблема. Дело в том, что Java не поддерживает iOS. А для полной кроссплатформенности разработчикам потребовалось изменить базовый язык, на котором написано приложение.
В результате, Minecraft теперь будет доступен в двух версиях – основная написана на C++ и дополнительная – Java Edition.
Почему Майнкрафт так нравится детям?
Если вы никогда не играли в Minecraft, но видели, как дети увлеченно это делают, наверняка вы задавались вопросом о том, что же там такого интересного? Ведь выглядит Майнкрафт совершенно не так, как большинство современных игр со сглаженными текстурами и навороченными эффектами.
Майнкрафт – это буйство пикселей и кубических моделей. При первом взгляде неискушенного геймера может показаться, что вы перенеслись в далекое прошлое в те времена, когда игроки носились по закоулкам неизвестной планеты в игре Doom.
Но на самом деле, Minecraft не имеет ничего общего с первыми трехмерными шутерами. Более того, это не шутер вовсе. Майнкрафт это целый мир, где вам предстоит менять ландшафт, добывать предметы и строить свои собственные постройки от простейших хижин до настоящих дворцов.
Minecraft – это, скорее, оцифрованный конструктор Лего, причем здесь нет каких-либо инструкций, что также очень нравится детям. Вы можете строить любое здание, главное, чтобы для этого хватило ресурсов. Почему же Minecraft так нравится детям?
- Безграничный полет фантазии. В игре ребенок может делать все, что угодно. Весь мир Майнкрафт полностью разрушаем, в том числе вода. То есть дети могут делать свой собственный ландшафтный дизайн по своему усмотрению.
- Свобода действий. В Майнкрафт никто не ограничивает ребенка в его поступках. Игрок может ходить по карте, рыть свои тоннели, осушать реки и озера.
Однако у всего этого есть и свои отрицательные стороны. В сети Интернет полно статей о том, как дети привыкают к игре и о появлении зависимости. Если ребенок слишком много времени уделяет игре, у него может ухудшиться успеваемость в школе, появляется апатия и это далеко не все негативные последствия.
Вместо того, чтобы запрещать детям играть в Майнкрафт, можно сделать так, чтобы Minecraft стал действительно полезен. И в этом помогут уроки программирования.
Майнкрафт и детское программирование
Почему сегодня многие онлайн школы программирования предлагают именно эту игру? Дело в том, что она пользуется популярностью у детей. Заинтересовать ребенка, если он будет заниматься любимым делом, намного проще.
В рамках уроков дети совмещают приятное с полезным. Они создают своих собственных персонажей и локации, что позволяет максимально включить творческие нотки в процесс обучения.
Для работы используется специальная среда разработки – Scratch. Это наиболее адаптированная платформа, работа в которой не вызовет затруднений у ребенка. Здесь предлагаются уже готовые модули, с помощью которых дети смогут выполнять различные задания преподавателя.
Основная суть такого обучения сводится к тому, чтобы научить детей мыслить логически, изучить, что такое алгоритмы, познакомиться с простейшими функциями и понять в целом, что такое разработка.
В чем основные преимущества Minecraft, как инструмента для обучения детей разработке?
- Малыши очень любят эту игру и готовы проводить в ней много времени. Поэтому вам не понадобиться уговаривать ребенка написать какой-то алгоритм. Дети обычно сами охотно занимаются разработкой на базе этой игры. Причем все обучение проходит таким образом, что ребенок как будто сам играет. То есть знания и навыки передаются незаметно, в процессе игры.
- Майнкрафт понятен детям. Здесь есть персонажи, которые могут выполнять определенные действия. В процессе обучения, ребенок научиться программировать алгоритм поведения персонажа. Причем изначально это будут самые простые программы. Впоследствии, дети смогут написать цепочку из более сложных команд, объединяемых в функции.
- Minecraft «заточен» под обучение. Существует специальная версия игры, которая разрабатывалась исключительно в образовательных целях профессиональными программистами. Причем она постоянно обновляется и поддерживается, появляется новый функционал. Разработчики делают все возможное, чтобы дети как можно глубже познакомились с программированием через игру.
Сможет ли ребенок понять азы программирования с помощью Minecraft?
В этой статье мы рассказали о том, на каком языке написан Майнкрафт. Но не стоит пугаться, что ребенка с первого же занятия начнут учить писать что-то подобное. Майнкрафт в данном случае выступает не как самоцель обучения, а всего лишь как инструмент, легкий, понятный и доступный ребенку.
Это своего рода возможность для взрослого разговаривать на языке ребенка. Конечно, если предложить детям одну и современных сред разработки и просто начать совместно писать код, малыш очень быстро устанет и разочаруется. Потому что это сложно и придется написать немало кода до достижения какого-то визуального результата.
В Minecraft все намного проще и интереснее. Результат дети могут видеть сразу же. Более того, им не придется писать код самостоятельно. Все блоки уже готовы к использованию. Необходимо только научиться правильно их расставлять для получения нужного результата.
Программирование – это, прежде всего, выстраивание различных алгоритмов и логических цепочек. Именно этим и занимаются дети в рамках обучения разработке с помощью Майнкрафт. Из готовых блоков складываются определенные последовательности команд, которые заставляют персонажа предпринимать те или иные действия. На самом деле, это очень интересно и увлекательно. И, как показывает практика, действительно полезно при получении детьми базовых знаний о программировании.
Еще можно почитать
Самые востребованные специальности 21 века
Разработка собственного плагина для сервера Minecraft
Еще с детства я начал покорять бесконечные просторы Minecraft. Естественно о разработке в то время никакой речи не шло. Но с недавних пор загорелся идеей создать о свой проект серверов.
На Java до этого никогда не писал, но есть бекграунд на других языках, поэтому осталось только приспособиться. Соотвественно разработка плагинов, Bukkit и другие библиотеки вижу впервые, но посмотрев несколько туторов, стала понятна примерная концепция.
Ранее писал на таких языках как PHP, JS. В данный момент веду разработку на языке Go. Сильно привык к «гошке» и его синтаксису и в процессе написания плагина часто использовал синтаксис Go для написания логических конструкций.
Мне не сильно хотелось использовать какие-то готовые решения, ведь тогда не будет углубленных знаний, которые я получу в процессе написания кода. Хочется одновременно и поучить Java и написать что-то свое (самое главное).
В этой статье я не буду затрагивать процесс настройки окружения, установки IDE и стороннего софта.
Идея плагина
На серверах часто используются постройки, находящиеся в пустоте, например летающие лобби, острова. Такую модель постройки мы выбрали вместе с моим другом: летающие острова. Одной из проблем таких построек — Игрок может провалиться в пустоту и не выбраться.
Прошерстив Google мне удалось найти парочку подходящих плагинов, которые уже решают это проблему. Но один из них, который оказался поддерживаем разработчиком и самими ядром сервера, предоставлял ограниченный функционал, расширенный можно было приобрести на X евро. Фича, которая мне понравилась в платном плагине — создание анимаций из частиц после телепортации из пустоты.
Мне захотелось самому понять, как это сделать, разработать собственный плагин, а потом с удовольствием им пользоваться, поддерживать, находить баги — мое мелкое детище, как никак.
Создаем сам плагин
Назвал я плагин просто — VoidTeleport.
Первым делом создал класс для управления конфигурацией плагина.
public class Config < private static File file; private static FileConfiguration config; private static final String fileNameConfig = "config.yml"; /** * Initializes the static Config class. */ public static void init() < // Получаем инстанс нашего плагина. Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(VoidTeleport.PluginName); if (plugin == null) < // На этом моменте что-то пошло не так, // нужно обработать и залогировать. Bukkit.getLogger().log( Level.WARNING, MessageFormat.format("Cannot get plugin ", VoidTeleport.PluginName) ); return; > file = new File(plugin.getDataFolder(), fileNameConfig); // Мы не знаем существует ли файл, поэтому пытаемся создать его. // Если файл уже есть, то выражение file.createNewFile() вернет false. try < if (file.createNewFile()) < plugin.getLogger().log( Level.INFO, MessageFormat.format("New config file with name was created", fileNameConfig) ); > > catch (IOException e) < plugin.getLogger().log(Level.SEVERE, e.toString()); return; >// На данно моменте наш конфиг пустой, // поэтому подгружаем его из файла. reload(); > /** * Getter * @return FileConfiguration */ public static FileConfiguration get() < return config; >public static void reload() < // Самый простой анмаршаллер YAML из файла. config = YamlConfiguration.loadConfiguration(file); >
Отлично! Класс для работы с конфигом уже есть, теперь нужно определиться со структурой файла config.yml . Нужно реализовать поддержку для разных миров, поэтому не придумал ничего проще, как просто указать список нужных миров.
worlds: # Наименование мира, например spawn, world, world_the_end - name: spawn # Координаты для респавна игрока при падении в пустоту spawnLocation: x: 0 y: 0 z: 0
Конфиг есть, теперь можно приступить к созданию обработчика событий. Мой выбор пал на событие EntityDamageByBlockEvent. Можно было бы и слушать событие PlayerMoveEvent, но оно случается гораздо чаще, чем триггер на получение урона. Лишняя нагрузка на сервер не нужна, поэтому стал слушать урон.
public class PlayerDamageListener implements Listener < // Хеш мапа в которой хранится наименования мира и точка телепортации. private HashMapworlds = new HashMap<>(); @EventHandler public void onPlayerDamage(EntityDamageByBlockEvent e) < if (!(e.getEntity() instanceof Player)) < // Это не игрок. return; >if (e.getCause() != EntityDamageEvent.DamageCause.VOID) < // Урон не от пустоты. return; >Player player = (Player) e.getEntity(); // Получаем мир, в котором находится Игрок. World world = player.getWorld(); // Пытаемся найти в хеш мапе значение по наименованию мира. Location spawnLocation = this.worlds.get(world.getName()); if (spawnLocation == null) < // К этому миру не действует правило телепорта. return; >// Данный код является костылем, который я быстро сообразил. // Проблема в том, что мир может быть = null. // В таком случае устанавливаем мир на тот, в котором находится игрок. if (spawnLocation.getWorld() == null) < spawnLocation.setWorld(world); >// Добрались до самого главного. // Отменяем событие, которое наносит урон игроку. e.setCancelled(true); // Отменяем сам урон от падения, // чтобы при телепортации игрок не разбился. player.setFallDistance(0); // Телепортируем игрока. player.teleport(spawnLocation); // Доабвляем анимацию из частиц при попадании на точку телепортации. Spiral.spawn(player); > @SuppressWarnings("unchecked") public void updateWorlds(@Nullable ArrayList> listWorlds) < if (listWorlds == null) < // Ну если null, так null - ничего не делаем. return; >// Очищаем мапу. this.worlds = new HashMap<>(); for (HashMap world: listWorlds) < String worldName = (String) world.get("name"); if (Objects.equals(worldName, "")) < // Тут хорошо бы залогировать, но просто скипаем. continue; >Location spawnLocation = Location.deserialize((Map) world.get("spawnLocation")); // Т.к. мир у нас не указан, поэтому получаем его. spawnLocation.setWorld(Bukkit.getWorld(worldName)); // Сохраняем в хеш мапу. this.worlds.put(worldName, spawnLocation); > > >
Тепер разберем вызов эффекта анимации при телепортации Spiral.spawn(player) . Назвал класс Spiral, потому что эффект будет в виде спирали.
Т.к. это мой первый плагин, то не стал заморачиваться с Пакетами и ProtocolLib.
Описываем анимацию в отдельном классе Spiral. Я предпочел реализовать спираль под названием Helix — достаточно простая в реализации модель. Пришлось немного вспомнить тригонометрию, но у меня получилось!
public class Spiral < public static void spawn(@NotNull Player player) < Location location = player.getLocation(); // Задаем радиут спирали. double radius = 0.5; for (double y = 0; y catch (InterruptedException e) < Bukkit.getLogger().log(Level.SEVERE, e.toString()); >> > >
Почему в коде 23? Это число является ограничением для координаты y. Т.е. по сути спираль будет подниматься вверх на y = 2.3 . Как можно заметить, при указании смещения particleLocation.add(x, y / 10, z) y делится на 10. Еще одной причиной стало то, что спираль не успевает несколько раз «обернуть» игрока.
Собираем все вместе
Наконец можем собрать наш код в единой точке и протестировать, что получилось.
public final class VoidTeleport extends JavaPlugin < public static final String PluginName = "VoidTeleport"; @Override public void onEnable() < getLogger().log(Level.INFO, "Plugin enabled!"); // Инициализируем конфиг Config.init(); // Регистрируем обработчик событий для входщего урона this.registerDamageEvent(); >@Override public void onDisable() < getLogger().log(Level.INFO, "Plugin disabled!"); >@SuppressWarnings("unchecked") private void registerDamageEvent() < // Инициализируем обработчик PlayerDamageListener damageListener = new PlayerDamageListener(); // Достаем из конфига нужные значения и обновляем хеш мапу в обработчике damageListener.updateWorlds((ArrayList>) Config.get().get("worlds")); // Регистрируем новое событие на сервере getServer().getPluginManager().registerEvents(damageListener, this); > >
Результат
При заданным настройкам файле конфигурации мы успешно попадаем в указанную точки и наблюдаем просто классную анимацию, как по мне.
И без указания мира в конфиге.
Можно посмотреть код этого плагина в моем репозитории Github.
Скачать можно последний релиз.