Project Manager для OS X


...

Юрий "yurembo" Язев


В конце прошлого года я разработал менеджер проектов для Torque 2D, работающий из-под Windows. Про него я написал статью: "Менеджер проектов для Torque 2D". Поскольку, Torque 2D кроссплатформенный движок, через некоторое время мне понадобился этот менеджер в операционной системе OS X для разработки игр под iOS. Благо, изначально я разработал менеджер проектов на фреймворке .NET 4.5, для которого есть свободная реализация Mono под OS X и Linux (последняя пока остается без моего внимания). В частности, для разработки я использовал интерфейс программирования приложений WinForms, замечательная поддержка (хотя и не совсем официальная) которого есть в Mono, где, для визуализации элементов WinForms используется открытый графический тулкит GTK#. Следовательно, мы легко можем портировать наш менеджер проектов из Windows на OS X. Но об этом мы поговорим позднее, а сейчас…

Проблема компиляции Torque 2D под OS X

Первым делом скачайте последнюю версию движка. Я рекомендую использовать самую последнюю версию из ветки development. На момент написания этих строк, текущей версией была 3.3. Совсем недавно, до версии 3.2, Torque 2D компилировался без проблем прямо “из коробки” - скачанный с сервера, то есть без предварительных настроек и манипуляций. Однако, начиная с указанной версии, во время компиляции появляется трабла, связанная с линковкой проекта. А, именно, в сообщение об ошибке указано, что линковщик не может найти либу libogg.dylib. Проблема заключается в том, что в Torque 2D 3.3 была добавлена поддержка проигрывание звука с помощью аудио библиотеки Vorbis, установка которой происходит отдельно от движка. Установка Vorbis выполняется с помощью HomeBrew, являющимся менеджером недостающих пакетов для OS X, как написано на сайте разработчика. Следовательно, для начала надо установить сам HomeBrew. Он находится на сайте, но для его установки достаточно ввести в терминале следующую команду (в одну строчку):

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

После инсталляции менеджера пакетов HomeBrew можно переходить к установке аудио библиотеки Vorbis. Для этого введите в терминал:

brew install libogg libvorbis --universal

Эта команда установит необходимые файлы и пропишет ссылки, таким образом, XCode будет знать, куда установлены нужные библиотеки.

...

рис. 01. Терминал

...

рис. 02. Сайт HomeBrew


Теперь, компиляция движка пройдет успешно без проблем!

Установка Mono

Теперь, надо установить среду выполнения (фреймворк) Mono. Для этого перейдите на сайт проекта Mono в раздел Download. Для начала скачивания пакета установки для операционной системы OS X выберите слева вкладку Mac OS X (открывается автоматически) и нажмите кнопку Download Mono 32-bit. В результате на жесткий диск вашего мака скачается стандартный установщик - пакет pkg, инсталляция из которого протекает стандартным образом.

...

рис. 03. Сайт Mono

Установка Xamarin Studio

После установки среды выполнения, надо установить систему программирования - Xamarin Studio. После перехода на этот сайт, появится форма регистрации, после заполнения которой станет доступна кнопка Download Xamarin Studio for OS X. В результате нажатия на ней, начнется скачивание установщика. Инсталляция студии ничем особенным не отличается.

...

рис. 04. Сайт Xamarin Studio

Теперь, можно переходить к изменению исходного кода менеджера проектов под Windows для соответствия требованиям OS X. Исходный проект для Windows можно скачать с моего аккаунта GitHub.

Изменения по сравнению с Windows-версией

Сделайте двойной щелчок на файле ProjectManager.sln, входящем в содержимое проекта менеджера, скачанного с GitHub. В результате, решение будет открыто в Xamarin Studio. Сделайте перечисленные ниже модификации.
Во-первых, надо изменить символ-разделитель между каталогами с обратного слэша ‘\’, принятого в Windows на слэш ‘/’, принятый в Unix-подобных системах. Это удобно сделать с помощью диалога “Заменить в файлах” (рис. 05).

...

рис. 05. Диалог “Заменить в файлах”

Хотя, в некоторых местах кода я применял статический метод Combine класса Path, который принимает неограниченное количество параметров - имен папок через запятую, а возвращает файловый путь, между папками содержащий символ, присущий данной конкретной операционной системе, в которой выполняется приложение. Тем не менее, в некоторых местах кода, я поленился использовать данную конструкцию, поэтому там жесткий хард-код, который придется заменять для OS X.
Во-вторых, поскольку в OS X нет динамических библиотек, их копировать не придется. В самом низу файла с исходным кодом, есть статический класс, в котором объявлены константы - имена файлов - динамических библиотек:

public static class Constants
{
//public const string rootDir = "c:/Torque/Torque2D-development-3-2/";
public const string exeName = "Torque2D.app";
public const string leapName = "Leap.dll";
public const string openALName = "OpenAL32.dll";
public const string uniName = "unicows.dll";
public const string script_main = "main.cs";
}

