среда, 30 марта 2011 г.

Режимы подкреплений

Режимы подкреплений:

Mario и монеткиТема использования режимов подкреплений в играх впервые была поднята в докладе “Behavioral Game Design” десять лет назад. Когда я прочитал статью, основанную на докладе, это был для меня шок. Я стал анализировать игры с точки зрения бихевиоризма, обратил свое внимание на доступную психологическую литературу и начал экспериментировать с наградами в своих играх.

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


Немного напомню

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

Если для вас это звучит немного заумно, прочитайте сначала предыдущую статью: “Кнут и пряник”. В ней детально описаны два вида подкреплений с примерами. А если неохота читать, то просто для упрощения будем считать, что подкрепление – это что-то приятное для игрока, которое появляется сразу же после выполнения им какого-то действия.

 

Режимы подкреплений

Люди (и животные в целом) подстраивают свое поведение под тип подкреплений. Например, если экзамены нужно сдавать раз в полгода, многие студенты начнут прикладывать усилия только ближе к экзаменам. Другими словами, вероятность того, что средний студент будет прилежно учиться в середине семестра – мала.

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

Зато если преподаватель решит проводить контрольные в случайные дни, многие будут готовиться постоянно – ведь неизвестно, когда следующая контрольная: завтра или через неделю. Другими словами, вероятность того, что студенты будут более часто готовиться – самая высокая из этих трех ситуаций.

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

  1. время
  2. количество действий

В первом случае подкрепление происходит через какое-то время после выполнения действия (режим временного подкрепления). Например, помидоры в игре растут 8 игровых часов. Чтобы получить награду, игрок должен заходить в игру один раз в 8 часов.

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

Will press lever for food
“Буду нажимать рычажок за еду”

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

  • Режим подкрепления с постоянным соотношением
  • Режим подкрепления с постоянным интервалом
  • Режим подкрепления с вариативным соотношением
  • Режим подкрепления с вариативным интервалом

 

Режим подкрепления

с постоянным соотношением

[...]

Антон Волков о прошлом, настоящем и будущем

Антон Волков о прошлом, настоящем и будущем:

Информационный портал Prosto-site.org умудрился разговорить технического директора AlternativaPlatform Антона Волкова так, что новое о нём открыли даже давние его знакомые. Рассказ о прошлом, настоящем и будущем “Альтернативы” из уст одного из её основателей читайте в этом интервью.

a_volkov_interview.jpg

воскресенье, 27 марта 2011 г.

TowerDefence #8. Первая башня

TowerDefence #8. Первая башня:

Сегодня мы наконец-то добавим в нашу игру долгожданные башенки и научим их стрелять и убивать врагов. Но для этого прийдется много поработать [...]

пятница, 25 марта 2011 г.

вторник, 22 марта 2011 г.

Биндинг в ActionScript проектах. Часть 2

Биндинг в ActionScript проектах. Часть 2:

Рамки использования метатега [Bindable] значительно шире указнных в статье Биндинг в ActionScript проектах. Часть 1. В данной статье расскажу о том куда можно применить данный метатег и о возможностях биндинга в случае использования собственных событий.

Куда можно воткнуть метатег [Bindable]?

Метатег [Bindable] можно использовать в следующих местах:

1. Перед свойством.

Свойство может быть как public, так и protected или private.

Например:

1
2
[Bindable]
public var text:String;

О биндинге применительно к свойствам уже говорилось в первой части. Компилятор автоматически преобразует свойство, помеченное тегом [Bindable] к геттеру/сеттеру с отсылкой события.

2. Перед определением класса

1
2
[Bindable]
public class SomeClass extends EventDispatcher

Это равносильно тому, что мы бы проставили метатег [Bindable] для каждого из public свойств этого класса. Private и protected или свойства из другого пространства имен автоматически не будут помечены как [Bindable]. Если нужно забиндить не public свойства к ним нужно дописывать метатег [Bindable] самостоятельно.

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

3. Перед get или set методом

Метатег [Bindable] так же можно использовать если свойства у класса оформленны в виде get/set методов:

