Делаем двухмерные игры самостоятельно — на движке Torque

 | 13.35

Мой Компьютер, №02 (506), 26.05.2008

Torque — это целая ветвь, которая состоит из нескольких программных продуктов для разработки мультимедиа, в особенности игр. Основной сайт разработчиков — www.garagegames.com, взглянув на него один раз, вы не сможете оторваться от своего интернет-браузера :-). Здесь можно найти много полезной информации как для начинающих игростроителей, так и для профессионалов в этой сфере, в том числе и множество разнообразных алгоритмов, решений и примеров, которые безусловно необходимы для изучения, независимо от графической библиотеки, которую вы используете. Там же можно познакомиться с друзьями Torque2D — трехмерным вариантом, физическим движком, всевозможными библиотеками и, естественно, форумом — одним из наиболее посещаемых людьми, приобщенными к этому ремеслу.

Дистрибутив — где достать, как установить, с чего начать

Вышеупомянутый ресурс — основной источник, так сказать, исходная позиция для тех, кто хочет делать игры, основываясь на Torque. Будьте уверены — если не пожалеете немного усилий и начнете делать игры на этом движке, у вас появится желание купить его хотя бы для развлечения, не говоря уже о том, что сделанные вами игры могут с лихвой покрыть ту пару зеленых тугриков, что вы потратили на него. В любом случае есть демонстрационные материалы, которые с головой увлекут вас в эту технологию…

Допустим, мы достали дистрибутив. С чего же начать? Самый первый и наиболее важный вопрос, которым задается любой человек, начиная что-то изучать. Всегда тяжело «поднимать» программу самому, копаться в куче файлов и справочных материалах… Не волнуйтесь, вы получите ответ достаточно быстро.

Начнем с теории — если посмотреть на движок со стороны, все просто: есть С++-часть и скриптовая. Это значит, что можно писать только на TorqueScript, а можно и только на С++ — выбирать вам! Конечно, может настать такой момент, когда ну просто необходимо реализовать какую-то «сишную» функцию, дополнительную возможность и т.п., но игру можно всецело написать и на скриптах — для этого данная возможность и реализована. Теперь получается вообще просто — мы можем начать с чистого .cs-файла (обычный текстовый файл, расширение родное для движка).

Итак, куда же писать наш код и как его выполнить? Разработчики постарались и создали некий базис, мини-движок — это значит, что графический режим задан, окно появится, осталось только расписать логику игры, что мы сейчас и попробуем сделать. Поэтому переходим понемногу к практике и открываем файл …SDKexampleT2Dclentclient.cs (можно с помощью блокнота, но лучше использовать такой текстовый редактор, как UltraEdit, который при наличии соответствующего плагина предусматривает подсветку синтаксиса, что делает написание кода более комфортным). Основываться будем на версии 1.0.2 движка, впрочем, для кодера разница несущественная, поэтому не стоит беспокоиться, если у вас более новая :-). Открыли? Что же тут понаписывали…

Должно быть три основных функции: initialiseClient, destroyClient и setupT2DScene. Первая, собственно, и загружает все необходимое, то есть подключает ресурсы (картинки, игровые диалоги), инициализирует графический режим; вторая — соответственно, уничтожает это все (в данном случае это произойдет при выходе из игры, но может пригодиться и для очистки сцены); последняя создает игровую камеру (как бы окно, через которое мы будем видеть результаты нашего творения).

Давайте запустим в конце концов исполняемый файл и посмотрим, что там уже приготовлено для нас. Для этого поднимаемся на два каталога выше и запускаем T2D.exe. По-хорошему должно появиться такое окно, как на рис. 1.

Теперь вернемся к нашим… скриптам :-), то есть к ранее открытому текстовому файлу. Эх, многовато тут всякой всячины, начать бы с чистого листа… Не проблема — создаем в том же каталоге, где этот скрипт, свой файл, допустим, это будет startup.cs. Для начала его нужно подключить к нашей игре, чтобы она знала, что там будет наш код, который нужно будет учитывать при выполнении. В файле client.cs находим строчки:

// Setup Scene.

setupT2DScene();

и сразу после них (перед закрывающей скобкой) пишем:

exec(«./startup.cs»);

Команда exec подобна известным командам include, source — т.е. она подключает другой файл-скрипт к текущему, как бы связывает его. Это используется затем, чтобы не нагромождать много функций в одном файле и в понятной форме хранить отдельные логические блоки игры. Точка и черточка указывает, что искать наш новый скрипт-файл не нужно — он в том же каталоге, где и client.cs.

Теперь возвращаемся к нашему срипту. Нет, давайте обойдемся без «Hello, MK!» — это слишком банально, для этого достаточно одной строчки:

echo(«Hello, MK!»);

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

Мы сделаем что-то поинтереснее. Например, загрузим картинку и зададим ей управление с помощью клавиш-указателей на клавиатуре.

Результат выполнения должен соответствовать тому, что изображено на рис. 2 — космический корабль, управляемый клавиатурой. Неплохо для начала, да?

В файл startup.cs вносим следующее:

datablock fxImageMapDatablock2D(MyObject_datablock)

{

 mode = full;

 textureName = «~/client/images/ship.png»;

};

