Solution Vostok Posted May 20 Solution Share #1 Posted May 20 Основы Блоки кода Блок кода заключен в фигурные скобки и определяет область действия. Переменные, определенные внутри области действия, доступны только изнутри нее. Пример области действия Please Log in or Register to see this: Spoiler Вложенная область видимости Please Log in or Register to see this: Spoiler Заявления о сфере применения Please Log in or Register to see this: Spoiler Структура программы Принудительный скрипт состоит из классов и функций. Весь код должен быть объявлен внутри функции. Please Log in or Register to see this: Spoiler Переменные Переменные определяются по типу и имени. Please Log in or Register to see this: Spoiler Функции Функции являются основной функцией скрипта Enforce. Объявление функции состоит из типа возвращаемого значения, имени функции и списка параметров. Функции могут быть объявлены в глобальной области видимости или внутри объявления класса Параметры функции фиксированы и типизированы (не могут быть изменены во время выполнения, без переменных параметров). Функции могут быть перегружены Ключевое слово "out" перед объявлением параметра гарантирует, что параметр передается по ссылке (таким образом, вы можете передавать более одного значения из функции, его можно использовать только в собственных функциях) Скрипт Enforce поддерживает параметр по умолчанию Please Log in or Register to see this: Spoiler Комментарии Please Log in or Register to see this: Spoiler Константы Константы похожи на переменные, но доступны только для чтения. Они объявляются с помощью ключевого слова const. Please Log in or Register to see this: Spoiler Операторы Приоритет оператора: Приоритет операторов аналогичен языку C, подробнее.Символ операции Добавить / Add + Вычитать / Subtract - Умножать / Multiply * Делить / Divide / По модулю / Modulo %AssignmentsСимвол операции Присвоить значение переменной / Assign value to variable = Увеличить переменную на значение / Increment variable by value += Уменьшить переменную на значение / Decrement variable by value -= Умножить переменную на значение / Multiply variable by value *= Разделить переменную на значение / Divide variable by value /= Побитово-ИЛИ на значение / Bitwise-OR by value |= Побитово- И на значение & / Bitwise-AND by value &= Сдвигаем переменную влево по значению / Left-shift variable by value <<= Сдвигаем переменную вправо по значению / Right-shift variable by value >>= Увеличиваем переменную на 1 / Increment variable by 1 ++ Уменьшаем переменную на 1 / Decrement variable by 1 --Относительный (условный)Символ операции Больше значения / More than value > Меньше значения / Less than value < Больше или равно значению / More or equal to the value >= Меньше или равно значению / Less or equal to the value <= Равно / Equal == Не равно / Not equal !=ДругиеОператоры категорий Логические / Logical &&, || Побитовые / Bitwise &, |, ~, ^ Строка / String + Сдвиг / Shift <<, >> Присваивание / Assignment = Индексация / Indexing [ ] Отрицание / Negation !Переопределение скрипта Оператор Index Переопределение оператора index может быть достигнуто с помощью методов Set и Get. Вы можете использовать любое количество перегрузок, при условии, что в типах нет неоднозначности. Please Log in or Register to see this: Spoiler Примечание: Если вы хотите присвоить предварительно обработанному вектору значение instance[index] = "1 1 1", то установщик должен принять строку в качестве параметра _value и преобразовать ее явно с помощью _value.ToVector() перед присваиванием.Ключевые слова Модификаторы функций/методов Please Log in or Register to see this: Code Модификаторы переменных Please Log in or Register to see this: Code Модификаторы классов Please Log in or Register to see this: Code Другие ключевые слова Please Log in or Register to see this: Code ТипыПримитивные типы Please Log in or Register to see this: Code Струнные Строки передаются по значению, как и примитивные типы Их можно объединить с помощью оператора + Строки инициализируются и уничтожаются автоматически Строки могут содержать стандартные escape-последовательности. Поддерживаются следующие варианты: \n \r \t \\" Please Log in or Register to see this: Spoiler Векторы Векторы передаются по значению, как примитивные типы Значения векторов доступны с помощью оператора [, ], как статические массивы Векторы инициализируются и уничтожаются автоматически Вектор может быть инициализирован тремя числовыми значениями в двойных кавычках, например "10 22 13". Please Log in or Register to see this: Spoiler Объекты Объекты в enforce script являются ссылками и передаются по ссылке Все функции-члены и переменные по умолчанию являются общедоступными. Используйте ключевое слово 'private', чтобы сделать их закрытыми, ключевое слово 'autoptr' перед объявлением объектной переменной гарантирует, что компилятор автоматически уничтожит объект при завершении области видимости (например, при завершении вызова функции). Please Log in or Register to see this: Spoiler Пример this & super: Please Log in or Register to see this: Spoiler Перечисления Перечислители - это набор именованных константных идентификаторов. перечисления имеют тип int, значение enumitem может быть присвоено в определении, в противном случае оно вычисляется автоматически (предыдущее значение элемента плюс единица) , перечисление может наследоваться от другого перечисления (значение элемента продолжается от последнего значения родительского элемента). имя перечисления, используемое в качестве типа, ведет себя как обычный int (при назначении не проверяется значение перечисления) Please Log in or Register to see this: Spoiler Шаблоны Скрипт Enforce Script имеет функцию шаблонирования, аналогичную шаблонам C++, которая позволяет классам работать с универсальными типами. Объявление универсального типа помещается внутри операторов <, > (например, "class Template Class<class GenericType>" ) после идентификатора имени шаблонного класса. Enforce Script поддерживает любое количество универсальных типов для каждого шаблонного класса Please Log in or Register to see this: Spoiler МассивыСтатические массивы Массивы индексируются с 0 Массивы передаются по ссылке, как объекты Статические массивы инициализируются и уничтожаются автоматически Размер статических массивов можно задать только во время компиляции Элементы доступны с помощью оператора доступа к массиву [ ] Please Log in or Register to see this: Spoiler Динамические массивы Динамические массивы поддерживают изменение размера во время выполнения путем вставки/удаления элементов массива Динамические массивы предоставляются через шаблонный класс 'array' Динамические массивы передаются по ссылке Динамические массивы являются объектами, и поэтому их необходимо создавать и уничтожать как объекты, поэтому не забудьте использовать "autoptr" или оператор удаления! Элементы доступны с помощью функции "Get" или оператора доступа к массиву [ ] Для массивов примитивных типов уже определены определения типов: Please Log in or Register to see this: Code Please Log in or Register to see this: Spoiler Автоматическое определение типа Тип переменной будет определен автоматически во время компиляции, если в качестве заполнителя используется ключевое слово auto. Please Log in or Register to see this: Spoiler Управляющие структуры Управляющие структуры работают очень похоже на языки C# или C/C++. Условные структуры Оператор If Please Log in or Register to see this: Spoiler Оператор Switch Оператор Switch поддерживает переключение с помощью чисел, констант и строк. Please Log in or Register to see this: Spoiler Итерационные структуры Для Цикл for состоит из трех частей: объявления, условия и приращения. Please Log in or Register to see this: Spoiler Инструкция foreach Более простая и удобная версия for loop. Please Log in or Register to see this: Spoiler Пока Please Log in or Register to see this: Spoiler Особенности объектно-ориентированного программирования По умолчанию все функции-члены и переменные являются общедоступными. Для управления доступом можно использовать ключевое слово "private" или "protected" Функции-члены класса являются виртуальными и могут быть переопределены дочерним классом Используйте ключевое слово override для переопределения методов базового класса (чтобы избежать случайного переопределения) Класс может наследоваться от одного родительского класса, используя ключевое слово "extends" Объекты не инициализируются и не уничтожаются автоматически, используйте "new" и "delete" (или функцию "autoptr"). При создании переменные класса сбрасываются до значений по умолчанию Наследование Please Log in or Register to see this: Spoiler Конструктор и деструктор Конструктор и деструктор - это специальные функции-члены У каждого класса может быть один конструктор и один деструктор Конструктор - это функция, вызываемая при создании объекта (с помощью 'new') и имеющая то же имя, что и класс (например, 'void className()'). Деструктор вызывается, когда объект должен быть уничтожен (с помощью 'delete'/'autoptr'), и имеет то же имя, что и класс, с символом тильды в начале (например, 'void ~className()') Конструктор может иметь параметры инициализации, деструктор не может иметь никаких параметров Как конструктор, так и деструктор не возвращают никакого значения (возвращает void) Конструктор и деструктор вызываются даже при создании или уничтожении объекта из C++ Если конструктор не имеет никаких параметров, при использовании оператора 'new' скобки опускаются Please Log in or Register to see this: Spoiler Безопасность управляемых классов и указателей Поскольку скрипт не выполняет автоматическую сборку мусора, все простые указатели считаются небезопасными Все классы, унаследованные от управляемого класса, используют программные ссылки вместо простых указателей. Программная ссылка - это слабая ссылка, которая не поддерживает объект в рабочем состоянии и обнуляется при уничтожении, поэтому они никогда не становятся недействительными Все объекты, доступные в игровом модуле, должны быть управляемыми, поэтому по умолчанию для них должны использоваться программные ссылки (все они наследуются от управляемого класса). Please Log in or Register to see this: Spoiler Автоматический подсчет ссылок Enforce Script поддерживает автоматический подсчет ссылок. В целях обеспечения гибкости вы можете выбрать, следует или не следует управлять вашим классом, выбрав наследование от управляемого класса. Простые классы, подобные C++, по-прежнему подходят для высокопроизводительных, но менее безопасных сценариев объекты, на которые ссылаются простые указатели C , не имеют автоматического управления памятью, владелец должен удалить их Для обычных игровых скриптов/модов и т.д. существуют управляемые объекты, которые являются немного медленнее (из-за косвенного доступа к объекту со слабым указателем) внутренне пересчитываемые и автоматически удаляемые, когда ненужные объекты, на которые ссылаются слабые указатели (указатель всегда действителен или равен нулю, никогда не указывает на удаленную память и т.д.) Сильные и слабые ссылки сильная ссылка увеличивает количество ссылок - сохраняет объект живым , слабая ссылка просто указывает на объект, но не увеличивает количество ссылок Please Log in or Register to see this: Spoiler В приведенном выше коде в конце функции main объект "a" имеет нулевые строгие ссылки, поэтому удаляется, деструктор освобождает m_child, и поэтому объект "b" также имеет нулевые строгие ссылки и удаляется. Использование ключевого слова ref В скрипте Enforce по умолчанию все переменные являются слабыми ссылками, ключевое слово ref указывает, что переменная является сильной ссылкой. В некоторых особых случаях переменные по умолчанию являются сильными ссылками локальные переменные внутри функций возвращают значение и освобождаются после завершения их области видимости. Пока объект хранится по крайней мере в одной строгой ссылке, он остается активным. Когда последняя строгая ссылка уничтожается или перезаписывается, объект уничтожается, а все остальные ссылки (остаются только слабые ссылки) обнуляются. Когда объект удаляется вручную с помощью команды delete (например, 'delete a;'), он удаляется немедленно, игнорируя количество ссылок, и все ссылки (слабые и сильные) устанавливаются в NULL. Оптимальное использование ссылок в скрипте Enforce заключается в том, чтобы на каждый объект была ровно одна строгая ссылка, помещаемая в объект "владелец", который его создает. Такой способ использования обеспечивает отсутствие циклических ссылок на правильный порядок уничтожения объекта - объект уничтожается при уничтожении его "создателя". Примеры: Please Log in or Register to see this: Spoiler Моддинг Модифицированный класс Модифицированный класс используется для встраивания унаследованного класса в иерархию классов без изменения других скриптов, что требуется для правильного моддинга: Модифицированный класс ведет себя как класс, унаследованный от исходного класса (вы можете использовать super для доступа к исходному классу). Когда объявляется модифицированный класс, его экземпляры будут создаваться вместо исходного класса повсюду в скрипте Когда несколько модифицированных классов модифицируют один и тот же класс vanilla, следующий модифицированный класс будет наследовать последний модифицированный класс, что обеспечивает совместимость с модами Please Log in or Register to see this: Spoiler Измененные константы Константы могут быть переопределены при компиляции последним загруженным модом (обратите внимание на порядок загрузки модов) Позволяет нескольким модам изменять разные константы в одном классе Please Log in or Register to see this: Spoiler Модифицированные закрытые члены Несмотря на то, что модифицированный класс ведет себя так же, как унаследованный, он все равно может обращаться к закрытым членам класса vanilla Please Log in or Register to see this: Spoiler 1 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now