Онлайн
библиотека книг
Книги онлайн » Научная фантастика » Товарищ МАСК - Константин Владимирович Ежов

Шрифт:

-
+

Закладка:

Сделать
1 ... 10 11 12 13 14 15 16 17 18 ... 70
Перейти на страницу:
бота и добавил несколько строк кода, чтобы создать эффект его движения:

```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);

// Проверка выхода за пределы карты

if (testX 0 || testX = mapWidth || testY 0 || testY = mapHeight) {

hitWall = true; // если за пределами — считаем, что есть "стена"

distanceToWall = maxDepth;

} else if (map[testY * mapWidth + testX] == '#') {

hitWall = true;

}

}

// Простое затемнение для глубины

int ceiling = (screenHeight / 2.0) - screenHeight / ((float)distanceToWall);

int floor = screenHeight - ceiling;

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

if (y ceiling) { setPixel(x, y, skyColor); }

else if (y ceiling y = floor) { setPixel(x, y, wallColor); }

else { setPixel(x, y, floorColor); }

}

}

return 0;

}

```

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

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

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

1 ... 10 11 12 13 14 15 16 17 18 ... 70
Перейти на страницу:

Еще книги автора «Константин Владимирович Ежов»: