Как сделать игру от первого лица

Добавил пользователь Дмитрий К.
Обновлено: 03.09.2024

Сегодня я расскажу о том, как можно написать шутер от первого лица, используя псевдо-3D графику. Такая графика повсеместно использовалась в старых игрушках типа Wolfenstein 3D, Doom, Doom II и др.
Вдохновлением для написания данной статьи стал видеоролик Code-It-Yourself! First Person Shooter (Quick and Simple C++) с YouTube канала OneLoneCoder. Мне настолько понравилась идея и простота её реализации, что я просто не мог сдержаться, чтобы не рассказать о ней!
На моём YouTube канале есть видео с наглядными объяснениями этой темы:

Как выглядела Wolfenstein 3D:

А вот, что мы получим в итоге:


Можно ожидать, что для написания чего то подобного понадобятся тысячи строчек кода и недели работы, но эта программа содержит всего 180 строчек кода!
Я не буду много останавливаться на коде и углубляться в детали программирования, а только попытаюсь объяснить основную идею и показать результаты. На GitHub'e автора кода есть все исходники.


Начнём с того, что просто создадим необходимые переменные:


Для вывода текста на экран мы не будем использовать стандартную функцию cout, ведь она слишком медленная. Вместо этого будет использоваться следующая конструкция:

Это просто метод вывода, поэтому на нем сильно не останавливаемся.
Теперь все готово к написанию кода. Игровую карту мы будем хранить в виде двумерного массива. Решётка будет означать стену, а точка - пустое пространство:

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

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


Мы будем строить изображение в два цикла, изменяя во внешнем цикле координату по \(X\), а во внутреннем - по \(Y\).
Напомню, что в консоли, как и полагается, вывод текста происходит слева направо с переносом вниз. Так что координатная сетка будет выглядеть следующим образом:


У нас будут две степени свободы: движение вперёд-назад и поворот.
Реализовать изменение этих параметров не составляет никакого труда:


Мы будем строить изображение в два цикла, изменяя во внешнем цикле координату по \(X\), а во внутреннем - по \(Y\).
Для того, чтобы построить часть изображения - вертикальную полоску на экране, нужно найти расстояние от наблюдателя до предмета, который попадет в эту полоску.
У наблюдателя есть некоторый угол обзора \(\theta\), в который могут попасть предметы. Расстояние до них мы и будем пытаться найти:

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


Чтобы не попадать в бесконечный цикл нужно ограничить радиус видимости. Если стенка не попала в радиус видимости, то мы будем воспринимать это как отсутствие препятствия в данном направлении.

Для построения изображения наблюдатель пускает лучи с некоторым шагом, проходя по всему углу обзора. Направление луча для построения конкретной полоски на экране находится исходя из того, что за весь проход по оси \(X\) экрана нужно полностью пройти угол обзора \(\theta\). Угол обзора - это то, что помещается в ширину экрана:


По сути, у нас теперь есть все для того, чтобы создать иллюзию 3D. Имея расстояние \(d\) до стенки в данном направлении, мы можем вычислить её высоту относительно экрана. Как это сделать? Нужно понять как изменяется относительная высота объектов при изменении расстояния до них:


Из подобия треугольников сразу получаем зависимость относительной высоты кота от расстояния до него. Мы строим проекцию в точку (глаз), при которой мы получаем перспективу:


Видно, что если расстояние \(d\) равно \(d'\), высота кота относительно экрана равна его "настоящей" высоте. То есть расстояние \(d'\), на котором находится экран от наблюдателя - это расстояние на котором размеры объектов не искажаются.
Для отрисовки полоски нужно задать две координаты по Y: первая - это координата, где начинается стенка и заканчивается небо (идем сверху вниз и сначала прорисовываем небо), а вторая указывает, где заканчивается стенка и начинается пол.
Сделаем эти две точки симметричными относительно центра по высоте, задав их следующими формулами:
$$
y_1 = \frac\left(1-\frac\right) \qquad (1)
$$
$$
y_2 = \frac\left(1+\frac\right) \qquad (2)
$$
Видно, что если расстояние \(d\) до стенки становится большим, то эти точки сходятся в центр и высота полоски становится маленькой. То есть небо и пол занимают почти все место.
Если расстояние становится маленьким, то эти точки уходят вниз и полоска увеличивается. Легко убедиться, что формулы (1) и (2) задают размер стенки, как и положено, обратно пропорциональным расстоянию до неё. Действительно:
$$
b'=h' - 2\frac(1-\frac) = \frac
$$
То есть размер стенки в данном случае равен размеру экрана, а экран расположен на расстоянии 1 метр от наблюдателя.


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

Теперь подробно разберём, как реализовать это:


На выходе получается достаточно красиво:


Выглядит наша программа уже неплохо, но ориентироваться по карте всё равно тяжело. Хорошо бы добавить отображение рёбер стен.
Но как мы поймем, что смотрим именно на ребро? Если мы определили, что произошло столкновение со стеной, то мы сразу же можем (точно) определить её местоположение, а значит и местоположение её четырёх рёбер.
То есть у нас есть четыре вектора, которые направлены от наблюдателя точно в рёбра стенки. Если угол между испускаемым лучом и одним из этих векторов становится маленьким, то мы будем воспринимать эту часть стенки за ребро и рисовать её другим символом:


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


Если флаг bBoundary принимает значение true, то мы печатаем вертикальную черту вместо стенки.
Теперь мы можем видеть границы стен:


Получилась вполне себе сносная бродилка времен 90x.
Исходники, как я уже говорил выше, вы можете найти на GitHub'e автора кода.
Если данная статья вам понравилась, то поделитесь ею с друзьями или оставьте комментарий - мне будет очень приятно С:
Скорее всего я напишу вторую часть, в которой расскажу о том, как можно сильно улучшить данный результат и сделать настоящий шутер!

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

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


Дата: 26-05-2019 в 13:54

Ждём продолжения. Если можно, то хотелось бы на самом примитивном уровне объяснений отрисовки (и её реализации), на своём примере с единичными объектами.

Тибу бы, заняться робетгутством и учить людей программированию бесплатно. )))
--------------------------------------------
Бесплатно бы я не хотел работать :)


Дата: 02-10-2019 в 09:14


Дата: 05-10-2019 в 19:27

Великолепно! Требуем продолжения бро. )


Дата: 14-11-2019 в 18:26

как бы сюда ещё бы спрайтов добавить


Дата: 16-11-2019 в 13:58

На ютуб канале есть подобные видео у тебя?


Дата: 05-12-2019 в 17:02

Я знаю чем займусь в ближайшее время! Спасибо


Дата: 06-12-2019 в 16:53


Дата: 12-12-2019 в 17:31


Дата: 11-01-2020 в 11:33

SetConsoleColor и поехали 3000 year игры в консоле


Дата: 16-02-2020 в 14:54


Дата: 22-02-2020 в 22:50

Пожалуйста, сделай продолжение


Дата: 01-03-2020 в 15:51

мой редактор С++ выдает ошибку в объявлении tp1 и tp2 : " 'tp1' does not mean a type " как с этим бороться?

Спасибо за урок, очень доступно объяснил, лично я всё понял, хоть и не с первого раза.


Дата: 21-03-2020 в 11:32


Дата: 24-03-2020 в 16:36


Дата: 29-03-2020 в 20:30

Тоесть мы делаем проверку на каждом луче что бы узнать где поставить ребро?если что мне 12 лет


Дата: 30-03-2020 в 00:58

у меня не запускается(


Дата: 30-03-2020 в 12:41

как сохранить в какой формат ? просто текстовий дакуумант виходет ((((((


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

Здравствуйте. Так в стандартной консоли же 80 столбцов и 25 строк. Почему у Вас 120 столбцов?
И я бы хотел запустить этот код в CodeBlocks v17.12. Он неработает, что делать? Можете мне с этим помочь?


Дата: 30-03-2020 в 20:04

BlabbingCrow:

Братан. Шикарная статья. Но тебе бы изучить основы ООП. Банально использование функций. Очень полезный навык, который тебе очень поможет. Статье уже больше года. Так что возможно ты уже обратил на это внимание, но если нет, то очень советую изучить данный вопрос. Так же более детально подойти к организации проекта на С++, т.е. инкапсулировать функционал по разным компонентам и добавить им хедеры (своего рода аналоги интерфейсов) и получится замечательный приятный код.


Дата: 30-03-2020 в 22:09

BlabbingCrow:

Чекнул вторую часть статьи. Предъявы за ООП сняты. Все по красоте)


Дата: 30-03-2020 в 22:19


Дата: 04-04-2020 в 20:27


Дата: 09-04-2020 в 13:33

Интересная интерпретация определения предмета перед собой. Спасибо не знал есть ли ссылка на патирон?!


Дата: 09-04-2020 в 20:50

А можно сразу весь код написать?


Дата: 09-04-2020 в 21:41

у меня выдаёт ошибки при написании for в коде
паиагитеееееееееее


Дата: 12-04-2020 в 14:56

У меня вопрос а как запустить программу с игрой


Дата: 15-04-2020 в 20:05

А что делать если выдает ошибки и не запускается консоль


Дата: 24-05-2020 в 07:42

Спасибо, получилось повторить


Дата: 24-05-2020 в 11:39

Б. Страуструп:


Дата: 30-05-2020 в 17:08

По-моему проще бы было реализовать это без псевдо трехмерной графики и на js с библиотекой three js, там бы на мой взгляд было бы намного проще


Дата: 14-06-2020 в 20:55


Дата: 21-06-2020 в 18:05

Очень хорошо сделано! Читая эту статью написал свой '2.5D engine', не слегка изменив его) Не так давно узнал про твой канал и все твои видео просто огонь!:)

эх жалко что полного кода нет


Дата: 09-07-2020 в 23:38

ДАЛБАЕБ КАТОРЫ НЕЧИВО НИЗНАЮЕ:

Я нічого не зрозумів

у меня не получилось

PyGame [Python]:

Все топ можете оставь в ссылку яндекс диск думаб так будет удобнее скачивать


Дата: 06-09-2020 в 10:32

Топ спасибо за помощь ;)


Дата: 15-10-2020 в 21:44

Статья супер. Хотел сказать по сайту. На ксиоми редми нот 7 в стандартном браузере не прогрузились картинки.


Дата: 20-11-2020 в 02:01


Дата: 22-11-2020 в 12:12

Нечего не работает!


Дата: 02-12-2020 в 16:09

Кстати мне 11лет и я смог сделать карту .Перехожу к управлению


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


Дата: 15-12-2020 в 13:40

А как запустить?


Дата: 26-02-2021 в 11:33

я бы не создавал массив для хранения буфера консоли, это очень сильно загромождает память (я пишу на fasm, я уменьшил размер файла с 8КБ до 2КБ), можно использовать LocalAlloc, он быстрее и лучше. По поводу микроконтроллера arduino для начинающий пойдет, но если тебе надо производительность и малый размер программы используй AVR (я тоже этим занимаюсь), и там же можно также сделать как это сделал я через LocalAlloc, но загружая данные напрямую в оперативку и выгружая её (в ассемблере с AVR не селен)


Дата: 26-02-2021 в 20:59

3д мне пока не нужно, не дорос ещё. Пока пытаюсь привести в движение 2д. getch() не подошло. А у Вас нашёл GetAsyncKeyState(). Завтра попробую использовать.


Дата: 06-03-2021 в 22:53

using UnityEngine;
using System.Collections;

public class movePlayer : MonoBehaviour

private GameObject player; //Переменна объекта персонажа с которым будем работать.

public static int speed = 6; //Скорость перемещения персонажа. Запись public static обозначает что мы сможем обращаться к этой переменной из любого скрипта
public static int _speed; //постоянная скорость перемещения персонажа
public int rotation = 250; //Скорость пповорота персонажа
public int jump = 3; //Высота прыжка


public static bool IsDrawWeapon; //Двоичная переменная, которая будет отвечать достануто ли у нас оружие.
public static float x = 0.0f; //угол поворота персонажа по оси x
void Start () <
IsDrawWeapon = false; //По умолчанию оружие у нас спрятано.
_speed = speed; //Задаем постоянное стандартное значение скорости персонажа
player = (GameObject)this.gameObject; //Задаем что наш персонаж это объект на котором расположен скрипт
>

void Update () <
if(IsDrawWeapon == true) //Если оружие вытащено
<
speed = _speed * 2; // Меняем скорость передвижени(я это сделал потому что, у этой моделки нету анимаций движения простым шагом с мечом. а понижать скорость анимации у бега получиться не красиво)
if(Input.GetKey(KeyCode.W)) //Если нажать W
<
player.transform.position += player.transform.forward * speed * Time.deltaTime; //Перемещаем персонажа в перед, с заданой скорость. Time.deltaTime ставится для плавного перемещения персонажа, если этого не будет он будет двигаться рывками
>
if(Input.GetKey(KeyCode.S))
<
speed = _speed / 2; //При передвижениии назад снижаем скорость перемещения
player.transform.position -= player.transform.forward * speed * Time.deltaTime; //Перемещаем назад
>
if(Input.GetKeyUp (KeyCode.S))
<
speed = _speed * 2; //Возвращаем cтандартное значение
>
if(Input.GetKey (KeyCode.A))
<
player.transform.position -= player.transform.right * speed * Time.deltaTime; //перемещаем в лево
>
if(Input.GetKey (KeyCode.D))
<
player.transform.position += player.transform.right * speed * Time.deltaTime; //перемещаем в право
>
if(Input.GetKey (KeyCode.Space))
<
player.transform.position += player.transform.up * jump * Time.deltaTime; //Прыгаем
>

if(Input.GetKey (KeyCode.Tab)) //При нажатии и на кнопку Tab
<
IsDrawWeapon = false; //Мы спрячем наше оружие.
>
>
else if(IsDrawWeapon == false) //Если оружие не спрятано. |||||| Сделано разделение на движения в зависимости от того вытащено ли у нас оружие или нет, потому что персонаж будет перемещаться сразной скорость у меня в этих случаях, как я уже написал из за отсутсвия некоторых анимаций у модельки.
<
speed = _speed;//Скорость в стандартное значение
if(Input.GetKey (KeyCode.LeftShift)) //Если зажать левый Shift
<
speed = _speed * 2; //Увеличиваем скорость перемещения(бег)
>
if(Input.GetKeyUp (KeyCode.LeftShift)) //Если отпустить
<
speed = _speed; //Возвращаем стандартное значение
>
if(Input.GetKey(KeyCode.W)) //Если нажать W
<
player.transform.position += player.transform.forward * speed * Time.deltaTime; //Перемещаем персонажа в перед.
>
if(Input.GetKey(KeyCode.S))
<
speed = _speed / 2;
player.transform.position -= player.transform.forward * speed * Time.deltaTime; //Перемещаем назад
>
if(Input.GetKeyUp (KeyCode.S))
<
speed = _speed; //Возвращаем cтандартное значение
>
if(Input.GetKey (KeyCode.A))
<
player.transform.position -= player.transform.right * speed * Time.deltaTime; //перемещаем в лево
>
if(Input.GetKey (KeyCode.D))
<
player.transform.position += player.transform.right * speed * Time.deltaTime; //перемещаем в право
>
if(Input.GetKey (KeyCode.Space))
<
player.transform.position += player.transform.up * jump * Time.deltaTime; //Прыгаем
>
if(Input.GetKey (KeyCode.Tab)) //при нажатии на кнопку таб
<
IsDrawWeapon = true; //Мы вытащим наше оружие
>
>

//Поворачиваем персонажа. Так как наша переменная x глобальна, из скрипта камеры в неё будем записывать длину на сколько сместился указатель мыши и по оси X и относительно этого будет повернут наш персонаж
Quaternion rotate = Quaternion.Euler (0,x,0); //Создаем новую переменную типа Quaternion для задавания угла поворота
player.transform.rotation = rotate; //Поворачиваем персонаж

codeusing UnityEngine;
using System.Collections;

public class CamMove : MonoBehaviour <
public Transform target; //Объект за которым летаем(Наш персонаж)
public float distance = 3.0f; //На каком ратоянии от него
public float xSpeed = 125.0f; //Чуствительность по Х
public float ySpeed = 50.0f; //Y Чуствительность
public float targetHeight = 2.0f; //Высота относительно объекта
//Минимальный и максимальный угол поворота Y инче камеру разверет, Дальше у нас будет простая функция для инвертации их в обратные числа
public float yMinLimit = -40;
public float yMaxLimit = 80;
//Максимальное удаление и приближение камеры к персонажу, искорость.
public float maxDistance = 10.0f;
public float minDistance = 0.5f;
public float zoomRote = 90.0f;

private float x = 0.0f; //Угол поворота по Y?
private float y = 0.0f; //Уго поворота по X?

[AddComponentMenu("Scripts/Mouse Orbit")] //Добавляем в меню

public void Start() <
//переворачивам углы
Vector3 angles = transform.eulerAngles;
x = angles.y;
y = angles.x;

if(rigidbody)
rigidbody.freezeRotation = true; //Если камера столкнется с физ.объектомона остановиться
>

public void LateUpdate() <
if (target) //Меняем углы согласно положению мыши
x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
//Меняем дистанция до персонажа.
distance -= (Input.GetAxis ("Mouse ScrollWheel") * Time.deltaTime) * zoomRote * Mathf.Abs(distance);
distance = Mathf.Clamp (distance, minDistance, maxDistance);

y = ClampAngle(y,yMinLimit, yMaxLimit); //Вызыв самописной функции для ограничения углов поврот
movePlayer.x = x;
//Повернуть камеру согласно поченым данным
Quaternion rotation = Quaternion.Euler(y, x, 0);
transform.rotation = rotation;

//Двигаем камеру и следим за персонажем
Vector3 position = rotation * new Vector3(0.0f, targetHeight+0.5f, -distance) + target.position;
transform.position = position;

//Следуйщи код нужен что бы камера не проваливалась по ланшафт
RaycastHit hit;
Vector3 trueTargetPosition = target.transform.position - new Vector3(0, -targetHeight,0);
if(Physics.Linecast (trueTargetPosition, transform.position, out hit))
<
float tempDistance = Vector3.Distance (trueTargetPosition, hit.point) - 0.28f;
position = target.position - (rotation * Vector3.forward * tempDistance + new Vector3(0, -targetHeight, 0));
transform.position = position;
>
>

>
//Меняем значения углов
public static float ClampAngle (float angle, float min, float max) <
if(angle 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
>
>

using UnityEngine;
using System.Collections;

public class AnimatePlayer : MonoBehaviour

public void Start ()
<
// Устанавливаем все клипы анимации в режим цикла
animation.wrapMode = WrapMode.Loop;
// Кроме следующих
animation["Attack01"].wrapMode = WrapMode.Once;
animation["jump"].wrapMode = WrapMode.Once;
animation["Skill"].wrapMode = WrapMode.Once;
//У них одиночное выполнение

//Останавливаем выполнение анимаций.
animation.Stop();
>

public void Update () <
// На основе нажатой клавиши выполняем анимацию
if(movePlayer.IsDrawWeapon == false) //Если оружие не вытащено
<
if (Input.GetAxis("Vertical") > 0.0f) //Проверяем на изминениея позиции персонажа повертикали, если да
<
if(movePlayer.speed == movePlayer._speed * 2) //Проверяем скорость Передвижения персонажа,
<
animation.CrossFade ("Run00"); //Если зажата клавиша shift, значит грузим анимацию бега
>
else
<
animation.CrossFade("Walk"); //В противном случаее ходьбу
>
>
else if(Input.GetAxis("Vertical") 0.0f)
<
if(movePlayer.speed == movePlayer._speed * 2)
<
animation.CrossFade ("R_Run00"); //бег в право
>
else
<
animation.CrossFade ("R_Walk"); //Шагание в право
>

0

Ребят, а как сделать чтоб при движении назад он разворачивался на 180 градусов, заранее спасибо.

0

-1

0

0

Автор, умоляю исправь ошибку. "moveCam" и "CamMove" не одно и то же. У меня 4 часа жизни ушло чтобы найти ее.
Ну и "codeusing" заодно, на нее ушло минут 5.

0

0

Писалось для версии Unity 4.3 если я не ошибаюсь(таки больше 2х лет прошло), ищи аналогичные функции для своей версии в справке, да и по факту тут описан фактичекски стандартный CharacterController так что ковырни стандартные ассеты

0

1

2

4

Игровой форум GFAQ.ru


Разработка компьютерных игр. С чего начать? Это просто! С нуля до разработчика игр: как начать создавать свою игру. Заказать создание игры.

8 доступных игровых движков, на которых можно сделать свою игру

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

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

GameMaker Studio 2

Именно GameMaker Studio 2 – это тот движок, на который стоит обратить внимание в первую очередь. Он подойдет людям, которые ничего не понимают в игростое и не имеют соответствующего образования. Он простой в освоении за счет встроенного языка сценариев, который придумали создатели движка, чтобы разработка игр стала максимально доступной.

Идеально подойдет для разработки 2D платформеров и ролевых игр. Также движок позволяет легко реализовать кросс-плей в своих проектах. Есть пробный период для тестирования возможностей, но если захочется серьезно заняться созданием игр, придется заплатить $99 за постоянную лицензию, то есть никаких месячных или готовых платежей – платим один раз и получаем инструмент навсегда.

Плюсы GameMaker Studio 2:

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

Минусы GameMaker Studio 2:

  • Слишком простой язык сценариев, в котором легко запутаться, если проект большой;
  • Из-за простоты языка программирования теряется производительность проекта;
  • Если долго сидеть на этом движке, то в будущем будет сложно перейти на более продвинутый, например, Unity или Unreal Engine 4.

Ren’Py

8 доступных игровых движков, на которых можно сделать свою игру

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

Используется Ren’Py в основном для простых симуляторов и 2D квестов. Делать что-то сложнее на нем, скорее всего, не получится, но при желании можно попробовать. У движка открытый исходный код, поэтому к нему часто выходят различные дополнения для разработки. А еще довольно большое комьюнити, с которым можно пообщаться и получить бесценный опыт.

Плюсы Ren’Py:

  • Кроссплатформенный движок, который позволяет делать игры под любые устройства;
  • Удобен в использовании и наглядно показывает, что писать код во время разработки не так страшно, как кажется;
  • Лучшее решение для квестов и визуальных новел.

Минусы Ren’Py:

  • Есть ограничения в поддержке различных механик;
  • Ориентирован в первую очередь на 2D проекты, поэтому с 3D работать сложно;
  • Изначально был заточен под конкретные жанры, соответственно, какой-то шутер от первого лица или стратегию в реальном времени на нем сделать практически нереально.

Construct 2

8 доступных игровых движков, на которых можно сделать свою игру

Как создаются видеоигры от идеи до продажи

Разбор всех этапов разработки видеоигр начиная от цели будущего проекта и заканчивая старатом продаж.

Здесь очень легко сделать прототип игры, а затем навешивать на него интересный контент. При этом движок подходит исключительно для 2D игр, сделать на нем что-то в 3D крайне сложно и долго, проще воспользоваться тем же Unity или аналогами. Несмотря на это, сложные 2D игры вроде длинных jRPG на нем сделать реально, но придется брать бизнес-версию, которая обойдется в $4 в месяц или $60 в год. Это при условии, что движок будет использовать один человек. Есть и другие пакеты бизнес-версии, и там расценки отличаются.

Плюсы Construct 2:

  • Не нужно писать код, идеально подойдет новичку;
  • Множество инструментов для простой разработки 2D игр;
  • Интуитивно понятный интерфейс, легко разобраться с тем, как создавать игры.

Минусы Construct 2:

  • Неудобно использовать для 3D игр;
  • Чтобы сделать игру более проработанной, придется платить;
  • Редко появляются обновления движка с новыми возможностями. Как правило, просто шлифуется готовое.

libGDX

8 доступных игровых движков, на которых можно сделать свою игру

Простой в освоении кроссплатформенный движок, который написан на языке Java и отлично работает с OpenGL. Есть возможность публиковать готовую игру сразу на нескольких платформах. Сегодня активно используется для создания мобильных игр, но и десктопный проект на нем вполне реально реализовать.

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

Плюсы libGDX:

  • Позволяет делать кроссплатформенные проекты;
  • Предлагает удобную и понятную документацию;
  • Много инструментов, чтобы комфортно делать игры именно под смартфоны и планшеты.

Минусы libGDX:

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

Phaser

8 доступных игровых движков, на которых можно сделать свою игру

Сразу уточним, на этом движке сделаны не оригинальные Snake и Pacman, а их усовершенствованные копии. Когда создавались оригиналы, данного движка еще в помине не было. Суть Phaser в том, что он позволяет делать различные 2D проекты максимально удобным способом. Он поддерживает язык HTML, соответственно, разработка игры на нем чем-то напоминает создание сайта. При этом есть масса готовых инструментов, которые помогут быстро собрать простенький проект.

Именно Phaser сейчас используется, чтобы дать вторую жизнь старым играм наподобие Snake и Pacman. Умельцы по всему миру собирают на них игры своего детства или делают что-то похожее. У движка отличная документация и очень активное сообщество. Здесь вам всегда помогут с реализацией проекта, и это одна из причин, по которой движок берут для своей первой игры. Также на официальном сайте есть раздел с кучей готовых спрайтов, уровней, модулей с физикой к игре, аудиодорожками и всем остальным. Из наработок сообщества вполне реально собрать оригинальную и затягивающую игру.

Плюсы Phaser:

  • Очень прост в освоении и не требует глубоких знаний в программировании;
  • Идеально подходит для создания 2D игр, причем к этому подталкивают сами создатели движка;
  • Есть куча готовых инструментов, из которых можно собрать готовую игру.

Минусы Phaser:

  • Слишком сложно сделать что-то в 3D;
  • Мало ресурсов для того, чтобы реализовать крупный проект, придется обходиться простыми десктопными платформерами и браузерными играми;
  • Обновления движка выходят редко.

Unity

8 доступных игровых движков, на которых можно сделать свою игру

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

Программирование и киберкультура для школьников: Minecraft, Dota 2 и Unity

Учить детей играть в Minecraft и Dota 2 еще со школы? А почему нет? В какое прекрасное время мы живем.

Также стоит отметить встроенный магазин, в котором есть множество готовых ресурсов для создания игр. Например, Corgi Engine и Rex Engine, которые предлагают готовый набор для управления игрой и реализации физики. Что касается спрайтов и 3D моделей, то их тут десятки тысяч, есть платные и бесплатные. Сам же Unity распространяется в виде бесплатной версии, Unity Plus за $35 в месяц и Unity Pro за $125 в месяц.

Плюсы Unity:

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

Минусы Unity:

  • Проект имеет закрытый исходный код, если вы столкнетесь с каким-то багом, то придется ждать обновления Unity;
  • Редактор кода и отладчик часто работают плохо и отнимают кучу времени у создателя;
  • Не такой низкий порог вхождения, как в других движках. Чтобы сделать на нем игру, придется многое выучить.

CryEngine

8 доступных игровых движков, на которых можно сделать свою игру

Один из самых популярных движков среди разработчиков. Еще один вариант для тех, кто серьезно хочет заняться созданием игр. Здесь не получится просто перетаскивать готовые модели на экран и добавлять физику, но что-то простое вполне реально сделать даже без знания программирования.

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

Плюсы CryEngine:

  • Масса инструментов для работы с графикой;
  • Постоянное развитие, обновления с новыми возможностями выпускают очень часто;
  • Огромный магазин с инструментами для ваших будущих игр.

Минусы CryEngine:

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

Unreal Engine 4

8 доступных игровых движков, на которых можно сделать свою игру

Пожалуй, самый сложный движок для новичков из нашего списка, но он однозначно заслуживает внимания. Дело в том, что Unreal Engine 4 можно назвать финальным шагом для того, кто серьезно задумался над разработкой. Сразу можно попробовать движки, которые предлагают более простой язык сценариев и кучу вспомогательных инструментов, но если решили делать что-то крупное и качественное, то без UE 4 не обойтись.

Оказывается, Unreal Engine 4 может быть невероятно фотореалистичным, а не только мультяшным

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

Преимущество движка в том, что создатели выпустили несколько серий обучающих роликов. С их помощью даже при минимальных познаниях в программировании можно попробовать сделать свою игру. К тому же здесь простой интерфейс и удобная система программирования элементов, которая состоит из специальных блоков. UE 4 подойдет для создания игр любого жанра, причем как в 2D, так и в 3D. Он абсолютно бесплатный, но если ваш проект взлетит и заработает более $3000, то придется постоянно платить создателям движка роялти в размере 5%.

Плюсы UE 4:

  • Есть огромное количество инструментов, чтобы создавать любые игры;
  • Удобный интерфейс, в котором разберется даже новичок в игрострое;
  • Разработчики сделали отличную документацию и даже выпустили обучающие видеокурсы для пользователей.

Минусы UE 4:

  • Высокий порог вхождения, до UE 4 лучше попрактиковаться на более простых движках и начать изучать программирование;
  • Если проект выстрелит, то вам придется платить создателям движка пожизненно;
  • Не самые удобные инструменты для 2D проектов, и именно с ними здесь часто возникают проблемы во время разработки.

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

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

Как играть в Симс от первого лица

А вы знали, что вы можете увидеть мир в The Sims так, как его видят ваши симы? И так, как мы видим наш мир. Как играть в Симс от первого лица?

1 вариант

Итак, что нужно делать, чтобы увидеть мир The Sims своими глазами?

  1. Зайти в игру и начать играть нужной семьей/персонажем.
  2. Нажать на клавишу Shift.
  3. А затем резко нажать на Tab.
  4. Готово! Всё должно получиться.

2 вариант

  1. В режиме игры нажать на кнопку Shift и удерживать её.
  2. А затем нажать на кнопку Tab.
  3. Готово! Вы великолепны!

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


Как играть в Симс от первого лица

Как играть в Симс от первого лица
Как играть в Симс от первого лица

Подборка игр

В этой подборке для вас я собрала разноплановые игры на компьютер и телефон. В списке можно найти и сюжетные, и нелинейные, и хорроры, и атмосферные игры. Выбирайте, что понравится. Желаю приятной игры!

(Тык на картинку)



Теперь вы знаете, как играть в Симс от первого лица. Попробуйте этот метод, чтобы посмотреть на любимую игру новым взглядом. Этот способ точно работает на The Sims 4.

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

Читайте также: