Bevy - движок очень перспективный, а главное - он регулярно обновляется.
Согласен. Недостатки (совершенно нормальное явление для молодого проекта) которые я упоминал выше имеют далеко не критичный характер, я просто старался не создать ложное впечатление о движке как "ультра убийца Unity\UE".
Движок вправду очень интересный из за можно сказать популяризации ECS подхода и правда очень активно разрабатывается. Сообщество тоже очень активно. Майнкрафт - лучшая игра в мире
Bevy молодой игровой движок общего назначения который предоставляет ECS логику для создания игровых сценариев. Основное отличие от ООП подхода как раз в отсутствии самого понятия "объект", вместо работает структура из Entity (сущности) Component (компоненты) и Systems (системы) (а так же ещё Resources, но их в аббревиатуру по какой-то причине не включают). Так же стоит отметить что ECS не ноу-хау Bevy, а в общем-то довольно известная технология. К примеру года 3 назад Unity предприняла попытку создать альтернативную логику движка на ECS.
Так что же, перейдём к змейке. И самое главное забываем про стандартный ООП подход и стараемся переключится на ECS логику (по началу может быть очень сложно).
Для начала настройки рабочего окружения.
Добавляем Bevy к проекту:
Код
cargo add bevy
Так как вы уже должны быть минимально знакомы с Rust'ом вы знаете какие у него долгие компиляция так что необходимо добавить пару оптимизаций что бы в результате наш .toml файл выглядел так:
И так же включить доп. функцию динамического линкера что бы наша конфигурация запуска выглядела таким образом:
После таких настроек нажимаем кнопку build и ждём компиляции. Имейте ввиду это может занять довольно приличное время (около 10 -+3 минут). Зато последующие запуски проекта будут в течении нескольких секунд.
Базовая настройка приложения
Для использования базовых функци движка необходимо использовать указать:
Код
use bevy::prelude::*;
Остальные же импорты сама IDE предложит.
Самый корень Bevy приложения это App. С помощью которого мы добавляем Системы. Системы это обычные функции Rust. Давайте добавить встроенную системы close_on_esc что по нажатию на соответствующую клавишу игра закрывалась. Код будет выглядеть так:
Системы выполняются каждый кадр приложения. Но есть ещё отдельный вид систем которые исполняют себя только один раз при создании приложения. С помощью таким систем можно создать камеру через которую будет видно игровое поле.
В качестве параметров системе принимает Commands - инструмент для работы с сущностями (удаление, создание). Обратите внимание, при добавлении системы передавать аргументы не надо! Bevy решит это самостоятельно какие параметры системе нужны.
Для змейки нам необходим ресурс (глобально доступная структура) которая будет хранить вектор с id сущностей змейки. Так же необходим компонент SnakeSegment для маркировки сущностей принадлежностью к змейке и направление змейки. Так же не забываем имплементацию "по умолчанию" для того что бы инициализировать ресурс.
В качестве параметров ресурс берёт Commands для спавна сущности змейки, ресурс змейки и вектором (обязательно mut, нам его менять надо), и сервер по загрузки ассетов. Помимо спавна спрайта, добавляем ещё SnakeSegment, теперь сущности можно легко найти по фильтру этого компонента. Добавляем системы как стартовую.
Тут логика игры стандартная - удаляем хвост добавляем спереди и так движемся по направлению. У данной системы есть очень важный параметр - запрос (Query). С помощью запросов можно легко найти все необходимые элементы с необходимыми компонентами. Это ключевая функция Bevy и ECS системы.
Для создания системы роста змейки будем использовать ещё одну функцию Bevy - события (Event). События может отправить любая система и принять так же любая система кто имеет соотвествующий параметр.
Создаём пустую структуру и добавляем её как событие:
Код
.add_event::<SnakeGrowthEvent>()
Спавн еды Для начала нам нужно создать еду по умолчанию:
Код
fn spawn_default_food(mut commands: Commands, asset_server: Res<AssetServer>) { let x = rand::thread_rng().gen_range(-7..=7) as f32; let y = rand::thread_rng().gen_range(-7..=7) as f32;
Змейка съела сама себя? Тут можно применить более хитрый метод чем проверять у каждого сегмента змейки столкновение с головой. Для обработки проигрыша мы просто отфильтруем сегменты змейки и если сегментов с кординатами головы больше 1 то игра завершается.
Для того что бы змейка двигалась не так быстро создадим ресурс с фиксированным временем. Далее вместо поочерёдного добавление систем. Используем функцию добавление пачки систем и объеденим из Schedule. Такой способ позволет настроить порядок запуска систем и как часто они запускаются. В нашем случае необходимо что бы система движение всегда была перед система поедания и проигрыша.
Послесловие Ещё хочу обратить внимание что при таком подходе нужно как можно больше разбивать логику работы на мелкие системы, тогда движок будет работать на все сто. Движок очень молодой (ему вот только 3 года), бесплатный, так что специально не обращал внимание на некоторые особенности API так они крайне часто меняются (тут версия 0.10.1). Но как по мне явно перспективный, явно не будет брошен, всё таки 25 тысяч звёзд на гитхабе о чём то говорит (к примеру у libgdx за всё его время существования в почти 13 лет только 21 тысяча).
Добавлено (29 Июня 2023, 18:04) --------------------------------------------- Простейший графический интерфейс Создание простейшего меню
Для создания графического интерфейса будем использовать встроенные функции движка Bevy UI. Графический интерфейс ещё достаточно сыроват (на момент версии 0.10.1) и код будет выглядеть достаточно громоздко но в общем полностью выполняет необходимые требования + возможна полная кастомизация внешнего вида.
Первое что нам понадобиться это дополнительный файл main_menu.rs (или лучше просто menu.rs, так больше подходит стилистике Rust кода)...
Небольшое отступление: структура и организация проекта для Bevy на данный момент это та ещё головная боль, поэтому такое разделение не является самым лучшим, но для небольших проектов вполне себе подойдёт.
...после создания файла с меню нам нужно подключить файл к основному (к примеру IntelliJ IDEA сама предложит подключение), сделать это так:
Код
mod main_menu;
Это указывает компилятору видимость данного файла но важно - не само содержимое файла.
Создадим в main_menu.rs структуру:
Код
pub struct MainMenuPlugin;
И указываем возможность его использования в main.rs:
Код
use crate::main_menu::MainMenuPlugin;
Теперь когда базовая настройка завершена перейдём к логике.
Состояния Состояния это обычный enum с перечислением всех возможных вариантов.
...для поиска самой кнопки "Играть" и корневого компонента этой кнопки.
Сама модель UI строиться по логике Flexbox и предстовляет собой довольно гибкую систему, но слишком громоздкую для человеческого глаза и может очень легко спугнуть новичка.
Хотя с другой стороны трудно тут как либо прокомментировать, код сам себя объясняет. Единственное что отметить можно это логику: КорневойКомпонент -> Кнопка -> Текст.
Взаимодействие с кнопками
Для взаимодействия с кнопкой нужно использовать запрос (Query) вместе с параметром Interaction (это enum со всеми возможными действиями над кнопкой) и компонентов <ИмяНашейКнопочки>.
Так же не забываем использовать конструкцию...
Код
if let Ok(...) = ... {}
...что бы исключить ошибку если элемента не существует.
Помогите деду (уже как никак 10 лет прошло, а как будто вчера было) скомпилировать библиотеку Ссылка (GitHub).
Уже обошёл несколько форумов так нигде ни у кого и не получилось. Был бы очень рад гайду как это сделать от А до Я с самого начала. Потому что сколько разного советовали и ошибки были на разных этапах.
Добавлено (25 Мая 2022, 21:35) --------------------------------------------- Ну и нужны .dll под винду
При подключении GLAD компилятор не может найти khrplatform.h. Пробовал указывать с помощью -L, -I, -l но как-то не помогло.
Ошибка:
Исходный код:
Код
#include "glad/glad.h" #include "glfw3.h"
#include <iostream>
int main() {
}
Структура проекта:
Добавлено (25 Июля 2020, 19:51) --------------------------------------------- Я уже разобрался. Я -I не правильно использовал.
Но возник другой вопрос: компиляция программы проходит успешно (SFML) но при запуске исполняемого файла появляется ошибка libgcc_s_seh-1.dll не обнаружен.
Добавлено (25 Июля 2020, 21:46) --------------------------------------------- С этим тоже разобрался Майнкрафт - лучшая игра в мире
Сообщение отредактировал minecrafter2 - Суббота, 25 Июля 2020, 21:46
Обратите внимание если вы решили посмотреть исходный код - я не программист и не умею программировать. Хотя я с Java уже знаком довольно давно но я её изучаю практически методом тыка и делаю только это в своё удовольствие в свободное время на нерегулярной основе. Я понимаю что код конечно очень плохой. Если хотите поправить или сказать как правильно - я буду только рад.
Вообще я рад что Gcup ещё жив, я ведь можно сказать вырос на нём. Думал со временем загнётся, а он ещё в самом расцвете сил. Майнкрафт - лучшая игра в мире
1. При запуске JFrame из IDE (Eclipse) - всё нормально Если скомпилировать программу в запускаемый .jar и запустить через иконку - то окно почему то место заявленных 1600х720 раздувает где то в раза полтора. Если запускать через cmd java -jar game.jar - окно нормальных размеров как указано в программе. Попробовал на другом компьютере - не зависимо от способа запуска фрейм зумится. Я попробовал убрать масштабирование Windows до 100% процентов - стало всё нормально. Как заставить её запускаться игнорируя масштаб Windows? И почему на одной машине способ запуская влияет на размер окна, а на другой - нет?
2. Но это ещё не всё. Самое весёлое вот: мне нужно отображать текст из .txt файла по середине фрейма зависимо от размера строки и размера фрейма, и тут опять же - если программа запустилась из IDE или через cmd то всё нормально - если нет то текст начинает съезжать из за того что размер первой строки почему то перестаёт правильно считаться.
Это функция по которой я текст рисую
Код
public void drawText(Graphics g, String textFile) {
int y = 110;
String text = " ", firstLine = " ";
FileReader fr;
try {
fr = new FileReader(textFile); BufferedReader reader = new BufferedReader(fr); firstLine = reader.readLine(); reader.close(); } catch (IOException e1) {
e1.printStackTrace(); }
try { text = new String(Files.readAllBytes(Paths.get(textFile)), "MS932"); } catch (IOException e) {
Капец вот до чего меня java довела, сюда не заходил уже года 2 - 3, надеюсь тут ещё живые люди есть.
Добавлено (31 Октября 2019, 06:56) --------------------------------------------- Скриншотил с рабочем столом для большей наглядности(Все картинки 1280х720)
1. Как правильно
2. Как не надо
Изменение масштабирования до 100% не решает проблему с съезжанием текста.
Добавлено (01 Ноября 2019, 20:27) --------------------------------------------- Вообще мне главное чтобы текст не съезжал, а на размер окна пофигу вообщем то.
Добавлено (01 Ноября 2019, 23:34) --------------------------------------------- Хахах,это оказывается происходит только с русским текстом. Изменение кодировки не лечит. Вообще можете поздравить меня, я нашёл баг - g.getFontMetrics().stringWidth(Line) работает не верно если строка была разгружена из файла с русским текстом.
Но вопрос открыт - как обойти этот баг?
Добавлено (02 Ноября 2019, 00:03) --------------------------------------------- Хотя мне кажется g тут не причем, а чудит filereader:
Код
try {
tfr = new FileReader(textFile); tBufferedReader reader = new BufferedReader(fr); tfirstLine = reader.readLine(); treader.close(); } catch (IOException e1) {
e1.printStackTrace(); }
Ну и как с этим быть?
Добавлено (02 Ноября 2019, 00:05) --------------------------------------------- Но почему же тогда если запускать из Ecplise то всё норм, а если нет - то всё не норм???
Помогите, сейчас убьюсь об клаву
Добавлено (02 Ноября 2019, 03:28) --------------------------------------------- Капец stack overflow машина, первый раз там вопрос задал, как по мне серьёзно нерешаемый - решили.
ответ: BufferedReader reader = Files.newBufferedReader(Paths.get(fileName), StandardCharsets.UTF_8); Майнкрафт - лучшая игра в мире
Сообщение отредактировал minecrafter2 - Суббота, 02 Ноября 2019, 03:28
Решил я попробовать себя в web c помощью фреймворка PointJS очень понравился всё классно но есть одна существенная проблема: создание игрового поля начинается от левого верхнего угла а мне надо чтобы игра была посередине браузера. Как это решить? Может как то с помощью CSS? Майнкрафт - лучшая игра в мире
Если создаю окно JFrame и начинаю на нём отрисовывать что-то добавляю слушатель клавиатуры начинаю это что-то двигать и если нету фона то это всё начинает размываться. Исходное состояние:
При движении:
Как это убрать? Майнкрафт - лучшая игра в мире
Сообщение отредактировал minecrafter2 - Вторник, 03 Ноября 2015, 18:33
Лучше танки заделай не реальные а свои придумай по-моему так интереснее. И госпади убери этот ужасный голос который говорит "Готов", "Активация прицела", а вообщем выглядит серьёзно так Майнкрафт - лучшая игра в мире
Как - то искал движки на java и нарыл ardor3d ток вот везде облазил но нигде скачать незя его! Офф сайта нет уже.Помогите, киньте где скачать! Майнкрафт - лучшая игра в мире