Huldra
> AE не конкурирует с godot
AE сейчас вообще с кем-то может конкурировать?))
Huldra
> И на чем же тогда делать игры чтобы все было хорошо сделано и при этом на С++ ?
Ниначём увы. Не создали ещё ни 1 нормального движка.
samrrr
> AE сейчас вообще с кем-то может конкурировать?))
Напрямую разве что с SDL и SFML, при этом AE выигрывает по простоте результирующего кода, но может проигрывать по количественным фичам типа поддержки 100500 форматов данных.
Arctic engine отличается тем, что с ним простые вещи делать действительно просто, и при этом принципиально не может возникнуть ситуации когда что-то сделать совершенно невозможно. Лучше всего arctic engine подходит для создания простых 2д игр и знакомства с программированием.
Arctic Engine хорошо подходит если ты хочешь делать по дюжине разных игр в месяц в основном занимаясь именно программированием и прокачивая навык написания кода
Можно сравнить arctic engine с парой популярных аналогов. Начнем с простоты первых шагов: arctic engine автоматически создает проекты для Visual Studio, XCode и makefile для linux (x86 или Raspberry Pi), а в SDL2 только настройка проекта в Visual Studio займет пол часа, причем уже в этом месте многим нужна помощь и поддержка сообщества.
Посмотрим на простые задачи. Как загрузить и вывести картинку на экран в arctic engine и в SDL2?
arctic engine:
Sprite hero; hero.Load("hero.tga"); ... hero.Draw( x, y);
SDL2:
std::string imagePath = getResourcePath("Lesson1") + "hero.bmp"; SDL_Surface *bmp = SDL_LoadBMP( imagePath.c_str( )); if ( bmp == nullptr) { SDL_DestroyRenderer( ren); SDL_DestroyWindow( win); std::cout << "SDL_LoadBMP Error: " << SDL_GetError( ) << std::endl; SDL_Quit( ); return 1; } SDL_Texture *tex = SDL_CreateTextureFromSurface( ren, bmp); SDL_FreeSurface( bmp); if ( tex == nullptr) { SDL_DestroyRenderer( ren); SDL_DestroyWindow( win); std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError( ) << std::endl; SDL_Quit( ); return 1; } ... int w, h; SDL_QueryTexture( tex, NULL, NULL, &w, &h); SDL_Rect dst( x, y, w, h); SDL_RenderCopy( ren, tex, NULL, &dst);
Ну то есть arctic engine позволяет делать игру, а SDL2 позволяет изучать SDL2
Важная идея в основе Arctic Engine заключается в том, что игру можно и нужно писать прямо на С++ и что для написания игры не нужны никакие скриптовые языки.
Huldra
> Важная идея в основе Arctic Engine заключается в том, что игру можно и нужно
> писать прямо на С++ и что для написания игры не нужны никакие скриптовые языки.
Самый весомый гвоздь в крышку гроба этого движка. имхо.
Huldra
> Ну то есть arctic engine позволяет делать игру, а SDL2 позволяет изучать SDL2
Твоё сравнение несколько нечестное по отношению к SDL.
Во 1, ты включил код не относящийся к рендеру спрайта напрямую.
Во 2, ты сравниваешь Си-шную либу с плюсовой. Для честного сравнения стоит взять https://github.com/libSDL2pp/libSDL2pp
Huldra
> Важная идея в основе Arctic Engine заключается в том, что игру можно и нужно писать прямо на С++ и что для написания игры не нужны никакие скриптовые языки.
Ты явно не участвовал ни в 1 ААА проекте, рас такую чушь пишешь. Скриптовые языки в движок добавляют потому что многие вещи делать в C++ очень неудобно.
Huldra
> Как загрузить и вывести картинку на экран в arctic engine и в SDL2?
Ну давай по честному, выкинем проверку на ошибки как у тебя:
std::string imagePath = getResourcePath("Lesson1") + "hero.bmp"; SDL_Surface *bmp = SDL_LoadBMP( imagePath.c_str( )); SDL_Texture *tex = SDL_CreateTextureFromSurface( ren, bmp); SDL_FreeSurface( bmp); ... int w, h; SDL_QueryTexture( tex, NULL, NULL, &w, &h); SDL_Rect dst( x, y, w, h); SDL_RenderCopy( ren, tex, NULL, &dst);
Ну и С либа с голыми указателями... это лучше вообще в С++ не использовать. Давайка лучше возьмем что-нибудь адекватное, например SFML:
sf::Texture texture; texture.loadFromFile("hero.bmp"); sf::Sprite sprite( texture); .... sprite.setPosition( xy); window.draw( sprite);
Внезапно не такая уж и большая разница. Ты лучше напиши что-то чуть более сложное, чем вывод одного спрайта. Например покажи, как красиво можно сделать работу с камерой. Представим большой статический мир (допустим 100*100 экранов), спрайты которого загружены из файла. И главного героя, который бегает по этому миру. И камера прикреплена к нему:
std::vector<sf::Sprite> static_sprites; sf::Sprite hero_sprite; sf::View view; ..... view.setCenter(hero_sprite.getPosition( )); for ( const auto& sprite : static_sprites) { window.draw( sprite); } window.draw( hero_sprite);
Давай тот же код, только на AE.
AE (как и тот же SFML) вообще плохо подходит под игры с большим миром. Потому что все оптимизации нужно писать самому ручками. Банальное отсечение по фрустуму - уже делай сам.
MrShoor
> Давай тот же код, только на AE.
std::vector<Sprite> sprites; std::vector<Vec2Si32> positions; ..... Vec2Si32 view_pos = positions.back() - ScreenSize( )/2; for ( size_t i = 0; i < sprites.size( ); ++i) { sprites[i].Draw( positions[i] - view_pos); }
MrShoor
> Ну давай по честному, выкинем проверку на ошибки как у тебя:
А в том то и дело что у меня проверка на ошибки не выкинута, у меня все ошибки обрабатываются, а вот в SDL - нет, чтобы получилась такая же обработка ошибок как в arctic engine нужен как раз весь этот длинный код на SDL
MrShoor
> возьмем что-нибудь адекватное, например SFML:
Верно, на SFML выходит 5 строк, на AE 3, разница не такая большая как с SDL... но ты опять забыл обработать ошибки на SFML
Huldra
> Верно, на SFML выходит 5 строк, на AE 3, разница не такая большая как с SDL...
> но ты опять забыл обработать ошибки на SFML
Неправильно, ты выкинул рендер hero вот у тебя и получилось короче.
Huldra
> но ты опять забыл обработать ошибки на SFML
Вижу глобальную заглушку. Слабо тянет на "обработку ошибок". Как мне попытаться загрузить текстуру, и если не получилось - сообщить об этом пользователю?
Вангую твой вопрос: "А зачем тебе это надо?". Отвечаю: "Я пишу игру, и параллельно пишу редактор уровней для игры. Я так часто делаю (в 4 из 5 игр наверное). Так вот, я хочу при открытии уровня в редакторе показать, что ресурс Х не загрзуился, чтобы понять, что надо либо уровень подправить, либо пути к ресурсу"
Но даже к заглушке куча вопросов. Вот код:
Если путь к файлу или имя файла содержат точку, то обломс? Т.е. файл C:\My.Name\pic.tga уже не откроется?
Huldra
> std::vector<Sprite> sprites;
> std::vector<Vec2Si32> positions;
> .....
> Vec2Si32 view_pos = positions.back() - ScreenSize()/2;
> for (size_t i = 0; i < sprites.size(); ++i) {
> sprites[i].Draw(positions[i] - view_pos);
> }
Спасибо за кривой перевод примера, что я предоставил. Давай я починю за тебя:
std::vector<Sprite> sprites; Sprite hero_sprite; std::vector<Vec2Si32> positions; Vec2Si32 hero_position; ..... for (size_t i = 0; i < sprites.size( ); ++i) { sprites[i].Draw( positions[i] - hero_position); } hero_sprite.Draw( hero_position);
А теперь предположим, что я гружу уровень. Часть спрайтов отскейлина, часть повернута.
Код рендера на sfml:
std::vector<sf::Sprite> static_sprites; sf::Sprite hero_sprite; sf::View view; ..... view.setCenter(hero_sprite.getPosition( )); for ( const auto& sprite : static_sprites) { window.draw( sprite); } window.draw( hero_sprite);
Код рендера на AE:
std::vector<Sprite> sprites; Sprite hero_sprite; std::vector<Vec2Si32> positions; std::vector<float> zooms; std::vector<float> rotations; Vec2Si32 hero_position; ..... for (size_t i = 0; i < sprites.size( ); ++i) { sprites[i].Draw( positions[i] - hero_position, rotations[i], zooms[i]); } hero_sprite.Draw( hero_position);
MrShoor
> Если путь к файлу или имя файла содержат точку, то обломс? Т.е. файл
> C:\My.Name\pic.tga уже не откроется?
Похоже на то. Спасибо, исправлю!