Перейти к содержимому

Как сделать игру на с

  • автор:

Как научиться писать игры на С++

Я считаю, что начинать учиться программировать надо в раннем детстве, лет в 5, и начинать надо сразу с С++. Первая программа должна играть музыку, вторая программа должна рисовать картинки, а третья должна позволить управлять персонажем игры с клавиатуры. После этого становится очевидно, что ничего сложного в программировании игр на С++ нет и изучение языка продолжается по мере создания десятков разных игр.

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

После этого все очень просто: при помощи wizard нужно создать проект типа coding for kids, открыть этот проект и редактировать содержимое файла code.inc.h

Если удалить из него все что там написано кроме строчки

то получится программа, играющая на протяжении 1 секунды первую по счету ноту (До). Чтобы вместо этого игралась вторая нота (Ре), достаточно изменить номер ноты в программе:

А чтобы компьютер проиграл по очереди несколько нот, нужно написать несколько команд Beep друг за другом, например вот так:

В качестве первой программы я предлагаю запрограммировать проигрывание какой-нибудь мелодии, например «с днем рождения». Номера нот этой мелодии: 1,1,3,1,6,5,1,1,3,1,1,6,1,1,6,3,6,5,3,4,4,3,6,1,6

На то, что ребенок приемный можно не так жестоко указать. Хотя бы js-ом.

Это если ты собираешься намекнуть, что хочешь сдать его обратно )

чтобы в 14 устроиться синьйором?

Самый сложный момент в самостоятельном изучении С++ возникает в самом начале, когда нужно установить все необходимое и написать свою самую

Самый сложный момент возникает, когда начинаешь разбирать слои говна, да простят меня фанаты С++, которые накидали начиная с C++11.

Желательно все сразу начать писать на системных вызовах, без движков и библиотек. А то нещитово.

К сожалению, современные операционные системы и библиотеки языков программирования настолько деградировали за 40 лет, что вместо включения компьютера и написания одной строки кода для вывода звука нужно скачать и установить несколько гигабайт программ, а потом к ним еще несколько мегабайт игрового движка, чтобы можно было наконец написать одну строчку кода, выводящую звук.

Я считаю уже с 5-ти лет ребёнок должен строить космические корабли и знать физику, математику и тд и тп

Насиловать ребенка крестами в 5 лет — сомнительная история. Есть не мало приложений, которые доносят базовые принципы программирования в игровой и яркой форме.

Так ведь в том то все и дело, что ребенку в 5 лет изучать С++ должно быть не сложно, а весело и интересно. И разница между С++ и веселой игровой формой заключается в первую очередь в том, что веселая игровая форма позволяет понять только базовые принципы, а С++ позволяет делать абсолютно что угодно, никак не ограничивая. Вот например, очень хорошая веселая игрушка для знакомства с базовыми принципами:
https://youtu.be/bRfTDoZiz-k

Как в веселой и игровой форме объяснить значение инкапсуляции, полиморфизма и наследования ?

а за отказ от супа ебануть ему главу про указатели

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

Не надо такие вещи детям объяснять вообще, это просто не нужно для того, чтобы делать игры на С++ и получать от этого удовольствие, на собственном опыте понимать проблемы и по достоинству ценить решения.

Даже более того, для того чтобы делать игры не нужно изучать даже такие ключевые слова как for, while, do, switch, case и даже return

Первый абзац выглядит как реальная мудрость. Второй как сарказм. Я запутался.

Второй тоже вполне серьезно. Конечно, рано или поздно ребенок изучит и for и while и все остальное, но и не зная об их существовании можно делать точно такие же игры, как и зная. Достаточно знать о существовании меток, if и goto. Это базис, позволяющий написать любую логику. Да, когда в коде будет пара сотен меток и goto читать и развивать его может стать сложно, но очень много разных игр можно сделать написав всего сотню или две строк кода.
Что лучше, потратить несколько дней на изучение for, while, do, switch, case и return и в процессе расхотеть делать игры, или потратить это время на то чтобы сделать пару игр и полюбить программирование?

Пишем змейку на C++

