вторник, 29 октября 2013 г.

“getTrailingNumber” function in T2D

by yurembo



Hello all!

I used Torque 3D for a long time. I liked to use “getTrailingNumber” function. This function is very useful to get a tail number of an object. For example, you have many objects, all of these have a name ”Gun” and to differ these you add a number to the end of a name, like “Gun22”. Then you need to get this number, right, you should call “getTrailingNumber” function and pass a target word with a number as a parameter to this function. It returns a tailing number. But T2D miss this function. Ok, we can add “getTrailingNumber” to T2D. It is very simple.
So, open up your project in VS, open \engine\source\string\stringBuffer.h file and add a declaration of a function in the StringBuffer class:

static const UTF8* GetTrailingNumber(const char* str, S32& number);

You should notice that this is a static function. Next open engine\source\string\stringBuffer.cc file to write a definition of this function:

const UTF8* StringBuffer::GetTrailingNumber(const char* str, S32& number)
{
   // Check for trivial strings
   if (!str || !str[0])
      return StringTable->EmptyString;

   // Find the number at the end of the string
   StringBuffer base = str;
   const char* p = base.getPtr8() + base.length() - 1;

   // Ignore trailing whitespace
   while ((p != base.getPtr8()) && dIsspace(*p))
      p--;

   // Need at least one digit!
   if (!isdigit(*p))
      return base.getPtr8();

   // Back up to the first non-digit character
   while ((p != base.getPtr8()) && isdigit(*p))
      p--;

   // Convert number => allow negative numbers, treat '_' as '-' for Maya
   if ((*p == '-') || (*p == '_'))
      number = -dAtoi(p + 1);
   else
      number = ((p == base.getPtr8()) ? dAtoi(p) : dAtoi(++p));

   // Remove space between the name and the number
   while ((p > base.getPtr8()) && dIsspace(*(p-1)))
      p--;

   return base.substring(0, p - base.getPtr8()).getPtr8();
}

I took up this cod from T3D with little modifications. Nice!
Next thing we should to do is to write a console function. This way we will able to call “getTrailingNumber” from Torque Script. Right way, open up \engine\source\console\consoleFunctions.cc and to the end of this file add this cod:

ConsoleFunction(getTrailingNumber, S32, 2, 2, "")
{
    S32 suffix = -1;
    StringBuffer::GetTrailingNumber(argv[1], suffix);
    return suffix;
}

Don’t forget: you should include StringBuffer.h header to current file. Now, when we call getTrailingNumber from a T2D script cod we should get a result like from T3D.
Yep, this is very simple to play!
So have a rest!

понедельник, 14 октября 2013 г.

Создание проекта для Torque 2D 2.0

Юрий "yurembo" Язев

      К сожалению, Torque 2D 2.0, распространяемый под свободной лицензией MIT, не обладает средствами для создания нового проекта, другими словами, в его поставке отсутствует менеджер проектов. Для более подробного введения в движок и его культуру обратись к моей статье «Indie-gamedev», которая будет опубликована в ноябрьском номере журнала «Хакер». А тут мы рассмотрим возможность создания нового проекта.
     Хотя на Torque 2D можно разрабатывать игры как из-под Windows, так из-под Mac OS X, я предпочитаю первый вариант, ибо под Windows есть Torsion. Torsion – это полнофункциональный редактор скриптового кода на языке Torque Script, разработанный компанией Sickhead Games. Кроме стандартного набора редактирования, форматирования и подсветки этот редактор включает средства автодополнения кода (aka IntelliSense) и средства отладки, как положено с точками останова и пошаговым выполнением.
     Новый проект можно создать, как дополнение для Sandbox, поместив новый проект в подпапку modules репозитария движка. При этом название родительского каталога для нового проекта должно оканчиваться на «Toy», чтобы во время запуска Sandbox смог задетектить этот каталог и прочитать его содержимое. После этого, он добавит новый проект в список запускаемых игр.

     Но чаще требуется создать независимый от Sandbox’а проект. Для этого, к примеру, на уровне папки modules создадим папку для нашего проекта, пусть будет: MyProject. Сразу же скопируем в нее исполняемый файл Торка, сейчас он называется Torque2D.exe, но в целевой папке его можно переименовать. Также, в ней создай подкаталог modules, в котором размести необходимые для будущей игры ассеты. Вообще, ассеты заслуживают отдельного разговора, поэтому перенесем его на другой раз.
     В каталоге с игрой должен находиться файл main.cs, с него начинается выполнение любой игры. Содержимое этого файла, с некоторыми исключениями, примерно одинаковое:

// Set log mode.
setLogMode(2);

// Set profiler.
//profilerEnable( true );

