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

Шрифт:

-
+

Закладка:

Сделать
1 ... 9 10 11 12 13 14 15 16 17 ... 70
Перейти на страницу:
class="p1">}

}

}

}

```

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

1. **Система врагов и объектов** – каждому врагу нужно выделить отдельное место в памяти и алгоритм для поведения, который бы не замедлял работу движка.

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

3. **Открытие дверей и передвижение объектов** – система триггеров, которая позволит игроку взаимодействовать с окружением.

Отложив блокнот, еще раз взглянул на экран и добавил ещё несколько строк кода для отрисовки простейшего интерфейса, чтобы сделать игру более наглядной:

```c

void RenderHUD() {

// Показать простую панель здоровья и боезапаса

char hudText[128];

sprintf(hudText, "Health: %d Ammo: %d", player.health, player.ammo);

DrawText(hudText, 10, screenHeight - 20, RGB(255, 255, 255));

}

```

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

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

```c

void MovePlayer(float deltaX, float deltaY) {

float newX = player.x + deltaX;

float newY = player.y + deltaY;

// Проверяем, не сталкивается ли игрок со стеной

if (map[(int)newY][(int)newX] != WALL) {

player.x = newX;

player.y = newY;

}

}

void RotatePlayer(float angle) {

player.angle += angle;

if (player.angle 0) player.angle += 2 * PI;

if (player.angle 2 * PI) player.angle -= 2 * PI;

}

```

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

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

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

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