Цикл игры


Содержание

Game Loop, Главный игровой цикл: рассуждения и непонятности.

Здравствуйте.
Главный цикл игры или Game Loop — это основа, фундамент игры. Без него не может быть и игры.
Поэтому его создание — это необходимый этап написания игры, а правильное создание цикла — это еще и полезный этап.

Чтобы написать хороший ГЛ, начал читать по этой теме. Прочитав некоторый материал, я пришел к непониманию некоторых моментов. Их я бы и хотел обсудить.
Вот основные источники (http://habrahabr.ru/post/136878/) и (http://live13.livejournal.com/469940.html). Можно заметить, что материал в них похож, возможно даже, что их писал один человек.

И вот, какие непонятки у меня появились.
___________________________________________
Рассуждение 1. Предсказания.
Особенность такой организации заключается в том, что вызов рендера происходит «между» вызовами обновления. И, чтобы картинка была плавной, мы применяем интерполяцию и предсказания.
Пример с пулей, что указан в источнике. Сказано, что надо «предсказывать» положение объекта и вычислять его положение в тик+интерполяция. НО!
То, что мне кажется непонятным, странный и даже неприемлемым:
1) для того, чтобы сделать предсказание, надо высчитать положение пули в какой-то промежуточный момент времени. Высчитать положение.. Высчитать.
Стойте, высчитать — это же прерогатива функции update(). То есть мы помещаем в рендер какую-то логику. Во-первых, мы дублируем логику, а дублирование какой-то подпрограммы — это плохо. Ну ладно, дублирования легко избежать.
Но, во-вторых. Мы теряем тогда различия между Апдейтом (логикой) и рендером (отрисовкой) — мне кажется это неправильным.
2) чтобы провести интерполяцию, нужно, чтобы этот процесс был возможен. В приведенном примере с пулей интерполяция всего лишь формула пути. Но в общем смысле мы должны изменять состояние. А это — процесс сложный, а может даже и невозможный для какого-то момента.
3) в примере используется предсказание только одной пули, а если объектов — 1000. И каждому надо сделать свое предсказание. Получается, что в рендере мы делаем еще один Апдейт. А это итак плохо (см. п. 1), так мы еще и дополнительный тяжелый апдейт делаем.
А смысл тогда предсказания, если можно сделать некий апдейт и тут же начать отрисовывать. То же самое, что и внутренний апдейт, названный предсказанием.

Вывод: предсказание странная штука. И не нужная. Идеал: на один апдейт — один вызов рендера. Рендер же должен отрисовывать всегда статичное состояние. От вообще должен быть тупой — он не должен ничего соображать, только рисовать то, что ему сказано.

Рассуждение 2. Update(delta).
Как можно заметить, везде в статьях пишется только о update() — без параметров. Единственный пример, где есть параметр — и там говорится о «взрыве» вычислений.
А я вообще не понимаю, как апдейт может жить без дельты. Ибо обновление — это состояние + пересчет его изменения на момент (state_time+delta).
Тут непонятны сразу две вещи:
1) откуда взяться взрыву?
2) почему апдейты живут без дельты?
По первому: почему это должен произойти «взрыв»? Ведь мы же не в будущее заглядываем? То есть частый вызов функции update(delta) должен привести к более точному просчету (без учета набегающей ошибки) — и только.
В общем (представляя, что ошибки представления данных нет) получаем, что единственной проблемой вызова апдейта с дельтой — это его бессмысленность: если рендер не успеет отрисовать состояние игры до вызова следующего апдейта, то это состояние просто пропадет. И можно было бы сразу вызывать update(delta1 + delta2).

Вывод: совершенно неясно, почему везде пишутся апдейты без времени. Лично я вообще не вижу работу программы (в частности функции апдейт) без передачи туда дельты.
___________________________________________

Мне кажется, что это правильные замечания.
Прошу тех, кто уже разрабатывает игры, помочь разобраться и составить действительно верный и эффективный игровой цикл.

PS: с вашего разрешения, я бы хотел создать еще тему с обсуждением разбиения программы на несколько потоков, ибо там тоже некоторые моменты для меня не совсем ясны и с ними согласен.

Ух. тема довольно обширная, а писать много мне не охота. Т.к. сам занимался этими вопросами недавно, могу проконсультировать, но только по скайпу. Если будет желание — пиши в ПМ.

>Можно заметить, что материал в них похож, возможно даже, что их писал один человек.
Это переводы вот этих статей:
http://www.koonsolo.com/news/dewitters-gameloop/ (автор: Koen Witters)
http://gameprogrammingpatterns.com/game-loop.html (автор: Bob Nystrom)

>[b]Рассуждение 1. Предсказания.[/b]
Идея предсказания, насколько я себе представляю, — как раз втащить в render() товсем тупую экстраполяцию (или интерполяцию), которой не нужен полноценный update(), но которая смотрится сильно лучше, чем ничего. Т. е. без всякого:
>Но в общем смысле мы должны изменять состояние.
Впрочем если мы может достичь:
>Идеал: на один апдейт — один вызов рендера.
и быть уверенными, что оно работает как часы и render’ит каждые 1/60 с (например), тогда, наверно, действительно, предсказание ни к чему.

>[b]Рассуждение 2. Update(delta).[/b]
>Как можно заметить, везде в статьях пишется только о update() — без параметров.
Да вроде обе статьи приводят примеры с дельтой, и говорят, почему это сомнительная идея.
Если delta фиксированная, то и передавать её (явно) особого смысла не видно.
>почему это должен произойти «взрыв»? Ведь мы же не в будущее заглядываем?
Не понял.

А взрыв, по-моему, более вероятен для больших delta. Нарушился где-нибудь критерий Куранта — и привет.
Впрочем, если внутри update(delta) устроен как «вызвать сколько нужно фиксированных обновлений» то одно и то же.

Ну и кроме «более точный», есть ещё такой критерий, как «одинаковый». Небесполезный для сетевой игры и реплеев, как я представляю.

Странные статьи. Ощущение, что человек только начинает программировать и делает для себя «открытия». Очень путанные и возможно даже не верные.
Игр без отработки дельты времени не видел. Работающих не видел, а вот переделывать модули, где дельты не было, приходилось. Так, эти модули не просто так переделывать поручали, ибо они не работали как надо.
Запаздывание менее чем на одну двадцатую долю секунды разве нуждается в экстраполяции? Где задержки больше? Если только у вас синхронная работа с сервером или вы по глупости физику в другой поток вынесли — тогда да, может быть. Есть еще и быстродвижущиеся объекты, типа пуль, может только о них речь? Ну так, их моделируют иначе, отрезками траектории, а не фиксированными положениями в момент просчета.

Поправка: Исходников не видел, а как игрок играл в одну, где скорость передвижения зависела от фпс, что очень удивило, ибо это был первый масс эффект, вроде как игра солидная.

Vhodnoylogin
> Мы теряем тогда различия между Апдейтом (логикой) и рендером (отрисовкой)
Не, суть экстраполяции в том, что точность её результата не зависит от дельты. Например, если ты делал основной апдейт сначала 60 раз в секунду, а затем стал 30, то если в игре есть хоть какое-то подобие физики, это обязательно почувствуется. А для интерполяции-экстраполяции пофиг, на какую величину её применять — там нет ускорения, нет сил и столкновений, просто линейная скорость. Ну или движение по какой-то фиксированной траектории.

