Читаем Товарищ МАСК полностью

Теперь управление было достаточно простым: стрелки на клавиатуре двигали игрока вперед-назад, а боковые — разворачивали его, позволяя смотреть в разные стороны. Оставалось протестировать, и, предвкушая результат, запустил программу. Эх! На экране игра ожила. Простенький интерфейс отражал каждое движение и разворот, стена мелькала перед глазами, становясь то ближе, то дальше. кликнул стрелкой вправо, и перспектива мгновенно изменилась. Серые стены с разной глубиной то появлялись, то исчезали из виду, и казалось, что он действительно идёт по простым, но реалистичным коридорам. Правда, с цветом был проблема, поскольку всё приходилось додумывать. Монохромный дисплей к красоте не располагал. Ну ничего, запущу на нормальной машине, тогда и посмотрим, как совпадут ожидания и реальность.

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


```c

char wallTexture[2] = { '#', '@' };

char floorTexture = '.';

char ceilingTexture = ' ';

```


И добавил соответствующую логику в код отрисовки, чтобы менять символы текстур в зависимости от расстояния:


```c

void DrawColumn(int x, float distanceToWall) {

int ceiling = (screenHeight / 2) - (screenHeight / distanceToWall);

int floor = screenHeight - ceiling;


for (int y = 0; y screenHeight; y++) {

if (y ceiling) {

SetPixelColor(x, y, ceilingTexture);

} else if (y floor) {

SetPixelColor(x, y, floorTexture);

} else {

char texture = distanceToWall 5 ? wallTexture[0] : wallTexture[1];

SetPixelColor(x, y, texture);

}

}

}

```


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


```c

void UpdateNPC() {

float dx = player.x - npc.x;

float dy = player.y - npc.y;

float distance = sqrt(dx * dx + dy * dy);


if (distance detectionRange) {

npc.x += dx / distance * npcSpeed;

npc.y += dy / distance * npcSpeed;

}

}

```


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

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

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


Я понимал: на настоящие 3D-ускорители здесь надеяться не приходится, потому главный вызов был в том, чтобы создать иллюзию трёхмерного пространства с тем, что имелось – в сущности, с теми же вычислительными мощностями, что и в середине восьмидесятых. Запустил компилятор, снова вернулся к коду. Словно бы мелькнуло нечто – магия простых вычислений, которые, при правильном использовании, творят чудеса.


```c

// Код для базовой структуры трассировки лучей

int rayCasting(float playerX, float playerY, float playerAngle) {

for (int x = 0; x screenWidth; x++) {

// Преобразуем угол для каждого пикселя на экране

float rayAngle = (playerAngle - fov / 2.0) + (x / (float)screenWidth) * fov;

float distanceToWall = 0;


// Проверяем пересечение с стенами

float eyeX = cos(rayAngle); // единичный вектор по оси X

float eyeY = sin(rayAngle); // единичный вектор по оси Y


while (!hitWall distanceToWall maxDepth) {

distanceToWall += stepSize;

int testX = (int)(playerX + eyeX * distanceToWall);

int testY = (int)(playerY + eyeY * distanceToWall);


Перейти на страницу:

Похожие книги

Неправильный лекарь. Том 1
Неправильный лекарь. Том 1

Заснул в ординаторской, проснулся в другом теле и другом мире. Да ещё с проникающим ножевым в грудную полость. Вляпался по самый небалуй. Но, стоило осмотреться, а не так уж тут и плохо! Всем правит магия и возможно невозможное. Только для этого надо заново пробудить и расшевелить свой дар. Ого! Да у меня тут сюрприз! Ну что, братцы, заживём на славу! А вон тех уродов на другом берегу Фонтанки это не касается, я им обязательно устрою проблемы, от которых они не отдышатся. Ибо не хрен порядочных людей из себя выводить.Да, теперь я не хирург в нашем, а лекарь в другом, наполненным магией во всех её видах и оттенках мире. Да ещё фамилия какая досталась примечательная, Склифосовский. В этом мире пока о ней знают немногие, но я сделаю так, чтобы она гремела на всю Российскую империю! Поставят памятники и сочинят баллады, славящие мой род в веках!Смелые фантазии, не правда ли? Дело за малым, шаг за шагом превратить их в реальность. И я это сделаю!

Сергей Измайлов

Самиздат, сетевая литература / Городское фэнтези / Попаданцы