Давным-давно, когда мониторы были зелёными, а 64Кб оперативы на борту считалось нормой, существовала игрушка под названием Snake. Она также была известна под названиями Змейка, Удав, Питон и даже Червяк. По прошествии времени появилось множество клонов этой игры под различные платформы: от Flash до мобильных телефонов и смартфонов. Но вот та реализация, работающая в текстовом режиме, видимо умерла вместе с теми компьютерами, для которых она была написана.

И вот, за пару свободных вечеров был написан очередной клон легендарного Snake, который я и представляю вашему вниманию: Oldschool Snake.

Игровой процесс

Как играть

Управление змейкой клавишами управления курсором. Esc — завершение игры. Для выхода из игры надо нажать Esc или клавишу N на вопрос «Once more?». Змейка не должна натыкаться на стенки и на собственный хвост. Это — смерть. Змейка не умеет ползать хвостом вперёд. Попытаться заставить её это сделать — верная смерть. Кормить змейку надо, естественно, долларами. Когда змейка ест, она растёт.

Top 10 определяется по рейтингу. Общий рейтинг складывается из суммы рейтинговых очков, полученных за каждую съеденную еду. Рейтинговые очки прямо пропорциональны длине змейки и обратно пропорциональны времени, затраченному на достижение очередной порции еды.

Окончание игры
Окончание игры

Лицензия

GNU GPL. То есть можно свободно распространять, изучать исходный текст, вносить изменения в исходный текст, использовать в своих некоммерческих проектах.

Замечания по реализации

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

В этот вариант программы уже заложены некоторые возможности по усовершенствованию игры. Но при этом теряется аутентичность.

Программа написана для Windows 2000 Professional (и выше). Для переноса под другие операционки необходимо переписать реализацию класса CScreen и иметь порт библиотеки conio.h .

Компилировал TDM-GCC 4.8.1 С другими компиляторами не проверял.

Вопросы, замечание, предложения, ошибки — пожалуйста в комментарии. Но, скажу сразу, не судите строго за стиль — написано было быстро и, что называется, «для себя».

Как я написал онлайн шутер на C++ за неделю?

Привет, Вектозавры! Сегодня я расскажу о том, как за 15 дней я написал свой онлайн шутер от первого лица. В этом ролике я с самого начала продемонстрирую, как создать свою псевдо 3D игру в стиле DOOM или Wolfenstein 3D.

Мы начнем с установки необходимой библиотеки, рисования объектов и управления камерой с клавиатуры.
После этого мы научимся строить 3D изображение, добавим освещение и управление мышью.
Далее мы реализуем текстурирование и сделаем нашу игру светлой и красивой. В такую игру уже захочется поиграть.
Мы добавим объекты разной высоты, скины, оружия и врагов, а также зеркала, в которых будет видно отражение объектов. А потом посмотрим, что будет, если поставить два зеркала напротив друг друга.
Ну и в конце концов, мы добавим онлайн в игру, чтобы можно было играть с другом. В общем, вас ждет большая и очень интересная статья, приятного чтения, вектозавры!

Первая часть статьи.

В предыдущем ролике я показал, как можно с помощью алгоритма ray-cast и консольной графики сделать простую бродилку. Много кому ролик понравился, некоторые даже сами пытались реализовать свою версию и, как по мне, получилось очень здорово!

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

В качестве основы я выбрал библиотеку SFML, которая позволяет рисовать линии, многоугольники и окружности. Также она дает возможность удобного использования клавиатуры, добавления звуков и загрузки изображений. В общем все, что нужно для того, чтобы писать игру и не заморачиваться над не существенными деталями на низком уровне.

Подключение SFML

Первое, что нужно сделать — это подключить эту библиотеку. Это не самая простая задача — пришлось хорошенько покопаться в мануалах и исходниках.
Естественно, подключилась SFML далеко не с первого раза, но меня это не испугало и в конце концов я смог разобраться.

Для проверки корректности работы попробуем нарисовать зелёную окружность.

Ура! Как видно, всё отлично работает, а значит можно приступать к проектированию каркаса проекта и реализации первых и самых важных интерфейсов.

Формирование каркаса игры

Основой будет является класс «Мир», в котором будут храниться все объекты на карте. Важно отметить тот факт, что все объекты представляют из себя набор из точек в двумерном пространстве. То есть реально никакого 3D не будет, но далее я создам иллюзию трёхмерного изображения и игроку будет казаться, что он бегает по трёхмерной карте.

Половину дня я потратил на проверку и отладку кода, но в итоге всё-таки смог нарисовать первый объект на карте.

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

По сути класс «Мир» готов и теперь можно создать небольшую 2D сцену из нескольких объектов. Хорошо бы также добавить на сцену камеру и прописать управление с клавиатуры.

2D карта, камера и управление

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

Клавишами вперёд и назад камера будет передвигаться вдоль направления взгляда, а клавиши «влево» и «вправо» будут поворачивать игрока.
После нескольких неудачных попыток я заставил камеру двигаться по карте. Как видно, управление отлично работает: камера перемещается и вращается. Погнали дальше.

Ray-cast и получение 3D изображения

Теперь самое главное – движок игры. Нужно сделать так, чтобы камера могла рисовать изображение на экран, и чтобы это выглядело, как настоящее 3D. Для этого, мы будем использовать алгоритм ray-cast.
Его суть заключается в следующем: Игрок пускает луч до стены. Если мы найдем точку пересечения луча и препятствия, то сможем определить расстояние от камеры до стенки. Так вот если стенка близко, то мы в этом направлении нарисуем большую полоску, а если стенка далеко, то и полоска должна быть маленькой.

Так мы делаем для всех направлений в пределах угла обзора. Пускаем лучи во все стороны и мерим расстояния. Вот и всё.

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

Встаёт проблема определения расстояния до двумерное объекта. На Хабре я нашел мощный и простой алгоритм обнаружения пересечения отрезков. Это, по сути, главный алгоритм во всей игре. Им я буду пользоваться буквально постоянно.

Задача состояла только в его адаптации под мои структуры. После того, как реализован алгоритм, остаётся только пустить лучики по всей зоне видимости и определить расстояния.
Как оказалось, это не самая простая задача: поначалу всё очень тормозило, а камера неправильно обнаруживала расстояния. В итоге получалось, что я как будто вижу невидимую стену прямо перед собой.

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

Видно, что лучи огибают двумерные объекты и камера может понять на каком расстоянии от неё находится стена. Чудненько! Ведь это всё значит, что можно переходить к построению изображения с камеры.
Перед тем, как переходить к псевдо 3D я решил сделать небольшую тестовую комнату, по которой будут разбросаны препятствия.

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

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

Код здесь крайне простой поэтому я очень надеялся на то, что все заработает с первого раза. Но мир жесток и, к сожалению, реальность не всегда совпадает с ожиданием.

Видно, что результат почти правильный, но что-то явно не так. Оказалось, проблема не в математике, а в том, что я неправильно использовал библиотеку. Только минут через 30 понял, что неправильно рисую полоску.
Исправил и всё сразу заработало.

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

Всё плавно и красиво – можно идти дальше!

Текстурирование

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

Теперь немного отвлечёмся на то, как именно я придумал реализовать текстурирование. Я не видел этого метода в интернете и придумал это сам, поэтому вкратце расскажу, как это происходит.
Допустим мы имеем текстуру стены. Теперь мы кромсаем её на вертикальные полоски и каждую из этих полосок накладываем на соответствующую полоску стены.

В принципе, это и есть весь алгоритм. Очень простой и понятный.
Теперь каждый объект имеет свою текстуру в качестве свойства и каждая точка на поверхности объекта теперь соответствует конкретному сдвигу в текстуре.

Естественно, более далёкие участки текстуры мы будем рисовать более темными.
Теперь можно найти, например, текстуру колонны и применить её для боковых колонн.
Здесь нужно обратить внимание на то, что при моём подходе, рисуя вертикальные полоски, мы не сможем сделать красивый пол. Небо можно сделать, просто рисуя текстуру, которую мы будем сдвигать при повороте камеры. В итоге получится эффект параллакса и объёма, а пол я решил пока просто сделать однотонным.
Важно, чтобы текстура неба была бесшовная, то есть при её склейке не должно быть разрывов. Тогда начало и конец без видимых полос соединяться друг с другом.