>Вот основные источники (http://habrahabr.ru/post/136878/) и (http://live13.livejournal.com/469940.html).
То что там написано хорошо подходит для несложного проекта. С другой стороны статья должна быть понятной. А на сложном проекте понятную статью написать не просто. Что мне не хватило в этой статье так это распределение ресурсов, погрузка уровней. Много поточность. Всё это закинуто в game_update().

>Рассуждение 1. Предсказания.
>1 Мы теряем тогда различия между Апдейтом (логикой) и рендером (отрисовкой) — мне кажется это неправильным.
Я нигде не нашёл такого диссонанса в статье. Если рассуждать в данном ключе то там речь шла о том, что на разных ЭВМ и на одной но с разным количеством объектов на сцене при условии что рендер работает на своём пределе появится разность в времени отрисовки кадра. Чтобы человек не ходил то быстрее то медленнее, он предложил воспользоваться таймером реального времени, чтобы объект класть в траекторию.

>2 А это — процесс сложный, а может даже и невозможный для какого-то момента.
автор не предлагает считать систему дифференциальных уравнений для каждого кадра. Формула может быть и эмпирической, лишь бы было красиво. Пример с пулей не совсем удачен на мой взгляд либо автор подразумевал какой то контекст.

3 Повторение 1. Нет никакого двойного просчёта. Есть один просчёт на конкретную единицу времени и есть время рендера. Если ЭВМ не справляется с рендером, есть смысл задуматься об оптимизации а затем и упрощении этого рендера и формул, процессов.

Вывод. Об этом нужно почитать из других источников, где тоже самое описано другими словами.

>Рассуждение 2. Update(delta).
из статьи

Статья у него кривовато написана. Он слишком много подразумевает. Как видно он всё-таки использует время для расчёта апдейта анимации и положения объектов. Всё что выше написано это пример того чем плох или хорош тот или иной вариант. А также множество упрощений и подразумеваний.

Рефакторил сиё у одной большой игры.
На этапе главного цикла — вообще ни о никаких «предсказаниях» нет и речи. Главная задача главного цикла в том, чтобы код разбить по модулям, при написании которых ты вообще не задумываешься когда они там выполняются.

Идеальный пример main loop-а — это фреймворк игровой логики для Unigine. Так вообще пипец — архитектура построена так, что главного цикла вообще словно вроде бы нет.

Ну это как ты например пишешь Qt приложение.. Ты эммитишь евенты и прочее вообще не задумываясь где там главный цикл.


Это отдельная тема вообщем, на мой взгляд, к главному циклу игры особо отношения не имеет.

KKH
> Чтобы человек не ходил то быстрее то медленнее, он предложил воспользоваться
> таймером реального времени, чтобы объект класть в траекторию.
А с чего бы ему ходить «то быстрее, то медленнее»? Как скорость зависит от частоты кадров? Объект за время Х переместиться на столько, сколько ему положено, независимо от фпс. Рывки и лаги — да, будут. Но это же не «то быстрее, то медленнее».

FordPerfect
> Да вроде обе статьи приводят примеры с дельтой, и говорят, почему это
> сомнительная идея.
> Если delta фиксированная, то и передавать её (явно) особого смысла не видно.
Почему это сомнительная идея — я так и не понял (если только проблема не одна — ограниченность флоата).
А вот с фиксированной дельтой я тоже не совсем понимаю. А кто сможет гарантировать, что она будет фиксированной?

Ладно, будем списывать все на упрощенность статей.

>Объект за время Х переместиться на столько, сколько ему положено, независимо от фпс.
В этом смысл приведённой тобой статьи.
>Рывки и лаги — да, будут.
Если всё сделать верно, то нет, не будет.
>Но это же не «то быстрее, то медленнее».
это вырвано из контекста. В одном случае будут рывки и скорость перемещения различна, в других случаях этого не будет. Это рассмотрено в приведённой тобой статье.

KKH
> Если всё сделать верно, то нет, не будет.
Ну, если видюха не справляется, то будут рывки.

> В одном случае будут рывки и скорость перемещения различна
Ну не могу понять я — отчего скорость перемещения будет различной. Скорость — это скорость, одна из составляющих состояния объекта. Поэтому графон не может (не должен) на нее влиять — хоть при 60 фпс, хоть при 15 объект будет проходить одинаковое расстояние с разной плавностью.

Vhodnoylogin
> Рывки и лаги — да, будут. Но это же не «то быстрее, то медленнее».
Что это за бред? Рывок это ускорение, лаг это остановка/откат с рывком к новой позиции. ТС, ты наркоман? Если ты не можешь понять почему, то запусти юнити и targetFrameRate сначала в 25, потом в 100. В коде пропиши перемещение кубика по удержанию клавиши с определенной скоростью без умножения на timeDelta. Посмотрим, насколько одинаково они у тебя поедут.

Dampire
> Что это за бред? Рывок это ускорение, лаг это остановка/откат с рывком к новой
> позиции.
Рывок — это рваная картинка. Когда все дергается. Равно «у меня лаги и низкий фпс». Никакого отношения к «Рывок это ускорение» не имеет. Кстати, рывок — это производная от ускорения, а не ускорение.
Так что не надо грубить, за приличного человека сойдешь.

Vhodnoylogin
Не сойду, потому что я быдло и хам. Лаги и низкий фпс это совершенно разные вещи, а рваная картинка — это когда происходят разрывы изображения из-за особенностей построчной отрисовки картинки на экране и происходит как раз из-за избыточного фпс. Раз уж ты докопался до определения слова рывок, то будь точен в определениях и далее. 3:1 не в твою пользу. Вторую часть моего поста ты благополучно проигнорировал, что характерно для бесполезных гуманитариев-интеллигентишек вроде тебя.

timeDelta вычисляется для всей итерации. Именно поэтому все апдейты без дельты, а сама дельта берется из условно глобальной переменной, когда нужно переместить объект на 1метр за одну секунду. Напомни мне, какой фреймрейт у тебя, и какое расстояние пройдет объект, если position += Vector3(0f,0f,-1f) за одну секунду? Интерполяция нужна ТОЛЬКО если физика у тебя в другом треде, и ЗНАЧИТЕЛЬНО отличается по фреймрейту в МЕНЬШУЮ сторону. Я специально выделил основные слова, чтобы до тебя получше дошло, мой культурный друг. А твои чудные предсказания нужны ТОЛЬКО для сетевой игры, где ты НЕ МОЖЕШЬ гарантировать скорость передачи пакетов, и приходится ВЫКРУЧИВАТЬСЯ как можешь. Именно из-за некорректного предсказания игроки бегут рожей в стену, а не огибают угол. Если ты хочешь реализовать такую лабуду в оффлайновой игре, то на здоровье.

Цикл игры

Существуют различные модели игр. Условно их можно разделить на две группы: одни используют событийную модель, другие — игровой цикл.

Событийная модель аналогична последовательности событий, которые возникают в игре и обрабатываются определенным образом. В C# есть функционал для построения событий. Нередко с использованием событий создают простенькие игры на C# и Windows Forms / WPF, применяя графические возможности платформы .NET. Изменения состояния игровых объектов происходят лишь при возникновении каких-то событий в игре. Примерно событийную модель можно представить так: пользователь управляет некоторым персонажем, нажимает на кнопку мыши, в ответ генерируется событие, в обработчике устанавливается перемещение персонажа. Нажимает пользователь на какую-нибудь клавишу клавиатуры — возникает новое событие. В обработчике события, допустим, генерируется выстрел. И так далее — происходят события, они обрабатываются, и это приводит к изменению состояния игровых объектов.

При наличии игрового цикла игровой процесс происходит несколько иначе. Через равные промежутки времени срабатывает некий метод, который обновляет состояние игровых объектов и производит перерисовку объектов в соответствии с их новым состоянием. Пользователь также может нажимать на мышь или на клавишу клавиатуры, для перемещения персонажа. Но теперь события нажатия не возникает. В методе игрового цикла производится опрос объектов. В частности, мы узнаем не нажата ли клавиша, отвечающая за перемещение. Если она нажата, обновляем состояние объекта и перерисовываем сцену. Возникает иллюзия движения. Далее через тот же промежуток опять срабатывает метод игрового цикла, и снова производится опрос игровых объектов.

Платформа MonoGame работает по модели игрового цикла. Схематично игровой процесс в MonoGame можно представить следующим образом:

В методе Initialize() происходит инициализация объектов, начального состояния игры.

Затем методе LoadContent() в приложение загружаются различные ресурсы: картинки, аудиофайлы, модели и т.д.

Затем собственно начинается игровой цикл. С периодичностью 60 раз в секунду вызывается метод Update() , в котором происходит опрос игровых объектов. Здесь мы узнаем, нажал ли пользователь какую-то определенную клавишу, столкнулись ли два объекта и так далее. И также здесь обновляем состояние игры.

После метода Update также с периодичностью 60 раз в секунду вызывается метод Draw() . В нем перерисовывается сцена. Затем управление снова передается в метод Update. И так по кругу.

В какой-то момент пользователь может нажать на клавишу Escape, чтобы выйти из игры. Осуществляется выход из игрового цикла, и управление передается в метод UnloadContent() . В этом методе происходит выгрузка ранее использованных ресурсов.

После этого игра завершается, и приложение закрывается.

Это жизненный цикл любого приложения на MonoGame вне зависимости от типа проекта и операционной системы, под которую пишется игра.

Suvitruf’s Blog :: Gamedev suffering

Блог о разработке игр и серверных технологиях

libGDX: Часть 1. Жизненный цикл игры

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

Android основан на Linux. Между приложением и ядром лежит слой API и слой библиотек на нативном коде. Приложение выполняется на виртуальной машине Java (Dalvik Virtual Machine). В Android можно запускать несколько приложений, одно из которых будет главным и займёт весь экран. Между приложениями можно переключаться (они представлены на странице «Последние запущенные приложения»).


Каждый экран пользовательского интерфейса представлен классом Activity в коде.

Application/Andro > Главная точка входа любого приложения libGDX. Application определяет целевую платформу и графические бэкэнды, которые будут использоваться в приложении. Это так же дает доступ к общему Log-модулю, который работает на всех платформах. ApplicationListener должен быть реализован первым при создании libGDX приложения.

В введении мы создали класс MyGame , он и является этим самым Application Listener.

Илон Маск рекомендует:  Предварительная подготовка xml xslt

Application Listener/Game

Вспомните public class MyGame extends Game . Наш класс наследуется от Game , который реализует интерфейсы Application Listener .

Application Listener отвечает за инициализацию приложения, обновление игрового процесса (то есть игровой логики), отображение изображений, установка паузы игры, сохранение состояния приложения и выгрузку ресурсов при выходе из приложения.

Это та часть, где происходит обработка событий жизненного цикла приложения. Каждое приложения или игра, независимо от бэкэндов либо целевой платформы, реализует ApplicationListener интерфейс. Он реализуется одинаково для всех платформ.

В своём классе, если это необходимо, вы можете эти методы переопределить:

create() — вызывается однократно, когда приложение создается. В следующей статье я опишу архитектуру игр. В методе create() будет инициализироваться элемент по управлению экраном (или несколько элементов, если несколько экранов игровых).

resize(int width, int height) — вызывается каждый раз, когда приложение меняет размер и оно не находится в состоянии паузы. Так же данный метод вызывается однажды, сразу после вызова метода create() . Передаваемые параметры ширины и высоты меняются в зависимости от размера окна так же каждый раз при вызове метода.

render() — вызывается каждый раз, когда происходит отрисовка экрана. Вызывается непрерывно, пока мы не решим, что игра закончена. По сути, является сердцем игры (:

pause() – вызывается прежде чем приложение будет закрыто. В Android это происходит, когда нажимается кнопка “Home” или поступает входящий вызов. В desktop-приложениях метод вызывается перед вызовом метода dispose() при закрытии приложения. Обычно в этом методе сохраняют состояние приложение, потому что не факт, что к нему ещё вернуться.

resume() – вызывается при получении фокуса приложением.

dispose() – вызывается при закрытии приложения (после метода pause()). Здесь можно подчистить за собой мусор, который не почистить за вас сборщик.

Напомню метод onCreate в MainActivity :

С useAccelerometer и useCompass всё ясно.

useWakelock — используется ли PowerManager. В прошлой статье для этого разрешение добавляли в манифест приложения.

useGL20 — флаг, указывающию, используется ли OpenGL ES 2. Если true – используeтся OpenGL ES 2, если false – используется OpenGL 1.x.

Геймдизайнерам об игроках или как программировать игроков?

Вступление 1.

Много думал и анализировал информации на тему разработки игр. И чтобы не потерять, а так же поделиться с людьми, получить подсказки, советы и комментарии решил оформить и выложить статью. На сегодняшний день “геймдизайн” все больше обретает очертания некой науки, требующей особого подхода и изучения. К сожалению, в общем доступе находится очень мало структурированной информации. Что касается иностранных авторов, имеющих большой опыт и ряд успешных проектов — зачастую их труды так и не попадают на прилавки отечественных магазинов. А изучить их в оригинале многим мешает языковой барьер.
В данной ситуации спасением служат статьи, где люди делятся впечатлениям и личным опытом по разработке игр. Эти статьи не только и не столько доносят до читателей новую информацию, сколько подают ее в новом свете, позволяя более четко осознать и отобразить в жизнь.

Вступление 2

Хочу отметить, что на написание материала оказало влияние выступление на Sociality Rocks 2011 Henric Suuronen — руководитель студии Wooga, разработчика Bubble Island и других хитов. Особого внимания заслуживает статья Андрея Плахова “Геймдизайнерам о программистах или как программировать программистов”. По аналогии с той статьей возникла мысль, что программировать можно и пользователей тоже. Программировать их модель поведения, чтобы их развлекать и извлекать нужные нам ценности — платежи, удержание в игре, привлечение новых игроков. И одним из инструментов удержания служит набор функций в приложении, который можно условно назвать игровым циклом. Об этом мы и поговорим далее

1. Что такое игровой цикл и зачем он нужен?

Основой всей игры является контент. С одной стороны он определяет возможности пользователей и определяет объем работ для создания проекта с другой стороны. Именно он затягивает людей и является причиной, почему они возвращаются в игру. При этом большая часть действий в процессе получения этого контента циклически повторяется. Я самый умный и один заметил, что все в этих социальных играх повторяется. Эти повторы и есть игровые циклы.
Игровой цикл — последовательность действий, выполняемая на протяжении всей игры раз за разом. Например: постройка здания, ожидание, получение валюты, постройка здания, ожидание и т.д.

Можно ли обойтись без игровых циклов? — Можно, но давайте представим, что в нашем проекте существует только линейный (не зацикленный) контент. Десятки и сотни часов игрок видит все новый и новый арт, анимации, мини-игры, слышит постоянно новую музыку. Сколько будет весить такая игра? Сколько времени она будет разрабатываться? Сколько устанавливаться? Нафига это надо? Заходим в такую игру и видим что-то похожее на сюжетную линию длинного квеста, с большим количеством уникальных действий. Cложно придумать длинную интересную игру.
А мы привыкли: быстрые игры — легкие деньги. Чтобы решить эти проблемы вводятся элементы повторения одних и тех же действий с различными внешними проявлениями. Цепочка таких действий и образует игровой цикл.

Несмотря на сказанное выше, читатель может задаться вопросом “зачем же все-таки выделять игровые циклы и следовать им”. Ответ банален — чтобы создавать интересный, понятный и при этом не слишком сложный в разработке продукт. Рассмотрим положительные эффекты:

  • Пользователю проще освоить игр у. 2-3 простых действиях любому человеку проще запомнить и привыкнуть к ним чем к сложным длинным последовательностям действий.
  • Требуется меньше контента, меньше вес приложения, быстрее грузится. 100 часов игры, каждая последовательность занимает 5 минут, и в среднем 30 минут ожидания продукции. С такой простой математикой видно, что объем приложения становится меньше в сотни раз. В результате мы получаем игру наибольшей длины с наименьшими затратами ресурсов.


Игровые циклы есть во всех играх. Потому что все разработчики ленятся работать и хотят вкусно кушать.:

  • Шутер: купил оружие — убил противников — получил денег;
  • Квесты: разгадал головоломку — получил предмет — нашел применение;
  • Казуальные аркады: меню — уровень — награда;
  • MMORPG: купил снаяржение, провел ряд боев, получил награду;
  • Социальные игры: построил дом — посадил дерево — вырастил сына — разместил — подождал — получил прибыль.

2. Типовые игровые циклы (housing, PvP, PvE)

Housing:

Рассмотрим социальные игры. В них мы можем определить следующие действия игроков — копание грядок, строительство домов, крафтинг вещей — эти действия относятся к игровым циклам типа Housing. В этом типе игровых циклов люди могут тратить много времени в ожиданиях, которое стоит как-то скрасить.

Далее рано или поздно в игре появляются какие-нибудь NPC, управляемые компьютером (NPC), которые дают квесты, нападают на дома, посевы и т.д. — это цикл взаимодействия с окружающей средой, PvE. Этот тип более динамичен потому что ждать обычно ничего не нужно, необходимо действовать быстро, реагируя на поведения игрового персонажа. Но так как искусственный интеллект персонажей линейный и сложностей не вызывает, то он просто вносит в игру разнообразие.

Третий вид циклов — это взаимодействие с другими игроками. В военных играх — это нападения и битвы — цикл PvP, В мирных же играх — помощь друзьям, подарки, соревнования. Назовем его Player for player. Этот вид циклов наиболее важен. Правильное взаимодействие с другими игроками вызывает наибольший интерес у публики.

3. Игровые циклы в мирных и военных играх

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

4. Каким должен быть игровой цикл

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

5. Примеры игровых циклов на хорошо известных играх.

Пример 2.1 (Castleville):
1. Выбираем нужное здание, покупаем его, строим и ждем прибыль. по истечении фиксированного времени получаем прибыль, потом строим еще здание, опять ждем и опять получаем прибыль.

Рис. 1. — Игровой цикл: постройка здания — ожидание — прибыль.

2. В игре у нас есть грядки на которых можно выращивать растения. Выбираем грядку, сажаем на ней растение, ждем заданное время и собираем урожай. И так по кругу.

Рис. 2. — Игровой цикл: посадил растение — ожидание — прибыль.

Игровые циклы в Castleville предельно просты – один раз показываете его, дальше игрок все делает на автомате.

Пример 2.2 (Airport city):
1. Выбираем здание, покупаем, строим, собираем прибыль и еще строим зданий. Этот цикл типичен для многих игр.
2. Выбираем рейс, заправляем самолет, загружаем, отправляем, ждем заданное время, собираем прибыль и снова выбираем рейс. Хотя кажется, что действий больше — они все интуитивно понятны. И несмотря на это все равно на каждом шаге пользователя окружают подсказки. Ими можно не пользоваться. Выбор использовать/не использовать очень актуален в начале игры.

Рис. 3. — Игровой цикл: выбор рейса — снаряжение самолета — ожидание — прибыль


Рис. 4 — Игровой цикл: постройка здания — ожидание — прибыль

Можно сделать вывод, что сопровождающие подсказки – альтернатива простоте цикла, но злоупотреблять сложностью все равно не стоит.

6. Как начать игровой цикл?

Вот вы вошли в игру. С чего начать? Игроку нельзя позволять разбираться в игре самостоятельно. Это быстро надоедает и у него появляется желание закрыть приложение, а так как положительных эмоций у него не осталось – он не вернется. В игру нужно ввести обучение, которое научит игрока самостоятельно входить в игровой цикл и идти по нему, а также расскажет об основных элементов управления. Л учшим началом первого игрового цикла будет кнопочка «нажми меня». В дальнейшем игрок, наученный положительным опытом, увидев пустую грядку или голодную коровку, сам все сделает. Следовательно, чтобы начать цикл — необходимо всякими мигающими занаками, звуковыми сигналами и анимациями показать, куда надо нажать, чтобы что-то начать делать.

7. Как вести игроков по игровому циклу?

Был такой эксперимент над крысами, когда им в мозг вводили электроды. И давали кнопку, при нажатии на которую, в мозг поступали разряды и доставляли крысам приятные ощущения. Животные переставали есть, пить, спать. И жали на кнопку до тех пор, пока не умирали. Так вот: принцип ведения игрока по циклу примерно такой же. На протяжении всего игрового цикла игрок должен знать, что ему делать дальше и где его кнопка счастья. Получить бонус награду или что-то построить — повести любое действие. Процесс показывает обучение. А далее мигающими значками, звуками, движениями действующих лиц и небольшими роликами отмечать достижения и обозначать новую цель. И интенсивность и торжественность мигания калибровать в зависимости от важности достигнутой цели (эффект кнопки счастья). Либо таймером показать время до события.

8. Как закончить игровой цикл

По окончанию игрового цикла у пользователя должно остаться впечатление, что все в его игровом мире хорошо. Все что мог, сделал. Получил награду и готов делать новые ответственные задания. Позитивное настроение в конце игрового цикла необходимо для успешного его закрытия.

9. Разорванные игровые циклы

Мы рассмотрели простые игровые циклы, которые используются чаще всего. Но для того чтобы завлечь игрока необходимо сделать игру похожей на живое существо. Чтобы она скучала по нему и присылала извещения, чтобы она ждала его, и игроку было, зачем возвращаться.

Игровые циклы бывают короткие по времени — когда мы что-то строим ждем 5 минут и получем какую-нибудь “классную штуку”. Такие циклы происходят во время одного игрового цикла. Бывают же циклы длинные по времени, когда для того чтобы дождаться профита нужно ждать много времени. Обычно такие циклы занимают 2 и более игровых сессий. Такие циклы называются разорванными игровыми циклами. Например, мы посадили какую-нибудь мега-тыкву. Чтобы она созрела, и мы могли получить за нее много бонусов, надо подождать всего-то 100500 часов. Конечно, никто столько не будет сидеть в игре и ждать. Но игрок может сделать все другие дела, потратить всю энергию, посетить всех друзей и вернуться в следующий раз, когда все созреет.

Если короткие игровые циклы дают пользователю для организации игрового процесса, то разорванные циклы тоже важны — это основной инструмент удержания пользователя в игре.

10. Как это все использовать?

После появления игры у создателей возникает 3 проблемы:

  • как привлечь игроков;
  • как их удержать;
  • как их заставить платить;
  • куда складывать деньги.

Привлечение игроков и монетизация – это темы других статей. Что же касается удержания пользователей, то этому способствуют разорванные игровые циклы. Они создают видимость того, что игра идет даже в отсутствии игрока и тем самым помогают возвращаться пользователям обратно после закрытия приложения.

11. Подведем итоги

Так как же сделать такую игру, которая точно увлечет пользователя, и он будет в нее играть длительное время. Универсального ответа на этот вопрос нет. Вот основые моменты, без которых успешную игру сделать практически невозможно:

  1. в любой игре присутствуют игровые циклы;
  2. игровой цикл — основная часть игры, которая должна дарить игроку положительные эмоции от присутствия в игре;
  3. игрока нужно обучить прохождению игрового цикла;
  4. в игре обязательно должны быть разорванные игровые циклы.

Цикл игры

Игры — получить на Академике действующий промокод МИФ издательство или выгодно игры купить со скидкой на распродаже в МИФ издательство

Цикл игры — Цикл игры: интервал времени от начала до окончания игры. Источник: РЕКОМЕНДАЦИИ ПО СТАНДАРТИЗАЦИИ. ИНФОРМАЦИОННО ТЕЛЕКОММУНИКАЦИОННЫЕ ИГРОВЫЕ СИСТЕМЫ. ТЕРМИНЫ И ОПРЕДЕЛЕНИЯ. Р 50.1.048 2004 (утв. Постановлением Госстандарта РФ от 09.03.2004 N… … Официальная терминология

Цикл — совокупность процессов в системе периодически повторяющихся движений, при которых объект, подвергающийся изменению в определенной последовательности, вновь приходит в исходное положение. Источник: ГОСТ 2846 … Словарь-справочник терминов нормативно-технической документации

Цикл женских турниров ITF 2012 — (англ. 2012 ITF Women s Circuit) ежегодный женский тур профессиональных теннисистов, проводимый Международной федерацией тенниса. Содержание 1 Расписание 2012 года 2 Статистика по турни … Википедия

Цикл женских турниров ITF — Цикл женских турниров ITF третий (до 2012 года второй) по значимости женский профессиональный тур. Содержание 1 Общая информация 2 История тура 3 Рейтинговые … Википедия

Цикл женских турниров ITF 2011 — Лидер тура по числу побед в одиночном разряде Сорана Кырстя из Румынии. Цикл женских турниров ITF 2011 (англ. … Википедия


Цикл женских турниров ITF 2010 (октябрь — Основная статья: Цикл женских турниров ITF 2010 Цикл женских турниров ITF 2010 (англ. 2010 ITF Women s Circuit) ежегодный женский тур профессиональных теннисистов, проводимый Международной федерацией тенниса. Статья содержит результаты… … Википедия

Цикл женских турниров ITF 2011 (октябрь — Основная статья: Цикл женских турниров ITF 2011 Цикл женских турниров ITF 2011 (англ. 2011 ITF Women s Circuit) ежегодный женский тур профессиональных теннисистов, проводимый Международной федерацией тенниса. Статья содержит результаты… … Википедия

Цикл женских турниров ITF 2009 (Апрель-Июнь) — Основная статья: Цикл женских турниров ITF 2009 Цикл женских турниров ITF 2009 (англ. 2009 ITF Women s Circuit) ежегодный женский тур профессиональных теннисистов, проводимый Международной федерацией тенниса. Статья содержит результаты… … Википедия

Цикл женских турниров ITF 2010 (июль — Основная статья: Цикл женских турниров ITF 2010 Цикл женских турниров ITF 2010 (англ. 2010 ITF Women s Circuit) ежегодный женский тур профессиональных теннисистов, проводимый Международной федерацией тенниса. Статья содержит результаты… … Википедия

Цикловые игры

Особую живость, праздничность и интерес в детском лагере могут придать цикловые игры. Часто они помогают разрешать психологические проблемы детей, подуставших от будничного режима, ожидающих приключений и романтики от жизни в лесу. Заранее, до смены, желательно долго в течение года продумывайте и разработайте игру, готовьте, если можно, с детьми, найдите, если сможете, взрослых специалистов по ролевым или сюжетным играм.

Смысл цикловой игры Цикловая игра – такая игра, которая длится весь лагерь, имеет предварительную подготовку и подготовку в течение лагеря. Цикловая игра – это всегда «интрига», непредсказуемость в будничном ритме лагеря, «изюминка», неожиданная и для детей и для взрослых (кроме тех некоторых избранных, которые готовят каждый эпизод, часто по ночам). Цикловая игра всегда подразумевает непосредственную реакцию детей и совместный выход через сюжет игры в инобытие. У любой игры обязательно есть завершение – обретение «клада». Специально ставим слово «клад» в кавычки, так как выросшие на цикловых играх дети воспринимают большие мероприятия в ключе цикловых игр и для них «кладом» может быть, например, поездка на экскурсию в интересное место. Но это нужно заработать, и цикловые игры здесь играют важную воспитывающую роль.

Сюжет игры. Сюжет может быть выдуман, но лучше, когда игра – это путешествие по какой–нибудь хорошей книге, которая читается и проживается в течение всего года перед лагерем, а также в самом лагере.

Эту книгу вы все вместе читайте, разыгрывайте их сюжеты в виде «точек» у костров, смотрите вместе фильмы по этой книге, спектакли, музеи и т.д. по теме.

Возрастные этапы в цикловых играх

  1. Игра с положительным героем, которого можно увидеть издалека, но нельзя потрогать. Финал – обретение настоящего клада. 6-8 лет.
  2. Таинственный герой, которого нет (он в записках, посланиях) плюс герои из руководителей и театральное обыгрывание пространства лагеря. 7-9 лет.
  3. Главный герой отрицательный. Пропадают ценности из лагеря, их нужно вернуть, ночные дежурства, испытания, самостоятельные приключения. Собственно сюжет игры выдают театральные постановки у костров. 9-12 лет.
  4. Игра = работа. Основной сюжет обыгрывается в большой театральной постановке или съемках фильма и в специальностях лагеря (репетиции, изготовление костюмов, декораций , антуража и т.д.). 11-13 лет.

ЦИКЛОВАЯ ИГРА « ГЭНДАЛЬФ». ВОЗРАСТ 6-8 ЛЕТ.

Подготовка в городе. Руководители читали на каждом сборе книгу Р. Токиена «Хоббит». Ребятам дали сказочные имена гномов из книги. Разыгрывались отдельные сценки силами руков и родителей. Обучение скаутским навыкам тоже происходило в сказочной обстановке. Подготовка к лагерю. Еще до лагеря разработан сценарий игры, намечены отдельные эпизоды, набран клад, подарочки, нечто, изображающее руны (это были небольшие глиняные таблички с знаками действительно похожими на руны), сшиты плащи для каждого гнома (это были крепкие и красивые дождевики), собраны костюмы для персонажей игры. Уже в лагере нарисованы несколько карт местности и тщательно подделывать их под старинные: натереть воском, ломали, обжигали и обрывали.

Илон Маск рекомендует:  Что такое код asp timeout

Сюжеты игры в лагере. Открытие.

  1. С утра раздаются ребятам сшитые плащи и расшили их вместе с детьми всякими лентами, тесьмой и разными побрякушками, так что теперь был узнаваем каждый гном индивидуально.
  2. После открытия лагеря, т.е. построения все в этих плащах с песней пришли на поляну знакомств. Нас встретил «хозяин» этих мест. Он был одет в листья и ветви, с большой косматой бородой. «Хозяин» стал рассказывать историю этих мест, переплетая реальность и сюжет книги, послания от начальника дружины и древние сказочные предсказания. Он упомянул, что здесь водятся странные существа и происходят загадочные происшествия. А мы приветствовали его как могли – пели свои гномские песни. В конце он пригласил всех на пир на берегу озера. Когда же все вышли к озеру, то он стал прощаться, оставив нам полные вкусностей столы, а сам влез в лодку стоявшую у берега. Он встал в ней и поднял руки в знак последнего приветствия, и тут лодка сама начала плыть к противоположному берегу, а он все стоял и приветственно махал руками (ее тащили на подводных канатах с другого берега). Когда же он вышел на сушу и скрылся в лесу, возле лодки из тростниковых зарослей появилась странная фигура. Она проскользнула на виду у всех и вновь исчезла в водяных зарослях. Издалека она была совершенно нечеловеческая и некоторые вспомнили о Горлуме .( Это был человек в трико и противогазе с ластами на руках, он-то и тащил лодку за канат). Дальше был пир.
  3. На следующее утро на палатках появились руны, нарисованные мелом, что вызвало большой переполох особенно у девчонок.

Гэндальф и руны.

Несколько дней в лагере ничего особенного не происходило.

  1. Однажды на построении неожиданно один из руководителей начал удивленно всматриваться в даль озера. Он стал шептаться с другими руками, все развернулись к озеру, началась суматоха. Там на озере была лодка, а в ней сидел человек в большой островерхой шляпе и сияющем на солнце серебряном плаще. Он приветливо замахал руками, потом бросил в озеро какой–то предмет и поспешно уплыл на другой берег. Это – Гэндальф. Все дети вместе с руководителями бросились в лодки, но как «ни старались», не успели догнать Гэндальфа. Зато они вынули из воды тот предмет. Это оказалась старинная бутыль с печатями на горлышке. Когда все выбрались на берег и собрались вместе, бутыль вскрыли и обнаружили там приветственное письмо от Гэндальфа и грубую схему лагеря с тремя отмеченными точками. Каждая точка соответствовала одной из стай. Все побежали к своим стоянкам и вскоре в тайниках нашли 3 куска старинной, едва сохранившейся карты этой местности. Карту собрали общими усилиями и вывесили на дереве посередине лагеря. На ней множество крестиков. Теперь уже ищут по одиночке. В каждом тайничке лежала одна руна и маленький подарочек. Руны мы договорились собирать у одного руководителя, подарочек ребенок брал себе. Зачем эти руны пока было непонятно.
  2. На следующий день и еще на следующий день крестики на карте все появлялись каждое утро, а дети самостоятельно их разыскивали.
  3. Через день после первого появления Гэндальфа, в конце обеда вдалеке на поле появилась та же самая фигура в серебряном плаще и островерхой шляпе с мешком за плечами. Дети бросились к Гэндальфу, на ходу напяливая свои гномские плащи. Однако и на этот раз догнать его не удалось. Но он бросил свой мешок. В мешке – именные подарки для гномов и записка, мол, если соберете все 147 рун и расшифруете послание, то поймете, где лежит старинный клад.
  4. На следующие дни все еще появлялись знаки на карте, и в свободное от занятий время дети искали руны с подарками.

Завершение игры. Клад.

  1. Предпоследний день лагеря. В самом конце завтрака с дерева на веревке неожиданно спустился прямо на стол бумажный шар. Внутри него – записка. В ней указано время выхода в поход на поиски шифра и приметы в пути.
  2. Мы вышли в путь к означенным местам. Это было длинное путешествие на полдня по совершенно незнакомому лесу на другом берегу озера. Обед на костре, неожиданные препятствия, не всегда понятные лесные приметы в записке Гэндальфа. Но зато мы пришли … Перед нами лежало небольшое лесное озерцо, сплошь заросшее белыми кувшинками, которые на наших глазах стали закрываться в закатных лучах солнца. У последней приметы мы нашли обрывок старинной бумаги с шифром.
  3. Мы долго складывали руны в нужном порядке и разгадывали место клада, которое можно было найти по скаутским заданиям – ориентирование, нужное количество шагов, порода дерева. Наконец, нашли это место и лопатами разрыли клад. В потертом, но явно когда-то роскошном платке лежали украшения, старинные походные принадлежности и самое главное — драгоценные камни (осколки вулканических пород).
  4. Найденный клад мы понесли обратно к прощальному костру. А когда мы уже в темноте переправлялись через озеро к лагерю, то пускали в озеро десятки плавающих свечей и все озеро светилось в ночи.
  5. В последний день лагеря дети делили между собой клад и свое клали в свои рюкзаки. (Ох, и нелегкий это был момент в нашей жизни).

Можно также положить в клад что-нибудь действительно очень ценное, а потом увезти это на экспертизу, а потом привезти бумагу с настоящими печатями научно-исследовательского института или музея с благодарностью за такую редкую и ценную находку и подарки от той организации.. Можно также оставить часть клада у руководителя смены и тем самым начать маленький музей для гостей лагеря и отряда. Можно придумывать и придумывать…

Участие и включенность взрослых была очень разная. Много сумятицы было из-за того, что игра была на несколько групп. В начале запутались в количестве реквизита — плащей. В конце, такая же путаница была и с кладом. Были нестыковки из-за того, что группы жили в разных местах, и приходилось постоянно придумывать предлоги для их собирания во время эпизодов. Может быть из-за этого, или из-за того, что дети не были настроены на игру, чувствовался сумбур. В общем, тайны и не было. Многое было так или иначе известно из общения со старшими, которые уже играли «Хоббита». Желательно играть одним отрядом. Тогда лучше получается удержать игровое пространство. Запомнились костры, связанные с игрой в гномов: обретение плащей, изготовление гномских мечей, разбор у костра гномских ценностей из гномского сундука, добытого в приключении. Было полное впечатление реальности происходящего. Драгоценности сверкали в отблесках костра. Их собирали — покупали разные «древности», которые стали гномскими сокровищами. Сундук закопали, Свечи по маршруту к сундуку поставили. Потом естественно дети откопали. Раздачу подготовили и провели. Изготовление гномских мечей подготовили и провели заранее, а костер придал романтику, таинственность. При раздаче, обретении плащей у средних и маленьких гномиков была растерянность — видимо для них это было слишком таинственно. Непонятно — откуда костер на воде? Гэндальф — злой или добрый? Что делать? Много загадок, а ответов нет… Костры проводились несколько поздно для младшего отряда. Создавалось впечатление их стихийности.

Цикловые игры для малышей (младшие отряды) — увлекательнейшее время для руководителей. Дети так искренно отвечают на каждую выдумку, так жаждут и стремятся к волшебным приключениям, что невольно руководители сами начинают сопереживать, удивляться и искать, хотя вот только что ночью сидели и придумывали, копали, прятали, строили.

Геймдизайнерам об игроках или как программировать игроков?


Вступление 1.

Много думал и анализировал информации на тему разработки игр. И чтобы не потерять, а так же поделиться с людьми, получить подсказки, советы и комментарии решил оформить и выложить статью. На сегодняшний день “геймдизайн” все больше обретает очертания некой науки, требующей особого подхода и изучения. К сожалению, в общем доступе находится очень мало структурированной информации. Что касается иностранных авторов, имеющих большой опыт и ряд успешных проектов — зачастую их труды так и не попадают на прилавки отечественных магазинов. А изучить их в оригинале многим мешает языковой барьер.
В данной ситуации спасением служат статьи, где люди делятся впечатлениям и личным опытом по разработке игр. Эти статьи не только и не столько доносят до читателей новую информацию, сколько подают ее в новом свете, позволяя более четко осознать и отобразить в жизнь.

Вступление 2

Хочу отметить, что на написание материала оказало влияние выступление на Sociality Rocks 2011 Henric Suuronen — руководитель студии Wooga, разработчика Bubble Island и других хитов. Особого внимания заслуживает статья Андрея Плахова “Геймдизайнерам о программистах или как программировать программистов”. По аналогии с той статьей возникла мысль, что программировать можно и пользователей тоже. Программировать их модель поведения, чтобы их развлекать и извлекать нужные нам ценности — платежи, удержание в игре, привлечение новых игроков. И одним из инструментов удержания служит набор функций в приложении, который можно условно назвать игровым циклом. Об этом мы и поговорим далее

1. Что такое игровой цикл и зачем он нужен?

Основой всей игры является контент. С одной стороны он определяет возможности пользователей и определяет объем работ для создания проекта с другой стороны. Именно он затягивает людей и является причиной, почему они возвращаются в игру. При этом большая часть действий в процессе получения этого контента циклически повторяется. Я самый умный и один заметил, что все в этих социальных играх повторяется. Эти повторы и есть игровые циклы.
Игровой цикл — последовательность действий, выполняемая на протяжении всей игры раз за разом. Например: постройка здания, ожидание, получение валюты, постройка здания, ожидание и т.д.

Можно ли обойтись без игровых циклов? — Можно, но давайте представим, что в нашем проекте существует только линейный (не зацикленный) контент. Десятки и сотни часов игрок видит все новый и новый арт, анимации, мини-игры, слышит постоянно новую музыку. Сколько будет весить такая игра? Сколько времени она будет разрабатываться? Сколько устанавливаться? Нафига это надо? Заходим в такую игру и видим что-то похожее на сюжетную линию длинного квеста, с большим количеством уникальных действий. Cложно придумать длинную интересную игру.
А мы привыкли: быстрые игры — легкие деньги. Чтобы решить эти проблемы вводятся элементы повторения одних и тех же действий с различными внешними проявлениями. Цепочка таких действий и образует игровой цикл.

Несмотря на сказанное выше, читатель может задаться вопросом “зачем же все-таки выделять игровые циклы и следовать им”. Ответ банален — чтобы создавать интересный, понятный и при этом не слишком сложный в разработке продукт. Рассмотрим положительные эффекты:

  • Пользователю проще освоить игр у. 2-3 простых действиях любому человеку проще запомнить и привыкнуть к ним чем к сложным длинным последовательностям действий.
  • Требуется меньше контента, меньше вес приложения, быстрее грузится. 100 часов игры, каждая последовательность занимает 5 минут, и в среднем 30 минут ожидания продукции. С такой простой математикой видно, что объем приложения становится меньше в сотни раз. В результате мы получаем игру наибольшей длины с наименьшими затратами ресурсов.

Игровые циклы есть во всех играх. Потому что все разработчики ленятся работать и хотят вкусно кушать.:

  • Шутер: купил оружие — убил противников — получил денег;
  • Квесты: разгадал головоломку — получил предмет — нашел применение;
  • Казуальные аркады: меню — уровень — награда;
  • MMORPG: купил снаяржение, провел ряд боев, получил награду;
  • Социальные игры: построил дом — посадил дерево — вырастил сына — разместил — подождал — получил прибыль.

2. Типовые игровые циклы (housing, PvP, PvE)

Housing:

Рассмотрим социальные игры. В них мы можем определить следующие действия игроков — копание грядок, строительство домов, крафтинг вещей — эти действия относятся к игровым циклам типа Housing. В этом типе игровых циклов люди могут тратить много времени в ожиданиях, которое стоит как-то скрасить.

Далее рано или поздно в игре появляются какие-нибудь NPC, управляемые компьютером (NPC), которые дают квесты, нападают на дома, посевы и т.д. — это цикл взаимодействия с окружающей средой, PvE. Этот тип более динамичен потому что ждать обычно ничего не нужно, необходимо действовать быстро, реагируя на поведения игрового персонажа. Но так как искусственный интеллект персонажей линейный и сложностей не вызывает, то он просто вносит в игру разнообразие.

Третий вид циклов — это взаимодействие с другими игроками. В военных играх — это нападения и битвы — цикл PvP, В мирных же играх — помощь друзьям, подарки, соревнования. Назовем его Player for player. Этот вид циклов наиболее важен. Правильное взаимодействие с другими игроками вызывает наибольший интерес у публики.

3. Игровые циклы в мирных и военных играх

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

4. Каким должен быть игровой цикл

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

5. Примеры игровых циклов на хорошо известных играх.

Пример 2.1 (Castleville):
1. Выбираем нужное здание, покупаем его, строим и ждем прибыль. по истечении фиксированного времени получаем прибыль, потом строим еще здание, опять ждем и опять получаем прибыль.

Рис. 1. — Игровой цикл: постройка здания — ожидание — прибыль.

2. В игре у нас есть грядки на которых можно выращивать растения. Выбираем грядку, сажаем на ней растение, ждем заданное время и собираем урожай. И так по кругу.

Рис. 2. — Игровой цикл: посадил растение — ожидание — прибыль.

Игровые циклы в Castleville предельно просты – один раз показываете его, дальше игрок все делает на автомате.

Пример 2.2 (Airport city):
1. Выбираем здание, покупаем, строим, собираем прибыль и еще строим зданий. Этот цикл типичен для многих игр.
2. Выбираем рейс, заправляем самолет, загружаем, отправляем, ждем заданное время, собираем прибыль и снова выбираем рейс. Хотя кажется, что действий больше — они все интуитивно понятны. И несмотря на это все равно на каждом шаге пользователя окружают подсказки. Ими можно не пользоваться. Выбор использовать/не использовать очень актуален в начале игры.

Рис. 3. — Игровой цикл: выбор рейса — снаряжение самолета — ожидание — прибыль

Рис. 4 — Игровой цикл: постройка здания — ожидание — прибыль

Можно сделать вывод, что сопровождающие подсказки – альтернатива простоте цикла, но злоупотреблять сложностью все равно не стоит.

6. Как начать игровой цикл?

Вот вы вошли в игру. С чего начать? Игроку нельзя позволять разбираться в игре самостоятельно. Это быстро надоедает и у него появляется желание закрыть приложение, а так как положительных эмоций у него не осталось – он не вернется. В игру нужно ввести обучение, которое научит игрока самостоятельно входить в игровой цикл и идти по нему, а также расскажет об основных элементов управления. Л учшим началом первого игрового цикла будет кнопочка «нажми меня». В дальнейшем игрок, наученный положительным опытом, увидев пустую грядку или голодную коровку, сам все сделает. Следовательно, чтобы начать цикл — необходимо всякими мигающими занаками, звуковыми сигналами и анимациями показать, куда надо нажать, чтобы что-то начать делать.

7. Как вести игроков по игровому циклу?

Был такой эксперимент над крысами, когда им в мозг вводили электроды. И давали кнопку, при нажатии на которую, в мозг поступали разряды и доставляли крысам приятные ощущения. Животные переставали есть, пить, спать. И жали на кнопку до тех пор, пока не умирали. Так вот: принцип ведения игрока по циклу примерно такой же. На протяжении всего игрового цикла игрок должен знать, что ему делать дальше и где его кнопка счастья. Получить бонус награду или что-то построить — повести любое действие. Процесс показывает обучение. А далее мигающими значками, звуками, движениями действующих лиц и небольшими роликами отмечать достижения и обозначать новую цель. И интенсивность и торжественность мигания калибровать в зависимости от важности достигнутой цели (эффект кнопки счастья). Либо таймером показать время до события.

8. Как закончить игровой цикл

По окончанию игрового цикла у пользователя должно остаться впечатление, что все в его игровом мире хорошо. Все что мог, сделал. Получил награду и готов делать новые ответственные задания. Позитивное настроение в конце игрового цикла необходимо для успешного его закрытия.

9. Разорванные игровые циклы

Мы рассмотрели простые игровые циклы, которые используются чаще всего. Но для того чтобы завлечь игрока необходимо сделать игру похожей на живое существо. Чтобы она скучала по нему и присылала извещения, чтобы она ждала его, и игроку было, зачем возвращаться.

Игровые циклы бывают короткие по времени — когда мы что-то строим ждем 5 минут и получем какую-нибудь “классную штуку”. Такие циклы происходят во время одного игрового цикла. Бывают же циклы длинные по времени, когда для того чтобы дождаться профита нужно ждать много времени. Обычно такие циклы занимают 2 и более игровых сессий. Такие циклы называются разорванными игровыми циклами. Например, мы посадили какую-нибудь мега-тыкву. Чтобы она созрела, и мы могли получить за нее много бонусов, надо подождать всего-то 100500 часов. Конечно, никто столько не будет сидеть в игре и ждать. Но игрок может сделать все другие дела, потратить всю энергию, посетить всех друзей и вернуться в следующий раз, когда все созреет.

Если короткие игровые циклы дают пользователю для организации игрового процесса, то разорванные циклы тоже важны — это основной инструмент удержания пользователя в игре.

10. Как это все использовать?

После появления игры у создателей возникает 3 проблемы:

  • как привлечь игроков;
  • как их удержать;
  • как их заставить платить;
  • куда складывать деньги.

Привлечение игроков и монетизация – это темы других статей. Что же касается удержания пользователей, то этому способствуют разорванные игровые циклы. Они создают видимость того, что игра идет даже в отсутствии игрока и тем самым помогают возвращаться пользователям обратно после закрытия приложения.

11. Подведем итоги

Так как же сделать такую игру, которая точно увлечет пользователя, и он будет в нее играть длительное время. Универсального ответа на этот вопрос нет. Вот основые моменты, без которых успешную игру сделать практически невозможно:


  1. в любой игре присутствуют игровые циклы;
  2. игровой цикл — основная часть игры, которая должна дарить игроку положительные эмоции от присутствия в игре;
  3. игрока нужно обучить прохождению игрового цикла;
  4. в игре обязательно должны быть разорванные игровые циклы.

The Cycle игра

Скриншоты игры

Трейлеры (1)

Новости (3)

На мероприятии для разработчиков Game Developers Conference 2020 компания Epic Games сделала ряд удивительных анонсов для своего магазина. Итак, приготовьтесь… *барабанная дробь* Эксклюзивами Ep…

В июле студия Yager анонсировала The Cycle — мультиплеерный шутер, жанр которого обозначен как «соревновательное выполнение квестов». Что под этим скрывается, разработчики предлагают узнать в свежем г…

Студия Yager больше всего известна по Spec Ops: The Line — после этой игры разработчики не хвастались крупными успехами. Кооперативный экшен Dead Island 2 у Yager отобрали, а условно-бесплатная Dreadn…

Цикл Try/Fail для сценария игры

Цикл Try/Fail используют многие авторы и сценаристы. В этой статье мы поговорим о том, можно ли использовать их для сценария развития игрового персонажа и чем это хорошо для игры. Другими словами: как сделать персонажа, игра с которым не только доставит удовольствие, но и поможет получить новый опыт, а может даже и развиться самому игроку.

Людям нравятся истории про неудачников — тех, с кем вечно происходят какие-нибудь неприятности, но в итоге продолжительной борьбы все заканчивается хорошо. Но задумывались ли вы, что в компьютерных играх приходится брать эту роль на себя?

“Характер нельзя развить в простоте и тишине. Только через опыт испытаний и страданий душа укрепится, амбиция получит силу для реализации, а успех будет достигнут.” — Хелен Келлер (американская писательница)

Главными героями игр часто являются не просто выдуманные персонажи, но лучшие люди, которые бы справились с данной ситуацией, поэтому их борьба часто бывает физической. Они неотделимы от препятствий, которые встречают.

Головоломки, платформеры, враги — препятствия, которые нужно преодолеть

Некоторые физически, другие своим умом, третьи — лишь вопрос времени. И местами есть диалоги. Но будь то хоть симулятор свиданий, хоть шутер от первого лица, руководимый игроком персонаж является единственным, кто может решить задачу.

Персонаж является таким по двум причинам: 1). Как упоминалось выше, они выдуманы; и 2). Они с готовностью создают пространство под размер игрока. Вторая причина позволяет взять любую игру и поместить себя в нее.

Но этого недостаточно для интересной и захватывающей истории. В игровой прессе часто обсуждают, что такие пустые персонажи невозможно связать с определенным случаем и историей не опасаясь потерять аудиторию. Не станем обсуждать утверждение, так как по этой теме уже написано многое.

Намного интереснее и полезнее для нас и для писателей игровых сценариев оказалось узнать то, как мало связи с реальным преодолением задач у главного героя играет его предыстория. Препятствия различаются в зависимости от жанра игры, но часто мало приводят к развитию персонажа. Персонаж и игрок могут столкнуться с трудными и опасными задачами, но вместо развития они продолжают упорно биться головой о стену до тех пор, пока та не упадет перед ними. Или бегут мимо стены, как некоторые, кто хотят пойти пацифистским маршрутом.

Но с любыми препятствиями должен бороться именно игрок. Персонаж просто существует и конкретная задача на него так или иначе не влияет. Преодоление не изменяет персонажей, хотя и может улучшить положение в отношении игры в целом. Но каждая следующая задача, поставленная перед ними, не отличается от предыдущей. Она может быть сложнее, это может быть иной, но с точки зрения истории ничего не меняется.

Потому что полностью проиграть в игре можно редко

После проигрыша игра начинается заново. Halo, Destiny, Diablo, Far Cry, Dark Souls, Mass Effect, Dragon Age, Baldur’s Gate, Assassin’s Creed, Uncharted, Tomb Raider и т.д. — все перезапускаются после проигрыша. Это может быть смерть или провал миссии, все равно игра возвращается в предыдущее состояние.

Бывает и по-другому, особенно в таких играх как Dark Souls или “рогалики”. Это игры, в которых история очень конкретно связана с игроком и его опытом. В таких играх развитие истории происходит непосредственно в игре, и существуют механизмы, которые так или иначе влияют на историю. Но даже здесь есть ограничения.

В некоторых играх проигрыш принимается как часть повествования, и вы идете с ним дальше

Moon Hunters, например. Но таких игр очень мало.

Истории редко спорят со смертью главного героя. Он может получить ранения, увечья, потеряться, лишиться или быть схвачен. Но смерть редко является препятствием, которое он должен преодолеть. Герои не возрождаются заново в том же мире. Если мы не говорим о комиксах, но это особый атрибут для них. Только там герой может умереть и вернуться.

Гэндальф не считается, потому что он не более, чем deus ex machina в человеческом облике. Можно буквально сказать, что он был помещен в Средиземье богами.

Степень, в которой каждая игра позволяет начать заново, сильно различается. В Dark Souls восстанавливается население мира, боссы возвращают полное здоровье, а игрок должен снова пройти полный путь. В Diablo и других ролевых боевиках игрок просто перемещается в прежнее пространство. Иногда без оружия. Иногда, если предполагалась схватка с боссом, тот возвращается с полным здоровьем. Имеет ли значение хоть что-то из этого с точки зрения истории? Нет. Только Dark Souls станет исключением… Потому что эта игра всегда исключение.


Механика возрождения в играх серии Far Cry представляет собой нечто среднее. Но даже в ней можно иногда потерпеть поражение и начать заново, в особенности, в последних частях. Только иногда игроку после возвращения приходится убегать, потому что ситуация вышла из-под контроля.

Бесспорно лучшая игра в серии, Far Cry 2, может сокрушить огнем, заклинившим оружием, закончившимися боеприпасами или медикаментами, смертью AI спутника и борьбой с бесконечным потоком NPC, прущих на вас. Не поэтому ли вместо Far Cry 5 я снова купил второй, который теперь доступен на Xbox?

Невозможность захватить форпост или выполнить миссию никогда не изменит связанную с прохождением историю. Игры с системным управлением преуспели в процедурной генерации части, которая рассказывается игроку. Но заново загруженные форпосты не станет сложнее захватить. И новых, более трудных врагов не будет.

Смерть и возвращение или даже постепенный процесс возвращения, которому есть помехи, в большинстве игр не являются препятствием на пути к выигрышу.

В качестве игры, которая пытается связать историю с поведением игрока и повышает трудность после возвращения, вы можете взглянуть на Shadow of Mordor или Shadow of War. Когда вы проигрываете оркам, они становятся сильнее и могут сильнее менять мир по мере продвижения по своей иерархической лестнице. Это влияет на историю игрока, не не слишком сильно изменяет возможность выиграть / потерпеть неудачу во время прохождения миссий.

С возвращением сложность прохождения нарастает неравномерно. Так бывает еще в некоторых головоломках, когда с общим увеличением сложности на игрока по-прежнему быстро падают шипы. Эти шипы должны сделать историю интереснее, но в большинстве игр их нет.

Прямой успех от выполнения миссий, будь то побочные квесты, случайные встречи или рассказ о части сюжета, скучен. Он не дает игроку и его персонажу возможности учиться или меняться. Но он усиливает иллюзию мощи — смотрите, как все падают передо мной!

Создается прямая линия от начала игры до кульминации, в которой персонаж игрока проходит сквозь все препятствия перед ним. Для лучшей иллюстрации пришло время обратиться к Брэндону Сандерсону, автору книжных серий «Рождённый Туманом» и «Архив Буресвета». Также он является одним из ведущих подкаста Writing Excuses.

(Ролик является собственностью Write About Dragons, а его полную версию можно отыскать на YouTube и сайте writeaboutdragons.com)

Как отмечает Брэндон Сандерсон, заметное различие в циклах Try/Fail делает историю интересней. А еще история становится более динамичной, похожей не на книгу, а на телевизионное шоу. Для сценария South Park Мэтт Стоун и Трей Паркер используют упомянутую Сандерсоном технику Yes But/No And.

С играми стараются поступать так же. В частности, так поступает Far Cry 5 и вечно мешающая игроку семейка Сидов. Регулярная поимка игрока Сидами предполагает, что насаждение их сектантской идеологии в Монтане возобновится. Но “предполагает” здесь ключевое слово, потому что эти случаи запланированы заранее и не находятся под контролем игрока.

Даже такие события не создают настоящий цикл Try/Fail. Они просто ненадолго отклоняют игрока с пути и делают слабее, отбирая оружие. В случае смерти вы вернетесь к точке сохранения, так что на самом деле перед вами миссия с исходом “победить или проиграть” — не более. Помехи являются попыткой ввести цикл Try/Fail в историю развязного беспредела, коим является открытый игровой мир.

Я продолжаю воспевать цикл Try/Fail по двум причинам не связанным с игровой механикой. Не потому что без него скучно. Это важно для изменений и персонажей. Изменение жизненно важно для повествования. Важно для миссий и квестов. Для чувства успеха.

Все истории, шутки и квесты об этом — об изменениях

Если ничего не меняется, истории у нас нет. Это изменение может быть внутренним или внешним. Но самые лучшие истории, самые памятные сказки и великие саги заключают в себе оба из них — изменение мира и изменение персонажа.

Персонажи могут меняться весьма интересными путями и создавать наиболее динамичные истории, когда не являются идеальными героями для решения данной ситуации. Но эта идея мало сочетается с мощью, которую любят доверять игрокам в жанре power fantasy.

В прошлом эпизоде я не говорил про Firewatch (Пожарный дозор), Gone Home и Tacoma, поэтому должен сделать это сейчас. Герой “Пожарного дозора” Генри не идеален. Он не самый умный, не самый физически развитый, у него не все в порядке в голове и в жизни, и каких-то особых умений, способных выделить из толпы, у него тоже нет. Но получилась бы история, если бы Генри не был таким неудачником? Он заслуживает нашу любовь как раз потому, что не имеет способностей идеально справиться с любой ситуацией. Не то, чтобы он никогда не встречался с большими препятствиями, но он точно не тот человек, который хорошо справляется с изоляцией в глуши Вайоминга. Вот почему у нас есть Делила и то, как они взаимодействуют и меняют друг друга.

Сравните с играми Gone Home и Tacoma, в каждой из которых персонаж игрока идеален для игры, потому что история совсем не о нем. Конечно, у персонажа есть мотивы и связь с игрой, но это в общем и целом лишь специальное пространство, в которое втиснули персонажа. Кейтлин Гринбрайер в Gone Home и Эми Ферье в Tacoma не меняются по ходу игры и не являются неудачницами, потому что им не надо преодолевать препятствия. Предпосылок для цикла Try/Fail нет.

Сравните с Геральтом из Ведьмак 3, где персонаж ходит посередине между идеальностью и обычностью. Его роль и навыки в качестве ведьмака, наемного охотника на монстров, делают Геральта идеальным человеком для перемещения по жестокому миру игры. Но очень много в игре построено на переговорах с персонажами и взаимодействии в “цивилизованной” среде, политике и попытках добиться реакции от NPC, в чем Геральт не мастер.

Ведьмак 3 может быть посередине между идеальным и неподходящим человеком для истории, но он не проходит цикл Try/Fail в бою, потому что в случае смерти мир восстанавливается в прежнем виде и игра возвратит вас в более раннюю точку. Переговоры — другое дело. Это явная возможность избежать драки или нечаянно попасть в нее, что добавляет динамики. В этой динамике все дело. Линейный сюжет легко предугадать, будь он хоть восходящим, хоть нисходящим. Предсказуемость скучна. Скука означает, что люди не вовлекаются в историю и быстро забывают ее. Прямая линия не предлагает изменений, отличий, ничего нового.

“Самое элементарное, что сцена начинается в одном месте и заканчивается в другом. Она начинается с хорошего (мужчина встречает женщину в своих мечтах) и заканчивается плохо (женщина отвергает шаги мужчины). Или она начинается с плохого (отверженный мужчина звонит своему другу за поддержкой) и заканчивается хорошим (друг советует взять себя в руки и попытаться снова). Она также может начаться плохо и закончиться еще хуже (кто-то терпит неудачу… а потом его сбивает машина) или хорошо и закончиться еще лучше (человек выигрывает партию в блэкджек, ставит все на один номер в рулетку, и выигрывает еще больше). Вот о чем речь.” — Шон Койн, The Story Grid

В играх есть сцены, иногда их называют миссиями, иногда главами, в иных случаях они больше напоминают сцены в книгах, фильмах или пьесах. Уместность этой идеи зависит от типа игры и ее механики, поэтому берите из нее то, что вам нужно. Суть в том, что повороты сюжета в играх редко бывают такими, как их описывает Шон Койн. Задача каждой миссии приблизить игрока к его конечной цели, а не чинить препятствия и поражения. Это равносильно тому, что каждая сцена начинается хорошо и заканчивается хорошо. Отсутствие разнообразия порождает скуку и делает сюжет линейным.

Эмоциональное ядро игры, и тем более истории, должно меняться. Оно должно иметь отличающуюся структуру, даже если следует структуре начало-развитие-развязка или описывает путешествие героя. Оно не должно иметь вид плато, или, как уже говорилось ранее, если игра всегда идет на 5+, еще не достигнув половины она будет ощущаться на 3. Ричард Леммархен во время своего выступления на Tone Control сказал об этом.

Эмоции динамично меняются с изменением результата. А динамика интересна

Как добавить динамики в сюжет игры, во многом зависит от игровой механики. Если она не позволяет воплотить цикл Try/Fail без восстановления игрового мира, значит, вам надо написать части, в которых персонаж может не выполнить свою задачу. Так начинается Destiny 2. Ваша первая миссия в качестве игрока состоит в том, чтобы отразить атаку Красного Легиона, но вы терпите неудачу. В случае неудачи вы лишаетесь способностей и ваш мир разрушен. Это здорово, это убедительно, это дает надежду, что Destiny 2 сможет рассказать действительно незабываемую историю.

Только это не так. В любом другом месте Destiny 2 вы не можете проиграть. Вы возвращаете свои силы легко. Вы снова собираете команду и приобретаете новых друзей. Вы совершаете новые подвиги, чтобы в итоге побороть великое зло. Вас не отвлекают в какие-то моменты путешествия, и вы не встречаете в нем препятствий, кроме тех, в которые надо стрелять. Поэтому если бы история Destiny 2 была нарисована как линия, она бы выглядела так: прямой путь к финальному боссу с небольшим провалом в начале, когда мы впервые встретим Доминуса Гоула. Это скучно.

Если вы собираетесь писать игры и строить повествование, даже в жанре power fantasy, не ставьте успех за успехом. Лишь преодоление провалов, множества подряд, дает реальное ощущение достижений и силы. Вот это делает истории о неудачниках столь притягательными. И поэтому в комиксах и мыльных операх персонажи переживают так много бед.

Спасибо, что приняли участие в этом эпизоде The Writing Game с Грегори Пеллечи. Все, что я делаю, можно найти на OneGameDad.com, и меня можно найти там или в Twitter как @OneGameDad, если вы хотите поговорить о писательстве, играх, этом шоу или даже о совместной работе.

Дополнение

Еще про повороты сюжета и циклы (в этой статье их назвали битами):

Пересказ книги Шона Койна The Story Grid:

Бестиарий участия игрока. Перевод обстоятельной статьи о том, каким стоит делать персонажа и что такое «пространство под размер игрока»:

Коротенькая статья на английском, с объяснением и примерами про цикл Try/Fail и технику Yes But/No And:

Почему это «главный» игровой цикл, необходимый для разработки игры?

Я считаю, что большинство разработчиков игр требуют основного цикла игры, но я не знаю, почему это необходимо. Не могли бы мы осуществить слушатель событий и реагировать на каждое действие пользователя? Анимации (и т.д.), могут затем быть воспроизведен, когда происходит событие.

Какова цель основного игрового цикла?

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

Но вы все еще не хотели бы структурировать игру таким образом.

Дело в том, что делает цикл наиболее привлекательным решением является то, что ваш цикл становится то, что в режиме реального времени программирования называется «циклической исполнительной». Идея заключается в том, что вы можете сделать относительные скорости выполнения различных системных мероприятий детерминированным по отношению друг к другу. Общая скорость цикла может контролироваться с помощью таймера, и таймер может в конечном счете будет прерывание, но с современной ОС, вы, вероятно, увидеть доказательство этого прерывания, как код, который ждет семафора (или какого-либо другого механизма синхронизации), как часть вашего «основного цикла».

Так почему же вы хотите детерминированное поведение? Рассмотрим относительные скорости обработки входных данных вашего пользователя и злодеи AIs. Если поместить все в систему чисто событий на основе, нет никакой гарантии, что AIs не будет получать больше процессорного времени, чем ваш пользователь, или наоборот, если у вас есть некоторый контроль над приоритетов потоков, и даже тогда, вы склонны иметь трудности поддержания синхронизации последовательны.

Поместите все в петле, однако, и вы гарантируете, что ваши AiS временные линии собираются действовать в фиксированной связи по времени вашего пользователя. Это достигается путем вызова из вашего цикла, чтобы дать САИ в квант времени, в котором, чтобы решить, что делать, вызов из ваших пользовательского ввода процедур, для опроса устройств ввода, чтобы узнать, как ваш пользователь хочет вести себя, и крикнуть, чтобы сделать вашу визуализацию.

При таком цикле, вы должны следить за тем, что вы не принимая больше времени обработки каждого прохода, чем на самом деле идет в режиме реального времени. Если вы пытаетесь цикл вашего цикла в 100Гц, вся обработка вашего цикла в лучше закончить в рамках 10 мса, иначе система будет получить рывки. В режиме реального времени программирования, это называется обгонным ваше время. Хорошая система позволит вам контролировать, насколько близко вы к накату, а затем вы можете уменьшить нагрузку обработки, однако вы посчитаете нужными.

Илон Маск рекомендует:  Что такое код alter domain
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL