Как сделать свою rts



  • Все про разработку игр, основанных на Spring, собранно в одном месте.
    Надо добавить, что это не единственный путь, а лишь один из возможных. Даже немного устаревший.
    Но все же, довольно простой, поэтому вам и предлагается попробовать.

    сделать Прежде, чем начать, сразу скажу: для прохождения данного урока, нужен компьютер с операционной системой Windows. Так как, надо будет установить специальную программу "UpSpring"(инструкция будет позже), и под linux сделать это проблематично. Если хотите разрабатывать под linux и mac, ждите другую, более продвинутую, статью.

    Полезные ссылки:
    Пустая игра - структура каталогов и файлы, которые необходимы для того, чтобы сделать простейшую игру. Содержит 1 куб
    Пустая игра + танк - структура каталогов + файлы, необходимые для простейшей игры, в которой есть один работающий танк
    Игра-пример - очень простая игра, включающая танк, завод, строитель, энергетическая башня

    Установка Spring

    Для начала, вам нужно убедиться, что установлен сам движок "Spring". Инструкцию по установке можно найти тут. Для наших целей лучше всего подойдет portable версия. Если вы не скачивали игры и карты, скачайте игру-пример и маленькую карту

    Скачанную игру надо положить в директорию games, а карту - в директорию maps (директории внутри директории, куда установили Spring).
    (Для Windows они в C:\Users\YOURUSERNAME\My Documents\My Games\Spring ; Для Linux, /.spring. Так же возможно придется создать директории вручную.) Если вы скачали "движок" через SpringLobby, то он лежит в C:\Users\YOURUSERNAME\My Documents\My Games\Spring\engine для Windows и home/revenant/.spring/engine для Linux соответственно
    После установки игры и карты, перезапустите springlobby и перейдите на вкладку "Single Player" или "одиночная игра", выберите эту игру(Example Mod) и карту, добавьте любого бота, например AAI, и запустите. Убедитесь, что все работает.

    Программы, которые понадобятся в этом руководстве:

    The GIMP - бесплатный графический редактор

    Wings 3D - бесплатный инструмент моделирования

    И любой текстовый редактор, желательно с подсветкой синтаксиса. Например: Notepad++

    Разработка 3д модели

    Существует множество более крутых руководств по Wings 3D, рекомендуется, пройти именно их. Но мы все же рассмотрим простой пример тут, чтобы данное руководство получилось действительно полным.

    Если вдруг вы хотите пропустить этот раздел, то вы можете взять полную модель без текстур, просто распаковав (zip архиватором)

    этот архив. Модель лежит внутри /objects3d

    Итак, запустите Wings 3D. Изначально, окно выглядит как-то так:

    Нажмите среднюю кнопку мыши и подвигайте. Экран должен вращаться. Кликните левой кнопкой, чтобы выйти из этого режима. Покрутите колесико мыши, чтобы приблизить или отдалить сцену. Во время режима вращения, нажмите и держите среднюю кнопку мыши + двигайте мышью, чтобы перемещать экран. А если нажмете правой кнопкой мыши на заднем фоне, то получите меню.

    Вызовите меню и нажмите на квадратик справа от пункта Cube (не на сам пункт). Вам предложат ввести размеры, введите 20x20x20 и нажмите OK. Вы получите достаточно большой куб, и вам нужно отдалить камеру, чтобы увидеть его полностью.

    Посмотрите на верхнюю панель, там вы найдете эти кнопки:

    Они нужны, чтобы выделять вершины, углы, ребра, плоскости и т.п. Поэкспериментируйте с ними и вы поймете, как они работают. Если нажать на какой-нибудь объект, то он выделяется. Но с выделенных до этого объектов, выделение не снимается. Чтобы убрать выделение с выделенного объекта, надо на него кликнуть мышью. Или нажать пробел, для снятия выделения со всех объектов.

    Для этих кнопок есть горячие клавиши: v, e, f, b. Лучше их выучить, они очень пригодятся!

    Как вы, наверно, заметили, куб наполовину уходит вниз, под землю. Чтобы его поднять, выделите весь куб и вызовите меню.

    Выберите пункт "Move", и в появившимся окне, выберите ось "Y". Подвигайте мышью влево и вправо. Чтобы располагать объекты более точно, нажмите клавишу Shift во время движения. Нажмите левой кнопкой мыши, чтобы поместить объект. Или правой, чтобы отменить перемещение

    Если держать Ctrl или Ctrl+Shift, то вы будете перемещать на десятые и сотые доли единиц.

    Нажмите клавишу f, чтобы перейти в режим "Face". Или кликните на соответствующую кнопку на верхней панели. Выделите только верхнюю плоскость. Далее, вызовите меню и выберите пункт "Scale Uniform". Уменьшите размер до 50% (Ctrl поможет быть точным). После этих действий, подвиньте эту верхнюю грань вниз на 10 единиц.

    Теперь добавим еще один куб - это будет пушка (ствол). На этот раз нам не надо никаких свойств, так что можно просто жать на сам пункт меню "Cube".
    О нет! А где как сделать свою rts же новый куб?? Без паники! Нажмите на "Window" (это пункт главного меню, сверху), и выберите там "Outliner". Таким же способом, откройте "Geometry Graph".

    Эти окна очень полезны, они отображают все объекты. Подвиньте эти окна и измените их размер, чтобы было удобно. Из окна "Geometry Graph", вы можете выбрать любой объект модели. Выберите верхний объект, кликнув на его серый куб.

    А теперь развыделите его, нажав пробел. И выделите другой (нижний). Затем вызовите меню, move... и двигайте вверх по оси Y.

    В итоге переместите этот куб на 12 единиц вверх, чтобы он как-бы висел над другим объектом.
    А теперь выберите плоскость, которая смотрит на вас (вперед юнита). Это ось Z. Эта ось подсвечивается синим. Нажмите правой кнопкой, выберите Move, и переместите так, чтобы "ствол" был достаточно длинным.

    Теперь создайте сферу 10 на 10 (x и y radial) и переместите ее на верх модели.

    Теперь добавим этому уродливому танку немного гусениц. Выберите выделение Edge (e клавиша) и выберите боковые ребра.

    Нажмите клавишу C. Новое ребро, соединяющее два выбранных, должно появиться. Теперь выберите нижнюю половинку (поверхность). Вызовите меню и выберите пункт "extrude". Выдвините на 2 пункта по оси X.

    То же самое сделайте и с другой стороны.
    А теперь, выдвигайте эти гусеницы вперед и назад, по оси Z.

    Вот и все! Модель нашего танка готова!
    Перед тем, как наносить текстуры, надо воспользоваться "edge" инструментом (e клавиша). Выберите все ребра кубов (из geometry graph окна), вызовите меню, и поставьте Hardness в значение Hard. Цвет ребер изменится на оранжевый.
    И, когда вы нажмете на эту кнопку

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

    Что ж, теперь у нас есть простой и неуклюжий танк, готовый к накладыванию текстур. Советую пройти как можно больше туториалов по моделированию, поиграть со всеми опциями и т.п. Время, потраченное на обучение, того стоит!

    UVMapping(развертка) и текстурирование 3д модели

    википедия (на русском)
    Эта секция основана на данном туториале.
    Окей, у нас есть серая и неуклюжая модель танка, и она нуждается в текстурировании.
    Чтобы это сделать, нам надо проделать операцию "UVMap"(развертку) над моделью. Что это значит? Нам надо взять поверхности нашей 3д модели и преобразовать их в 2д поверхность, которую мы сможем редактировать в редакторе изображений и потом обратно натянуть на 3д модель.

    В данный момент, у модели 3 части: основание, ствол пушки и башня. Если мы начнем делать uvmapping прямо сейчас, то у нас будет 3 файла с текстурами. Но движок Spring не может с ними работать в таком виде. Нам надо скомбинировать эти 3 части в 1 файл.

    Вернемся к Wings 3D. Нажмите клавишу b, чтобы выбрать инструмент body (тело). Выделите всё, вызовите меню и выберите Combine. Так, вы получите единый объект.

    Теперь, вызовите меню и выберите пункт More->"UV Mapping". Откроется новое окно. Как только вы отдалите камеру, вы получите следующую картинку:

    Чтобы развернуть модель, вам нужно разбить ее на фрагменты. Есть 3 основных способа сделать это:
    1) Вы можете выбрать грани, вызвать меню и выбрать пункт "Mark edges for cut". Модель будет нарезана вдоль этих граней. Это дает вам контроль над тем. какие грани должны идти вместе, а какие-отдельно.

    2) Вы можете выбрать плоскости(фрагменты), вызвать меню и пометить их разными цветами. Программа разделит их согласно цветам. Плоскости одинакового цвета будут расположены вместе. Это дает вам контроль над группировкой этих фрагментов.

    3) Вы можете вызвать меню и выбрать "Segment by" > "Projection". Программа сделает всю работу сама, предоставив вам набор цветных фрагментов. При этом вы теряете контроль над тем, что за чем идет, и иногда, этот способ дает вам очень странные результаты. Но этот способ настолько быстрый... что автор статьи пользуется им постоянно. Иногда приходится вручную немного поправить цвета после этой операции.
    Сделайте так, как написано в 3 пункте. Пусть, на этот раз, все произойдет автоматически.
    Как только все грани и плоскости помечены, вызовите меню и выберите "Continue, Unfolding". Программа выдаст вам что-то вроде этого:

    В этот момент лучше поменять размеры этих окошек внутри Wings 3D, потянув за нижний правый край. У вас должна быть возможность видеть и модель и текстуру.
    Программа дала стандартные текстуры, подписанные буквами и цифрами. Это показывает, насколько детализированной будет модель. Чем меньше буквы и цифры - тем меньше детали.

    Вы можете видеть, что есть куча повторяющихся форм. Например, одна трапеция для левой гисиницы танка, и одна - для правой. Мы можем использовать одну и ту же текстуру для обоих. Так что, давайте передвинем одну в другую (наложим их друг на друга).

    Самый простой способ это сделать: выделите обе трапеции, вызовите меню, выберите пункт "Move To" и потом "Center". Потом вы можете снова вызвать меню, выбрать "Move", и переместить куда захотите.
    Сделайте то же самое для всех дублирующихся фрагментов.

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

    Теперь посмотрите на ствол пушки. Некоторые стороны имеют буквы, эти буквы расположены в алфавитном порядке. Обратите внимание, в какую сторону они направлены. На одной стороне они могут быть направлены к башне, а на другой, например, от башни.

    Законченная модель будет выглядеть лучше, если все они будут направлены в одном направлении. В окне с 3Д моделью, выберите те плоскости, что направлены в "неправильную" сторону, затем переверните их в окне текстур.
    Теперь посмотрите на окно текстур. Там есть свободное место. Мы можем использовать его. Увеличьте некоторые фигуры. Это даст вам возможность использовать более качественные, более детализованные текстуры.

    Осторожно, если у вас есть несколько фигур, которые наложены друг на друга, то кликнув по ним, вы выделите лишь верхнюю. Чтобы выделить обе, нажмите левую кнопку мыши и потяните. Будут выделены объекты на всех слоях, что попадут в выделение.

    Например, мы можем сделать самыми большими, текстуры тела танка. Потому, что они - самые главные. Было бы логично сделать их более детализованными. А текстуры, которые вряд ли кто-то увидит, можно сделать поменьше. Не забудьте сделать небольшие промежутки между фигурами, чтобы текстуры не перемешались.

    Ну что ж, теперь развертка нашей модели завершена. Вы можете создать текстуры для нее. Вызовите меню и выберите пункт "Create Texture".

    Сначала нажмите на кнопку "Delete Unused Pass", чтобы убрать лишнее (буквы всякие). Теперь посмотрите на два выпадающих списка "background" и "draw edges", и на кнопки рядом с ними. Убедитесь, что для заднего фона стоит прозрачность (A, alpla) в значение 1.0, а не 0.0. Надо нажать на сам прямоугольник цвета и перетащить ползунок внизу. Так же, здесь есть настройки размера текстур. Чем чаще люди будут видеть этот юнит в игре, тем меньше должны быть текстуры. Например, 256x256 - это хороший размер для обычных юнитов. А для каких-нибудь "end-of-game" юнитов апокалипсиса, доступных в конце игры, можно сделать текстуры 1024x1024.
    Нажмите OK, и вы должны получить что-то вроде этого:

    Теперь, закройте "2d uv-editor" окно и посмотрите на окно "Outliner". Вы должны увидеть черно-белую квадратную текстуру. Нажмите на нее правой кнопкой мыши и выберите пункт меню "Make external". Сохраните где-нибудь этот файл, выбрав расширение.tgs в выпадающем списке.

    Окей, вы можете свернуть программу Wings 3D и открыть ваш сохраненный.tga файл в графическом редакторе The GIMP. Закрывать Wings 3D не стоит, так как он нам еще понадобится.
    GIMP очень легок в использовании, и я не буду вдаваться в детали в этой статье. Начните с заливки форм цветом и нарисуйте что-нибудь инструментом "карандаш". У Вас должно получиться что-то вроде этого:

    ... или даже лучше и интереснее! Я не стал тратить на это много времени и покрыл все простой заливкой цветом + сделал немного камуфляжа. Вам так же нужно закрасить и черные полоски! Иначе, у вашей модели будут потом белые полоски.

    Сохраните изображение и снова вернитесь в программу Wings 3D. Вы увидите, что старая текстура все еще используется.

    Чтобы использовалась новая, просто нажмите на нее правой кнопкой мыши и выберите "Refresh"(обновить) в меню.

    Теперь все это выглядит более текстурно :-) Вы можете перемещаться туда-сюда между GIMP и Wings 3D, чтобы достичь оптимального результата.

    Теперь, когда модель текстурирована, нам надо разъединить те части, что мы соединяли до этого. Если мы оставим все как есть, то пушка не сможет поворачиваться не зависимо от тела, чтобы стрелять. Воспользуйтесь "body" инструментом (клавиша b), выделите весь танк, вызовите меню и выберите пункт "Separate"(разъединить).

    Все будет разобрано на составные части с какими-нибудь простыми именами типа "cube2_sep7". Желательно переименовать их во что-нибудь более понятное. Сделать это можно в окне "Geometry Graph": правой кнопкой мыши -> "Rename"(переименовать). Я бы дал имена "body"(тело), "turret"(башня), "gun"(ствол).

    Вот и все! Модель готова! Да, она выглядит квадратной и простой, позже вы сможете делать более продвинутые модели!
    Готовую и оттекстурированную модель вы можете найти в архиве с игрой-примером (Example Mod).

    Пока еще не закрывайте GIMP, нам он еще понадобится в следующей части данного руководства.

    Подготовка модели для использования ее движком Spring

    Эта часть статьи основана на данном руководстве.

    Итак, у нас есть полностью текстурированая модель. Но нам же еще нужно как-то наложить цвет команды на юнит! Цвет текущего игрока, владельца юнита. Для этого, переключимся снова в GIMP.

    В движке Spring для цвета команды используется Alpha канал (прозрачность). Большинство программ используют альфа канал для прозрачности, поэтому ваше изображение будет выглядеть немного странно в редакторах. Но зато это будет выглядеть отлично в игре. В альфа канале, белый - цвет команды, черный - это нет цвета команды, а средний - это что-то промежуточное. Если Вам все еще не понятно, то продолжайте читать дальше. Станет понятнее, когда мы закончим это делать.

    Spring так же позволяет накладывать "вторичные" текстуры. В которых, красный цвет используется для свечения, зеленый для отражения, альфа для прозрачности. Мы не будем рассматривать их здесь, просто полезно об этом знать.

    В GIMP, если у вас получилось несколько слоев, схлопните их в один. Затем нажмите правой кнопкой на слое и выберите "Add Alpha Channel"(добавить альфа канал), если этот пункт доступен. Если недоступен, то у вас, возможно, уже есть альфа канал.

    Нажмите "Colors > Components > Decompose". Вы увидите диалоговое окно, выберите там "RGBA".

    После нажатия на ОК, вам будет показано другое, серое, окно. Так же, в окне "слои" появились 4 слоя: красный, зеленый, синий и альфа каналы. Вы можете заметить, что альфа канал - совершенно белый. Нам это не нужно тк сейчас весь наш юнит будет окрашен в цвет команды. Вместо этого, мы бы хотели видеть наши серый и камуфляжный цвета.

    Скопируйте один из слоев в альфа слой, чтобы вы могли видеть, что где находится. Затем, сделайте абсолютно все черным, кроме нашей текстуры башни. Башню сделайте белой. Или переместите слой наверх и сделайте его полупрозрачным на время, чтобы видеть, что под ним.

    Затем, выберите в меню "Colors > Components > Recompose". И переключитесь на окно с первоначальным изображением. Вы увидите, что всё исчезло, кроме башни, которую мы пометили белым. Не паникуйте, оно все еще здесь, просто прозрачное. Сохраните.tga файл.

    Альтернативно, можно сохранить в формат DDS. Он лучше подходит для моделирования. Но для этого нужен GIMP DDS плагин. Поэтому, пока что останемся на формате.tga.

    Теперь можно закрыть GIMP.

    Далее, нам нужно перенести нашу модель из программы Wings 3D в программу UpSpring. Переключитесь в Wings 3d, выберите в меню пункт "File -> Export" и нажмите на квадратик рядом с "3D Studio (3ds)". Вам будет предложено несколько опций.

    Уберите галку с "Swap X and Y axes", обе галки "Export normals" и "UV coords" должны быть включены. Тип текстур по умолчанию(нижний выпадающий список) должен быть выставлен в tga. Нажмите OK и сохраните куда-нибудь, где вы сможете потом это найти.

    Теперь, вам нужно открыть программу UpSpring. Установите ее отсюда.

    Запустите UpSpring, она выглядит примерно так:

    Выберите в меню "File -> Load model", и укажите путь до вашего файла с расширением 3ds. В окне открытия файла, в выпадающем списке, выберите 3ds, иначе вашего файла будет не видно.

    После этого, появится окно, в котором спрашивается: мы нашли несколько объектов в файле, что с ними делать? Надо выбрать пункт 2 "load all objects..."(загрузить все объекты как дочерние к пустому корневому объекту)

    Вот и ваша модель. Выглядит маленькой и без текстур. Справа выберите "Objects" вкладку.

    Вы можете видеть иерархию кусочков модели. Эта иерархия определяет: какие куски движутся, когда двигают другие куски. Например, мы хотим, чтобы ствол двигался, когда мы двигаем башню. И мы хотим, чтобы ствол и башня двигались, когда мы двигаем тело. Для этих целей воспользуемся кнопками "cut and paste"(вырезать и вставить), чтобы перераспределить объекты вот так:

    Далее, нам нужно определить точку сцепления для каждого куска, чтобы определить, как они будут вращаться относительно друг друга. Приблизьте камеру "Zoom in", чтобы вы могли лучше видеть, что происходит. Нажмите правой кнопкой мыши и поводите.
    Затем, выберите инструмент (на панели слева) "Select origin move tool" и выберите башню(не ствол) в иерархии объектов.

    Поля "X pos, Y pos и Z pos" - позиция точки сцепления. По умолчанию, все установлено в (0, 0, 0). Потяните за точку мышью так, чтобы она оказалась в центре шара, где прикрепляется пушка. Координаты при этом меняются сами. У меня, к примеру, получились (0, 12, 0).

    Если посмотреть на ствол, то его точка так же находится теперь в этом месте. Это благодаря иерархии.

    На самом деле, нам понадобится еще 1 кусок модели, чтобы указать конец дула, откуда будут вылетать пули. Для этого, выделите ствол и нажмите "Add empty"(добавить пустой) и надавите этот кусок "flare". Поместите его туда, где заканчивается дуло.

    Теперь перейдите на вкладку "Model". Здесь находятся настройки для радиуса модели и ее центра. Так же здесь задается высота модели(определяет, где будет в игре отображаться полоска жизней юнита) и сфера попадания(когда считается, что пуля попала в танк). Здесь есть кнопка "Estimate"(вычислить автоматически), но иногда, после неё, требуется ручная коррекция.

    Чтобы увидеть, что делают эти настройки, нажмите на кнопку "3D" вверху нижней правой части экрана и выберите "Draw model radius and height"(рисовать радиус и высоту).

    Теперь, юниту нужна текстура. Перейдите на вкладку "Mapping", нажмите "Browse" для "texture 1" и загрузите текстуру, созданную на предыдущих шагах.

    Так как мы используем TGA текстуру, а не DDS, нам нужно сделать еще один дополнительный шаг. Выберите в меню пункт "Texture Mapping", затем выберите пункт "Show UV Mapping". Оно отобразит текстуру. Нажмите "Edit"->"Flip UVs". Закройте редактор.

    Теперь, ваши текстуры выглядят немного странно на юните. Не беспокойтесь, в игре они будут выглядеть хорошо.

    И еще один шаг: Выберите в меню "Object > Recalculate vertex normals, 3d0 style > All objects" и нажмите ОК в появившемся окне. Это сделает нашу модель и текстуры чуть красивее.

    Теперь сохраните все в формате s3o (File -> Save model as -> "tank.s3o"). Вот и все! Модель юнита готова! Теперь поместим ее в игру!

    Добавляем юнит в игру

    Движок Spring использует ".sdz" и ".sd7" форматы файлов для данных игры. Это просто переименованные ".zip" и ".7z" архивы соответственно. Просто переименуйте их и распакуйте. Так же, движок Spring позволяет вам не упаковывать вовсе. Просто положите директорию с игрой в папку %spring%/games и переименуйте ее так, чтобы имя оканчивалось на ".sdd".

    Лучше всего начать со скачивания игры-примера. Скачайте ее и распакуйте в директорию "EmptyMod.sdd", а затем поместите эту директорию в поддиректорию "games" каталога, куда установлен Spring.

    Чтобы увидеть юнит в игре, вам надо положить s3o файл в папку "objects3d", текстуру в папку "unittextures". И еще, файл "unitdef" в "units". Этого unitdef у нас еще нет. Положите текстуру и модель в соответствующие директории.

    А файл unitdef(описание юнита), мы сейчас будем создавать.

    Существует 2 способа это делать: 1) старый, в стиле игры Total Annihilation 2) новый, в формате.lua. Старый - это текстовый файл в формате FBI, в котором перечислен список переменных. Новый это так же текстовый файл, с расширением.lua, в нем так же перечислены переменные, просто используется немного другой синтаксис. Мы будем использовать.lua вариант.

    local unitName = "tank" local unitDef = { --Internal settings BuildPic = "filename.bmp", Category = "TANK SMALL NOTAIR NOTSUB", ObjectName = "tank3.s3o", name = "Generic Tank", Side = "TANKS", TEDClass = "TANK", UnitName = "tank", script = "tankscript.lua", --Unit limitations and properties BuildTime = 1000, Description = "A generic tank unit.", MaxDamage = 800, RadarDistance = 0, SightDistance = 400, SoundCategory = "TANK", Upright = 0, --Energy and metal related BuildCostEnergy = 100, BuildCostMetal = 0, --Pathfinding and related Acceleration = 0.15, BrakeRate = 0.1, FootprintX = 2, FootprintZ = 2, MaxSlope = 15, MaxVelocity = 2.0, MaxWaterDepth = 20, MovementClass = "Default2x2", TurnRate = 900, --Abilities Builder = 0, CanAttack = 1, CanGuard = 1, CanMove = 1, CanPatrol = 1, CanStop = 1, LeaveTracks = 0, Reclaimable = 0, --Hitbox -- collisionVolumeOffsets = "0 0 0", -- collisionVolumeScales = "20 20 20", -- collisionVolumeTest = 1, -- collisionVolumeType = "box", --Weapons and related BadTargetCategory = "NOTAIR", ExplodeAs = "TANKDEATH", NoChaseCategory = "AIR", } return lowerkeys({ [unitName] = unitDef }) Просмотрите весь этот текст. Постарайтесь понять, что означает каждая переменная. Описание всех этих переменных уже выходит за рамки этой статьи, документацию можно посмотреть здесь.

    Вам нужно изменить ObjectName, укажите здесь имя вашего файла-модели. Так же, можете поменять имя юнита (unitName). Далее, сохраните этот файл как tank.lua, например, и положите его в "units" директорию.

    Далее, откройте файл "/gamedata/sidedata.lua" и замените эту строчку 'startunit = "cube"' на эту: 'startunit = "tank".

    Откройте SpringLobby. Это приложение, которое устанавливается с движком Spring. Затем перейдите на вкладку "Single Player"(одиночная игра) и выберите любую карту и игру "Example Mod". Добавьте бота, например AAI, и запустите игру. Попробуйте найти свой танк.

    Вы должны иметь возможность выделить его и погонять по местности, нажимая правой кнопкой мыши. Он все еще не может стрелять, но все будем делать постепенно.

    Мы сделаем так, чтобы танк стрелял маленькими оранжевыми шарами. Для этого, нам надо 3 вещи: картинка оранжевого шара, скрипт анимации юнита, описание оружия в unitdef файле.

    В качестве картинки с оранжевым шаром, мы возьмем файлик из игры "Evolution RTS". Кстати, хорошая игра, рекомендуется познакомиться. Этот файл мы уже скачали за вас и положили в "bitmaps" директорию в "Example mod", переместите его в вашу директорию "bitmaps". Чтобы движку Spring сказать, где находится этот файл, мы вставим эту строчку: "flame = 'flame.tga' " в файл gamedata/resources.lua (внутри секции projectiletextures).

    Откройте файл unitdef, который вы создавали и сохраняли ранее (tank.lua или как-то так). И замените его содержимое на это:

    local unitName = "tank" local unitDef = { --Internal settings BuildPic = "filename.bmp", Category = "TANK SMALL NOTAIR NOTSUB", ObjectName = "tank3.s3o", name = "Generic Tank", Side = "TANKS", TEDClass = "TANK", UnitName = "tank", script = "tankscript.lua", --Unit limitations and properties BuildTime = 1000, Description = "A generic tank unit.", MaxDamage = 800, RadarDistance = 0, SightDistance = 400, SoundCategory = "TANK", Upright = 0, --Energy and metal related BuildCostEnergy = 100, BuildCostMetal = 0, --Pathfinding and related Acceleration = 0.15, BrakeRate = 0.1, FootprintX = 2, FootprintZ = 2, MaxSlope = 15, MaxVelocity = 2.0, MaxWaterDepth = 20, MovementClass = "Default2x2", TurnRate = 900, --Abilities Builder = 0, CanAttack = 1, CanGuard = 1, CanMove = 1, CanPatrol = 1, CanStop = 1, LeaveTracks = 0, Reclaimable = 0, --Hitbox -- collisionVolumeOffsets = "0 0 0", -- collisionVolumeScales = "20 20 20", -- collisionVolumeTest = 1, -- collisionVolumeType = "box", --Weapons and related BadTargetCategory = "NOTAIR", ExplodeAs = "TANKDEATH", NoChaseCategory = "AIR", weapons = { [1] = { def = "orangeblob", }, }, } local weaponDefs = { orangeblob = { name = "Orange Plasma Cannon", weapontype = "Cannon", accuracy = 10, areaofeffect = 100, avoidfeature = false, avoidfriendly = true, canattackground = true, collidefriendly = true, collisionsize = 8, commandfire = false, craterboost = 0, cratermult = 0, edgeeffectiveness = 0.1, explosionspeed = 128, impulseboost = 0, impulsefactor = 0, intensity = 1, noselfdamage = true, size = 4, -- soundstart = "tank_fire", -- soundhit = "explo01", range = 250, reloadtime = 1.5, rgbcolor = "1.0 1.0 1.0", turret = true, texture1 = "flame", weaponvelocity = 400, -- explosiongenerator = "custom:TANKGUN_FX", damage = { default = 55, }, }, } unitDef.weaponDefs = weaponDefs return lowerkeys({ [unitName] = unitDef }) Опять же, обновите имя файла с юнитом, как вы делали это раньше.
    Заметьте, что мы добавили секцию с описанием оружия "weaponDefs".

    Теперь, если все эти файлы в правильных директориях, запустите игру. Вы должны получить маленький танк, способный ездить и стрелять в разные штуки! Вероятно вы заметили две вещи. Во-первых, взрывы от попаданий оранжевых шаров не очень драматичны. Во-вторых, нет ни звука. Сначала давайте исправим звук.

    Прежде всего вам нужен звук взрыва. Давайте используем Explosion3 с сайта, и, конечно же, вы можете взять его из "Example Mod". Положите файл в директорию /sounds. Далее нам нужно сказать движку о нашем звуковом файле. Откройте /gamedata/sounds.lua, и замените содержимое на это:

    local Sounds = { SoundItems = { --- RESERVED FOR SPRING, DON'T REMOVE IncomingChat = { file = "sounds/incoming_chat.wav", rolloff = 0.1, maxdist = 10000, priority = 100, --- higher numbers = less chance of cutoff maxconcurrent = 1, ---how many maximum can we hear? }, MultiSelect = { file = "sounds/multiselect.wav", rolloff = 0.1, maxdist = 10000, priority = 100, --- higher numbers = less chance of cutoff maxconcurrent = 1, ---how many maximum can we hear? }, MapPoint = { file = "sounds/mappoint.wav", rolloff = 0.1, maxdist = 10000, priority = 100, --- higher numbers = less chance of cutoff maxconcurrent = 1, ---how many maximum can we hear? }, --- END RESERVED --WEAPONS orangeblob_explo = { file = "sounds/Explosi3.wav", rolloff=3, dopplerscale = 0, maxdist = 6000, priority = 10, --- higher numbers = less chance of cutoff maxconcurrent = 4, ---how many maximum can we hear? }, --DefaultsForSounds = { -- this are default settings file = "ThisEntryMustBePresent.wav", gain = 1.0, pitch = 1.0, priority = 0, maxconcurrent = 16, --- some reasonable limits --maxdist = FLT_MAX, --- no cutoff at all }, --- EXAMPLE ONLY! MyAwesomeSound = { file = "sounds/booooom.wav", preload, -- put in memory! loop, -- loop me! looptime=1000, --- milliseconds! gain = 2.0, --- for uber-loudness pitch = 0.2, --- bass-test priority = 15, --- very high maxconcurrent = 1, ---only once --maxdist = 500, --- only when near }, }, } return Sounds И, наконец, нам нужно написать в unitDef какой звук использовать. Откройте его и в weaponDef добавьте строку

    soundhit = "orangeblob_explo",

    Теперь, если вы попытаетесь поиграть в Spring, вы будете слышать звук взрыва каждый раз, как оранжевый шар ударит что-нибудь. Чтобы добавить звук выстрела, делайте тоже самое, только добавьте в weaponDef:

    soundstart = "whatevername".

    Теперь для взрыва. Для эффектов частиц, есть два способа (старый способ ТА и новый Lua путь, как и в прошлом случае). Вы можете написать CEG tdf файл, определяющий, куда спрайты и частицы направятся, и что будут там делать, или вы можете использовать Lups (система частиц Lua). На этот раз мы пойдем по старому ТА пути(потому что это не работает на некоторых видеокартах ATI). Lups является гораздо более гибким, но сейчас лучше всего использовать его только для трасс самолетов и других эффектов, на которые люди не будут жаловаться, если они отсутствуют.

    Для использования CEG, сначала вам нужно поместить файл TDF в директорию /gamedata/explosions:

    [TANKGUN_FX] { [groundflash] { flashSize = 45; flashAlpha = 0.9; circleGrowth = 3; circleAlpha = 0.3; ttl = 30; color = 1, 0.5, 0; air=1; ground=1; water=1; } [heatcloud_MED_EXPLOSION_FX01] { class=heatcloud; [properties] { texture=explodeheat; heat = 30; maxheat = 30; heatFalloff = 1; size = 30; sizeGrowth = -0.3; sizemod = 0; sizemodmod = 0; speed = 0, 1.5, 0; pos = 0, 5, 0; } air=1; water=1; ground=1; count=1; } [MOREDOTS] { class=CSimpleParticleSystem; [properties] { alwaysVisible=1; Texture=randdots; colorMap = 1.0 1.0 1.0 0.05 0.2 0.9 0.5 0.01 0.1 0.8 0.1 0.00; pos = 0, 2, 0; gravity = 0, -0.1, 0; emitVector = 0, 1, 0; emitRot = 45; emitRotSpread = 32; sizeGrowth = 0.5; sizeMod = 1; airdrag = 0.8; particleLife = 5; particleLifeSpread = 7; numParticles = 16; particleSpeed = 8; particleSpeedSpread = 3; particleSize = 20; particleSizeSpread = 0; directional = 1; useAirLos = 0; } air=1; ground=1; count=1; } } Вам так же понадобится больше изображений взрывов, которые так же доступны в "Example Mod". Их надо положить в /bitmaps и указать их в /gamedata/resources.lua. В weapondef вам необходимо вставить:

    explosiongenerator = "custom:TANKGUN_FX",

    И теперь в игре у вас должен быть прекрасно двигающийся и стреляющий танк! Поздравляю!

    И еще одна мелочь.

    Игроку очень поможет, наличие картинок того, что конструктор строит. Положите их в unitpics и добавьте в unitdefs запись:

    BuildPic = "filename.bmp".

    Структура игры

    Прежде чем перейти к заводам, строителям и другим видам юнитов,? стоит пройтись по структуре папок, и посмотреть что они означают.?
    /bitmaps - Содержит.tga файлы взрывов, лазеров и прочего подобного. Каждое изображение отсюда должно быть указано в /gamedata/resources.lua
    , прежде чем его можно будет использовать. /bitmaps/loadpictures - Любой jpg файл отсюда будет показан, пока игра загружается.

    /gamedata - Lua файлы, определяющие информацию об игре.
    gamedata/armordefs.lua - определяет различные группы брони. Больше информации: Armordefs.lua.
    /gamedata/explosions - TDF файлы для CEG взрывов.
    /gamedata/messages.lua - сообщения, показываемые, когда команда проиграла. Больше информации: Messages.lua
    /gamedata/modrules.lua - различные параметры вашей игры, такие как бонусы атаки с фланга, скорость получения опыта и т.д. Посмотрите на существующие игры, чтобы увидеть что они делают. Больше информации: Modrules.lua
    /gamedata/movedefs.lua - определяет различные типа движения(ховеркрафт, танк, корабль и т.д.). Больше информации: Movedefs.lua.
    /gamedata/resources.lua - все изображения в /bitmaps: как называются и что делают(для снарядов, вспышек и т.д.).br/> /gamedata/sidedata.lua - определяет различные фракции и с какими юнитами они стартуют. В теории, вы можете делать все это lua гаджетами (больше об этом позже), но тем не менее sidedata.lua работает хорошо.
    /gamedata/sounds.lua - определяет все звуковые файлы, а так же значения громкости, приоритета, эффекта допплера и т.д.
    /LuaRules - содержит гаджеты. Это файлы скриптов, меняющих геймплэй; больше информации позже.
    /LuaRules/Gadgets/spawnPlayer.lua - создает стартовый юнит в начале игры, записанный в /gamedata/sidedata.lua. В теории, вы можете адаптировать это для создания случайных юнитов, создания целых баз в начале игры и т.д.
    /LuaRules/Gadgets/unit_script.lua - необходим для того, чтобы анимационные lua скрипты работали.
    /LuaUI - содержит виджеты. Это файлы скриптов, меняющие пользовательский интерфейс; больше информации позже.

    /music - содержит музыку для музыкальных виджетов.
    /sounds - содержит звуки.

    /objects3d - содержит все s3o модели.
    /scripts - содержит все скрипты анимации юнитов.
    /units - содержит описание юнитов.
    /unittextures - содержит текстуры для s3o моделей.

    /unitpics - картинки для каждого юнита, отображающиеся в меню строительства.
    /sidepics - картинка для каждой фракции, показываемой в лобби.

    /modinfo.lua - определяет название мода, описание, и, если это необходимо, предварительно существующий контент.
    /EngineOptions.txt - именно то, что описано в первоисточнике. Посмотрите в других играх, чтобы узнать что он делает.

    Другие типы юнитов

    На данный момент у вас есть юнит танк. Это прекрасно, но для вашей игры, вам вероятно нужны заводы, строители, здания и так далее (в зависимости от того, насколько ваша игра нестандартна0). Самый простой путь - показать как делать эти юниты на примере, и вот базовый мод с каждым из них:

    Example mod

    Загрузите игру вместе с RAI (этот AI работает почти с любым модом, если конечно ваш lua не слишком странный). Далее распакуйте ее (это всего лишь.zip файл), посмотрите в код, на скрипты, unitdefs, на Lua гаджеты и виджеты.

    Вот где начинается самое веселье. Гаджеты это маленькие lua скрипты, позволяющие вам добавлять штуки к базовому геймплэю Spring. И под "штуками" подразумевается "что угодно". Хотите чтобы юниты превращались в других юнитов? Lua. Хотите юнитов, стреляющих другими юнитами? Lua. Хотите метеоритные удары и периодически появляющихся динозавров и нападающих на игроков? Lua. Хотите напалм? Lua.

    Для примеров гаджетов и виджетов у нас есть база данных. Она пока не особо большая, так что за большим обращайтесь в исходный код CA.

    Виджеты, они как гаджеты, но вместо того, чтобы менять геймплэй, они меняют пользовательский интерфейс. Так что если вы хотите добавить кучу кнопок справа или светящиеся контуры около отдельных видов юнитов, вам вероятно стоит использовать виджеты. Так же вы можете добавить виджеты в свою локальную копию Spring а не в мод; это может быть полезно для дебага, но помните, что остальные игроки так же могут использовать свой собственный набор виджетов для улучшения их игровых навыков.

    Карты и миссии

    Окей, теперь у нас есть работающая многопользовательская игра. А что насчет одиночной? На данный момент нет ни одной Spring игры с однопользовательской компанией. Все инструменты есть, но никто ими до сих пор не воспользовался. Чтобы создать парочку карт springmapedit - лучшая программа.

    Для одиночных миссий, есть редактор Mission Editor с хорошим учебником. Enjoy!


    Закрыть ... [X]

    Готовим стратегию в реальном времени (RTS) в домашних условиях Трафареты для украшения стены своими руками

    Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts Как сделать свою rts