1
2
3
4
5
6
7
8
private var _text:String;
[Bindable]
public function get text():String{
    return _text;
}
public function set text(value:String):void{
    _text = value;
}

Компилятор позволит вам поставить его как возле геттера, так и возле сеттера. Но! Как изветсно если мы для свойства напишем только сеттер то оно будет доступно только для записи (write only), если же напишем только геттер то только для чтения (read only). С помощью BindingUtils “забиндиться” на свойство доступное только для записи невозможно, но сделать это для свойства, доступного только для чтения – вполне.  Я настоятельно рекомендую всегда писать тег [Bindable] только рядом с геттером, это позволит видеть событие (см. ниже) и избежать путаницы и ошибок.

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

4. Перед методом

1
2
3
4
5
[Bindable(event="bindFunctionChange")]
public function bindFunction(prop:int):String{
    ...
    return someString;
}

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

Кастомные события

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

Итак о событиях. Рассмотрим их при использовании с геттером. Представим что нам необходимо задать в каких конкретно случаях будет срабатывать биндинг, или чтобы он сработал после того как мы выполним все необходимые оперции в сеттере. Для этого в нашем метатеге мы можем указать событие в результате которого сработает биндинг [...]

понедельник, 21 марта 2011 г.

OpenZoom SDK

OpenZoom SDK:

OpenZoom SDK создана для отображения высококачественных изображений в Интернете, с помощью пирамид изображений. Она предоставляет достаточный инструментарий для отображения и управления отображением изображений и карт. У библиотеки хорошая справка, примеры и комьюнити, поэтому ограничусь лишь поверхностным описанием, просто, чтоб вы знали, что это уже реализовано и 'не надо париться'. SDK имеет две версии – для [...]

воскресенье, 20 марта 2011 г.

Введение в векторы

Введение в векторы:

Данной статьей я хочу начать небольшой цикл по возможному использованию векторов, а также освежить Ваши знания по данному предмету. Под вектором здесь я понимаю не «векторную графику», а Вектор – в смысле НАПРАВЛЕННЫЙ ОТРЕЗОК (надеюсь, что Вы сами поймете, почему я написал «Вектор» с большой буквы). В основном мы будем рассматривать векторы на плоскости, но будут и небольшие дополнения по предмету о векторах в пространстве.
Для чего же нужны векторы вообще? Отвечаем: с помощью векторов очень удобно задавать положение тел на плоскости и в пространстве, их скорости и ускорения (т.к. они, по сути, являются векторными величинами), всевозможные силовые факторы (гравитация, силы упругости, трения и т.д.). Иными словами, с их помощью можно создавать различные механические модели. Но на этом применение векторов не ограничивается, они используются и в трехмерной графике (например, для модели освещенности поверхностей, расположенных под различными углами к источнику света).
Заинтересованы? Как же столь простая вещь, как простой отрезок, может дать нам такие возможности? Что ж, давайте начнем путешествие в мир Вектора!

Рис.1. Вектор на плоскости

Математически вектор на плоскости может быть выражен парой чисел, причем несколькими способами:
1) полярный способ задания следует из определения вектора: первое число – его длина (т.е. расстояние между концом и началом вектора), второе – угол, который он образует с некоторой осью отсчета (на рис.1 такой осью является ось Ох). Данный способ мы будем использовать крайне редко (если вообще будем);
2) более распространенным является координатный способ задания вектора:
Взаимосвязи между длиной вектора, его углом на плоскости и координатами могут быть выражены следующими зависимостями:
Как видно, зная любые две характеристика вектора, мы можем найти остальные.
Теперь рассмотрим основные операции с векторами:
1) Умножение вектора на число

Рис.2. Умножение вектора на число (k>1)
Результатом умножения вектора AB на число k (масштабирование вектора) является вектор АС с координатами:

Таким образом:
- умножение вектора на k =1  оставит вектор без изменений;
- умножение вектора на k =0 превратит его в точку;
- умножение вектора на k =(-1) изменит его направление на противоположное;
- умножение вектора на |k| >1 увеличит его длину;
- умножение вектора на |k| <1 уменьшит его длину.

2) Нормализация вектора (приведение к единичному виду) [...]