воскресенье, 10 ноября 2013 г.

Портфолио 

Ниже представлена подборка некоторых моих игр.

1) YazevPacMan 3: Rebel’s Revenge (2005) – моя разработка классической игры, чтобы не придумывать геймплей, поскольку моя цель – техническая сторона вопроса. Движок разработан мною с нуля на Delphi и DirectX (DirectDraw, DirectInput).




2) YazevTeris 2 (2006) – снова в основу геймплея легла классика – моя разработка игры Алексея Пажитнова. Движок для игры я разработал на Delphi, графическую подсистему реализовал с помощью OpenGL. 



3) YazevBattleTank 2: Metaller’s Revenge (2006) – эту игру я разработал еще до того, как «танки» стали мейнстримом. Двумерные танки. Движок написан мною с нуля на Delphi, рендер организован посредством OpenGL, управление – через DirectInput.




4) YazevBomberMan (2007) – вновь классический геймплей, однако, в отличие от оригинала, действия в моей игре происходят в трехмерном пространстве. Следовательно, игровой и графический движок – мой, написан на Delphi + OpenGL (GLU, GLUT) + DirectInput (для управления).




5) YazevBomberManDev (2008) – по сути, это редактор уровней для игры YazevBomberMan. Запускается в оконном режиме и имеет набор элементов управления, присущих средам визуального программирования (компоненты для создания внутри игровых объектов). В редакторе используется движок от игры YazevBomberMan. Построенные уровни сохраняются в файлы, которые впоследствии можно загрузить в игру.


6) DarkRobot (2008) - игра, которую я разработал для журнала "Хакер", сопроводительный цикл статей "Темное искусство игродела" есть на сайте журнала. Игра разработана на C++ с использованием бесплатного графического движка DarkGDK. Кроме синглплеера игра включает клиент-серверный мультиплеер, где сервер представлен отдельным приложением.




7) myRiseOfAtlantis (2009) - двумерная казуальная игра типа match3 – тестовое от Playrix является клоном игры Rise of Atlantis, в ней используется оригинальный арт, программная сторона написана мной на C++ с использованием указанного в задании бесплатного движка HGE. При этом для парсинга xml-файлов и загрузки из них уровня используется свободная библиотека TinyXML.




8) XMLLevelWriter (2009) – редактор уровней для игры myRiseOfAtlantis. Оконное приложение, которое я написал на C++. Уровни сохраняются в xml формате для последующей загрузки в игру.


9) Project Genom (2009 – 2012) (не издан) – MMORPG, разрабатываемая совместно с компанией GenomeGames (http://www.pgenom.ru). В проекте я принимал участие, как ведущий программист. Исходя из того, что в качестве основы для разработки был выбран движок Torque 3D (по крайней мере, во время моего участия), то для доработки движка использовался C++, для написания игровой логики внутренний язык движка – Torque Script. Плюс к этому использовалась БД MS SQL Server.




10) Arcanoid (2013) – естественно, клон Арканойда – тестовое в компании DayTerium (плюс, в некоторых других компаниях было такое тестовое). Для разработки своей версии я использовал C++ и OpenGL.





11) ObjectFinder (2013) – игра типа Hidden Object – тестовое в компании GameInsight (подразделение мобильных разработок ILikeGames, г. Ростов-на-Дону). По сложившейся традиции для планируемой игры я разработал заточенный под HO игры движок. Он был написан на C++, для визуализации использованы OpenGL, GLUT. Для загрузки изображений из разных форматов воспользовался открытой библиотекой DevIL. Для загрузки уровней из xml файлов была использована библиотека TinyXML. Вдобавок, реализована поддержка хранения данных во встраиваемой БД SQLite.





12) Menu (2013) с взаимодействием, подобным WarCraft 3, разработано с использованием Unity 3D и NGUI. Арт используется присутствующий в NGUI, кроме фона.