// Controls whether the execution or script files or compiled DSOs are echoed to the console or not.
// Being able to turn this off means far less spam in the console during typical development.
setScriptExecEcho( false );

// Controls whether all script execution is traced (echoed) to the console or not.
trace( false );

// Sets whether to ignore compiled TorqueScript files (DSOs) or not.
$Scripts::ignoreDSOs = true;

// The name of the company. Used to form the path to save preferences. Defaults to GarageGames
// if not specified.
// The name of the game. Used to form the path to save preferences. Defaults to C++ engine define TORQUE_GAME_NAME
// if not specified.
// Appending version string to avoid conflicts with existing versions and other versions.
setCompanyAndProduct("YazevSoft", "MyProject" );

// Set module database information echo.
ModuleDatabase.EchoInfo = false;

// Set asset database information echo.
AssetDatabase.EchoInfo = false;

// Set the asset manager to ignore any auto-unload assets.
// This cases assets to stay in memory unless assets are purged.
AssetDatabase.IgnoreAutoUnload = true;

// Scan modules.
ModuleDatabase.scanModules( "modules" );

// Load AppCore module.
ModuleDatabase.LoadExplicit( "AppCore" );

//-----------------------------------------------------------------------------

function onExit()
{
    // Unload the AppCore module.
    ModuleDatabase.unloadExplicit( "AppCore" );
}

     По комментариям все должно быть понятно, отмечу лишь некоторые моменты: $Scripts::ignoreDSOs = true; - позволяет задать пропуск скомпилированных DSO-файлов; строка: ModuleDatabase.scanModules( "modules" ); задает каталог с модулями игр, т.к. для одного исполняемого файла может быть несколько игр (подобно Sandbox); с другой стороны строка: ModuleDatabase.LoadExplicit( "AppCore" ); указывает основные модули, которые необходимо загрузить в начале загрузки приложения до того, как будут загружены модули игр.
     Перейдем, собственно, к цели данной статьи – созданию Torsion-проекта. Для этого в каталоге с проектом создай текстовый файл main с расширением torsion. Открой его с помощью какого-нибудь редактора, например, Notepad++, и напиши следующий код:

     <TorsionProject>
     <Name>main</Name>
     <WorkingDir/>
     <EntryScript>main.cs</EntryScript>
     <DebugHook>dbgSetParameters( #port#, "#password#", true );</DebugHook>
     <Mods>
     <Folder>modules</Folder>
     </Mods>
     <ScannerExts>cs; gui</ScannerExts>
     <Configs>
     <Config>
     <Name>Release</Name>
     <Executable>MyProject.exe</Executable>
     <Arguments/>
     <HasExports>true</HasExports>
     <Precompile>false</Precompile>
     <InjectDebugger>true</InjectDebugger>
     <UseSetModPaths>false</UseSetModPaths>
     </Config>
     <Config>
     <Name>Debug</Name>
     <Executable> MyProject _debug.exe</Executable>
     <Arguments/>
     <HasExports>false</HasExports>
     <Precompile>false</Precompile>
     <InjectDebugger>true</InjectDebugger>
     <UseSetModPaths>false</UseSetModPaths>
     </Config>
     </Configs>
     <SearchURL/>
     <SearchProduct>main</SearchProduct>
     <SearchVersion>HEAD</SearchVersion>
     <ExecModifiedScripts>true</ExecModifiedScripts>
     </TorsionProject>

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

     <TorsionProject>
     <Name>main</Name>

     указывается название торсион-проекта; в тэгах <EntryScript> и </EntryScript> задается главный скрипт проекта; между тэгами <DebugHook> </DebugHook> вызывается оператор dbgSetParameters для установки удаленного отладчика, в большинстве случаев не используется; тэги <Folder> служат для задания папки, проверяемой при загрузке Torsion’а на наличие скриптовых файлов; следующим тэгом <ScannerExts> выбираются расширения для отбираемых фалов с кодом. Далее, следуют секции для установки отладочной и релизной версий проекта, подробно их разбирать не имеет смысла, ничего интересного они не представляют, кроме задания имен исполняемых файлов:

     <Name>Release</Name>
     <Executable>MyProject.exe</Executable>
     и
     <Name>Debug</Name>
     <Executable>MyProject_debug.exe</Executable>

     На этом создание Torsion-проекта завершено; сохраняем и закрываем файл, щелчком по нему запустится редактор Torsion, который загрузит скрипты из папок, на которые был нацелен.
     Torque 2D имеет много преимуществ перед конкурентами (см. ноябрьский номер «Хакера»), однако разработка игр с его помощью таит в себе свои подводные камни, ровно, как и любая другая технология; первый шаг – создание проекта мы коротко рассмотрели в данной статье, и, будем надеяться, продолжим обсуждение этого движка в будущем.