Теперь игра стала выглядеть светлой и смотрится намного лучше. И весь этот результат я добился всего за 5 дней. Но нужно понимать, что я программировал практически в режиме «нон-стоп» по 6-8 часов каждый день.
Мне и вправду стало очень интересно, что может получится и я решил продолжить, хотя изначально я задумывал остановиться на этом.

Оружие

Какой шутер может обойтись без оружия? Нужно скорее добавлять! Сначала я написал класс “Weapon”, содержащий всю необходимую логику, вроде стрельбы, подсчета количества патронов и скорости перезарядки. Класс «Camera» (то есть игрок) будет содержать в себе массив оружий и индекс выбранного оружия. Да, сначала оружие будет только одно, но я делаю задел на будущее.
Каждое оружие имеет свою текстуру. Я полез в поисковик и нашел вот такой вот дробовик.

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

Стоило добавить одну текстуру, а выглядеть стало в тысячи раз круче!
Можно добавить реализма, смещая текстуру оружия по синусу с постоянной скоростью. Получится эффект дыхания.
Чтобы выстрел выглядел красиво, нужно добавить анимацию перезарядки. Для этого я в Фотошопе разрезал текстуру оружия на три составляющие, одну из которых немного дорисовал. Таким образом, рука будет всегда находится над стволом, а приклад и ружье над рукой. Перемещая руку, можно создать иллюзию перезарядки. Скорость стрельбы оружия можно будет менять (например, прокачивая ловкость игрока) и поэтому скорость анимации тоже будет меняться.

Как видите я решил добавить вспышку огня из ствола во время выстрела, чтобы выглядело еще более эпично.

Коллизия камеры со стенками

Раз уж делать полноценную игру, так делать по совести – нужно заняться коллизией камеры со стенами, чтобы человек не мог ходить сквозь препятствия.
Теперь вместо того, чтобы кидать лучи только в направлении взгляда я кидаю их вообще во все стороны. Зачем это нужно? Если я обнаруживаю объекты, которые потенциально могут испытать коллизию с игроком, то я добавляю их в массив «collision» потом при смещении я прохожусь по всем потенциальным коллизиям.

Для каждой коллизии я высчитываю проекцию перемещения на вектор нормали к поверхности препятствия. Если эта проекция оказалось больше, чем размер игрока, то я немного уменьшаю её и сохраняю итоговый вектор перемещения. Так я делаю для каждой потенциальной коллизии и в конце концов вектор перемещения может очень сильно поменяться.

Процедура более ресурсоёмкая, но зато очень гибкая и в теории позволит игроку скользить вдоль стены. Но теперь нужно задавать точки для стен строго по часовой стрелке, т. к. направление определяет векторы нормалей. Неправильно заданные нормали приведут к тому, что мы сможем попасть внутрь стены, а выйти уже не сможем.

То есть объекты дают возможность выходить из текстуры, но входить внутрь запрещается.

Меню игры

Решил пока передохнуть и потратить время на создание меню игры. Сначала нарисовал основные кнопки, вроде «играть», «настройки» и т.д. Кнопки просто вывожу на экран, как обычную картинку, а при наведении мыши на неё меняю изображение. Если игрок кликнул мышью в пределах кнопки, то считаем это нажатием.

Тут я увидел, что есть проблема дребезга кнопки, но пока забил и оставил так. Хотя бы потому, что такими древними технологиями меню уже никто не делает и для достижения красивого результата придется всё переделывать.
Но цель была сделать «дружественный» пользовательский интерфейс и с ней я в каком-то виде справился. Можно двигаться дальше.

Зеркала и стены разной высоты

Этот проект я начал показывать своим знакомым и один из них предложил добавить зеркала и стены разной высоты. В принципе, ray-cast позволяет запросто сделать зеркало. Если стенка является зеркалом, то нужно просто отразить пришедший луч и рекурсивно продолжить вычисления.

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

Кстати, у меня есть замечательная школа математики для программистов – Академия вектозавров. Первую, бесплатную, главу пройти обязательно всем! 🙂