13) MagicMancala (2014) – разработанная совместно с Paradise Development казуальная игра для iPad (видео демонстрация проводится на PC). Основу для цифровой версии составляет настольная игра Манкала (подробности: http://ru.wikipedia.org/wiki/Манкала). Цифровая версия следует правилам оригинала, плюс, имеются некоторые добавления, так в нашей игре используется магия (отсюда происходит название). Во время разработки проекта я занимался всем программированием. Игра построена на базе кроссплатформенного игрового open source движка Torque 2D. Следовательно, главным образом игра написана на C++ и скриптовом языке движка Torque Script.






14) Asteroids (2014) – клон классической игры 1979-го года от Atari - Asteroids. Собственно, этот клон я разработал в качестве тестового для студии «Кефир». Так как, в начале выполнения «мне развязали руки», другими словами: разрешили использовать для разработки любые технологии, то я воспользовался мною горячо любимым движком Torque 2D.
В клоне реализован весь функционал оригинала с некоторыми добавлениями и/или исключениями в соответствии с ТЗ. Управляемый космический корабль перемещается по всей плоскости окна приложения, движение корабля ограничено рамками окна. В арсенале корабля есть два вида оружия: пули и лазер. Если пули бесконечны, то лазер имеет ограничение на количество выстрелов, после чего ему надо «восполниться». В игре присутствуют два типа врагов: дрейфующие в космосе астероиды, имеющие разные размеры и скорости, и летающие тарелки, всегда преследующие космический корабль. Если пулей попасть в астероид, то последний расколется на два более мелких куска, которые продолжать дрейфовать. Следующим попаданием маленькие кусочки уничтожаются. С другой стороны, если по астероиду  попасть лазером, то первый будет уничтожен с одного выстрела. В игре реализованы частицы, возникающие при взрыве и отображающие присущий ему эффект; текстовые надписи, показывающие набранные очки, увеличение которых происходит в момент поражения астероидов и тарелок; и количество лазерных снарядов. Космический корабль терпит крушение в двух случаях: при столкновении с астероидом и тарелкой. В таком случае, появляется окно, в котором отображается набранные очки, и дается выбор между стартом новой игры и выходом.





15) Стрельба по воробьям из пушки или крестики-нолики на UE 4 - эта игра представляет собой тестовое в еще одной замечательной компании (не буду говорить в какой, пока я с ней сотрудничаю). По заданию: надо разработать трехмерные крестики-нолики с помощью движка Unreal Engine 4. Значит, в UE 4 присутствует заготовка, где имеется 9 кубов, так почему же ее не заюзать для старта разработки игры? Пусть эти кубы представляют собой игровое поле – таблицу 3 х 3. Затем я добавил трехмерные крестик и нолик, по-быстрому, смоделированные в Blender. В UE 4 игровую логику можно писать на C++ или с помощью графического языка Blueprint. Так как, первый мне намного ближе, я использовал его. Игрок ходит за крестики, ИИ – за нолики. Следовательно, мне понадобилось написать простенький ИИ, который может ходить на основе текущей ситуации. В случае победы одной из сторон или ничьи (бессмысленное продолжение игры – невозможность хода), игра выводит меню, имеющее 2 кнопки: New Game, Quit. Меню разработано средствами движка. Ниже представлены скриншоты и видео:




16) AsteroidExplosion (2015) – игра, типа, классической «Пузыри», разработанная в качестве тестового для компании Playrix. 
В целом «Пузыри» выглядят следующим образом. В двумерном пространстве имеется изначально заданное количество точек, каждая из которых движется по игровому полю хаотично (в любом направлении, с любой скоростью — в разумных пределах), при этом они не сталкиваются, но отскакивают от границ окна приложения. Когда игрок щелкает по игровому полю мышью, то место, где был сделан клик, становится центром растущего круга. Вырастая до заданного 
предела за условный период, круг определенное время остается с максимальным радиусом, а потом начинает быстро уменьшаться. Достигнув минимального размера, он исчезает. В течение всего времени, пока круг виден на экране, точки, соприкоснувшиеся с ним, удаляются, а на их местах появляются такие же раздувающиеся круги, которые живут по идентичному алгоритму. Игрок может создавать новые круги, пока на игровом поле присутствует хотя бы одна окружность. В момент, когда исчезает последний круг, игра завершается. И тогда должно появиться модальное окошко, в котором надо отобразить общее число точек, а также количество удаленных. Одновременно при появлении этого меню должна быть возможность перезапуска игры с начала.
Вместе с заданием компания выдает свой движок и редактор эффектов, которые надо использовать при разработке игры. В то же время, арт и визуальную составляющую нужно использовать свои. То есть, придумать свою игру на основе «Пузырей».. Движок написан на C++, следовательно, этот язык нужно использовать для разработки.



