• Какую дорогу в GameDev лучше выбрать?

    TrueBers
    @TrueBers
    Гуглю за еду
    Да не слушай ты этот бред, который пишут: "То бросай, это бросай, вакансий нету, всё пропало!".
    Всё есть, если есть интерес.
    Учить не важно какой движок, они все используют одни и те же концепции, паттерны примерно одинаковые.

    Внезапно(!), но везде есть и текстуры, и спрайты, и шейдеры. И игровой цикл даже есть!
    Изучив один движок, и написав пару игрушек, потом сам поймёшь, когда стоит перейти на что-то более функциональное и удобное. Придёт осознание, каких фич не хватает, и в каких движках они есть, и т. п.

    А все эти анрилы и юнити только ключевыми словами, по сути, отличаются. Ну, и общий дизайн у них чуть более удобен в плане декомпозиции кода, грамотной архитектуры. Но, пока сам не дойдёшь до необходимости использовать эту декомпозицию, ничего особо не выиграешь, только запутаешься. При переходе достаточно будет ознакомиться с паттернами Gang of Four и всё станет ясно более-менее.

    ПС Знаю разработчиков Юнити, которые начинали геймдев с этого движка и в шоке от того, что кто-то программирует не мышкой. Азы оптимизации им просто недоступны, ибо они даже понятия не имеют о нижележащем уровне API. Они искренне удивляются, как это знать чистый OpenGL и писать всё самому, а разве так можно? Точно так же, кстати, удивляются многие кодеры на плюсах: "А зачем мне знать ассемблер? Я с ним не сталкиваюсь никогда..."

    ППС Вот ещё можно почитать чуть позже, самая крутая книга по геймдеву, которую я видел. Правда, она для тех, уже, кто нашёл в своих движках какие-то изъяны и ищет решения. Но и основы игрового цикла есть там, обработки ввода, множество примеров декомпозиции.

    А уж, если хочется просто изучить полезный скилл зарабатывания денег и как зомби рубить бабки, то тут, как описали выше, 2 варианта по сути: Unity (C#), Unreal (C++). По ним вакансий немерено.
    Ответ написан
    4 комментария
  • Где можно изучить Unity + C# с нуля?

    @CClarke
    Introduction to Game Design, Prototyping, and Development: From Concept to Playable Game with Unity and C#
    https://www.amazon.com/Introduction-Game-Design-Pr...
    интересная книжка вообще по геймдизайну, C# и unity
    теория геймдизайна + коротко про C# (и вообще про кодинг) + 8 прототипов игр разных жанров с детальным описанием.
    написано легко и с подробными объяснениями для полных нулей, есть полезный раздел с программистскими трюками "useful concepts". достаточно объемная, так что советую запастись терпением. по факту, материала на 800 страниц где-то.
    для меня, как новичка, книга идеальна.
    если проблемы с английским, то начинай осваивать его по ней.
    Ответ написан
    2 комментария
  • Что происходит с переменной / указателем в памяти после его обнуления?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Смотрю, на этот вопрос все еще нет ответов, поэтому добавлю немного отсебятины.

    Что произойдет после данной вышеописанной операцией с членом size и указателем старого объекта (other)? Они останутся в памяти вместе с объектом? Или при нулевом значение они занимают незначительную область памяти?


    Давай обратимся к C++ Core Guidelines за разъяснениями.
    Советую, кстати, детально изучить от корки до корки.

    https://github.com/isocpp/CppCoreGuidelines/blob/m...
    В результате перемещения источник должен оставаться в состоянии, когда им можно дальше пользоваться.

    Наш объект класса SomeClass может быть выделен как на стеке, так и в куче. Когда мы его перемещаем, мы перемещаем только внутренности объекта, а не сам объект. После перемещения объект все так же остается жить и должен иметь возможность правильно удалиться как со стека, так и из кучи. Ответственность за это полностью лежит на разработчике класса. Но удаляет объект не семантика перемещения и, тем более, не конструктор перемещения. функция std::move является всего лишь декоратором, который меняет тип объекта с lvalue на rvalue. Она не занимается удалением или очисткой объекта.

    После перемещения объект можно дальше использовать. Если следовать гайдлайну, то после перемещения объект должен стать таким, как будто он был только что сконструирован стандартным конструктором. Объект можно снова заполнить и снова переместить. И так - сколько угодно раз.
    А сам объект всегда занимает один и тот же объем памяти, определенный его классом.

    Так же по теме:
    https://github.com/isocpp/CppCoreGuidelines/blob/m...
    https://github.com/isocpp/CppCoreGuidelines/blob/m...
    Ответ написан
    2 комментария
  • Использование вариативного шаблона функции без аргументов?

    @MiiNiPaa
    К примеру на С++17:

    1) Переименовываете ваш текущий HasComponent в HasComponent_impl и делаете его приватным.

    2) Создаёте новый HasComponent:
    template<typename... Ts> bool HasComponent()
    {
        return (HasComponent_impl<Ts>() && ...);
    }
    Пример.

    Квадратичная сложность, конечно. Можно сделать лучше, но нужно ли?
    Ответ написан
    1 комментарий
  • Использование вариативного шаблона функции без аргументов?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Смотри... Т.к. в предложенном коде я уже вижу немного бардака, то и вариант предлагаю слегка бардачный. :)
    Эту задачу можно решить сразу несколькими способами метапрограммирования. Предложенное решение - одно из них.
    template< typename TComponentType >
    bool HasComponent()
    {
    	return ...;
    };
    
    template< typename... TComponentTypes >
    bool HasComponents()
    {
    	// Это тип предиката для проверки наличия одного компонента.
    	using CheckingPred	= bool (*)();
    	
    	// Это тип листа проверки.
    	using PredList		= std::array<CheckingPred, sizeof...( TComponentTypes )>;
    	
    	// Определяем лист проверки, следи за руками... :-)
    	PredList predicates{{ HasComponent<TComponentTypes>... }};
    	
    	// Проверяем!
    	return std::all_of( predicates.begin(), predicates.end(), []( CheckingPred stored_pred ) -> bool { return stored_pred(); } );
    };


    Сразу заостряю внимание на форматировании и стиле. Так сказать, что понятнее и удобнее читается? :)

    UPD:
    Еще предлагаю полистать библиотеку одного интересного товарища: https://github.com/alecthomas/entityx
    Как я понимаю, тебе хочется попробовать реализовать ECS. EntityX - одна из самых прямых ECS библиотек на плюсах, если не сказать - самая прямая.
    Ответ написан
  • Где найти подкасты по разработке игр?

    Squatch
    @Squatch
    iOS developer
    Ну и ещё, в дополнение уже озвученным, конечно, отличный подкаст Flazm-a:
    https://itunes.apple.com/us/podcast/radioflazm/id7...
    Ответ написан
    Комментировать
  • Как добавить динамическую библиотеку в проект напрямую?

    @Mercury13
    Программист на «си с крестами» и не только
    Задача lib — указать если не код функций, то хотя бы каким образом их прилинковывать из DLL. В частности, как «искозявлено» имя функции при переводе с Си на Си++. Этот самый lib — издержка разделения функций между компилятором и линкером.
    Не знаю, как MSVS/cl, но MinGW/ld с определённого момента начал прилинковывать DLL просто по наличию этого DLL, без построения *.a (а Embarcadero/ilink32, насколько мне известно, умел это изначально). С одной стороны, это серьёзно упрощает жизнь. С другой — для некоторых хитрых способов преобразования имён (или даже без имён, как в небезызвестном storm.dll) он не выцепит, что с чем слинковывать, *.a всё равно потребуется.
    stackoverflow.com/questions/31708832/how-to-refere...
    www.codeproject.com/Questions/613668/Is-it-possibl...
    Простейший, действующий на любом компиляторе способ — это сделать DLL-заглушку со всеми нужными нам функциями в нужных нам соглашениях вызова и с нужным образом закозявленными именами. Код может быть любым, хоть пустым. Компилируем, подставляем этот lib и правильный DLL.
    Второй способ — получить список имён функций, собрать их в *.def с правильными соответствиями «имя в коде — имя в DLL» и сделать из этого *.lib. Какими программами это делается в MSVS — описано по одной из ссылок.
    Ответ написан
    2 комментария
  • Сколько спрайтов персонажа в играх?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Зачастую один, а анимация выполнена на костях как и в 3D играх, только анимируется плоский меш, а не 3D моделька.
    ru.esotericsoftware.com
    dragonbones.com/en/animation.html
    https://brashmonkey.com/
    Ответ написан
    1 комментарий
  • Как правильно очистить память при работе со стеком (ADT)?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    А если комментарий //delete node; заменить на код, реально удаляющий ноду?
    Ну и push() неправильно сделан. Хранить node надо как указатель Node<T>*, в конструкторе инициализировать NULL, в push:
    tempNode->data = value;
    tempNode->next = node;
    node = tempNode;
    Ответ написан
    2 комментария
  • Как сделать, реализовать вывод дополнительной информации при наведении курсора мышки?

    kostanakis
    @kostanakis
    Немного там, немного тут...
    Можно. Достаточно в CSS прописать правило для псевдокласса :hover этого блока.
    Ответ написан
    Комментировать
  • Как сделать, реализовать вывод дополнительной информации при наведении курсора мышки?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Можно ли сделать с помощью HTML/CSS, Javascript?
    Можно!
    Ответ написан
    Комментировать
  • В чем разница между примерами приведенными ниже?

    @Free_ze
    Пишу комментарии в комментарии, а не в ответы
    Еще одно важное различие: в первом случае мы можем задавать размер массива динамически, в процессе работы программы:
    int size = 0;
    cout << "Введите размер массива: "; cin >> size;
    int *arr = new int[size];

    Во втором случае мы обязаны предоставить число, которое будет известно (вычеслено) на этапе компиляции - константу или результат константного выражения (constexpr):
    const int SIZE = 333 + 768 * 2;
    int arr[SIZE];
    Ответ написан
    Комментировать
  • В чем разница между примерами приведенными ниже?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    В первом случае память выделяется в куче и надо её явно освободить, вызвав delete[] arr; когда массив перестанет быть нужен. Во втором память выделяется на стеке и будет освобождена после покидания области видимости переменной arr.
    Ответ написан
    6 комментариев
  • Стоит ли учить Haskell?

    @LiguidCool
    Если можете ответить себе "зачем?" - стоит.
    Ответ написан
    2 комментария
  • Игры написанные на С#, как их импортировали на андроид и ios, как это проходит?

    SuccessVM
    @SuccessVM
    Программирование - творчество
    Игры лучше всего писать не на чистом языке, а с использованием уже готовых игровых движков, время на разработку уходит, возможно, столько же, но думаешь ты не о коде, а об игровом процессе. Поддерживать проект и вносить изменения проще, главное правильно выстроить процесс и неважно крупный проект или мелкий, главное перенять данную парадигму и успешно ей пользоваться.

    Благо игровых движков сейчас много. Судя по вопросу тебе нравится язык C# и ты умеешь на нём кодить, тогда в твоём случае подойдут:

    Unity.

    92e98462045849939fdf92df2bc1c18a.png

    Самый популярный на сегодняшний день. Компонентный подход, огромное кол-во плагинов, что сокращает время на разработку. Можно разрабатывать как на C#, так и на JavaScript. Активная поддержка Microsoft, интеграция в среду разработки Visual Studio. Есть и минус, к нему придётся привыкнуть, он платный, как и нормальные плагины.

    WaveEngine.

    084eb17385aa415ba49f2672b04c0e6b.png

    Абсолютно бесплатный движок. Проект существует с 2013 года, активно развивается и поддерживается, кросплатформенный, как раз за счёт Xamarin. Есть возможность разработки не только на Windows, но также на Linux и MacOS. C# родной язык, будешь как рыба в воде, компонентная модель и поддержка со стороны Microsoft, периодически проводят совместные конкурсы с денежными призами. Есть и минусы не такой популярный, как тот же Unity, часть функционала придётся писать самому, небольшое, но быстро развивающееся комьюнити, а это поддержка и быстрое решение возникающих вопросов.

    GoDot (произносится, как ГоуДо).

    d9f3bfc5bfd447fb8fafaf10c59c49a6.png

    Уникальный с открытым исходным кодом, бесплатный и быстрый, мультиплатформенная разработка (Godot works on Windows, OS X, Linux, FreeBSD, OpenBSD and Haiku. Editor runs in 32-bit and 64-bit, in all platforms.), кроссплатформенный, написан на С++. Можно писать как на С++, так и на собственном скриптовом языке GDScript, очень простой, понятный, легко освоить за день. Огромное комьюнити, общирная документация и примеры, наличие модели плагинов, в последнее время активно развивается.

    Из последних новостей, разработчики анонсировали официальную поддержку C# на платформе Mono. Из статьи понятно, что движку нужно идти дальше, а популярный язык программирования привлечёт огромную аудиторию + поддержку Microsoft.

    --
    Уверен, в сети сможешь отыскать ещё множество движков, я лишь указал на те, что привлекли моё внимание.
    Ответ написан
    Комментировать
  • Уроки Python + django, что посоветуете?

    aRegius
    @aRegius
    Python Enthusiast
    Django by Example
    Другие варианты (с подобной информацией) лично мне неизвестны.

    Кликните на изображении обложки книги (над которым стоит указатель со стрелкой Look inside), перейдите в раздел Table of Contents и ознакомьтесь с информацией о темах, представленных в книге.
    Ответ написан
    Комментировать