Для того, чтобы добавить стенки разной высоты, нужно производить ray-cast не только до ближайшего предмета, но и для всех предметов в данном направлении и сохранять все коллизии в вектор. Мне пришлось значительно переработать движок для того, чтобы сделать достаточный уровень абстракции для реализации рекурсивных зеркал с учетом стен и зеркал разной высоты.
Теперь я храню все расстояние до всех объектов, которые попали в радиус видимости.

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

Видно, что, как и следует, изображение в зеркале симметрично отображается и если за зеркалом текстура Анны смотрит на зеркало, то из зазеркалья Анна смотрит на нас. Надписи и текст тоже отлично отражаются.
А сейчас читатель, наверное, уже задался вопросом: «А что будет, если поставить два зеркала напротив друг друга?». Давайте проверим, как движок с этим справляется.

Очень круто! Все работает как надо.
Чтобы добиться такого результата нужно только не забыть ограничить глубину рекурсии лучей. Когда я этого не сделал и подходил к зеркалам, игра сразу падала, ведь стек быстро переполнялся.
Можно увеличить радиус обзора, но тогда сразу будет заметно, что игра начала тормозить.

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

Противник и обработка выстрелов

Чтобы добавить противника достаточно просто добавить еще одну камеру на карту.

И вот, противник готов.
Но как сделать обработку выстрелов? Я сделал так: после выстрела я пускаю луч в направлении взгляда. Если этот луч пересекает какую-нибудь камеру, то мы уменьшаем у неё количество здоровья.

Естественно, я использую тот же самый алгоритм бросания лучей, что и при измерении расстояний. Фактически ничего нового я вообще не писал, а просто использовал уже готовую функцию.
Но как мы помним, при встрече на пути зеркала луч рекурсивно отражается. Так как я использовал ту же функцию, то и пули так-же будут отражаться от зеркал.

Это вводит новую интересную механику в игру, ведь теперь если умеешь пользоваться зеркалами, можно убивать врагов, стреляя прямо в зазеркалье. Урон от пуль зависит от расстояния до цели. То есть если стоять вплотную, то враг сразу погибает, а если стрелять издалека или, например, через зеркало, то урон будет куда меньше.

Multiplayer

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

Возникла такая проблема: я изменяю координату кружка на сервере, а кружок на клиенте сдвигается с огромной задержкой. Практически сразу же я понял, что сервер затапливает UDP пакетами клиента. Поэтому клиенту надо читать все сообщения из буфера до тех пор, пока не будет прочитано последнее.
Несколько часов и кривая версия онлайн готова: игроки видят друг друга и могут стрелять в друг друга. Если запас жизней кончается, то игрока телепортирует на место старта.

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

Проектирование карты для сражений

Теперь нужно сделать интересную карту для deathmatch’a и можно будет звать друзей играть.
Сначала я набросал будущую карту на листе, а потом расставил колонны по углам, чтобы потом соединить их кирпичной стенкой.

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

Результаты

Можно наконец начать тест игры. Урон по противнику наносится, а значит, всё работает правильно.

Играть, честно говоря, немного непривычно, ведь нельзя взглянуть вверх, но потом быстро привыкаешь к этой механике и наоборот начинаешь ловить кайф от игрового процесса.
Мы так увлеклись игрой, что целый час проиграли и не заметили, как пролетело время. Во время игры мы придумывали, что можно добавить, сразу добавляли и играли дальше. Так, например, ребята придумали, что здоровья хорошо бы со временем восстанавливать. Тогда играть еще интересней.

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

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

GitHub & Как запустить игру?

А теперь для тех, кто хочет попробовать запустить эту игру или покопаться в коде. На своём GitHub’е я создал репозиторий с проектом, откуда его можно скачать. Тут же будет список того, над чем я работаю в данный момент и что уже сделано.

Для того, чтобы всё заработало, нужно поставить библиотеку OpenAL. Заходим в папку “Release” и запускаем .exe файл. Если вы увидели эту менюшку, то поздравляю, всё заработало.

Планы на будущее

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

Друзья! Я очень благодарен вам за то, что вы интересуетесь моими работами, ведь каждый пост на сайте даётся очень непросто. Я буду рад любому отклику и поддержке с вашей стороны.

Если у вас остались вопросы или пожелания, то вы можете оставить комментарий (регистрироваться не нужно)

