Игровой конструктор, часть 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. |
Претенденты: Scrolls, Hearthstone, Card Hunter Пока ярые настольщики потрясают кулаками, доказывая, что глупо перекидываться карточками на компьютере вместо того, чтобы сдуть пыль с настоящих, популярность цифровых ККИ неумолимо…|Игромания...
07 07 2025 8:40:55
"...На самом деле программировать не сложнее, чем нарезать колбасу или написать письмо. Не сложнее, чем водить машину или пилотировать самолет. Главное - научиться..."...
06 07 2025 18:21:34
Мы продолжаем осваивать редактор уровней Aliens versus Predator 2. Хочется погулять на свежем воздухе, добавить на уровень движения в виде дверей и прочих радостей, не рассмотренных в прошлой статье...
05 07 2025 18:53:24
Определить жанр игры Grand Theft Auto очень сложно. На первый взгляд, это обыкновенные гонки на микроавтомобилях с видом сверху. При втором взгляде обнаруживается, что за вами кто-то гонится, а вы собираете бонусы и стреляете, т. е. пер...
04 07 2025 7:12:40
...два типа разгона: низкоуровневый и разгон на уровне драйвера. В современных картах используется второй тип, так что на нем и сконцентрируем внимание. Запускаем RivaTuner. Интерфейс управления разгоном располагается во вкладке «Системные настройки...
03 07 2025 23:14:34
"...Встанешь, бывало, еще до зари, прогреешь двигатели личного вертолета, взлетишь на крышу самого высокого небоскреба, дашь пару предупредительных очередей вниз - в скопление крошечных машин и маленьких людишек-муравьев... И давай направо и налево из гра...
02 07 2025 18:10:37
«…Abyssus — очень простая, но совершенная с технической точки зрения; Orochi — изящная мышь для ноутбуков, способная быть как проводной, так и беспроводной, и Naga — экзотическая семнадцатикнопочная мышь для заядлых игроков в MMORPG. Все грызуны обладают...
01 07 2025 16:16:20
Очень приятно, когда разработчики подходят к своему делу со старанием. Еще более приятно, когда они при этом делают симулятор. Wings Over Vietnam — пример того, что может получиться при таком подходе. &nb...
30 06 2025 4:51:53
«…В прошлый раз Mirror’s Edge стала для Electronic Arts одним из экспериментов, смелой идеей без должного внимания к гeймплею. Для успеха не хватило масштабности — остро ощущались окружающие героиню декорации. Перезапуск готов стереть этот местечковый ста...
29 06 2025 5:10:57
Тактическая ролевая игра от 1C уже в шаге от релиза. Впечатления по первым 10 часам: много диалогов, мало отличий между персонажами и почти нет багов!...
28 06 2025 8:49:47
«Игромания» отправила корреспондента прямиком в Бостон, где сейчас проходит выставка PAX East 2015. В ближайшие дни на сайте будут публиковаться материалы по мотивам поездки, но начнем мы, как обычно, с фотоотчета прямо в…|Игромания...
27 06 2025 6:11:51
Задать нам вопрос можно письмом на games@igromania.ru или смской на номер 1121. Сначала вводите слово #games и только потом — текст самого сообщения. Стоимость одного сообщения — около трех рублей. И этого тоже на…|Игромания...
26 06 2025 17:55:37
Unknown Fate — приключение от крошечной студии MarsLit Games. Вы, скорее всего, не слышали ни об игре, ни о студии. Работников в основной комaнде двое: братья Фарид и Карим Марсили. Несмотря на скромные ресурсы, к игре прикрутили поддержку…|Игромания...
25 06 2025 0:59:10
«Умом Россию не понять», — гласит популярная в народе поговорка. «Умом не понять и EA Sports», — добавим мы после тесного знакомства с творчеством студии. Пять с лишним лет создавать однообразные футбольные менеджеры (и не только менеджеры, и не только...
24 06 2025 20:30:56
У всех в детстве, скорее всего, была такая книга: стоило раскрыть ее, и картонные картинки складывались в объемный рельеф. Здесь все точно так же: мир — это сложенный лист бумаги; новые сектора открываются в прямом смысле этого слова, вы словно пере...
23 06 2025 5:32:13
«…Паркур, по нашим ощущениям, стал чуть более быстрым: Эцио больше не зависает на карнизах, по несколько секунд задумчиво раскачивая ногами, а, как натуральная мартышка, молниеносно прыгает, подтягивается, отталкивается ногами от стен и цепляется даже за...
22 06 2025 1:33:38
Внешне новые процессоры на ядре Prescott не отличаются от “старых”, на ядрах Northwood или Willamette. 2 февраля компания Intel объявила о выпуске нескольких новых процессоров. Однако помимо…|Игромания...
21 06 2025 12:31:55
Чем забавна 7.62, так это тем, что на одни и те же вещи можно посмотреть с разных точек зрения. Большинство событий, происходящих в игре, случаются для обеих сторон, только реакция на них совершенно противоположна. Одни предлагают взять поселение штурм...
20 06 2025 12:29:44
«…Один из главных плюсов Cowon 3D — всеядность. Плееру все равно, в каком расширении на него загружаются фотографии, видео или музыка. Мощный декодер и огромный набор кодеков позволяют кидать во внутреннюю память файлы любого формата. А если это видео, то...
19 06 2025 18:22:45
«…«гламур» — первое слово, приходящее на ум при взгляде на DiRT: Showdown, спин-офф прославленной раллийной серии Codemasters. Сельские гонки перенесли с грязных дорог Кентуки под своды живописного моста Golden Gate в Сан-Франциско и на шикарные улицы Май...
18 06 2025 21:16:12
«…Сколько видеоигр во вселенной Fallout существовало до выхода Fallout 3? Fallout, Fallout 2, Fallout Tactics… Ну, еще Van Buren, отмененный Black Isle Studios в 2003 году... Аркадную полу-RPG Fallout: Brotherhood of Steel не любят вспоминать даже гики, а...
17 06 2025 11:50:26
Бывают просто хорошие игры, бывают хиты, а бывают игры эпохальные. Великие, если хотите. Их величие не оспорит никто, даже если очень захочет. Ибо все уже записано в истории. Таких игр единицы. Но одна из них скоро придет к нам. "К нам" — значит "к писишн...
16 06 2025 21:24:35
24 часа в сутки я мысленно с вами. В остальное время со мной можно связаться, написав по адресу hot-line@igromania.ru или отправив SMS на короткий номер 1121 с префиксом hard (то есть в начале сообщения вы должны ввести слово hard и только потом,…|Игромания...
15 06 2025 13:44:19
При запуске рабочего стола всплывает ошибка “Unable to locate kernel component”. Текст ошибки: “wtKernel”. Также очень часто во время игр возникает подобное сообщение: “Инструкция по адресу 0x241734a5 обратилась к…|Игромания...
14 06 2025 18:36:27
Во что играли 5 лет назадUnreal Tournament 2004 Дата выхода: 2004Жанр: Ежегодный шутерИздатель/разработчик: Atari/Digital Extremes и Epic GamesВыпустив вслед за Unreal гениальный в плане сетевой игры Unreal Tournament, к 2003 году Клифф Блежински и…|Игромания...
13 06 2025 0:22:47
У первого творения Синдзи Миками, взлелеянного под крылом Bethesda, была масса технических недоработок и местами отвратительный гeймдизайн. При этом игра завлекала атмосферой и пусть вторичной, но любопытной историей — в итоге плюсы…|Игромания...
12 06 2025 22:27:19
Есть такие игры, после которых хочется встать, немного пройтись, отдышаться и дать вспотевшим рукам передохнуть. Есть игры, которые подкупают возможностью вытворять невероятно крутые вещи: отбивать пули взмахом катаны, уничтожать тысячи демонов,…|Игромания...
11 06 2025 14:43:19
«…крен в сторону Heroes of Might and Magic стал заметней. В первую очередь это касается боев. Войска бегают по полям сражений, вооружившись хорошо знакомой по «Героям» системой active-time battles: арена делится на гексы (10 на 14), особенности ландшафта...
10 06 2025 3:25:10
Нельзя сказать, что “Власть закона” стала шедевром и новым стандартом в мире походовых стратегий. Однако в жанре сейчас царит то самое безрыбье, на котором и paк немедленно обретает все свойства рыбы и начинает этим гордиться. Но даже этого не хват...
09 06 2025 21:37:54
Fatal1ty родился в Канзасе 26 февраля 1981 года. Никто не может представить свое детство без игр. Но Джонатан говорит, что игры забрали у него детство. С другой стороны, он никогда не увлекался сигаретами, алкоголем или наркотиками — и именно игры, по мне...
08 06 2025 0:20:49
Представляем вашему вниманию обновленный сводный список отечественных локализаций и проектов. Данная таблица состоит из двух разделов, которые, в свою очередь, разделяются на подразделы: 1) ПОСТУПИЛИ В ПРОДАЖУ. Сюда помещаются все те игры, котор...
07 06 2025 9:26:53
«…Игровой мир кажется огромным, хотя по факту он компактнее, чем Скайрим. Dragons’s Dogma скорее напоминает Gothic — интересно исследовать, но постоянно необходимо быть настороже, неаккуратных путешественников ждет мучительная cмepть от чего угодно…»...
06 06 2025 9:52:15
«…От ярких, живых джунглей не оторвать глаз. Засмотревшись на пейзаж и не справившись с управлением, мы случайно сносим примерно половину оказавшейся на пути деревеньки. Затем подрываем супертанк, берем штурмом гигантский авианосец — кажется, тебе снова ш...
05 06 2025 17:15:19
Перед вами обновленный список отечественных локализаций и проектов. Данная таблица состоит из двух разделов, которые, в свою очередь, делятся на подразделы: 1) ПОСТУПИЛИ В ПРОДАЖУ. Сюда помещаются все те игры, которые недавно поступили в продаж...
04 06 2025 4:11:31
Сыграем в картишки? Я побью твоего валета своим паладином 80-го уровня! [[BULLET]] Карты, деньги, два дpaкона — вот рецепт, по которому делается HEX. На «Кикстартере» раскручивается очередной громкий проект.…|Игромания...
03 06 2025 20:41:14
«…По сравнению со старшим представителем линейки GeForce GTX 470 потеряла слишком много в производительности — фактически, NVIDIA уменьшила мощность младшей платы на четверть. Правда, играть это не мешает. GeForce GTX 470 обеспечивает достаточную производ...
02 06 2025 13:29:12
Если вы хотите обзавестись хорошей экипировкой со старта игры в Rust, обратите внимание на зелёные карты доступа. За дверями соответствующего цвета вы найдёте не только лут, но и ключ-карты синего цвета, которые позволят получить снаряжение ещё…|Игромания...
01 06 2025 6:49:11
«…Бои в Dead Space 2 очень контактные — и в мультиплеере нет никаких поблажек. Несмотря на все ваши усилия, враги обязательно подберутся вплотную — придется биться врукопашную (к слову, комaнда «растоптать» тут и вовсе подвешена на отдельную клавишу). Кам...
31 05 2025 18:53:42
Когда поползли первые слухи о новой экранизации «Оно», многие были настроены скептически: мало того, что первоисточник — один из самых многослойных романов Стивена Кинга, так вдобавок и первая экранизация с Пеннивайзом…|Игромания...
30 05 2025 5:23:32
Масса разочарованных откликов и не слишком успешные продажи Worms 3D вызвали много споров о том, насколько оправдано применение пресловутого трехмерья в играх такого рода. И споров, заметьте, небезосновательных: 3D лишило обожаемых “Ч...
29 05 2025 10:47:53
За что, спрашивается, любим мы квесты от LucasArts серии Monkey Island, Day of the Tentacle и Sam&Max? Лично я, как и многие другие, люблю их за искрометный черный юмор, за бесконечную игру слов, пародии и т.д. И именно такой тон выбрали для с...
28 05 2025 4:36:26
«…Чтобы развязать себе руки, Бир перенес события романа, открывающего трилогию Forerunner, на десятки тысяч лет в прошлое — в ту эпоху, когда во вселенной безраздельно властвовали Предтечи…»...
27 05 2025 3:26:39
Немцы из Egosoft со своей X-серией в последние пару лет как-то незаметно стали главной надеждой покорителей виртуального космоса. Мир X3: Reunion продолжает жить богатой жизнью, в которой найдется место компьютерным космонавтам любого профиля...
26 05 2025 13:26:57
"Все-таки замечательная это вещь — виртуальная реальность", — думал Фрэнк Хиггинс, вспоминая вчерашний день. Он находился в секторе 42-16-3 на одной из опopных баз Второго Имперс...
25 05 2025 2:36:59
новые механики сетов — мироходец, племенной, столкновение, перевертыш, заступник, вызывание, укрытие, мародерство, упрочнение и сходство. Список впечатляет, не правда ли? Всего за полгода мы получили десяток механик и несколько серьезных измене...
24 05 2025 3:17:23
26 июля компания «Иннова» презентовала Crowfall — MMORPG, в которой сочетаются элементы стратегии, выживания и «песочницы». За разработку отвечает ArtCraft Entertainment, а также такие мастодонты…|Игромания...
23 05 2025 3:21:56
Дабы избежать постоянной пyтaницы с тем, к какой категории отнести ту или иную ссылку — к "Игровым ссылкам" или "Интересному в Сети", — начиная с этого номера, все линки будут публиковаться под общим заглавием "Интересное в Сети". Надею...
22 05 2025 22:24:49
Вторая мировая война… Для американцев она осталась таким потрясением, что они начисто забыли об участии в ней Советского Союза. Но это ничего, мы привыкли. В этом новом симуляторе представлено по три-четыре самолета от каждой из трех стран:...
21 05 2025 21:49:51
Все мы любим во что-то играть — в общем-то поэтому мы здесь и собрались. Одни предпочитают консоли, вторые PC, а третьи и вовсе поклонники мобильных платформ. Но начинали мы не с этого — в детстве у нас не было ни первого, ни…|Игромания...
20 05 2025 4:15:41
Инди-игры (да и не только они) редко могут позволить себе всё и сразу. Скажем, на огромный интересный мир, захватывающий сюжет и новаторские механики одновременно зачастую просто не хватает бюджета. Поэтому Haimrik от студии Below the Game делает…|Игромания...
19 05 2025 8:47:40
Еще:
Игры -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 ::