Выбрать книгу по жанру
Фантастика и фэнтези
- Боевая фантастика
- Героическая фантастика
- Городское фэнтези
- Готический роман
- Детективная фантастика
- Ироническая фантастика
- Ироническое фэнтези
- Историческое фэнтези
- Киберпанк
- Космическая фантастика
- Космоопера
- ЛитРПГ
- Мистика
- Научная фантастика
- Ненаучная фантастика
- Попаданцы
- Постапокалипсис
- Сказочная фантастика
- Социально-философская фантастика
- Стимпанк
- Технофэнтези
- Ужасы и мистика
- Фантастика: прочее
- Фэнтези
- Эпическая фантастика
- Юмористическая фантастика
- Юмористическое фэнтези
- Альтернативная история
Детективы и триллеры
- Боевики
- Дамский детективный роман
- Иронические детективы
- Исторические детективы
- Классические детективы
- Криминальные детективы
- Крутой детектив
- Маньяки
- Медицинский триллер
- Политические детективы
- Полицейские детективы
- Прочие Детективы
- Триллеры
- Шпионские детективы
Проза
- Афоризмы
- Военная проза
- Историческая проза
- Классическая проза
- Контркультура
- Магический реализм
- Новелла
- Повесть
- Проза прочее
- Рассказ
- Роман
- Русская классическая проза
- Семейный роман/Семейная сага
- Сентиментальная проза
- Советская классическая проза
- Современная проза
- Эпистолярная проза
- Эссе, очерк, этюд, набросок
- Феерия
Любовные романы
- Исторические любовные романы
- Короткие любовные романы
- Любовно-фантастические романы
- Остросюжетные любовные романы
- Порно
- Прочие любовные романы
- Слеш
- Современные любовные романы
- Эротика
- Фемслеш
Приключения
- Вестерны
- Исторические приключения
- Морские приключения
- Приключения про индейцев
- Природа и животные
- Прочие приключения
- Путешествия и география
Детские
- Детская образовательная литература
- Детская проза
- Детская фантастика
- Детские остросюжетные
- Детские приключения
- Детские стихи
- Детский фольклор
- Книга-игра
- Прочая детская литература
- Сказки
Поэзия и драматургия
- Басни
- Верлибры
- Визуальная поэзия
- В стихах
- Драматургия
- Лирика
- Палиндромы
- Песенная поэзия
- Поэзия
- Экспериментальная поэзия
- Эпическая поэзия
Старинная литература
- Античная литература
- Древневосточная литература
- Древнерусская литература
- Европейская старинная литература
- Мифы. Легенды. Эпос
- Прочая старинная литература
Научно-образовательная
- Альтернативная медицина
- Астрономия и космос
- Биология
- Биофизика
- Биохимия
- Ботаника
- Ветеринария
- Военная история
- Геология и география
- Государство и право
- Детская психология
- Зоология
- Иностранные языки
- История
- Культурология
- Литературоведение
- Математика
- Медицина
- Обществознание
- Органическая химия
- Педагогика
- Политика
- Прочая научная литература
- Психология
- Психотерапия и консультирование
- Религиоведение
- Рефераты
- Секс и семейная психология
- Технические науки
- Учебники
- Физика
- Физическая химия
- Философия
- Химия
- Шпаргалки
- Экология
- Юриспруденция
- Языкознание
- Аналитическая химия
Компьютеры и интернет
- Базы данных
- Интернет
- Компьютерное «железо»
- ОС и сети
- Программирование
- Программное обеспечение
- Прочая компьютерная литература
Справочная литература
Документальная литература
- Биографии и мемуары
- Военная документалистика
- Искусство и Дизайн
- Критика
- Научпоп
- Прочая документальная литература
- Публицистика
Религия и духовность
- Астрология
- Индуизм
- Православие
- Протестантизм
- Прочая религиозная литература
- Религия
- Самосовершенствование
- Христианство
- Эзотерика
- Язычество
- Хиромантия
Юмор
Дом и семья
- Домашние животные
- Здоровье и красота
- Кулинария
- Прочее домоводство
- Развлечения
- Сад и огород
- Сделай сам
- Спорт
- Хобби и ремесла
- Эротика и секс
Деловая литература
- Банковское дело
- Внешнеэкономическая деятельность
- Деловая литература
- Делопроизводство
- Корпоративная культура
- Личные финансы
- Малый бизнес
- Маркетинг, PR, реклама
- О бизнесе популярно
- Поиск работы, карьера
- Торговля
- Управление, подбор персонала
- Ценные бумаги, инвестиции
- Экономика
Жанр не определен
Техника
Прочее
Драматургия
Фольклор
Военное дело
Товарищ маск (СИ) - Ежов Константин Владимирович - Страница 10
2. **Ширина и высота стен** зависели от расстояния до них, создавая эффект перспективы.
3. **Свет и тени** – расстояние к стенам также влияло бы на их яркость, что добавляло бы глубину сцене.
Набросав общий план, открыл новый файл и начал писать код для этого подхода:
```c
void RenderRaycasting() {
for (int x = 0; x screenWidth; x++) {
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-144', c: 4, b: 144})// Рассчитываем угол луча от игрока
float rayAngle = (player.angle - FOV / 2) + ((float)x / screenWidth) * FOV;
float distanceToWall = 0;
bool hitWall = false;
// Переменные для отслеживания попаданий луча
float eyeX = cos(rayAngle);
float eyeY = sin(rayAngle);
while (!hitWall distanceToWall renderDistance) {
distanceToWall += 0.1;
int testX = (int)(player.x + eyeX * distanceToWall);
int testY = (int)(player.y + eyeY * distanceToWall);
// Проверка столкновения луча с границей карты
if (testX 0 || testX = mapWidth || testY 0 || testY = mapHeight) {
hitWall = true;
distanceToWall = renderDistance; // Установка максимального расстояния
} else if (map[testY][testX] == WALL) {
hitWall = true;
}
}
// Расчёт высоты стены на экране
int ceiling = (screenHeight / 2) - (screenHeight / distanceToWall);
int floor = screenHeight - ceiling;
// Закрашивание столбца стены
for (int y = 0; y screenHeight; y++) {
if (y ceiling) {
DrawCeiling(x, y);
} else if (y floor) {
DrawFloor(x, y);
} else {
int shade = 255 - (distanceToWall * 20); // Чем дальше, тем темнее
SetPixelColor(x, y, RGB(shade, shade, shade));
}
}
}
}
```
Остановившись проглядел код, чувствуя тихое удовлетворение. Это был достаточно экономный подход для графики, не требовавшей оборудования доступного в будущем. Кстати об этом, после выпуска игры надо будет попробовать самому принять участие в будущей гонке ускорителей. Может всего и не съем, но чего-нибудь, да надкусаю! Правда, еще не тестировал, как движок поведет себя с большим количеством объектов, но и это уже был ощутимый прогресс. Запустив программу, наблюдать, как на экране проступили низкие серые стены, обрамленные «потолком» и «полом». Простая перспектива, создающая эффект коридора, была достигнута! Наложение света и тени добавляло глубины, делая картинку более выразительной. Почти то, что нужно! Да, наконец удовлетворённо вздохнул, слегка откинулся назад, снова сделал глоток уже остывающего чая и продолжил писать в блокнот идеи, которые планировал реализовать в будущем:
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 был прост: всего лишь точка на карте, которая медленно приближалась к игроку, если оказывалась в зоне видимости. Ввёл переменные для бота и добавил несколько строк кода, чтобы создать эффект его движения:
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-145', c: 4, b: 145})- Предыдущая
- 10/56
- Следующая