Как же много времени я потратил на создание этого ролика и статьи.
Такой формат не очень популярен на русском YouTube, да и красивых и интересных статей тоже не очень много.
Надеюсь, что мне удастся изменить ситуацию 🙂

Дата: 15-03-2020 в 12:47

молодец хороший контент делаешь

Дата: 24-03-2020 в 13:10

Круто! Отличная работа. Надеюсь, это перерастет во что-то большее

Дата: 26-03-2020 в 08:39

Предложение! Можно добавить физику, если это возможно! Сделать карту по красивее и объемнее (аналог того же De_DUst) ! Попробовать это все перевести на API Vulkan и DX12, если это возможно! Конечно я понимаю, что не все сразу! Можно еще и с шейдерами поиграться

Дата: 26-03-2020 в 09:36

Я бы хотел увидеть игру не на райкастинге а игру где мир описан обьектами с точками и текстурами .Я пытался что то сделать но фпс падал из за того что я поворачивал всю карту вокруг игрока а не взгляд -я делал массив точек относительно игрока потом умнажал на матрицу поворота затем рисовал текструры по растоянию .(формула перспективы и перевода в 2д по X «Z это кордината дальности»-(точкаX+игрокX)*(fov/(точкаZ+игрокZ))

Дата: 30-03-2020 в 02:13

Предложение! Можно сделать игру на одного игрока или мультиплеер, где надо справляться с «волнами» врагов» К примеру они могут выходить из какой-нибуть двери, А после убийства определенного количества врагов может выходить бос(он будет с большим количеством HP и моделька к примеру будет по больше)

Дата: 05-04-2020 в 10:26

гле можно скачять игру

Дата: 09-04-2020 в 09:54

Не могли бы вы пояснить начинающему программисту, что делать после скачивания с репозитория, чтобы можно было самому менять что-то в игре, ибо visual studio отказывается что-либо билдить?

Дата: 12-04-2020 в 17:39

Используй gpu и твоя игра похожа на Team Fortres 2

Дата: 13-04-2020 в 10:32

Кашпировский:

Хотел денюшку перевести, но карту заблокировало

Дата: 09-07-2020 в 19:53

А почему не Simple Directmedia Layer (SDL) http://libsdl.org ?

Так игра бы собиралась под многие платформы.

Дата: 15-10-2020 в 16:14

Здравствуйте,
На github нет текстур , а очень хотелось бы попробовать разобраться. Без них не работает.
Закиньте, пожалуйста, текстуры куда-нибудь для скачивания, хоть на тот же гитхаб!!

Дата: 31-10-2020 в 14:21

Дата: 02-11-2020 в 18:07

лявоамдфокруькумьжьщу:

Дата: 02-11-2020 в 18:08

Круто продолжай дальше, в том-же духе на игрой. Желаю успехов с игрой в дальнейшем.

Дата: 07-12-2020 в 13:18

Как ты реализовал коллизию?

>Для каждой коллизии я высчитываю проекцию перемещения на вектор нормали к поверхности препятствия. Если эта >проекция оказалось больше, чем размер игрока, то я немного уменьшаю её и сохраняю итоговый вектор перемещения. Так я >делаю для каждой потенциальной коллизии и в конце концов вектор перемещения может очень сильно поменяться.

Сижу голову ломаю, а всё равно стенку либо насквозь проходит, либо прям в ней застревает 🙁
————
tg @nekotorio

Дата: 03-02-2021 в 13:23

vladislaw2020:

Памагите!Как сделать текстуры вообще не понимаю.Я тоже делаю шутер на C++.

Дата: 31-03-2021 в 08:27

чел а код где, самый сок решил себе оставить?

Дата: 20-06-2021 в 19:11

Visual studio ничего не билдит.

Дата: 25-06-2021 в 13:02

Иван, Вы большой молодец! Делайте телеграм-канал, а пока Ваш сайт в закладках)
Успехов Вам!

Дата: 17-01-2022 в 23:47

Дата: 11-06-2022 в 09:26

прикольно автор харош

Дата: 07-01-2023 в 17:46

Дата: 26-04-2023 в 11:44

Мои курсовые | 30.11.2019: Выложил мои курсовые в открытый доступ. Теперь они отображаются в колонке слева под новостями.

Для будущих авторов | 12.10.18: Если вы хотите стать автором статей на сайте и получить подтвержденный аккаунт, то обращайтесь на почту! support@ilinblog.ru

Обновления | 21.08.18: Добавлена возможность комментировать статьи. Сайт адаптирован под мобильные устройства.

Обновления | 19.01.18: Добавлена возможность добавления математических формул в статьи посредством языка latex. Пример использования тут. Также добавлена возможность редактирования статей.

Информация о пользователях | 28.10.17: Расширена функциональность страницы пользователей, теперь можно добавить статус и личную информацию.

Первый игровой движок на С++ и SFML

Первый игровой движок на С++ и SFML

Прежде чем приступить к весёлой части с кодом, придётся пройти муторную, но важную часть с настройкой sfml. Данный гайд написан для Visual Studio 2019 на Windows. Установка для VS 2017 практически идентична, но могут быть незначительные отличия. Для других платформ крайне рекомендуется поискать гайд по настройке именно для вашего окружения. Ошибки на этом этапе, в лучшем случае, не дадут проекту скомпилироваться, в худшем – скомпилируются неправильно и вынесут вам мозг.

Переходим на главный сайт библиотеки и скачиваем последнюю стабильную версию (2.5.1 к моменту написания статьи). Выбираем для С++ 15(2017) 32-бита. Установка 64-битной версии идентична, для экономии времени сосредоточимся на более универсальной.

Распаковываем архив в удобную директорию, можно сразу сохранить в буфер путь до содержимого папки, в моем случае – это C:\SFML-2.5.1\ .

Открываем VS-2019, создаем новое консольное приложение Windows, Называем проект FirstGameEngine, получаем консольный хеллоуворлд.

Теперь включаем концентрацию на максимум, задача довольно простая, но почти каждый допускает ошибку во время первой настройки. Открываем вкладку Проект , в самом низу выбираем свойства: FirstGameEngine .

Первый игровой движок на С++ и SFML

Выставляем конфигурацию Все конфигурации и платформу Win32 . Выбираем пункт С/С++ → Общие , находим Дополнительные каталоги включаемых файлов – здесь нужно указать путь до папки include . Вставляем путь из буфера и дописываем, как сделал я. Если сомневаетесь, нажмите изменить и найдите папку через эксплорер.

Первый игровой движок на С++ и SFML

Спускаемся в Компоновщик → Дополнительные каталоги библиотек и проделываем тоже самое, но уже с папкой lib .

Первый игровой движок на С++ и SFML

Переключаем Конфигурацию на Debug. Открываем Компоновщик → Ввод → Дополнительные зависимости . Копируем этот перечень sfml-graphics-d.lib;sfml-window-d.lib;sfml-system-d.lib;sfml-audio-d.lib; и аккуратно, не стирая и не перезаписывая уже имеющиеся записи, вставляем его в начало списка.

Первый игровой движок на С++ и SFML

Переключаемся на Release и так же аккуратно вставляем sfml-graphics.lib;sfml-window.lib;sfml-system.lib;sfml-audio.lib;

Теперь поочередно запускаем Debug и Release, ловим по ошибке. Этот шаг необходим, чтобы студия создала папки проекта с exe-файлами. Сразу найдите эти каталоги. Их расположение зависит от настроек студии. Обычно они создаются на уровень выше папки с кодом. Теперь возвращаемся к распакованному архиву sfml, находим папку bin и копируем все бинарники с символом d в названии плюс openal32.bin в папку Debug, и то же самое без d + openal32.bin в Release.

Должна получиться такая картина:

Первый игровой движок на С++ и SFML

Самая нудная часть позади.

Написание первого игрового движка на С++.

К файлу FirstGameEngine.cpp мы вернемся чуть позже. Его единственная задача – это запустить в функции main() наш движок.

Класс персонажа.

Bob – простой класс для представления фигурки персонажа, управляемой игроком. Код класса будет легко расширяться, а что самое главное – его несложно переписать под любой другой игровой объект, который вы захотите добавить. Для этого потребуется заменить текстуру и описать поведение нового объекта в методе update().

Создаем новый заголовочный файл. Кликаем Проект → Добавить новый элемент → Файл заголовка. Называем Bob.h и объявляем следующие поля и методы:

Здесь мы объявили поля типа Texture и Sprite. Дальше мы свяжем их, и любое действие на экране с объектом Sprite будет сопровождаться изображением Боба:

Первый игровой движок на С++ и SFML

Сохраните это изображение в директорию FirstGameEngine/FirstGameEngine.

Bob.cpp

Приступим к реализации.

По той же схеме создаем файл Bob.cpp, только выбираем Файл С++ . Теперь добавляем в файл код:

В конструкторе мы установили значение переменной m_Speed на 400. Это значит, что Боб пересечет экран шириной в 1920 пикселей за 5 секунд. Также мы загрузили файл Bob.png в Texture и связали его с объектом Sprite. В переменных m_Position.x и m_Position.y установлено начальное положение Боба. Не забывайте, что в С++ координаты отсчитываются от верхнего левого угла и ось-у направлена вниз, не потеряйте Боба.

Функция update обрабатывает два If. Первое If проверяет, нажата ли правая кнопка (m_RightPressed), а второе следит за левой (m_LeftPressed). В каждом If скорость (m_Speed) умножается на elapsedTime. Переменная elapsedTime рассчитывается в функции Start движка (класс Engine). Им мы сейчас и займемся.

Engine.h

Создаем новый заголовочный файл Engine.h:

Класс библиотеки SFML, RenderWIndow, используется для рендера всего, что есть на экране. Переменные Sprite и Texture нужны для создания фона. Также в заголовке мы объявили экземпляр класса Bob.

Engine.cpp

Здесь мы реализуем конструктор и функцию start(). Создаем файл класса так же, как для Bob.cpp, и добавляем в него код:

Конструктор получает разрешение экрана и разворачивает игру на весь экран с помощью m_Window.create, загружается Texture и связывается с объектом Sprite.

В качестве фона вы можете использовать любое изображение, ниже я выложу своё. Рекомендую подобрать или масштабировать его по размерам вашего рабочего стола. Пункт не критичный, но смотрится приятнее, а в рамках данного курса мы не будем разбирать работу с окном и его размерами. Переименуйте файл в background.jpg и поместите в каталог FirstGameEngine/FirstGameEngine .

Можете воспользоваться моим примером:

Первый игровой движок на С++ и SFML

Игровой цикл.

Следующие три функции будут описаны каждая в отдельном файле, но при этом они должны быть частью Engine.h. Поэтому в начале каждого файла укажем директиву #include «Engine.h», так что Visual Studio будет знать, что мы делаем. Это делается для удобства дальнейшего масштабирования проекта.

Обрабатываем пользовательский ввод

Функция input обрабатывает нажатия клавиш через константу Keyboard::isKeyPressed, предоставляемую SFML. При нажатии Escape m_Window будет закрыто. Для клавиш A и D вызывается соответствующая функция движения.

Обновляем игровые объекты

Теперь опишем функцию update. Её задача вызвать аналогичную функцию обновления состояния у всех игровых объектов. В нашем случае это только Bob.

Создаём файл Update.cpp и добавьте в него код:

Отрисовка экрана.

Это последняя функция класса Engine, её задача – отрисовать все объекты текущего экрана. Создайте файл Draw.cpp и добавьте в него код:

Экран каждый виток цикла очищается методом clear. Первым делом должен быть отрисован фон, чтобы потом поверх него можно было поместить Боба.

Запускаем движок!

Теперь вернемся к FirstGameEngine.cpp.

Наш игровой движок, как и положено первой работе, получился очень простым: он умеет только двигать главный объект и закрывать программу. Он не умеет обрабатывать столкновения, работать с интерфейсом и еще много чего. Возможно, этим мы займемся позже. Однако он отлично описывает то, как строится ядро игрового проекта с нуля. К тому же, в него довольно легко добавлять новые объекты и расширять функционал. Попробуйте, в качестве практики, добавить второго боба, управляемого клавишами J и L, у вас уже есть для этого все необходимые знания. Или поменяйте фон, если Боб выходит за границу экрана. Задачка уже посложней, но тоже вам по силам. =)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *