Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Туториал (Устарел) [VarScript 0.5] Конструкторы и объекты

Тема в разделе "Руководства, инструкции, утилиты", создана пользователем DPOH-VAR, 26 авг 2013.

Статус темы:
Закрыта.
  1. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    -----------------------------------------------------
    Разработка VarScript 0.5 (ссылки на другие уроки, полезные функции, модули и т.д.)
    VarScript на dev.bukkit.org (скачать можно тут)
    -----------------------------------------------------
    Объекты varscript и работа с ними

    Каждый объект в varscript имеет несколько полей ( связок <Ключ-строка, Значение> )
    Создать пустой объект можно командой OBJECT
    Записать данные в его поля можно несколькими способами:
    Код:
    OBJECT        ## создаем пустой объект
    10 >>foo      ## записываем ему 10 в поле foo
    12 >>bar      ## записываем ему 12 в поле bar
    <Map> PRINT   ## распечатать объект в виде {ключ=значение}
    Получим на экране {foo=10, bar=12, constructor=FieldableObject{}}
    Поле constructor есть у каждого объекта по умолчанию и представляет собой конструктор, с помощью которого был создан объект.
    Вот второй вариант заполнения полей объекта
    Код:
    OBJECT %%a      ## создаем пустой объект и пишем в переменную a
    10 @a.>foo      ## записываем 10 в поле foo объекта a
    12 @a.>bar      ## записываем 12 в поле bar объекта a
    @a <Map> PRINT  ## распечатать объект a в виде {ключ=значение}
    В этом случае объект не лежит постоянно в стеке, а хранится в переменной.
    Результат будет аналогичным: {foo=10, bar=12, constructor=FieldableObject{}}
    Прочитать значение поля у объекта можно следующей командой:
    Код:
    @a.bar PRINT     ## выведет 12

    Вызов функции как конструктора

    Для примера, рассмотрим элемент модуля Helljump, но в упрощенном варианте:
    попробуем создать объект - платформу.
    Код:
    %Platform{ ## конструктор платформы
     
        ## первый аргумент конвертируется в массив блоков
        ## и записывается в переменную b
        :MAP{<Block>} %%b
     
        $blocks{ ## метод blocks - чтобы прочитать массив блоков
            @b
        }
    }
    Теперь мы имеем конструктор платформы (внешне он не отличается от обычной функции).
    Чтобы создать новый экземпляр, нужно вызвать функцию с помощью команды NEW:
    Код:
    -1:0:-1 1:0:1 BOX @Platform NEW %plat
    Теперь в переменной plat содержится объект - платформа
    В качестве аргумента мы передали конструктору -1:0:-1 1:0:1 BOX
    дословно это означает: регион начиная с позиции -1:0:-1 от меня и до 1:0:1 от меня.
    Внутри конструктора этот регион конвертируется в массив блоков (строка 5)
    И в итоге теперь в переменной b хранится массив из девяти блоков.
    Распечатаем объект plat в виде мапы:
    Код:
    @plat <Map> PRINT
    получим: {blocks=blocks{}, constructor=Platform{}}
    Это означает, что объект plat содержит функцию(метод) blocks{} в поле blocks
    Функция blocks{} вернет нам список блоков, который хранится в переменной b (строка 8)
    Вызвать метод у объекта можно такой командой:
    Код:
    @plat:blocks PRINT
    В результате мы увидим на экране список из девяти блоков.
    Мы не можем изменить значение переменной b внутри объекта, т.к. переменная замкнута внутри конструктора. Однако можем прочитать ее с помощью метода blocks{}
     
    FedorNogopletov и REZAYS нравится это.
  2. Хостинг MineCraft
    <
  3. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Вызов методов и команда THIS

    Теперь усложним задачу, добавим методы destroy и regen
    Пусть destroy - уничтожает все блоки, а regen - восстанавливает с id = 1
    Код:
    %Platform{ ## конструктор платформы
     
        :MAP{<Block>} %%b
     
        $blocks{@b}
     
        $destroy{ ## метод: уничтожить блоки
            THIS:blocks
            :MAP{0 SETBLOCKID} DROP
        }
     
        $regen{ ## метод: восстановить блоки
            THIS:blocks
            :MAP{1 SETBLOCKID} DROP
        }
    }
    Тут:
    строка 7 $destroy - метод для разрушения платформы
    строка 11 $regen - метод для восстановления блоков

    Команда THIS (строка 8 и 12) позволяет взять объект, для которого вызывается метод. То есть, THIS:blocks вызывает метод blocks у этого же объекта, в результате чего мы получаем массив блоков.
    :MAP{0 SETBLOCKID} DROP - для каждого блока из массива: заменить его на воздух
    :MAP{1 SETBLOCKID} DROP - для каждого блока из массива: заменить его на камень

    Вызвать конструктор и создать объект можно как и в предыдущем случае:
    Код:
    -1:0:-1 1:0:1 BOX @Platform NEW %plat
    Но теперь объект plat будет содержать еще два дополнительных метода, которые можно так же легко использовать
    Код:
    @plat:destroy  ## уничтожить платформу
    @plat:regen    ## восстановить платформу

    Значения полей по умолчанию

    Можно конструктору указать, чтобы он при создании объекта задавал значения полей:
    Код:
    ExampleConstructor{
        10 $foo
        12 $bar
    }
    Если с помощью этого конструктора создать новый объект, то у него будут уже заданы поля foo и bar.
    То же самое можно сделать при помощи команды THIS:
    Код:
    ExampleConstructor{
        10 THIS.>foo
        12 THIS.>bar
    }
    Или таким способом:
    Код:
    ExampleConstructor{
        THIS
        10 >>foo
        12 >>bar
        DROP
    }
    Создать новый объект с помощью конструктора и распечатать можно так:
    Код:
    @ExampleConstructor NEW <Map> PRINT
     
    AlexGL и REZAYS нравится это.
Статус темы:
Закрыта.

Поделиться этой страницей