17) Pulse Online – (2020 – 2021) — MMORPG про исследование космоса, далеких галактик, про войны между кланами, захват космических станций, торговлю сырьем и оружием и обо всем таком. Проще говоря, аналог Eve Online. Разрабатывался компанией Pulse Online Game. В проекте я был главным разработчиком, занимался серверной частью и дополнительным программированием. Принимал участие в планирование и решении всех технических вопросов. Для разработки игры использовался Unreal Engine 4.





вторник, 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 имеет много преимуществ перед конкурентами (см. ноябрьский номер «Хакера»), однако разработка игр с его помощью таит в себе свои подводные камни, ровно, как и любая другая технология; первый шаг – создание проекта мы коротко рассмотрели в данной статье, и, будем надеяться, продолжим обсуждение этого движка в будущем.

суббота, 31 августа 2013 г.

Спортивный стартап

yurembo

В первую очередь, стартап предполагает под собой создание бизнеса, приносящего доход. Но в случае с российским спортом так, к сожалению, не получается. И, в рассматриваемом случае организаторы не предполагали какой-либо выгоды. Идея о создание спортивного сооружения там, где его сконструировали – идея настоящих энтузиастов своего дела.
В пригороде г. Чусового есть славный Красный поселок, где в конце ничем не отличающейся от других улице Карла Либкнехта есть болото. Тоже, ничем не отличающаяся большая лужа, где в раннем детстве автор с друзьями плавали на плотах. Однако, позже эта лужа совсем заросла травой, превратившись в болото. Оно находится в низине под горой, где некоторое время назад жители Красного поселка выращивали картошку.
Между тем, в настоящее время это место преобразилось: озеро было очищено, из него был удален всякий мусор и водоросли, вокруг - воздвигнуты спортивные сооружения: раскинута волейбольная площадка, поставлены батуты, построен трамплин с покрытием для скольжения лыж в теплую погоду. Кроме того, там был поставлен домик, служащий раздевалкой для спортсменов. Получилась настоящая спортивная база! Она получила созвучное с местом расположения название: водный трамплин «Красная горка».

Спортивная база водный трамплин «Красная горка»
 
Зимой озеро превращается в хоккейную площадку.
Изначально задумка о создании спортивной базы на Красном поселке принадлежала Руслану Шарифуллину, воспитаннику СДЮСШОР «Огонёк», ныне тренеру по фристайлу данной спорт. школы. По его словам: после начала воплощения идеи в жизнь, ему стали помогать друзья, и тогда реализация задумки пошла более динамично. Результатом чего стала “Красная горка”. Главным образом, цель создания водного трамплина заключалась в том, что прыжки с трамплина в воду лучший способ перехода для спортсменов из спортзала -  с батута на снег.
В конце лета текущего года (25-го августа) на водном трамплине прошли соревнования: первенство на приз МКК. Последняя - один из спонсоров - Межрегиональная кабельная компания. По словам организаторов: эти соревнования краевого уровня. Это было заметно и по второстепенным признакам: спонсорские эмблемы, логотип федерации фристайла.

Спонсоры
Федерация фристайла

В соревнованиях приняли участие 5 девушек и 18 юношей. Чтобы не толочь воду в ступе, эпизоды произошедшего лучше всего увидеть на видео:

Видео соревнований

Целью этих соревнований, как и любых других - выявление лучше всех подготовленного спортсмена. Поэтому каждый прыжок оценивался компетентным жюри, результаты объявлялись по громкой связи.
Старт соревнованиям был дан примерно  в 12 часов. Сначала выступали девушки; после - юноши, затем случилось награждение, где автор уже не присутствовал.


Первенство на приз МКК

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

суббота, 24 августа 2013 г.

Game development and OS research

 yurembo

Кроме того, что вчера случился мой 26-ой день рождения, исполнился месяц моего "перехода на темную сторону". Вопреки расхожему мнению, для меня "светлая сторона" - это IBM PC и Windows, включая весь софт от Microsoft: редакторы, компиляторы, etc. "Темная сторона" - это Unix-like, но, конечно, это не так плохо, однако, опыт и умения приобретаются в сравнении, и для меня ПО от Microsoft всегда преобладало, превосходя софт конкурентов.
И, вот, месяц назад, в связи с любопытными обстоятельствами на мой светлый путь Microsoft-фэна пала тень со стороны Unix-like. Между тем, open source уже длительное время играет для меня важную роль, а именно с того момента, когда Torque 3D стал опен сорсным. При этом у Microsoft есть целое направление, сайт CodePlex, где ведутся открытые разработки с использованием их ПО. Кстати, очень хороший сайт, можно найти кучу полезных компонентов для любой Microsoft-платформы.
Однако, отступление. Итак, месяц назад. Я впервые запускаю макинтош, реальный Mac OSX, не будем о грустном хакинтоше. Загрузилась система: что ж, интерфейс напоминает Gnome. Конечно, это наоборот: Gnome похож на Mac OS, но для меня исторически сложилось наоборот: сначала Gnome, затем Mac OS.
Спустя некоторое время работы в этой операционке, для меня развеялись все надуманные утверждения в пользу Mac OSX, как самой совершенной операционной системе в мире. При запуске большого числа процессов она так же тормозит, приложения подвисают, музыка прерывается (чего, кстати, уже нет в Windows). На том железе, на котором в большинстве своем работает Mac OSX, та же мною горячо любимая Windows будет просто летать. И в этом я смог убедиться. Есть 2 компа: mac и pc с одинаковым объемом оперативы, но разными камнями: pc с Core 2 Duo, mac с Core i7, на pc установлена Windows 8 Pro, на mac – соответственно, Mac OS X. И первая система работает гораздо шустрее, чем вторая! Это факт. Софт разный, но его предназначение одинаковое – разработка ПО + фоновая музыка.
Я не хочу сказать, что вынужденный переход на Mac OS X оказался скучным мероприятием, это однозначно интересно и познавательно, однако, сравнение, опыт.
Основными моими тулзами на маке, как, впрочем, многие последние годы на pc, являются компилятор и редактор кода. Воистину, благодатно, что на маке есть C++ компилятор! А то, его присутствие как-то не особо афишируется, на первом плане Objective C – аппловский конкурент C++. И они, действительно, считают их конкурентами? Мягко говоря, «выпендрёж» Obj C с квадратными скобками вызывает у меня рвотный рефлекс. Но Apple стремится к широчайшему распространению своего языка. Так, в их системе все фреймворки реализованы на Obj C, а C++ является, как бы простым дополнением для компиляции каких бы то ни было кроссплатформенных фреймворков и программ. Используемым на маке компилятором с языка C++ является llvm, допиленный в Apple open source проект. Скорость компиляции очень не удовлетворительна, то есть, компиляция очень медленная. Я даже не берусь сравнивать с каким-либо компилятором под Windows. Особенно, когда компилируются шаблоны, это вообще пипец! Операционка перестает отвечать на запросы пользователя, музыка перестает проигрываться и наступает зомби-апокалипсис :) . С Visual С++ ничего подобного на моем опыте не происходило: компиляция всегда проходит, как не особо нагружающий систему процесс, во время которого я могу выполнять другие задачи. А при полном перестроении гигантских проектов, например, таких, как Torque 3D нужно действительно много времени даже с VC++.
Среда разработки XCode очень не плоха: по некоторым сочетаниям клавиш вызывает ностальгию по старым добрым Багдадским продуктам. Редактировать код в ней достаточно приятно, дебаггер тоже довольно хорош. Однако, но это больше относится к компилятору, сообщения об ошибках компиляции и линкования все еще иногда ставят меня в тупик. Ну, привык я общаться с VC++ компилятором. Поэтому, чтобы «на своем» языке общаться с другим компилятором, очевидно, нужно время.
Один мой хороший знакомый говорит, что те, кто попробуют на вкус макинтош и прочувствуют работу с ним, переходят на него со своих излюбленных платформ, потому что он им нравиться… Как-то так он однажды сказал…
Что ж, я по-прежнему фэн Microsoft! И в свободное от работы время работаю на pc с Windows, разрабатывая игры на Торке, и, занимаясь написанием статей... Вот, как-то так…