Признак (Flag)
Признак (битовая маска) — это логическое значение, хранящееся в большой переменной. Это удобнее, поскольку минимальный объём распределения памяти составляет 1 байт (8 бит), а для логического значения требуется всего 1 бит. Если нужно хранить много логических значений, бинарная маска будет в восемь раз эффективнее, чем отдельные переменные типа bool
.
Объектам мира в Source обычно применяются следующие типы признаков:
- Признаки появления -
SF_
, определённые в соотвествующем.cpp
файле объекта - Признаки поведения -
FL_
, определённые в файлеpublic/const.h
- Признаки эфектов -
EF_
, определённые в файлеpublic/const.h
- Признаки объекта (или
EFlags
) -EFL_
, определённые в файлеgame/shared/shareddefs.h
Элементам карты применяются следующие типы признаков:
- Признаки содержимого -
CONTENTS_
, определённые в файлеpublic/bspflags.h
- Признаки поверхности -
SURF_
, определённые в файлеpublic/bspflags.h
Использование
Признаками следует управлять с помощью специальных функций Source, а не напрямую. Каждый тип признаков имеет различный набор функций, но все подчиняются единому шаблону именования:
Add<*>Flags()
Remove<*>Flags()
Clear<*>Flags()
Has<*>Flags()
(иногдаIs<*>FlagSet()
)
Функции вызова, которые следует использовать для соотвествующих типов признаков:
Префикс | Добавление | Удаление | Проверка | Очистка | Чтение всех | Внутреннее имя | |
---|---|---|---|---|---|---|---|
Spawn Flags | SF_
|
AddSpawnFlags
|
RemoveSpawnFlags
|
HasSpawnFlags
|
ClearSpawnFlags
|
GetSpawnFlags
|
m_spawnflags
|
Behavior Flags | FL_
|
AddFlag
|
RemoveFlag
|
N/A | ClearFlags
|
GetFlags
|
m_fFlags
|
Effect Flags | EF_
|
AddEffects
|
RemoveEffects
|
IsEffectActive
|
ClearEffects
|
GetEffects
|
m_fEffects
|
Entity flags | EFL_
|
AddEFlags
|
RemoveEFlags
|
IsEFlagSet
|
N/A | GetEFlags
|
m_iEFlags
|


EFL_
and EF_
, so always double check. Some of Valve's own code makes these mistakes!
Для обработки нескольких признаков одновременно, необходимо использовать битовые операторы
&
, |
и ^
- обычные логические операторы, но только с одним битом.
Например:
if ( HasSpawnFlags(SF_CITIZEN_MEDIC | SF_CITIZEN_NOT_COMMANDABLE) ) ...
Создание
Признаки обычно объявляются как перечисление, наподобие этого:
enum MyFlags_t
{
FL_MYFLAG = 1 << 0,
FL_MYFLAG = 1 << 1,
FL_MYFLAG = 1 << 2,
// и т.д.
};
Или тоже самое:
enum MyFlags_t
{
FL_MYFLAG = 1,
FL_MYFLAG = 2,
FL_MYFLAG = 4,
// и т.д.
};
Или:
enum MyFlags_t
{
FL_MYFLAG = 0x1,
FL_MYFLAG = 0x2,
FL_MYFLAG = 0x4,
// и т.д.
};
Применение старого формата записи кода с использованием препроцессора для определения признаков следует избегать, поскольку он не является строго типизированным:
#define FL_MYFLAG 1<<0
#define FL_MYFLAG 2
#define FL_MYFLAG 0x4
// и т.д.
Признаки в редакторе Hammer
Признаки отображаются в диалоговом окне Свойства объекта редактора Hammer. Для разных объектов будут доступны разные признаки. Признак отображается в виде поля для отметки, означающей, что каждый признак может быть включен или отключен. Можно получить доступ к признакам через ключ-параметр spawnflags
. Это то, чем на самом деле являются признаки: конкретное значение переменной, определяемое комбинацией выбранных признаков.
