• Что можно приготовить из кальмаров: быстро и вкусно

    Компьютерные игры - это большой бизнес. Суммарная выручка индустрии видеоигр в США достигла 23,5 миллиардов долларов в прошлом году, что на 5% больше, чем в 2014. За каждой великой игрой стоят программисты, которые вносят существенный вклад в конечный продукт. Конечно, для создания разных игр используются разные языки программирования. В данной статье мы представим вам несколько самых популярных.

    Язык ассемблера

    Многие игры для Sega и Dendy были написаны на различных диалектах языка ассемблера, включая Super Mario Brothers.

    Игры серии Super Mario были проданы тиражом более 70 миллионов копий. IGN назвала третью часть Super Mario Brothers самой великой игрой всех времён.

    Язык Си

    Язык Си до сих пор остаётся одним из самых популярных языков программирования из-за своей относительной простоты и чёткой структуры. Компания id Software использовала Си для создания игры Doom, впервые выпущенной в 1993 году.

    Doom была названа самой влиятельной FPS-игрой, став прообразом многих других игр от первого лица и 3D-игр в общем. По приблизительным оценкам Doom набрал около 10 миллионов установок в 1995 году.

    С++

    Язык С++ использовался для создания многих современных операционных систем, софта, игр и игровых движков. Благодаря его гибкости, игры можно относительно несложно портировать с ПК на консоли и в обратном направлении. Одной из самых популярных игр, написанных на С++, является World of Warcraft.

    С момента запуска было продано 14 миллионов копий. 48% подписчиков проживают в азиатском регионе, 22% из США. На вики по WoW содержится более 100 000 статей.

    C#

    Разработанный компанией Microsoft в 2000 году, С# стал довольно популярен среди разработчиков игр. Движок Unity, широко используемый при создании игр для ПК, консолей и мобильных устройств, написан преимущественно на С#. Одна из самых заметных игр в данном классе - Angry Birds.

    Angry Birds находится на третьем месте по популярности среди всех игры для iOS всех времён, сразу за Candy Crush Saga и Fruit Ninja. Стоимость разработки первой версии игры составила порядка $140 000, что является очень скромным числом в своём роде. Четыре человека работали над игрой суммарно порядка восьми месяцев.

    Java

    Java является в некотором роде родственником C#. Они развиваются под влиянием друг друга, оба имеют сборщики мусора и объектно-ориентированы. Но Java изначально позиционируется как платформонезависимый язык, что означает, что он (по задумке) работает абсолютно одинаково на всех устройствах. Истории успешных игр, написанных на Java, включают в себя RuneScape и Minecraft.

    Альфа-версия игры была создана всего за 6 дней. Minecraft - вторая самая продаваемая игра в мире. Изначально она называлась «Cave Game».

    Хотите найти больше материалов по разработке игр и, может быть, даже разработать одну свою? Загляните в .

    Всем привет! Что-то последнее время много уроков по конструкторам игр, и не так много по различным языкам программирования. Что бы устранить эту не справедливость, я решил запилить урок по OpenGL C++, надеюсь вы оцените)

    Сразу же перейдем к геймдеву и будем писать маленькую игрульку нашего детства.

    Для начала подключаем библиотеку OpenGL к своей среде разработки, я лично программирую в Microsoft Visual Studio 2013.

    200?"200px":""+(this.scrollHeight+5)+"px");">
    #include "stdafx.h"
    #include
    #include
    #include
    #include // подключаем все необходимые инклюды.

    Int N = 30, M = 20; // т.к. змейка будем ездить по квадратикам, создадим их, для нашего окна в идеале будет 30x20 квадратов
    int scale = 25; // размер квадрата. Когда OpenGL будет расчерчивать поле для игры, расстояние между гранями квадрата будет 25 пикселей

    Int w = scale*N; // ширина поля
    int h = scale*M; // его высота

    Int dir, num = 4; // 4 направления и начальный размер змеи.
    struct { int x; int y; } s; // структура змеи, X и Y координаты, массив с длинной.

    Class fruct // класс фруктов, тех самых, которые будет есть наша змея
    {
    public:
    int x, y; //координаты фруктов, что и где будет находится

    Void New() // паблик с новыми фруктами. Он будет вызываться в начале игры и в тот момент, когда змея съест один из фруктов
    {
    x = rand() % N; // вычисление X координаты через рандом
    y = rand() % M; // вычисление Y координаты через рандом
    }

    Void DrawFruct() // паблик, отрисовывающий фрукты
    {
    glColor3f(0.0, 1.0, 1.0); // цвет фруктов. в openGL он задается от 0 до 1, а не от 0 до 256, как многие привыкли
    glRectf(x*scale, y*scale, (x + 1)*scale, (y + 1)*scale); // "Закрашиваем" квадрат выбранным цветом, таким образом в нем "появляется" фрукт
    }
    } m; // масив с фруктами, таким образом, у нас появится одновременно 5 фруктов в разных местах, а не один, как мы привыкли

    Void Draw() // функция, которая отрисовывает линии
    {
    glColor3f(1.0, 0.0, 0.0); // цвет наших линий, в данном слуае - красный
    glBegin(GL_LINES); // начинаем рисовать и указываем, что это линии
    for (int i = 0; i < w; i+= scale) // отрисовываем линии в ширину
    {
    glVertex2f(i, 0); glVertex2f(i, h); // рисуем прямую
    }
    for (int j = 0; j < h; j += scale) //отрисовываем линии в высоту
    {
    glVertex2f(0, j); glVertex2f(w, j); // рисуем ту же самую прямую, но в другом направлении
    }

    GlEnd(); // конец отрисовки
    }

    Void tick() // функция в которой будет все обновляться (двигаться змея и т.д.)
    {
    for (int i = num; i > 0; --i) // движение змеи. Система остроумна и проста: блок перемешается вперед, а остальные X блоков, на X+1(2 блок встанет на место 1, 3 на место 2 и т.д...)
    {
    s[i].x = s.x; // задаем Х координату i блока координатой i - 1
    s[i].y = s.y; // то же самое делаем и с Y координатой
    }
    // далее у нас система направлений.
    if (dir == 0) s.y += 1; // если направление равно 0, то первый фрагмент массива перемещается на один по Y
    if (dir == 1) s.x -= 1; // если направление равно 1, то первый фрагмент массива перемещается на минус один по X
    if (dir == 2) s.x += 1; // аналогиная система
    if (dir == 3) s.y -= 1; // аналогичная система

    For (int i = 0; i < 10; i++) //цикл, в котором наша змея будет расти
    {
    if ((s.x == m[i].x) && (s.y == m[i].y)) // Если голова нашей змеи находится в одном блоке с фруктом, то...
    {
    num++; //...увеличиваем размер нашей змеи на 1
    m[i].New(); // ... запускаем функцию отрисовки нового фрукта.
    }
    }
    // Следующее нужно, что бы змея не выходила за рамка поля. Действует это просто: если змея выходит за рамки поля, то задаем
    if (s.x > N) dir = 1; // Ей обратное направление. Например, если она выйдет за экран по высоте, то задаем ей направление, при котором она ползет
    if (s.y > M) dir = 3; // вниз
    if (s.x < 0) dir = 2;
    if (s.y < 0) dir = 0;

    For (int i = 1; i < num; i++) // с помощью этого цикла мы "обрежем" змею, если она заползет сама на себя
    if (s.x == s[i].x && s.y == s[i].y) // проверка координат частей змеи, если X и Y координата головной части равно координате любого
    num = i; // другого блока змеи, то задаем ей длину, при которой "откушенная" часть отпадает.
    }

    Void Snake() // выводим змейку на экран
    {
    glColor3f(0.1, 1.0, 0.0); //цвет змеи
    for (int i = 0; i < num; i++) // цикл отрисовки.
    {
    glRectf(s[i].x*scale, s[i].y*scale, (s[i].x + 0.9)*scale, (s[i].y + 0.9)*scale); //Рисуем квадраты, те самые "блоки" змеи
    }
    }

    Void Key(int key, int a, int b) // функция нажатия клавиш
    {
    switch (key) // используем оператор switch
    {
    case 101: dir = 0; break; // при нажатии клавиш, задаем направление змеи(вверх, вниз, влево, вправо)
    case 102: dir = 2; break;
    case 100: dir = 1; break;
    case 103: dir = 3; break;
    }
    }

    Void Display() //функция общий отрисовки
    {
    glClear(GL_COLOR_BUFFER_BIT); // очищаем окно перед началом отрисовки

    Draw(); // вызов функции Draw, отвечающей за отрисовку фруктов
    Snake(); // вызов функции Snake, отвечающей за отрисовку змейки

    For (int i = 0; i < 5; i++) // заполнение карты фруктами
    m[i].DrawFruct();

    GlFlush(); // выводим на экран все вышеописанное
    glutSwapBuffers();
    }

    Void timer(int = 0) // Таймер игры(промежуток времени, в котором будет производится все процессы)
    {
    Display(); // Вызов функций
    tick();
    glutTimerFunc(100, timer, 0); // новый вызов таймера(100 - промежуток времени(в милисекундах), через который он будет вызыватся, timer - вызываемый паблик)
    }

    Int main(int argc, char **argv) // Главная функция
    {
    std::cout << "Snake by Alexey Ovchinnikov:P\n Loading..."; // крутой текст в консоле при загрузке
    srand(time(0));
    for (int i = 0; i<10; i++) // начальная, самая первая отрисовка фруктов
    m[i].New();

    S.x = 10; // начальное положение змейки по X
    s.y = 10; // и Y координате
    // следующие функции абсолютно идиентичных почти во всех программах на OpenGL, так то запоминать их не обязательно, кроме...
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(w, h); // ... этой, она создаем окно (w - ширина, h - высота)
    glutCreateWindow("Game"); // ... этой, она задает название окна
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 640, 0, 480);
    glutDisplayFunc (Display); // ... и этой, она вызывает начальную функцию, в нашем случае это главная функция отрисовки - Display
    glutSpecialFunc(Key);
    glutTimerFunc(50, timer, 0); // ... Ну и в начале программы задаем рекурсивный таймер.
    glutMainLoop();

    Return 0;
    }

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

    Разработка игр на плаву, она перспективна и набирает популярность. Мы подготовили подробную инфографику о пути изучения разработки игр.

    С геймдевом связано много областей, и каждый этап обучения основан на этапе предшествующем. Например, не стоит сразу перескакивать на игровые движки. Начните с разработки ПО, изучения математики с заточкой под программирование игр и только после переходите к геймдеву. Каждый из представленных этапов – это пошаговое руководство, включающее в себя книги и другие материалы.

    0. Разработка игр для детей

    Многие книги ориентированы на работу с легендарной и интуитивно понятной средой разработки для детей Scratch, в том числе ScratchJr. После базиса следует информация о Python Pygame. Есть книга для пятилетних, но большая часть материалов подойдет для детей в возрасте от 8 лет.

    1. Информатика

    Теоретическая подковка – обязательная составляющая, без которой дальнейшее изучение лишено смысла. Эта подборка обучающей литературы включает в себя основы, сведения об алгоритмах и математику в разрезе изучения информатики.

    2. Языки программирования

    Разговаривать на языке компьютера непросто, но возможно. И таких способов уйма. Например, язык C существенно повлиял на индустрию ПО, поделившись своим синтаксисом с популярными C#, C++ и Java. C++, в свою очередь, является мощным языком для создания эффективных программ и программных комплексов. Многие также пишут игры на C#: язык шустрый, удобный и позволяет быстрее стартовать разработку.

    А вот Lua перенял кое-что от C++. Скрипт-язык хорош для игровой логики. Он упростит инициализацию уровня, привязку задач к объектам, смену поведения NPC в интерактивном режиме без необходимости перекомпилировать проект и многое другое.

    3. Создание приложений

    И если информатика – это базис теоретический, то здесь больше практики. Разработка игр – ухабистая стезя, и начать лучше с приложений. Книги с практическими заданиями, а также информацией о паттернах и UML помогут разобраться, что к чему.

    4. Математика для разработки игр

    Нет, здесь не будет школьного курса алгебры и геометрии. Подборка разбита на основы математики в сфере геймдева и более продвинутый уровень.

    5. Игровое программирование

    Аппаратные платформы, операционные системы, наборы API, алгоритмы, кроссплатформенность и другие важные аспекты, которые лягут в основу разрабатываемой игры. Книги дополнены рядом геймдев-статей, в которых содержится полезная информация по программированию.

    6. Разработка игрового движка

    Движок – это сердце игры, которое «закачивает» функциональные возможности и необходимый инструментарий. В первых книгах вы познакомитесь с архитектурой и дизайном. Дальше «игровые движки» разделяются на инструменты, оптимизацию, скрипты и дополнительные материалы в виде статей. В ходе ознакомления затрагиваются паттерны, алгоритмические трюки, оптимизация в Unity и прочие нюансы.

    7. Компьютерная графика

    Да, содержимое – это важно, но именно компьютерная графика является аналогом интерфейса приложения, который будут видеть пользователи. Поэтому ей стоит уделить особое внимание.

    Недаром этот раздел самый большой. Сюда включены основы программирования с Real-Time 3D, DirectX и OpenGL. Все дополнено информацией о рендеринге и технологиях. Отдельного внимания в подборке удостоились Direct3D и OpenGL.



    8. Игровое аудио

    Разработка игр касается и аудио: это звуки, издаваемые NPC, главным героем, явлениями или предметами, а также музыка. Аудио программирование обошлось всего двумя книгами, но в них доступно изложена необходимая информация.

    9. Игровая физика и анимация

    Один из самых сложных этапов. Кроме программной основы и картинок, должны быть законы, по которым все это взаимодействует. Игровая физика и анимационное программирование раскрыты в 17 книгах. Отдельно затронута имитация жидкости.

    10. Игровой искусственный интеллект

    Управляемых компьютером персонажей немало: это могут быть мобы, квестгиверы и даже обычные шахматы. Обилие книг позволит понять принципы работы ИИ. Ниже приведен перечень тематических полезных статей.

    11. Многопользовательское игровое программирование

    Разработка игр для одного игрока сильно отличается от многопользовательских вариантов. Здесь нужно учитывать соединение, работу потоков и другие нюансы. Подборка разбилась на статьи и книги о серверном программировании, сетевом программировании и сетевом протоколе.

    Я написал один и тот же шутер от первого лица на JavaScript, а потом на C++. В этой статье опишу, как все это происходило.

    Несколько лет назад, когда WebGL начал свое шествие по браузерам, у меня возникла идея - написать шутер от первого лица на JavaScript и HTML. Абсолютно безумная затея, но она сработала, и даже не очень лагала (попробуйте сами). В свободное время я понемногу модифицировал код, со временем игра обросла фичами и стала интересной.

    Сравнение

    Теперь у меня есть редкая возможность сравнить ход разработки одного и того же приложения на C++ и JavaScript. Разберу по пунктам.

    Производительность

    Сейчас вы очень удивитесь: производительность обеих реализаций не сильно различается (прим. перев. : А вот на компьютере без дискретной видеокарты разница огромна - в браузере игра почти не играбельна, а вот в C++-версии отсутствуют даже малейшие лаги).

    Даже самая ресурсоемкая часть - процедурная генерация домов и обнаружение столкновений физическим движком - не сильно лагали на JavaScript. Тормозит буквально раза в два больше, чем в C++-версии. Оптимизация выполнения JavaScript в Chrome меня очень впечатлила. К несчастью, все равно JavaScript-версия ощущается куда более медленной . Далее я объясню, почему.

    Дьявол кроется в деталях

    В реализации на C++ я мог контролировать любую деталь выполнения, любую мелочь. В JavaScript-версии во многих вещах я полагался на браузер - в этом и крылась проблема. На JavaScript процедурная версия едва заметно подлагивала из-за того, что некоторые вызовы WebGL имеют свойство ненадолго вешать браузер. Буквально на миллисекунды, но их очень много - поэтому игра «плыла», ощущалась очень медленной по ритму. Я написал несколько обходов для основных проблем, но с другими ничего сделать, увы, было нельзя. На C++ же контролировать можно все - и если возникают проблемы, можно придумать способ их решить.

    Версия на JavaScript на моем компьютере выдавала тот же FPS, что и на C++ - около 120 кадров в секунду. Но ощущалась она очень, очень медленной. В зависимости от используемой ОС и железа компьютера браузер ведет себя сильно по-разному, и даже ввод иногда лагает.

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

    В игровом коде есть два способа исполнения «игрового цикла»: requestAnimationFrame() и setInterval() . Одна из версий частично решает проблему скорости ввода на одних системах, другая - на других. От этого ситуация запутывается еще сильнее.

    Таких мелких проблем было много, но у всех была одна причина - в JavaScript-версии все очень сильно зависит от реализации браузера, который часто делает не то, что вы от него хотите. В C++ такой проблемы не было в принципе.

    Скорость разработки

    И JavaScript, и C++ я знаю достаточно хорошо, поэтому скорость была примерно одинаковой. В C++ иногда возникает нужда реализовать вещи, о которых в JavaScript думать не надо, но зато система типов C++ помогает в отлове багов и опечаток. «Хвала» современным браузерам - JavaScript отлаживать так же удобно, как C++ двадцать лет назад.

    Лично я думаю, у обоих языков есть и плюсы, и минусы. В конце концов, оба они - просто инструменты для достижения цели.

    Итог

    Если вы решите вдруг написать свой трехмерный шутер от первого лица, я настоятельно рекомендую делать это не на JavaScript/HTML/WebGL. Для встроенных в сайты мелких игрушек или прототипов они хороши, но сделать на них полноценный, да еще и нативный продукт нереально. Ну, по крайней мере, сейчас. Кто знает, вдруг через несколько лет все станет резко наоборот. Знаю много людей, которые с таким инструментарием делают двухмерные игры, и получается прекрасно. Но для трехмерной игры от первого лица это так не работает.

    Я решил продолжить работу над C++-версией. Надеюсь, что закончу в ближайшие месяцы. Вот тут можно понаблюдать за прогрессом: