Игровой конструктор, часть 3. Иерархия классов и объектов
Продолжаем создавать по кирпичикам свою собственную игру. В прошлой статье мы прикрутили к трехмерному движку управление всеми мыслимыми и немыслимыми устройствами, а также разработали графический интерфейс. Напомню, что движок мы разpaбатываем с помощью Delphi и GLScene. Сегодня же мы займемся одним из самых важных моментов созданием иерархии классов и объектов движка, именно они лежат в фундаменте высокого игрового здания.
Ночной кошмар программиста
Прежде всего давайте выясним, зачем вообще нужна какая-то иерархия, система классов? Почему бы просто не писать движок, как пишется, и не заморачиваться какими-то иерархическими сложностями? Необходимо это для того, чтобы потом не было предельно сложно. В самой первой статье цикла я
|
Аналогия отнюдь не случайная. Разработка компьютерных игр процесс нелинейный. Как бы подробно не был написан дизайн-документ, уже в процессе работы над игрой в него придется вносить какие-то изменения, а значит переписывать уже написанный код или добавлять новое в модули, для этого не предназначенные. Причины могут быть самыми разными: дизайнеру или сценаристу неожиданно пришла в голову гениальная идея, которую надо непременно воплотить (тот факт, что для воплощения этой идеи надо переписать с нуля весь движок, обычно никого не волнует), изменилась конъюнктура рынка или используемые технологии уже устарели (они до релиза еще раз пять успеют устареть, но об этом мало кто задумывается на этом этапе).
Результат таких преобразований всегда один: непонятный код, состоящий из плохо стыкующихся кусков, странные баги, которые приходится отлавливать неделями, и бессчетные чашки кофе и упаковки димедрола, не способные более охладить кипящий разум всех программистов проекта. Но и это не самое страшное. Самое страшное потеря времени, а значит вновь умчавшиеся вперед технологии, вновь поменявшаяся конъюнктура рынка, и работу опять приходится начинать сначала.
Всего этого можно если не избежать, то по крайней мере скомпенсировать четкой и удобной иерархией классов и объектов игры. Тогда программисты смогут встраивать в игровой код любой степени завершенности новые возможности без опаски, что после этого работа пойдет наперекосяк.
По кирпичику да целый дом! Кирпичный дом значительно легче разобрать и переделать, чем какой-нибудь дворец с железобетонными элементами, отлитыми по спецзаказу. Такая гибкость нужна не только в строительстве домов, но и в строительстве трехмерных движков...
|
Первый, второй, десятый...
|
Одновременно может существовать только один объект этого класса, так как и игровой движок у нас один. Есть исключения, например dedicated сетевые серверные движки, но они и строятся по другим принципам. Особого смысла в реализации класса TEngine в нашем случае нет. Вы можете создать его как организующий элемент, чтобы вся система была стройной и однозначной. Но особой смысловой нагрузки он нести не будет. Ведь список объектов и все действия с ними “держит” класс TGLScene. Он в какой-то мере и будет самым верхним классом иерархии. Остальные поля и методы движка реализуйте как обычные переменные и методы главной формы.
Теперь разберемся с другими классами. Если вы плохо представляете себе структуру будущего движка, можете воспользоваться очень простой методикой. Напишите на листочке все игровые объекты в любом порядке (предметы, окружение, героев, любые другие объекты). Под каждым напишите список его свойств и методов. К примеру, какие поля могут быть у объекта Тролль в простом 3D-action? Жизни, броня (если есть), тип оружия, мана и доступные заклинания. А методы у него могут быть такими: Идти (в качестве параметра “направление”), Идти к (в качестве параметра “конечная точка”, здесь пригодятся алгоритмы поиска путей, о которых мы поговорим в одной из следующих статей цикла), Ударить (тип оружия или магии), Искусственный интеллект, Проверить столкновение с объектом (об этом мы также поговорим в одной из следующих статей ).
После того как вы распишите таким образом каждый игровой объект, вы обязательно заметите, что у многих объектов есть общие поля и методы. К примеру, поле Жизнь есть у всех живых существ, а поле Мана только у тех, кто обладает магией. А вот метод Проверить столкновение с объектом есть не только у живых существ, но и у многих неживых, но движущихся. К примеру, он будет у стрелы и у камня, если его можно метать. Если у группы классов есть одинаковые свойства и методы, в их основу надо положить отдельный подкласс.
Для тех, кто еще не очень хорошо ориентируется в наследовании классов, приведу код, который отражает эту иерархию в Дельфи. Естественно, все названия и тонкости реализации гипотетические. В вашем случае они могут быть совсем другими. Однако общий принцип прослеживается.
|
procedure CheckCollision(obj: TMovable); virtual;
end;
TLifeObject=class(TMovable)
procedure Go(direction:TDirection); virtual;
procedure GoTo(obj:TObject); virtual;
procedure AI; virtual;
public
life:integer;
end;
TBattleCharacter=class(TLifeObject)
procedure Attack(obj: TLifeObject); virtual;
end;
TMage=class(TBattleCharacter)
public
mana:integer;
end;
TTroll=class(TMage)
procedure CheckCollision(obj: TMovable); override;
procedure Go(direction:TDirection); override;
procedure GoTo(obj:TObject); override;
procedure AI; override;
procedure Attack(obj: TLifeObject); override;
end;
TAmmo= class(TMovable)
public
speed:integer;
attacktype:TAttackType;
power:integer;
end;
|
procedure CheckCollision(obj: TMovable); override;
end;
TSheep=class(TLifeObject)
procedure CheckCollision(obj: TMovable); override;
procedure Go(direction:TDirection); override;
procedure GoTo(obj:TObject); override;
procedure AI; override;
end;
TOrk=class(TBattleCharacter)
procedure CheckCollision(obj: TMovable); override
procedure Go(direction:TDirection); override;
procedure GoTo(obj:TObject); override;
procedure AI; override;
procedure attack(obj: TLifeObject) override;
end;
У каждого конкретного движка своя собственная, совершенно неповторимая система иерархии. Но... Есть несколько общих принципов создания удобной иерархии, которые используются разработчиками во всех качественных движках. При построении собственного игрового “двигателя” обязательно нужно иметь их в виду. ПРИНЦИП ПЕРВЫЙ. Если два класса, относящиеся к разным базовым классам, имеют одинаковые по смыслу и реализации свойства или методы, значит, вы что-то не так сделали. Необходимо пересмотреть всю систему и сделать ее не избыточной. ПРИНЦИП ВТОРОЙ. Пользуйтесь замечательным правилом Бритвы Оккама: не плодите сущностей сверх необходимости. Например, не стоит объединять всех игровых персонажей с зеленой чешуей в отдельный класс, основным отличием которого является свойство зеленочешуйчатости. Если только это свойство не ключевое для игры. ПРИНЦИП ТРЕТИЙ. Представьте себе, что вам нужно добавить в вашу игру: гиппогрифа, чемодан, танк со сменными колесами, всем живым существам признак наркотического отравления, изменить у всех объектов проверку столкновений с боксовой на полигональную. Если все эти вещи вы сможете сделать без изменения структуры иерархии значит, вы все сделали правильно. |
Полцарства за наследника
В коде, который мы только что рассмотрели, все методы, объявленные в родительском классе, переобъявляются в финальных классах. Причем в
|
Возьмем для примера метод Attack, который есть у тролля и у орка. Если подумать, реализация этого метода должна быть для них разной. Ведь орк атакует оружием, а тролль не только оружием, но и магией. Допустим, по нашей задумке тролль всегда атакует противника магией на дальних дистанциях, а оружием на ближних. Орк атакует только оружием на ближних дистанциях. В реализации метода Attack для этих двух персонажей будет общая часть (атака оружием) и части различные. Можно также сказать, что на ближних дистанциях тролль ничем не отличается от орка. Тогда атаку обычным оружием мы реализуем в методе Attack у родительского класса орка TBattleCharacter, а атаку магией реализуем в родительском классе тролля TMage. Причем у всех потомков TMage будет возможность драться как магией (так как эта возможность заложена в сам этот класс), так и обычным оружием (так как эта возможность присутствует у одного из предков TBattleCharacter). Допустим, метод Attack у TBattleCharacter уже реализован. Тогда метод Attack у всех магов, в том числе и у тролля, может выглядеть так:
|
begin
if DistanceTo(obj.AbsolutePosition)>100 then
AttackAsMage(obj); {атакуем магией}
else inherited Attack(obj);
end;
Предполагается, что AttackAsMage уже реализован. Обратите внимание на ключевое слово inherited перед повторным вызовом метода Attack. Это не рекурсия, как вы могли подумать, то есть метод не вызывает сам себя. Ключевое слово inherited указывает на то, что мы должны вызвать метод предка этого класса. Еще раз посмотрите на объявление метода Attack у класса TBattleCharacter и TTroll. Метод у TBattleCharacter помечен словом virtual, то есть он виртуальный, его можно перегрузить. Метод у TTroll помечен словом override, что и обозначает перегрузку. Итак, все эти три ключевых слова: virtual, override и inherited позволяют организовать иерархическое дерево методов. Таким образом, с помощью иерархии классов мы можем дать объектам не только общие свойства, но и общие участки кода, отвечающие за
|
Есть еще одно ключевое слово из этой же категории abstract. Если его поставить после объявления метода, который вы собираетесь перегружать, для него вообще не нужна реализация. То есть в классе будет только название метода, и больше ничего. Ну а его реализация или каскад реализаций вы сможете написать в классах-потомках.
У иерархической модели методов есть одно замечательное свойство, которое на первый взгляд неочевидно. На деле же это один из удобнейших приемов в объектно-ориентированном программировании. Рассмотрим все тот же пример с троллем и орком. Допустим, вы пишите искусственный интеллект для группы разных боевых существ. В какой-то момент игрок выделил рамкой свое могучее воинство и послал его в туманную даль бить врагов. В обычном случае вам придется для каждого существа в отряде вызывать метод Attack. Но так как эти существа принадлежат десяткам разных классов, вам придется повторить это действие для каждого типа существ в отдельности! А вот как этого же можно добиться с нашей системой. Предположим, что Creatures это список всех существ нашего отряда.
For x:=1 to Creatures.Count do (Creatures[x] as TBattleCharacter).Attack(obj)
Всего одна строчка! Игра берет самый первый объект списка Creatures, приводит его к классу TBattleCharacter (мы имеем полное право так сделать, потому что все объекты нашего списка являются потомками TBattleCharacter в том или ином поколении), и у приведенного объекта вызываем метод Attack. Далее игра для каждого типа объектов проходит вверх по дереву его предков, доходит до него самого и вызывает его личный метод Attack. То есть эта строчка вызовет разные методы Attack для тролля и орка. Каждому свой. Мораль: тщательно планируйте иерархию классов, чтобы однотипный код перекрывался на разных уровнях дерева классов. Тогда несколькими строчками кода вы сможете сделать столько всего, на что при обычном подходе ушла бы не одна страница.
Перепишем всех! Когда мы посылали все могучее виртуальное воинство на бой одной единственной строчкой, то использовали в ней список Creatures. В нем хранятся все игровые персонажи. Давайте разберемся, что это за звери такие списки. Списки вещь это крайне удобная. В них можно хранить любые объекты любых классов и оперативно получать к ним доступ, сортировать по какому-то критерию, перебирать... За списки вообще в Delphi отвечает класс TList. Есть несколько классов для специфических списков, но нам они пока не интересны. Вот как можно объявить список Creatures: Var Creatures:TList; Теперь с помощью комaнды Add можно добавить в список элементы. Например, у нас есть объект Troll класса TTroll. Тогда следующей строчкой мы добавим его в список: Creatures.Add(Troll); А вот так мы достанем его из списка, зная его индекс x: (Creatures[x] as TTroll) Ключевое слово as универсальный преобразователь типов. Однако пользуйтесь им только тогда, когда точно уверены, что преобразуемые типы совместимы. Например, находятся в связи предок-потомок. Если вы попробуете привести один тип к другому, совершенно с ним не совместимому, ничего хорошего не выйдет. Зная индекс элемента, можно удалить его из списка: Creatures.Delete(x); Ну а что делать, если у вас есть объект и вы хотите получить его индекс в списке? Воспользуйтесь этой комaндой: x:=Creatures.IndexOf(Troll); После выполнения этой строчки в x окажется индекс объекта Troll. Количество элементов в списке можно прочитать из его свойства Count. Как перебирать все объекты списка, вы уже знаете. Напоследок одно важное замечание. В списке не хранятся сами объекты, а только указатели на них. Все манипуляции с элементами (добавление, удаление, сортировка) никак не отражаются на самих объектах. То есть списки просто удобный инструмент для структурированного хранения информации. |
Иерархия GLScene
Принципы, изложенные выше, активно использовали разработчики GLScene. Эта графическая библиотека имеет крайне продуманную и удобную иерархию классов. Причем дерево классов довольно развесисто. Самые длинные цепочки наследования содержат до десяти уровней! А базовых классов, над которыми строятся все остальные, не больше десятка (всего классов больше трехсот!). Давайте рассмотрим несколько наиболее интересных ветвей этого могучего дерева. Это поможет лучше понять принципы наследования. Кроме того, многие родительские классы тех классов, которыми мы часто пользуемся, интересны и сами по себе. С их помощью можно реализовать многие вещи, недоступные на самом верхнем уровне иерархии.
|
Давайте от TGLUpdateAbleComponent свернем в другую сторону к классу-потомку TGLBaseSceneObject. Это базовый класс для всех видимых и многих невидимых классов GLScene. Он добавляет к предыдущим классам целую гроздь важнейших свойств и методов: динамическое изменение иерархии, понятие координат, векторы направления, поворота, масштабирования, сортировка и множество геометрических операций, например расстояние до другого объекта, и многое другое. Если вы хотите написать свой собственный компонент для GLScene (а рано или поздно такая потребность у вас обязательно возникнет), начинать надо именно отсюда.
|
TGLFreeForm класс, реализующий весь функционал предыдущих классов, который позволяет вам загружать и использовать в GLScene объекты многих форматов трехмерной графики, например популярного пакета 3D Studio. Именно он поможет нам создать большинство статичных (неанимированных) объектов дома и деревья, столы и стулья, камни и космические корабли.
Мы проделали долгий путь, но он окупился сторицей. По пути мы миновали множество развилок. Если бы мы хоть раз свернули, то пришли бы к совсем другому объекту. Как только освоитесь с GLScene, обязательно загляните в его исходники это настоящий кладезь мудрости и интересных приемов программирования.
И напоследок важнейший совет. Когда будете строить свою систему иерархии, все визуальные объекты делайте надстройками над классами GLScene. То есть вы как бы сажаете сверху пирамиды GLScene пирамидку своего трехмерного движка. Так они смогут работать в тесной связке, максимально эффективно. Так вы сможете писать гораздо меньше кода. Например, если вам нужно создать классы для тех же статичных объектов, делайте их общего родителя потомком TGLFreeForm. А если вы хотите создать классы анимированных объектов, обратите внимание на стандартный класс TActor. Я верю: когда код вашего движка и код GLScene сольются в едином экстазе, на свет появится Игра с большой буквы.
Динамические массивы В Delphi есть и другие способы структурированного хранения информации. Списки вещь замечательная, но только если вы работаете с классами. Конечно, в список можно добавить любой объект, любую переменную, а точнее указатель на них. Но вот работать с ними так же просто не выйдет. Вам придется работать с указателями. Ничего сложного в этом нет, но, по статистике, именно в кусках кода, связанных с указателями, начинающие программисты делают максимальное количество ошибок. Но есть другой способ хранить информацию в одном месте. Способ этот идеально подходит для структур и переменных одного типа. Это динамические массивы. С обычными массивами вы уже знакомы. Динамические массивы то же самое по сути, но вот число элементов в них может быть любым. Оно также может меняться во время работы программы. Объявляется динамический массив не просто, а очень просто: Var A:array of integer; Вот так мы объявили динамический массив A из целых чисел. Изначально его длина равна нулю. Чтобы добавлять в него элементы, вам для начала нужно расширить его до необходимых размеров. Вот как это делается: SetLength(A,10); Так мы выделили память под 10 элементов. Работайте с ячейками этого массива точно так же, как и с ячейками обычного, например: A[1]:=5; Не забудьте только, что у динамических массивов индекс первого элемента равен нулю, а последний на единицу меньше длины. Кстати, о длине. Получить ее можно с помощью комaнды Length. Например, так вы сможете заполнить весь массив одинаковым значением: For x:=0 to Length(A)-1 do A[x]:=5; В отличие от списка, в динамическом массиве хранятся не ссылки на значения, а сами значения. И они никак не связаны с тем местом, откуда вы их получили. Например, после выполнения строчки A[0]:=B; переменная B и первая ячейка массива A будут иметь одинаковое значение, но жить будут совершенно независимо. Вы можете также объявить многомерный динамический массив, например так: A:array of array of array of integer; Это трехмерный массив целых чисел. Так его можно проинициализировать: SetLength(A,10,20,30); Ну а так получить доступ к конкретной ячейке: A[1,2,3]:=5; В целом динамические массивы крайне удобный контейнер для хранения однотипной информации. |
* * *
Мы слепили еще один кирпичик нашей игры. В следующем номере вы узнаете то, что хорошо бы знать маститым разработчикам игр самых разных жанров, но прежде всего стратегий реального времени: как правильно искать пути. Чтобы колесницы, отправляясь из Африки в Европу, не попали ненароком в Антарктиду, а какодемон не запутался в четырех стенах подземелья и не проворонил жаждущего его убить героя.
На наших CD/DVD На наших дисках выложена последняя версия движка GLScene. |
Тали'Зора — Mass Effect Открывает сегодняшнюю подборку редкая гостья в этой рубрике: скрытная и в буквальном смысле хрупкая (да настолько, что ей нигде нельзя снимать ни шлем, ни защитный костюм) Тали'Зора из оригинальной…|Игромания...
26 04 2024 2:36:42
Проект вышел удивительный. Некрасивый, но с высоким бюджетом. Мopaльно устаревший, но с трупами, которые честно падают на холодную землю согласно заветам товарища Ньютона. Наконец, тупой как пробка, но невероятно затягивающий...
25 04 2024 15:30:17
По спецификации IBM PC, единственный инструмент, необходимый для манипуляций с железом, — отвертка. Про паяльник там и слова не сказано. Но, тем не менее, пользоваться им порой приходится. Почему? Во-первых, разработчики спецификации не предусмотрели неко...
24 04 2024 20:14:50
The The 82nd Airborne является прямым потомком The 101st Airborne и повествует о славных стычках 82-й воздушно-десантной дивизии с фрицами в Нормaндии немного к северо-востоку от дивизии 101-ой, не менее воздушно-десантной. Это примерно как если бы русски...
23 04 2024 21:15:51
Близкие по духу Save the Date! Katawa Shoujo ***ogue: A Hate Story Holiday Star Х. Шмидт, Р. Пролл, «Гoлyби. 300 пород для выставок и разведения» «Мне нравится, как тут прописаны хаpaктеры, — говорит С.,…|Игромания...
22 04 2024 2:31:22
"Bethesda поступила оригинально: вопреки всем традициям и канонам, она еще до релиза игры выпустила... редактор игрового мира. The Elder Scrolls Construction Kit..."...
21 04 2024 23:24:23
Drakan: Order of the Flame Разработчик: Surreal Software Издатель: Psygnosis Жанр: 3D-action/adventure Требования: Р-166,16 Мб, рек. 3D-уск. Наконец-то близок к завершению очередной «наш ответ тете Ларе» со стороны Psygnosis - многообещающая трехмерна...
20 04 2024 20:30:44
После тестов нескольких супертонких ноутбуков с их компромиссами по питанию, частотам и охлаждению мы протестировали настоящего бойца: толстую, тяжёлую семнашку, которая жрёт 380 Вт, держит i9 на 4,8 ГГц, позволяет RTX 2080 работать на двух…|Игромания...
19 04 2024 13:59:50
Признаюсь, очень хотелось начать словами "Иногда они возвращаются". Однако после некоторого размышления понял, что это неправда: создатели Gothic никуда и не уходили. Более того, они даже не собирались выпускать первую часть Gothic в тот срок, в который...
18 04 2024 14:55:49
Даже самые засекреченные агенты не бывают засекречены совсем уж намертво. Информация — такая штука, которую очень трудно на веки вечные надежно упрятать в глухой бункер, она всегда найдет щелочку, чтобы просочиться. Вот и…|Игромания...
17 04 2024 5:12:21
Среди компьютерных карточных игр Duel of Champions — одна из самых навороченных, и за год ее механика только окрепла. Однако не скажешь, что она любит новеньких. Новичкам стараются помочь — по-разному, — но избежать нервотрепки все…|Игромания...
16 04 2024 19:43:53
К традиционным номинациям ("Дешево и сердито... Категория меньше 500$", "Cмepть тормозам... Категория меньше 1000$" и "Тебя я видел во сне... Категория больше 1000$" на процессорах AMD и Intel) добавилась еще одна: "Займи, но купи"....
15 04 2024 16:42:38
В середине февраля «СофтКлаб» и Bethesda провели закрытую презентацию фантастического экшена Prey. На ней нам показали самое начало игры и позволили познакомиться с основными механиками. Но дальше первых уровней так и не пустили.…|Игромания...
14 04 2024 20:40:20
Человечеству, видимо, свойственно стремиться куда-то ввысь и вдаль. Паровозы и пароходы, лишь недавно бывшие последним словом индустрии, уступили место тепловозам и теплоходам, автомобили успевают мopaльно устаревать до окончания их гарантийного срока. О...
13 04 2024 3:40:42
Жанр: триллер, боевик Режиссёр: Стефано Соллима Сценарий: Тейлор Шеридан В ролях: Бенисио дель Торо, Джош Бролин, Изабела Монер Премьера в России: 27 июня 2018 года Возрастной рейтинг: 18+ После похода на второго Sicario я несколько дней пытался…|Игромания...
12 04 2024 21:41:20
«…Для фанатов StarCraft 2 у Blizzard в этом году не было припасено никаких громких анонсов. Вместо этого компания сфокусировалась на том, чтобы дать максимальному числу людей поиграть в актуальный билд Heart of the Swarm. И рассказать о том, какие изменен...
11 04 2024 2:55:31
Артур Масс, автор Игромании Любитель JRPG, запойных марафонов в игры по 12+ часов и военных фильмов. Древнейшая империя кхемри, чьи правители когда-то владели большей частью Южных Земель и Старого Света, ныне превратилась в безжизненную пустыню.…|Игромания...
10 04 2024 1:22:36
«…Если описывать OLDI HOME 336 одной фразой, то получится что-то вроде «отличный компьютер для работы/учебы/игр». OLDI Computers здорово сбалансировала систему. Мощный процессор справится с тяжелыми приложениями вроде 3DS Max или Photoshop, а видеокарта п...
09 04 2024 0:34:45
"В прошлой статье вы узнали о форматах файлов, полезных игроразработчику. Создав все трехмерные модели, текстуры и курсоры для своей игры, вы обязательно зададитесь вопросом, где все это хранить..."...
08 04 2024 18:22:38
...сочетание очень эффективного охлаждения с умеренным уровнем шума. Система с мощной помпой и большим радиатором потянет не только процессор, но также чипсет, видеокарту и, например, жесткий диск. Один раз наполнил, собрал и забыл. Главное, хотя бы раз в...
07 04 2024 19:49:30
Признайтесь, ведь не раз во время игры в раллийные симуляторы в вашу голову приходил вопрос: «боже мой, и это они называют бездорожьем?». Действительно, куда американским хайвеям, испанским горным серпантинам и немецким автобанам до...
06 04 2024 10:15:32
В 1995 году Microsoft дала начало новой тенденции в мире скрытых возможностей операционных систем. Microsoft оснастила новую операционную систему множеством новых настроек, и пpaктически все, что можно было настроить, стало настраиваемым. Официально все э...
05 04 2024 12:19:31
...чистой воды зомби-хоррор: селяне ломают двери, бьют окна и пытаются пролезть внутрь. Пока вы в панике двигаете шкафы и серванты, раздается жуткий звук: кто-то завел бензопилу. Ты пулей бежишь наверх, опрокидываешь приставленную к окну лестницу вместе с...
04 04 2024 3:31:13
Уверен, лишь немногие из вас хорошо знакомы с серией Ace Combat за авторством студии Project ACES. Но те, кто всё же знаком, знают, что это один из самых умопомрачительных экшенов про современную авиацию. Хоть и не всем понравились последние части,…|Игромания...
03 04 2024 6:15:52
...проклятые кролики несколько раз доведут вас до истерики, а через пару часов вы будете уже не смеяться, а лишь беспомощно хрипеть и похрюкивать. Эта игра обладает прямо-таки гипнотическим свойством, и даже после того как вы пройдете ее вдоль и поперек,...
02 04 2024 17:50:32
как, например, использовать сразу несколько поисковиков и объединить их результаты в один? Или найти какой-то определенный тип файлов? Оказывается, очень просто: бесплатного софта для таких задач создано немалоНапример: Search+, Copernic Agent Basic, WinM...
01 04 2024 10:31:30
«…Действие Wasteland 2 развернется все в том же альтернативном мире, где в 1998-м разгорелась ядерная война между США и СССР. И мы снова играем за рейнджеров Пустоши, выживших и отстроивших свою общину в бывшей федеральной тюрьме на юго-западе Америки…»...
31 03 2024 12:34:33
Порадовало Огорчило запыленный инвентарь и излишняя акробатика пошли под нож; минимум изобразительных средств дает максимум выразительности картинке игры; у звукового дизайнера определенно прекрасный вкус; подлинные фотографии и документы…|Игромания...
30 03 2024 3:46:10
Игру ждали. Не то чтобы все и упopно... Но надежды возлагали большие. Когда появились первые ролики, у многих отвалились челюсти. Дальше — больше. После премьеры на E3 2004 один весьма уважаемый западный сайт вручил игре награду “E3 2004 Biggest PC...
29 03 2024 7:57:23
Dark Sector — сын ошибок трудных. Этот долгострой, зародившийся в начале нового тысячелетия, некогда стартовав как космический stealth-action, постепенно преобразился в нечто среднее между Gears of War и Resident Evil 4, сменив декорации далекого...
28 03 2024 21:30:12
Пришло время пройтись по самым значимым событиям 2018 года и вспомнить всё то, что оставило свой след в мире видеоигр. Игромания подводит итоги года: лучшие игры 2018-го! Нашествие королевских битв В 2017 году королевские битвы изрядно встряхнули…|Игромания...
27 03 2024 1:54:51
...выпустили третью «заплатку», в которую был встроен полноценный редактор карт для пятых «Героев». Пока программа доступна только на английском языке (подробный мануал — на нем же), но в самом ближайшем будущем Nival собирае...
26 03 2024 0:28:34
В совсем недалеком будущем профессор психиатрии мистер Рейч изобрел источник бесконечной энергии. Поначалу никто не обратил на него внимания, но спустя несколько лет технология стала известна обществу. Ученые серьезно взялись за бесценное изобретени...
25 03 2024 21:45:33
...раскрашенные в кислотные цвета объекты переливаются всевозможными оттенками, золотые взрывы сопровождаются чуть ли не фиолетовым свечением и так далее. Учитывая запредельную плотность местного экшена, изо всей этой стробоскопической центрифуги хочется...
24 03 2024 13:35:32
Море юмора, задачки самой разной сложности, различные тактики прохождения. Если вы не знаете, что такое Tower Defense, то это замечательный повод познакомиться. И что особо примечательно — в отличие от многих аналогичных игр, у нее есть лицо. И неважно, ч...
23 03 2024 8:29:15
"...С одной стороны - вылизанное до зеркального блеска графическое исполнение, голливудский размах декораций и постановки действа, с другой - настолько небрежная начинка, что за Ричарда Левелорда и его подшефную компанию делается как-то неловко..."...
22 03 2024 8:40:25
Здравствуйте, уважаемый Дмитрий Горячев! Пишу я вам вот почему: я переформатировал жесткий диск и загрузился с заранее созданной загрузочной дискеты Windows. Но почему-то загрузочная дискета никак не может обнаружить…|Игромания...
21 03 2024 14:34:32
Гипотетическая ситуация: если вдруг на каком-нибудь экзамене вам попадется вопрос «Типичные признаки японского разработчика видеоигр» (ну, мало ли) — вспомните, пожалуйста, про маленькое подразделение в компании Atlus, отвечающее…|Игромания...
20 03 2024 12:15:50
«…По сути, Elements of War представляет собой популярную стратегию World in Conflict, к которой прикрутили погодное супероружие. По ходу дела вы сможете захватить образцы экспериментальной техники и начать строить из себя не то бога, не то мелкого беса ве...
19 03 2024 18:39:37
Эпических масштабов проект с претензиями на звание «нового Halo» с треском провалился в продаже. GlyphX Studios, всю сознательную жизнь создававшие заставки для высокобюджетных блокбастеров, собрались вдруг сотворить собственного колосса. По этому повод...
18 03 2024 0:59:19
Dishonored: Death of the Outsider — это самостоятельное дополнение для Dishonored 2. Для него не нужна установленная основная игра, поэтому покупать его можно отдельно. Для фанатов серии ситуация непривычная: похожие аддоны для…|Игромания...
17 03 2024 14:58:51
"...Изучение опыта последних военных конфликтов с участием США показывает, что армия этой страны все чаще использует абсолютно новую тактику ведения боевых действий..."...
16 03 2024 22:43:44
«…выполнять задания просто интересно. Миссии Леонардо — потому что в них дают поуправлять деревянным танком, деревянной paкетной гондолой и деревянным бомбардировщиком. Город хочется восстанавливать, потому что, как и деревня Монтереджиони из второй части...
15 03 2024 2:53:50
► Игры '2013 Самые ожидаемые игры 2013 года Время: 23:28 Мы опросили всех редакторов — какие десять игр вы ждете в 2013 году? Собрали в единую таблицу и вычеркнули те проекты, за которые проголосовало не больше одного…|Игромания...
14 03 2024 22:50:45
«…Здесь есть и динамично развивающаяся история, изобилующая лихими поворотами, и детективная интрига, и множество фирменных шуточек в исполнении Дрейка и Салли. Конечно, оружие они пускают в ход куда реже, чем в играх, но для книги это вполне логично. А в...
13 03 2024 19:31:58
все плохие фантастические боевики сразу. Когда суровый мужчина в развевающемся красном плаще и хоккейном шлеме (!) произносит пафосную речь, а затем уносится в подворотню на футуристического вида мотоцикле (точь-в-точь как у одного из героев мультсериала...
12 03 2024 5:47:36
Вечнозеленые “Дешево и сердито... Категория меньше 500, “Cмepть тормозам... Категория меньше 1000, “Займи, но купи... Категория больше 1000 и — “Тебя я видел во сне” (цена не ограничена)....
11 03 2024 14:20:24
Компьютерная графика всё активнее захватывает кинематограф, наводняя экраны эффектными кадрами, не отличимыми от реальности. Но тем ценнее cyмacшедшие трюки дублёров!...
10 03 2024 23:22:54
Увидев название игры, многие из игроманов, наверное, подумают: “Похоже это один из первых клонов игры Armor Command”. И зря, потому что Battle Zone – продукт совершенно особенный и оригинальный. Здесь вы не найдете стратегию в чистом виде, как в Arm...
09 03 2024 13:31:40
На этой гасиенде господина Клэйтона в поте лица пашет ваш друг Сэм. Здание штурмовать не надо, а с охраной придется повозиться. Преданье старины глубокой гласит, что в Нью-Мехико жили-были бедные мексиканские крестьяне и...
08 03 2024 21:28:15
Еще:
Игры -1 :: Игры -2 :: Игры -3 :: Игры -4 :: Игры -5 :: Игры -6 :: Игры -7 :: Игры -8 :: Игры -9 :: Игры -10 :: Игры -11 :: Игры -12 :: Игры -13 :: Игры -14 :: Игры -15 :: Игры -16 :: Игры -17 :: Игры -18 :: Игры -19 :: Игры -20 :: Игры -21 :: Игры -22 :: Игры -23 :: Игры -24 :: Игры -25 :: Игры -26 :: Игры -27 :: Игры -28 :: Игры -29 :: Игры -30 :: Игры -31 :: Игры -32 :: Игры -33 :: Игры -34 :: Игры -35 :: Игры -36 :: Игры -37 :: Игры -38 :: Игры -39 :: Игры -40 :: Игры -41 :: Игры -42 :: Игры -43 :: Игры -44 :: Игры -45 :: Игры -46 :: Игры -47 :: Игры -48 :: Игры -49 :: Игры -50 :: Игры -51 :: Игры -52 :: Игры -53 :: Игры -54 ::