Menu

Как работает Spread Value

В этой статье Я подробно объясню, как именно работает Spread Value (распределение значений), и как вы можете его использовать.

Spread Value

Информация для новичков

Все Активные объекты в MMF2 и  CLF2.5, имеют Alterable Values (Альтернативные Значения или Переменные). Если вы создаете один объект монстра, и размещаете несколько его копий, эти Alterable Values позволят вам сделать каждую копию уникальной.

Классическим примером является счетчик урона. Например вы делаете события:

● Столкновение Игрока с Врагом
+ И у Игрока выполняется анимация атаки
— Добавить «5 » в значение А Врага

Alternative Value A

В Clickteam Fusion 2.5, вы можете  переименовать значение, и назвать переменную по собственному желанию. Например вы можете дать имя «Повреждения» (в Clickteam Fusion 2.5 можно давать имя на русском языке) вместо «Alterable Value A». Что бы это сделать выберете объект, в его свойствах перейдите на вкладку «Values» и в Alterable Values нажмите кнопку «New».

Values

Далее мы могли бы сделать:

● Враг «Повреждения» больше 20
— Уничтожить врага

Damage and destroy

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

Spread Value позволяет применять эту концепцию еще дальше.

Основная идея Распространения значений

«Spread Value» принимает значение и использует его в качестве ID для всех копий объекта. Таким образом, в случае нашего врага, предположим, что мы делаем следующее:

● Начала кадра
— Распространить «1» в Alterable Value А Врага

Spread Value in Alterable Value A

Теперь Alterable Value А для каждого из наших вражеских объектов выглядит так:

Копии врага  Значение А
1-ый враг 1
2-ой враг 2
3-ий враг 3
4-ый враг 4

и так далее…

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

Так же мы можем переименовать Alterable Values и дать ему имя «ID», чтобы с первого взгляда было понятно для чего мы используем это значение.

Мы могли бы использовать любое из  Alterable Values в качестве Spread Value, и, как вы увидите позже, есть некоторые ситуации, в которых вы могли бы использовать несколько таких переменных в одно и то же время!

Примечание о Spread Value

Когда вы устанавливаете Spread Value, чтобы дать копиям объекта идентификационный номер, вы назначаете начальный номер — «1». Это означает, что враги будут пронумерованы 1, 2, 3, 4, и т.д. Если вы устанавливаете «0», то враги будут пронумерованы 0, 1, 2, 3 и так далее. Если вы наберете «5», они будут пронумерованы 5, 6, 7, 8.

Конечно, обычно используется либо «1» или «0».

Spread Value и выбор объектов

Вы помните, в нашем первом примере «для новичков» было следующее условие:

● Враг «Повреждения» больше 20
— Уничтожить врага

… где только враги, чьи повреждения превышают 20 были уничтожены?

Это потому, что CLF2.5 имеет своего рода систему «выбора объектов» в ее событиях. Только объекты, удовлетворяющие условиям будут зависеть от действий, которые вы выберете.

Это также верно для действия Spread Value.

Когда мы сделали:

● Начала кадра
— Распространить «1» в Alterable Value А Врага

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

Но предположим, что мы нарисовали линию на пол-экрана (в положении, скажем, 320px). Теперь мы имеем несколько врагов слева и несколько справа. И мы делаем следующее:

● Позиция координаты X Врага  больше «320»
— Распределить «1» по переменной ID Врага

Spread Value X pos

Результатом является то, что все враги слева будут иметь ID в значении 0, но те, на правой стороне будут иметь идентификационные номера — 1, 2, 3, 4, 5 и т.д.

Теперь значение распределяется только на объекты удовлетворяющие условию.

Соединение объектов

Итак, давайте посмотрим, что мы можем реально сделать с этой вещью.

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

Вы создаете 5 копий танков и 5 копий башен танка, и вы делаете это:

● Всегда
— Задать положение башни танка от объекта танка

Tank posicion

Это действие устанавливает положение каждой башни на каждый танк.

Set posicion of tank

Теперь если мы дадим идентификационные номера для танков и башен:

● Начало кадра
— Распределить «1» по ID танка
— Распределить «1» по ID башни танка

Spread ID

… то мы заметим, что идентификационные  номера танков автоматически совпадают номерами их башен!

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

● Пуля сталкивается с башней танка
+ ID танка = ID башне танка
— Добавить 5 к повреждению танка
— Уничтожить Пуля

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

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

В действиях, только танк с тем же ID, что и у башни, которая столкнулась с пулей будет поврежден! И только пуля, которая попала в башню будет уничтожена.

Детектор

Другой распространенный пример это использование объектов «Детектор». Предположим, мы хотим что бы персонаж обнаруживал боеприпасы и поворачивался в их сторону когда они рядом. Создайте большой сплошной круг в качестве активного объекта (мы назовем его Detector).

Мы даем ему Spread Value:

● Начало кадра
— Распределить «1» по ID Персонажа
— Распределить «1» по ID Детектора

Spread Detector

… и мы соединяем детекторы с персонажами:

● Всегда
— Задать положение «детектор» от координат «персонажа»

Position Detector

Теперь мы можем сделать это:

● Детектор сталкивается с боеприпасами
+ ID персонажа = ID детектора
— Персонаж смотрит на боеприпасы

look from ammo

Примечание: Действие Look at from… работает только в случае заполненной анимации направлений у объекта.

Direction object

Итак, только детектор, который сталкивается с боеприпасами будет отобран, и только Боеприпасы, которые сталкиваются с детектор будут выбраны.
Во втором событии — только персонаж с тем же идентификатором, что и детектор будет выбран.

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

detector look at from ammo
Эта концепция использования Spread Values является фундаментальным ключом к управлению копиями одного объекта или к соединению нескольких объектов в один.

Циклы! Добавление объектов во время игры

Использование события «Start of Frame» (начала кадра) лучше всего подходит для распределения идентификационных номеров, но только если вы не планируете создавать новых врагов во время игры.

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

ВАРИАНТ 1

● Всегда
— Распределить «1» по ID Врага

Обновление идентификационных номеров для каждого объекта происходит все время. Но это немного расточительно.

ВАРИАНТ 2

● Начало кадра
— Запустить цикл «IDS» 1 раз.

● Враг ID = «0»
— Запустить цикл «IDS» 1 раз.

● В цикле «IDS»
— Распределить «1» по ID Врага

loop IDS

Это более эффективно. Мы используем fastloop, как функцию. Нам нужно только запустить одну петлю в нужный момент и пронумеровать все объекты, независимо от их количества.

Мы запустили цикл в начале, так что все объекты распространились в начале.

Но, то что мы распространяем значение «1», означает, что объекты со значением «0» — это только что созданные объекты.

Так что, если попадается объект Врага со значением «0», то мы запускаем цикл.

Еще пример с Fastloops и Spread Value

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

For each object

 

А затем сравниваете индекс цикла с идентификатором солдатика:

● В цикле «МойЦикл»
+ ID солдатика = индекс солдатика в цикле
— Сделайте необходимые действия

Loop index and spread value

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

Примечание: В такой ситуации нужно начинать распределение значений с «0», поскольку цикл начинаются с нуля.

Конечно, в данном примере мы могли использовать конструкцию попроще, как например:

● Если ID солдатика > 0
— Сделайте необходимые действия

Но Я уверен, что эта техника пригодится вам когда простого сравнения значений будет недостаточно.

На этом всё! Я надеюсь, что информация о Spread Value была вам полезна.

В этой статье Я подробно объясню, как именно работает Spread Value (распределение значений), и как вы можете его использовать. Информация для новичков Все Активные объекты в MMF2 и  CLF2.5, имеют Alterable Values (Альтернативные Значения или Переменные). Если вы создаете один объект монстра, и размещаете несколько его копий, эти Alterable Values позволят вам сделать каждую копию уникальной. Классическим примером является счетчик урона. Например вы делаете события: ● Столкновение Игрока с Врагом + И у Игрока выполняется анимация атаки --- Добавить "5 " в значение А Врага В Clickteam Fusion 2.5, вы можете  переименовать значение, и назвать переменную по собственному желанию. Например вы можете дать имя "Повреждения" (в Clickteam Fusion…

9

Рейтинг: 5 ( 1 голосов)

    Рейтинг: 4,88 ( голосов - 16 )
Загрузка...
Комментариев: 6
  1. Andrey Zadvornov:

    Офигенный туториал. Это я на середине понял, и решил написать. Но вот блин я не понимаю — когда делаешь правой кнопкой уже по созданному событию, то там есть OR logical и OR ещекакоето — в чем разница? Мне нужно так — в нижней части экрана есть несколько драгНдроп объектов. Мне нужно чтобы юзер, когда переносит один — он ложился в ячейку. Но потом, если ячейка занята, второй переносимый юзером объект ложился во вторую ячейку.

  2. niks:

    Спасибо. все понятно. :-P

  3. паша:

    я не нашел кнопку распростронить. и вообще не вижу смысла. зачем нам распростронять? если кликтим автоматически для каждого созданного объекта переменную делает уникальной

    • GQ:

      На первом скриншоте показано где находиться кнопка распространить. А нужно это для того что бы отличать копии одного объекта. Если задавать переменные непосредственно в свойствах объекта, то они всё равно будут одинаковые у всех копий этого объекта. А Spread Value даст всем копиям уникальное порядковое значение. И с его помощью можно будет в коде обратиться непосредственно к конкретному экземпляру объекта.

      • паша:

        у меня рус версия кликтима. на ней не распростронить написано а разделить. спасибо за ответ. так понятнее

  4. Есбол:

    Незнал. Спасибо. :idea:

Добавить комментарий

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

Вступай в группу!