Файл unicows.dll, начиная с версии Torque 2D 3.3 для Windows, не копируется, поскольку был изъят из дистрибутива движка. Вместе с тем, надо закомментировать и/или удалить код для копирования файлов Leap.dll и OpenAL32.dll. В операционной системе OS X, код этих библиотек помещается в исполняемый объект.
В-третьих, везде измените Torque2D.exe на Torque2D.app, а так же *.exe на *.app.
В-четвертых, если в Windows исполняемым объектом является файл с расширением exe, то в OS X исполняемым объектом является каталог с расширение app, кроме кода запуска, включающий код дополнительных библиотек, картинки, иконки и др., что только позволит фантазия программиста. Однако, набивать этот каталог не рекомендуется. Поэтому, если в менеджере проектов версии для Windows мы просто копировали исполняемый файл движка из корневой папки Торка в директорию с нашим новым проектом, то в OS X над надо копировать каталог app со всем содержимым. Для этого служит статичная рекурсивная функция DirectoryCopy, принимающая 3 параметра: папка - источник, папка - приемник, булевый флаг - копировать ли поддиректории.

private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
{
DirectoryInfo dir = new DirectoryInfo(sourceDirName);
if (!dir.Exists)
{
throw new DirectoryNotFoundException("Папка не существует: " + sourceDirName);
}
DirectoryInfo[] dirs = dir.GetDirectories();
// If the destination directory doesn't exist, create it.
if (!Directory.Exists(destDirName))
{
Directory.CreateDirectory(destDirName);
}
// Get the files in the directory and copy them to the new location.
FileInfo[] files = dir.GetFiles();
foreach (FileInfo file in files)
{
string temppath = Path.Combine(destDirName, file.Name);
file.CopyTo(temppath, false);
}
// If copying subdirectories, copy them and their contents to new location.
if (copySubDirs)
{
foreach (DirectoryInfo subdir in dirs)
{
string temppath = Path.Combine(destDirName, subdir.Name);
DirectoryCopy(subdir.FullName, temppath, copySubDirs);
}
}
}

...

рис. 06. Функция DirectoryCopy


Внутри тела функции, первым делом, создаем объект директории-источника и сохраняем его в переменной dir класса DirectoryInfo. Если, в результате, объект dir нулевой, тогда папка-источник не существует, выводим соответствующее сообщение. Если проверка завершилась успешно, т.е. объект dir инициализирован, тогда в массив объектов DirectoryInfo - dirs помещаем все подпапки. Далее, выполняем проверку на существование папки приемника, если ее нет, то - создаем ее. Затем, в массив files объектов класса FileInfo сохраняем список файлов, находящихся в папке-источнике. После этого, в цикле foreach копируем каждый файл из папки источника в папку-приемник. Далее, если флаг copySubDirs имеет положительное значение, тогда копируем содержимое каждой подпапки из массива dirs с помощью рекурсивных вызовов рассматриваемой функции - DirectoryCopy.

В-пятых, там, где раньше были операторы File.Exist, проверяющие существование исполняемого файла exe, теперь, должны быть Directory.Exist, соответственно, проверяющие существование папки - исполняемого объекта с расширением app.

На этом, изменения исчерпали себя. Проект готов к эксплуатации.

Компиляция и запуск

В главном меню Xamarin Studio выберите пункт “Сборка -> Пересобрать все”. В итоге, если вы не сделали никаких ошибок, проект будет перекомпилирован и собран заново. Однако, если вы сейчас откроете папку Debug или Release, смотря проект какого типа вы только, что построили, то обнаружите там исполняемый файл для Windows - ProjectManager.exe. Если по нему дважды щелкнуть, OS X сообщит, что она не поддерживает файлы такого типа. Ясное дело, в этой операционке исполняемые объекты - это папки с расширением app. Что за хрень, Xamarin Studio ведь понимает, что мы работаем в OS X. Понимает и билдит универсальные исполняемые файлы для среды Mono, с помощью которой мы можем запустить exe файлы из OS X. Для этого откройте терминал, с помощью команды cd перейдите в каталог, где находится менеджер проектов и выполните команду:

mono ProjectManager.exe

В результате, в оконном режиме запустится менеджер проектов, ровно, как в Windows, только по правилам OS X.

Теперь, давайте проведем эксперимент. Скопируйте исполняемый exe файл из каталога с проектом в папку с движком. В моем случае, движок находится в директории Downloads/Torque2D-development. В терминале перейдите в вышеуказанную папку, туда, куда вы скопировали исполняемый файл менеджера проектов. И, запустите его. В результате, он будет работать так же, как в операционной среде Windows. О чем подробнее можно прочитать в моей статье “Менеджер проектов для Torque 2D”, ссылка на которую приведена в начале текущей статьи.

...

рис. 07. Запуск менеджера проектов с помощью среды Mono”


...

рис. 08. Менеджер проектов с заполненными полями создал мини-игру”


...

рис. 09. Папка Downloads с движком и созданным проектом Wheel”


...

рис. 10. Созданная с помощью менеджера проектов мини-игра для OS X на движке Torque 2D”


Если вам не охота все это делать собственноручно, можете скачать полный репозиторий ProjectManager для OS X с моего аккаунта GitHub.