Здесь мы как бы создали экземпляр — именованный объект (MyObject_datablock), который загрузит картинку ship.png.webp (она уже есть в каталоге). Если понадобится, например, десяток или сотня одинаковых игровых объектов, они не займут много видеопамяти, потому как все будут ссылаться на этот датаблок.

Теперь нам нужно написать несколько логически связанных функций: «создать игровой объект», «двигать», «остановить» — вызывая их, мы будем строить нашу игру.

function CreateMyObject()

{

 %MyObject = new fxStaticSprite2D() { scenegraph = t2dSceneGraph; };

 %MyObject.setLayer( 0 );

 %MyObject.setPosition(«-40 0»);

 %MyObject.setSize( «28 14» );

 %MyObject.setImageMap( MyObject_datablock );

 %MyObject.setName(«MyObject1»);

}

В этой части кода мы создали статический спрайт, переменная %MyObject будет внутри функции (локальная, поскольку перед названием знак процента, если знак доллара — глобальная) хранить параметры нашего игрового объекта. В зависимости от того, где он будет прорисовываться, указывается его scenegraph — место, где он будет виден. Далее мы задали слой — как и в графических пакетах, эта фишка используются для корректного отображения объектов (чтобы правильно перекрывали друг друга, если их будет больше одного). Позиция и размер задаются с помощью простых функций setPosition и setSize. А вот следующая строчка и указывает программе, какую картинку для объекта использовать, а именно — ранее созданный датаблок, который уже хранит картинку. Как упоминалось ранее, переменная, хранящая объект, локальная, то есть она удалится при выходе из функции, поэтому объекту мы присваиваем имя, по которому он будет идентифицироваться — чтобы нам было к кому обращаться в дальнейшем :-).

Чтобы объект (в нашем случае, исходя из изображения — космический корабль) двигался, программе нужно указать, к каким клавишам какие привязать действия:

GlobalActionMap.bindCmd(keyboard, «left», «MoveObject(0);», «StopMovingObject();»);

GlobalActionMap.bindCmd(keyboard, «right», «MoveObject(1);», «StopMovingObject();»);

GlobalActionMap.bindCmd(keyboard, «up», «MoveObject(2);», «StopMovingObject();»);

GlobalActionMap.bindCmd(keyboard, «down», «MoveObject(3);», «StopMovingObject();»);

Грубо говоря, мы «забили» клавиши-курсоры под конкретные функции. Первый параметр указывает, что используется клавиатура, второй содержит условное имя клавиши (обычно то же, что написано на клавише), третий — функция, которая вызывается, когда пользователь нажимает на заданную клавишу, и последний — функция, которая вызовется при отпускании этой же клавиши.

Как видите, в первом случае в качестве параметра функции мы используем некий идентификационный номер, по которому мы потом определим, какую клавишу нажали; функции остановки объекта даны без параметров, так как они ей не нужны — мы и так знаем, что объект у нас один и останавливать нужно именно его.

Вот и необходимая функция:

function MoveObject(%where)

{

 if (%where == 0)

 {

    MyObject1.setLinearVelocity(«-20 0»);

    MyObject1.setRotation(180);

 }

 else if (%where == 1)

 {

    MyObject1.setLinearVelocity(«20 0»);

    MyObject1.setRotation(0);

 } 

 else if (%where == 2)

 {

    MyObject1.setLinearVelocity(«0 -20»);

    MyObject1.setRotation(-90);

 } 

 else if (%where == 3)

 {

    MyObject1.setLinearVelocity(«0 20»);

    MyObject1.setRotation(90);

 } 

}

По параметрам мы определяем, куда двигаться. Функция setLinearVelocity имеет два параметра — скорость движения объекта по координатам X и Y. setRotation — чтобы поворачивать объект в зависимости от направления движения.

Для остановки:

function StopMovingObject()

{

 MyObject1.setLinearVelocity(«0 0»);

}

Тем самым мы просто укажем, что скорость по всем координатам — 0, что и приведет корабль к остановке.

Мы ничего не забыли? Ах да, если идентификаторы клавиш вызывались не в функции, а прямо в коде, то вызов произойдет сразу при запуске EXE-файла. И что же такого случится? Ничего. А все потому, что мы не создали объект, которым будем управлять. Для этого просто допишем после всего:

CreateMyObject();

Ну как, у вас получилось?

Итоги

О минусах движка говорить трудно, ведь чем дальше углубляешься во всю эту механику, тем больше убеждаешься в том, что вещь сделана с умом. Например, на сцене может быть очень много объектов, но игра тормозить не будет, если объекты находятся «за кадром».

Пожалуй, единственный недостаток (и то не уверен) — при каждом запуске для всех выполняемых скриптов создаются .dso-файлы, и если произойдет серьезная ошибка при компилировании, то запустится предыдущая версия скриптов, а в лог-файл внесется запись об ошибке. Но со временем досада понемногу исчезает, ведь наиболее распространенная ошибка новичка — «забыл поставить точку с запятой после вызова функции…» 🙂

Если возникнут вопросы или что-то не получается, вас всегда выслушают и по возможности помогут на g[email protected] :-).

Для подогрева вашего энтузиазма предлагаю взглянуть на творения фирмы TikGames (www.tikgames.com) — игры Flower Stand Tycoon и Flower Shop.

Robo User
Web-droid editor

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *