• Game-dev путь. Что мне делать?

    @majstar_Zubr
    C++, C#, gamedev
    У вас должна быть цель стать профессионалом в области. Потому что только профессионал может выбирать, с кем работать, где работать, над чем работать - над крупными проектами для правительств, над банковским софтом, над веб-проектами или над играми.

    Вот это будет правильная установка. А что учить и в каком порядке вам никто не скажет, потому что требования меняются, возможности устроится на работу у всех разные, неизменно только одно - желательно знать все и вчера. Именно с этой установкой рисуются абстрактные Programming paths, но толку от них не будет никакого, если вы не сможете обобщать знания и не будете постоянно работать над строительством своего дерева знаний. Главное - пополнять свои знания концепциями, из которых потому выводятся базовые шаблоны, шаблоны проектирования, а из них, в свою очередь, архитектурные шаблоны, методология разработки, и непосредственно связь с рынком, экономикой, психологией и прочим, и так далее. И эти концепции не только в книгах по разработке ПО, их много в теор вере, дискретной математике, физике, которые дождаться в голову только в процессе получения высшего образования, системно.

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

    Что вы можете сейчас сделать - взять прицел. Конкретно сформулируйте профессию и специализацию. Оптимизируйте процесс полученния знаний: как бы не ругали образование в ВУЗах СНГ, все же это нехилая экономия времени, если вы сразу будете получать профильное образование.

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

    А на самом деле надо. Вы должны получать удовольствие от получения знаний, потому что иначе вы не сможете сделать игры, которые могли бы приносить новый опыт игрокам. Чтобы транслировать новый опыт через генераторы опыта - игры - нужно уметь и любить этот опыт (субъективный и эмоциональный) получать, и представлять, как его давать людям. Разработка игр - всего лишь автоматизация этого процесса.

    Так что, запасайтесь попкорном и начните с языка Си. Освойте структурное программирование. Алгоритмы, структуры данных. Архитектуру компьютера, ОС. Не торопитесь как можно быстрее неправильно понять как можно больше вещей за кратчайший промежуток времени. Перечитывание и практикуете, пока не станет понятно так, что сможете научить кого-нибудь другого. Макконнелл, Роберт Мартин, Кент Бек, Эрик Эванс, Мартин Фаулер + 1 год дополнительного быдлокодинга на java и c# и c++ и у вас появится понимание ООП, ФП, типовые устройства моделей памяти и сборщиков мусора. Ещё за год научитесь писать настоящий ООП код, читать чужой код, даже если он написан в процедурно-макаронном стиле как книгу. Но надо ли вам эти три скучных года, потерянных полностью для личной жизни? Не проще ли получить solid knowledge и постепенно получать практику в среде опытных специалистов?

    Подытожу: становитесь профессионалом, на это у вас уйдёт ~10 лет после введения привычки учится в свободное время. Периодически смотрите на требования вакансий и составляйте себе древо знаний, которое хотите получить.
    Ответ написан
    Комментировать
  • Стоит ли писать let, const?

    Seasle
    @Seasle Куратор тега JavaScript
    Если не нравится const, то всегда let. Потому как let используется в уникальном scope. А вообще неплохо рассказано тут (в новой редакции).

    Пример var:
    {
    	var value = 1;
    }
    
    console.log(value); // 1


    Пример let (const):
    {
    	let value = 1;
    }
    
    console.log(value); // ReferenceError: value is not defined
    Ответ написан
    Комментировать
  • Как создать свою игру на JS?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Дефакто стандарт разработки 3d игр на JS библиотека - threeJS https://threejs.org/ Она упрощает работу с webgl и имеет только самое необходимое для создания мира - scenegraph, камеры, источники света, растяжку текстур на 3d модели. У библиотеки большое сообщество и много учебников в сети. Чтобы персонаж не проходил сквозь текстуры называется collision detection. В threeJS реализован только самый базовый инструмент для этого - класс Raycaster.построенный на тех же рутинах что и raytracer А чтобы не роверять пересечения каждого с каждым вам нужно будет узнать например про структуру данных quadtree. Встроенного движка физики в библиотеке нет, предполагается что вы будете использовать по своему выбору. Что бы писать на этой библиотеке вам нужно будет подкачать скилл игроделания, но она быстрая.
    Если хотите побольше изкоробки берите фреймворк. Например заслуженно популярен Babylon.js www.babylonjs.com Кривая вхождения пониже, встроенного инструментария побольше(например движок физики и скелетная анимация), но работает помедленнее и жрет больше вычислительного ресурса. Tutorials в сети тоже достаточно.
    Ответ написан
    1 комментарий
  • Зачем нужна инкапсуляция js?

    В данном примере вы, как мне кажется, путаете инкапсуляцию и сокрытие данных

    Инкапсуляция - это прежде всего, сокрытие сложности системы, как правило, через объединение логики и данных. Сокрытие самих данных - не всегда обязательный элемент инкапсуляции.

    Javascript использует прототипное наследование, и в его реализации, традиционно, с сокрытием данных есть некоторые проблемы. Даже в "строго-типизированных" надстройках (например, в typescript), где в систему классов добавлены ключевые слова private и protected, защищенные свойства объектов все равно будут доступны извне на рантайме:
    // TypeScript
    class Foo {
        private bar = "lol"; // приватное поле класса
        baz = 42;
    }
    
    const foo = new Foo();
    console.log((foo as any).bar) // "lol"


    Если сокрытие данных на рантайме все-таки необходимо, его можно добиться с помощью замыканий и символов:
    const factory = () => {
        // используем замыкание, чтобы ограничить область видимости
        const privateProp = Symbol();
    
        function Foo() {
            // используем символ как идентификатор поля
            this[privateProp] = "lol";
            this.bar = 42;
        }
    
        return new Foo()
    }
    
    const foo = factory();
    
    // foo[privateProp] использовать невозможно вне замыкания
    console.log(foo.bar) // 42
    Ответ написан
    Комментировать