
- •С чего начать
- •Переменные и присвоение им значений
- •Области видимости
- •Настойчивые переменные
- •Изменяемый тип переменных
- •Присвоение значения по ссылке
- •Выделение памяти и уборка мусора
- •Имена переменных
- •Литералы
- •Числовые литералы
- •Строковые литералы
- •Литералы времени
- •Литералы имен объектов
- •Литералы точек в двумерном и трехмерном пространстве
- •Литералы массивов
- •Выражения
- •Простые выражения
- •Математические выражения
- •Порядок выполнения операций в математических выражениях
- •Полиморфизм
- •Выражения сравнения
- •Логические операции
- •Сокращенное выполнение логических выражений
- •Позиционированные и именованные параметры
- •Приоритет вызова функций
- •Написание вызова функции в несколько строк
- •Другой способ вызова функций
- •Контекстные выражения
- •Комментарии
- •Обращение из одного скрипта к другим
- •Управление порядком выполнения операторов
- •Пропуск выполнения цикла
- •Собственная обработка ошибок
- •Оформление функций
- •Переменная, содержащая функцию
- •Параметры функций
- •Принудительное завершение функции
- •Определение структур
- •Создание функций, локальных внутри структуры
- •Базовые классы maxScript Класс Value
- •Операторы
- •Литералы
- •Операторы
- •Свойства
- •Операторы
- •Точка в трехмерном пространстве
- •Литералы
- •Конструкторы
- •Свойства
- •Операторы
- •Литерал
- •Конструкторы
- •Свойства
- •Произвольный поворот
- •Литералы
- •Конструкторы
- •Операторы
- •Свойства
- •Углы Эйлера
- •Операторы
- •Свойства
- •Прямоугольник
- •Литералы
- •Конструкторы
- •Свойства
- •Операторы
- •Функция
- •Массив_чисел
- •Вспомогательные методы Функция
- •Функция
- •Можно открыть зашифрованный файл, используя функцию
- •Свойства
- •Свойства
- •Особенности работы с ключами анимации
- •Массив параметров
- •Конструкторы
- •Свойства
- •Операторы
- •Множества
- •Шаблонные группы
- •Свойства
- •Операторы
- •Функции для работы с группами
- •Наборы объектов
- •Конструкторы
- •Свойства
- •Операторы
- •Функции, работающие с наборами
- •Дополнительные сведения
- •Конструкторы
- •Свойства
- •Операторы
- •Прочие функции
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Литералы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Прочие функции
- •Скрипт-утилиты
- •Панель скрипт-утилиты
- •Составные части тела свитка
- •Создание перемещаемых окон
- •Видимость локальных переменных, структур, функций и компонент интерфейса из кода свитка
- •Доступ к локальным переменным и прочим элементам утилит и свитков из внешнего кода
- •Компоненты пользовательского интерфейса
- •Название_компонента Имя_переменной Символьная_строка
- •Общие свойства компонентов пользовательского интерфейса
- •Общие параметры компонентов пользовательского интерфейса
- •Типы компонентов пользовательского интерфейса Для примера рассмотрим утилиту, использующую все возможные компоненты пользовательского интерфейса
- •Битовая карта
- •Параметры
- •Свойства
- •События
- •Параметры
- •Параметры
- •Свойства
- •События
- •Параметры
- •Свойства
- •События
- •Выпадающий список
- •Параметры
- •Свойства
- •События
- •Свойства
- •События
- •Кнопка выбора текстурной карты
- •Параметры
- •Свойства
- •События
- •Кнопка выбора материала
- •Параметры
- •Свойства
- •События
- •Список с возможностью множественного выбора
- •Параметры
- •Свойства
- •События
- •Кнопка выбора объекта
- •Параметры
- •Свойства
- •События
- •Задатчик
- •Параметры
- •Свойства
- •События
- •Параметры
- •Свойства
- •События
- •Кнопки с картинками
- •Скрипт контекстного меню
- •Тело контекстного меню
- •Пункт меню
- •Разделитель
- •Подменю
- •Макро скрипты
- •Создание файлов с иконками
- •Средства работы с мышью
- •Остановить работу средства можно вызовом функции
- •Правила оформления средств работы с мышью
- •События
- •Скрипт плугины
- •Правила построения скрипт-плугина
- •Внесение изменений в плугин
- •Урок 1. Твердые тела
- •Создание набора твердых тел
- •Добавление тел к набору
Определение структур
Вы можете создать свой собственный тип данных, используя оператор определения структур. Записывается он так. Сначала пишется слово struct, затем название, которое Вы даете структуре. Потом в круглых скобках, через запятую перечисляются элементы структуры. Представим себе, что нам надо создать небольшой видео ролик, иллюстрирующий атомарную теорию строения вещества. В нем должен быть отражен тот факт, что атом состоит из ядра и вращающихся вокруг него электронов. Поскольку по сценарию атомов должно быть очень много, создадим структуру, описывающую изображение атомов.
struct atom
( nuclear, -- ядро
electrons = #( )
)
Данная структура содержит элемент nuclear, который призван изображать ядро атома и элемент electrons – массив, который будет содержать один или несколько электронов. В качестве моделей ядра и электронов будем применять сферы. Например, создать атом A с двумя электронами можно так
A = atom (sphere( )) (#(sphere( ),sphere( )))
Круглые скобки вокруг параметра обязательны только в данном, конкретном случае. Дело в том, что пустые скобки после слова sphere – это тоже выражение, имеющее значение undefined, и если не поставить круглых скобок вокруг параметра, то не ясно, к чему это выражение относится. То ли к вызову функции sphere, то ли к созданию объекта структуры atom. При создании объекта нужно указывать элементы структуры в том порядке, в каком они перечислены в определении. Именно так и сделано в приведенном выше скрипте. Для такой простой структуры это легко, ну а если она включает десяток элементов? В этом случае можно указывать их так же как именованные параметры функции. Например, тот же атом A можно создать и так
A = atom nuclear:(sphere( )) electrons:(#(sphere( ),sphere( )))
что несколько нагляднее. К тому же в этом случае соблюдать порядок следования параметров необязательно.
При определении структуры можно определить значение элемента по умолчанию. В нашем примере элемент electrons определен по умолчанию как пустой массив. Если написать
P = atom nuclear:(sphere( ))
или просто
P = atom (sphere( ))
то получится атом без электронов (положительно заряженный ион), а свободный электрон можно создать так
E = atom electrons:(#(sphere( )))
В этом случае ядро будет иметь значение undefined, поскольку значение по умолчанию для него не определено. Пока что наша структура не очень удобна для использования, и вскоре мы улучшим ее. Пока же можно воспользоваться только одним преимуществом структуры – наглядным доступом к ее элементам, или, как принято говорить в MAXScript, свойствам объекта.
Например, установить цвет сферы, имитирующей ядро атома A, можно так
A.nuclear.wireColor = red
а установить радиус сферы, имитирующей второй электрон того же атома, так
A.electrons[2].radius = 0.1
Создание функций, локальных внутри структуры
Одним из главных преимуществ, предоставляемых определением структуры, является возможность создавать функции, локальные внутри структуры. Их еще называют методами и в отличие от функций, локальных внутри других функций, методы можно вызывать вне определения структуры. Например, структуру, описывающую модель атома, можно дополнить функцией по созданию сфер, имитирующих ядро и электроны.
struct atom
( nuclear,
electrons = #(),
fn CreateSpheres ElectronsCounter:1 =
( nuclear = sphere radius:1.0
for i = 1 to ElectronsCounter do
( electrons[i] = sphere radius:0.1
electrons[i].position.x = nuclear.position.x + 2.0;
)
)
)
Методы, как и свойства, при определении отделяются друг от друга и от свойств запятой. После такого определения создать атом гелия, у которого два электрона, можно так
He = atom ( )
He.CreateSpheres ElectronCounters:2
Данный скрипт сам создаст большую сферу, имитирующую ядро и две маленьких, изображающих электроны. Если надо создать сцену, в которой участвуют десятки или сотни атомов, то выигрыш от такого подхода очевиден. Разумеется, пример далек не только от совершенства, но и от реальности. Надо было бы создать сферы электронов как минимум в разных местах. Можно было задать плоскости и направление вращения электронов вокруг ядра и отобразить еще массу фактов из теории атома. Но данный пример призван только проиллюстрировать тот факт, что Вы можете разработать и включить в структуру ряд функций-методов, облегчающих Вашу дальнейшую работу с созданными объектами.