Гаврилов Николай Игоревич
персональная веб-страница
gavrilov86@gmail.com

Стратегическая игра (Real-time strategy, RTS)

Скачать (1.84mb)

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

Сначала игра на двух игроков, искуственный "интеллект", препятствия, после чего забросил игру.

Потом, подбадриваемый на форумах, значительно ускорил производительность, особенно обхода препятствий, убрал баги, сделал до 8 игроков в игре, возможность сохранять/загружать игру. Пробовал различные игровые процессы: вводил постройку баз, сбор ресурсов, но в итоге вернулся к первоначальному варианту геймплея. Не сумев реализовать многопользовательскую игру, снова забросил.

И наконец, подготовившись морально, сделал приемлемый GUI (кнопки, формы и т.д.), улучшил графику, добавил звуки, даже музыку написать попытался, увеличил производительность (в основном за счёт уменьшения размера ячеек ускоряющей структуры, т.е. 2д сетки). Сделал туман войны, поигравшись с функцией смешивания, и реализовал сетевую игру. Пробовал играть через интернет-соединение, но приказы юнитам приходят с сильной задержкой. Да и вообще сетевую игру я не успел толком протестировать. Игровой процесс оригинальный, хотя обычно сводится к месеву, в котором ни о какой тактике думать не приходиться.

Наиболее сложные моменты реализации: синхронизация в сетевой игре, обход юнитами препятствий, объединение многоугольников и оптимизация взаимодействия юнитов, т.к. их может быть до 20000 штук в игре.

скриншот
скриншот
скриншот2
скриншот2
игровое меню
игровое меню


Описание игры


Основное

Жанр: RTS(стратегия реального времени)

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

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

Условие победы: захват всех баз на карте и уничтожение всех вражеских юнитов

Условие поражения: потеря всех своих баз и всех юнитов

Базы захватываются юнитами. В начале игры у каждого игрока есть по базе



Юниты

Они же солдатики, правда в игре они скорее похожи на микроорганизмы. Есть 6 различных типов юнитов. Ниже приведена таблица, характеризующая типы юнитов:


Свойства
Стреляет нет нет нет да да да
Скорость движения 5 3 14 5 3 11
Ближняя (Рукопашная) атака 20 45 15 6 6 6
Время перезарядки 35 100 12 80 100 40
Защита от ближней атаки 3 6 5 2 2 0
Защита от снаряда 14 15 18 10 2 0
Дальность обзора 5 5 5 8 7 12

Урон от попадания снаряда равен 24. От юнитов второго типа часто (87.5% вероятность) отскакивают вражеские снаряды, становясь при этом "своими" для игрока этого юнита. Такие юниты эффективны против стрелков. Юниты шестого типа могут убегать от противника, одновременно стреляя по нему.



Базы

Базы нужны для производства и лечения юнитов. Чтобы вылечить юнитов, нужно их выделить и нажать на иконку в виде щита в нижем левом углу экрана. Тогда юниты пойдут у ближайшей базе и будут её охранять, вылечиваясь заодно. Для производства юнитов нужно нажать кнопку "Производство" в верхнем левом углу. В этом случае через некоторое время все базы на карте (! и вражеские тоже) создадут юнитов. Причём вражеские бащы создадут в два раза больше, так что лучше дождаться, когда противник сам запустит производство. В игре 5 типов баз, и различие между ними в кол-ве и типе производимых юнитов:



Тип юнита
25 25 25 10 10
0 0 0 0 10
0 0 10 10 10
0 15 25 10 10
0 0 0 0 10
0 0 0 10 10


Управление

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

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

С помощью иконок в левом нижнем углу можно менять поведение выделенных юнитов.

Щит - юнит идёт к ближайшей базе своего игрока, когда он не занят.

Сабля - юнит нападает на всех врагов по пути, а не игнорирует их.

Якорь - юнит не двигается с места (но его всё же могут толкать).



Горячие клавиши

F1 - вкл/выкл ограничение на скорость игры
F2 - сохранить
F3 - загрузить
F4 - выход
F5 - вкл/выкл "туман войны"
1-6 - выделить всех юнитов определённого типа
0 - выделить всех юнитов
P - пауза
Q, A, Z - менять масштаб
i - показать/убрать инфу о кол-ве юнитов и процессе производства юнитов.
D - показать/убрать инфу о дипломатии и "силе" игроков.
F - Вкл/Выкл принятие перемирия от игроков.
S - настроить скорость игры
G - группировка юнитов
U - разгруппировка юнитов
Del - удалить выделенных юнитов



Группировка юнитов

Группа юнитов атакует сообща и дальность обзора группы чуть больше, чем у юнита в отдельности, однако обзор происходит из центра группы, так что если группа слишком рассеяна на поле - она уязвима, т.к. некоторые юниты не будут видеть противника рядом даже с собой. Если группа рассеялась в сражении - её лучше разгруппировать. Особенно актуально для стрелков.

G - группировать выделенных юнитов ( группируются юниты только одинакового типа, причём в кол-во юнитов должно быть в от 50 до 160). Если не выделено ни одного юнита, то происходит группировка всех юнитов, причём возможный несгруппированный остаток добавляется в наименьшие по численности группы.

U - разгруппировать выделенных юнитов



Сетевая игра

Для сетевой игры необходим сервер (net.exe - консольное приложение, находится в архиве с игрой). Нужно его запустить, ввести число игроков-людей, которые будут играть друг с другом. При запуске создаётся файл ServerIP.txt - там должен находиться IP адрес компа, на котором запущен сервер, но, похоже, IP адрес придётся всё же самому ввести. Этот файл должен быть у каждого игрока в папке с игрой, чтобы игра нашла сервер, т.е. содержимое файла - одно и то же для каждого игрока.

Итак, после того, как сервер вывел строку "Listerning for connections...", можно продолжать: каждому игроку нужно запустить игру (SGame.exe) и в игровом меню выбрать " Новая игра"->"По сети". Сделав это, игроки подключаются к серверу (по адресу, который записан в файле ServerIP.txt).

При удачном соединении игра начинает ждать соединения остальных игроков. Первый подсоединившийся игрок задаёт параметры игры (в параметрах число игроков - это люди+компы). Когда все игроки присоединились и первый игрок задал параметры, игра начинается.

В случае рассинхронизации игры сервер выводит что то вроде Diff0Player1, однако случаев не было пока.

После выхода из игры всех игроков сервер выводит статистику по траффику (протокол - TCP, так что на самом деле трафик по-больше). Траффик экономится раз в 40, если командовать группами, а не кучей несгруппированых юнитов.



Системные требования и производительность игры

Игра идёт только под Windows, т.к. написана под WinAPI. Чётких требований к памяти я не знаю, но игра требовательна к производительности процессора, хотя на современных многоядерных архитектурах должна летать. На слабых машинах или на машинах без аппаратной поддержки OpenGL тормоза вполне возможны. Обработка взаимодействия юнитов может отнимать много времени отнимать, если юниты слишком кучкуются.

И ещё о производительности: в верхнем левом углу цифры. Верхняя показывает кол-во игровых тактов в секунду, а вторая - период обмена пакетами с сервером при сетевой игре, т.е. чем меньше это число - тем быстрей отдаются приказы. Число кадров в секунду (fps) ограничено и не превышает 30.

e-mail:gavrilov86@gmail.com
© 2009-2024 Гаврилов Николай