Dmith

ВНИМАНИЕ!!! НЕ ПРЕДНАЗНАЧЕНО ДЛЯ НОВИЧКОВ!!!
Создание модификации Скретч 2.0
С помощью этого руководства вы сможете понять, как создать модификацию Скретч 2.0. Если что-то не понятно, то обращайтесь по-английски сюда (англ.) или в тему «Помощь новичку».
Как вы все знаете, Скретч 2.0 был создан на ActionScript (англ.), который в свою очередь был создан из ECMAScript (англ.) (но это так, к слову, чтобы вы знали).
Установка необходимых программ
Windows
Установка Apache Ant: просто следуй указанным инструкциям (англ.)
Установка Flex SDK: установи Flex SDK (англ.). При установке запомни место, куда установилась программа (обычно это C:\Program Files\Apache Flex).
Подгрузка дополнений: загрузи playerglobal10_2.swc и playerglobal11_4.swc. Первый файл нужно переместить в <путь до Flex SDK>\frameworks\libs\player\10.2, а второй сюда: <путь до Flex SDK>\frameworks\libs\player\11.2.
Mac OS X
Установка ApacheAnt может быть проведена с помощью Homebrew или MacPorts.
Homebrew:
Установи программу:
  1. Установи Xcode с помощью командной строки
  2. Установи Homebrew с помощью командной строки:
    ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
    
Установи Ant с помощью командной строки:
brew install ant
MacPorts:
Установи программу MacPorts:
  1. Установи Xcode с помощью командной строки
  2. Установи MacPorts, выбрав свою версию OS X: https://www.macports.org/install.php#pkg
Установи Ant с помощью командной строки (нужен пароль администратора):
sudo port install apache-ant
Установка Flex SDK: установи Flex SDK (англ.). При установке запомни место, куда установилась программа.
Подгрузка дополнений: загрузи playerglobal10_2.swc и playerglobal11_4.swc. Первый файл нужно переместить в <путь до Flex SDK>\frameworks\libs\player\10.2, а второй сюда: <путь до Flex SDK>\frameworks\libs\player\11.2.
Загрузка исходников Скретч
Теперь нужно загрузить исходники:
  1. Загрузи исходники с GitHub и разархивируй их куда-нибудь
  2. Создай новый текстовый документ и напиши туда
    FLEX_HOME=<путь до Flex SDK>
    Внимание! В пути не должно быть обратных слешей (\) они все должны быть заменены на обычные слеши (/)
  3. Сохрани файл в папку, куда ты разархивировал Скретч с названием local.properties
Ура! Ты уже сделал мод!
Компилирование
После всех сделанных изменений в коде ты можешь запустить компиляцию:
  1. Открой терминал
  2. Измени текущую директорию на путь до исходников Скретч
  3. Запусти команду
    ant
    
    для старта компиляции. Когда всё будет закончено, скомпилированный мод появится в папке bin. Если у тебя возникли ошибки, пиши по-английски сюда (англ.) или в тему «Помощь новичку».
Добавление блоков
Спецификация
Все блоки описаны в файле Specs.as, который лежит в папке src, в массивах, названных командами. Каждое описание блока является массивом, в формате
["block name", "block type", block category, "block primitive name", default arguments...]
Названия блоков
Имена блоков содержат текст, ввод и иконку блока. Ввод (или аргументы) описаны в формате %<буква>.<опциональный тип меню>. например, %n создаёт ввод цифры, а %m.direction создаёт меню направления.
Иконки описываются в формате @<название иконки>. Например, @greenFlag создаёт иконку зелёного флага, а @stop создаёт иконку кнопки стоп. Ты можешь найти полный список типов аргументов, меню и иконок здесь.
Форма блоков
Форма блоков бывает разная
  1. “ ” - обычный блок
  2. “w” - обычный блок с добавкой и ждать, например,
    спросить [] и ждать
  3. “b” - логический блок
  4. “r” - репортёр
  5. “R” - requester, a reporter that requests data and waits until it's been received
  6. “h” - блок-шапка
  7. “c” - обвивающий блок
  8. “cf” - закрывающийся обвивающийся блок, похожий на
    всегда
  9. “e” - двойной обвивающийся блок, похожий на
    если <>
    иначе
    end
  10. “f” - закрывающий блок, похожий на
    остановить скрипт
  11. “o” - блок, похожий на обычный блок определённого блока
  12. “p” - блок, похожий на
    определить
Категории блоков
Блоки должны относиться к определённой категории:
  • 0 - неопределён
  • 1 - движение
  • 2 - внешность
  • 3 - звук
  • 4 - перо
  • 5 - события
  • 6 - контроль
  • 7 - сенсоры
  • 8 - операторы
  • 9 - переменные
  • 10 - больше блоков
  • 11 - параметр (внутри блока)
  • 12 - листы
  • 20 - расширения
Для блоков, принадлежащих только к сцене к номеру категории нужно прибавить 100.
Примитивные имена блоков
Примитивное имя объясняет, что делает блок. Я покажу как их делать позже. Если примитивный блок не обозначен, то он окрашивается в серый и с ним ничего нельзя сделать.
Стандартные аргументы
Стандартные примитивы описаны здесь. Например,
["say %s for %n secs", " ", 2, "say:duration:elapsed:from:" "Привет", 2]
сделает "say for ( ) secs" со стандартными аргументами “Привет” и 2.
Добавление примитивов
Примитивы лежат в папке primitives и определены по категориям. Список примитивов определён в ListPrims.as, примитивы внешности определены здесь: LooksPrims.as, примитивы движения и рисования здесь: MotionAndPenPrims.as, примитивы сенсоров здесь: SensingPrims.as, примитивы звука здесь: SoundPrims.as, примитивы веб-камеры здесь: VideoMotionPrims.as, остальные примитивы здесь: Primitives.as.
Чтобы определить примитив, нужно добавить строчку в функцию addPrimsTo в классе Primitives в формате:
primTable['<название примитива>'] = <название функции>;
В другой файл добавим функцию, определяющую примитив в формате
private function <название функции>(b:Block):void {
	<код блока>
}
Давайте попробуем создать, например, блок “Привет, мир!”:
В спецификацию внешности, в Specs.as, добавим строчку
["Привет мир!", " ", 2, "helloWorld"]
В функцию addPrimsTo в LooksPrims.as добавим
primTable['helloWorld'] = helloWorld;
В файл LooksPrims.as добавим функцию
private function helloWorld(b:Block):void {
	var s:ScratchSprite = interp.targetSprite();
	if (s == null) return;
	s.showBubble("Привет, мир!", "talk");
	if (s.visible) interp.redraw();
}
Если всё получится, то спрайт будет говорить “Привет, мир!”.
Добавление категории
Давайте теперь создадим свою собственную первую категорию блоков. Назовём её, например, ПерКат.
Для того, чтобы создать категорию нужно добавить соответствующий массив в src/Specs.as. Этот массив передаёт Скретч информацию о цвете блока even if that color doesn't have its own button in the palette (such as Листы или Параметры). Каждый элемент массива должен иметь 3 части: номер категории, имя категории и её цвет по таблице. Например,
[13, "ПерКат", 0x0a6320],
Далее, добавим вход в массиве категории в PaletteSelector.as. Массив определяет название кнопки категории в палитре блоков сверху-вниз и слева-направо. Например,
private static const categories:Array = [
    'Motion', 'Looks', 'Sound', 'Pen', 'Data', 'ПерКат', // колонка 1
    'Events', 'Control', 'Sensing', 'Operators', 'More Blocks']; // колонка 2
Также, нужно изменить константу numberOfRows в PaletteSelector.as. Константа передаёт общее количество строк для кнопок в палитре блоков. Её нужно поставить в 6, потому что мы добавим одну строчку.
private function initCategories():void {
    const numberOfRows:int = 6;
И, наконец, добавим блоки в категорию, изменив массив команд в src/Specs.as. Каждый блок имеет 4 параметра: спецификация (строчка, описывающая sequence of labels и аргументы блока), тип блока (“ ” для команд, “b” для логического, там сверху всё написано), номер категории (у меня, например, 13) и опкод (уникальное название блока). В категории у нас будет 2 блока:
["добавить радости", " ", 13, "добавитьРадости"],
["спрайт %s радостный?", "b", 13, "да"],
Когда ты скомпилируешь код, у тебя появится категория и два блока в ней. Однако, блоки будут серыми! Непорядок! А всё потому, что ты не определил блок. Он просто не зает, что он делает.
Для этого добавь определение в src/primitives. Например, я сделал определение в src/primitives/Primitives.as:
primTable[" добавитьРадости"] = function(b:*):* { trace("Я не уверен, что так!") };
primTable["да"] = function(b:*):* {
    var x:* = interp.arg(b, 0);
    return (typeof x == 'string' ? x.length : x) == 42;
};

Morni

Для открытого кода?

Dmith

Ну что ж дерзайте!

Morni

Ок) Попробуем)

Dmith

Добавил блоки

DenisO

Что это?

Mr-Angry-Fruit13

DenisO wrote:

Что это?

Это старая тема.

DenisO

Mr-Angry-Fruit13 wrote:

DenisO wrote:

Что это?

Это старая тема.
Эото страная тем**рим***аст***арррррар*****уст****здр****и** щом**параляк*****аря-лалалалалалалала)))(((*апем674896рмицймдхщауи2огаэ2мьщз2п4н76н9ещаъцыхлф***********************************************************************************************РАОММА*************…

Grustno

Чего-чего?

DenisO

Grustno wrote:

Чего-чего?
Это странная тема.

RGBD

Всем привет, мой первый пост на русском. Я тут пытаюсь фичи допиливать на github.com. Может кто подскажет способ импортировать проект хоть в какую-то IDE? Блокнот - это, конечно, круто, но баги ловить я уже устал)

Grustno

А что за IDE, если не против рассказать))

RGBD

Виноват. (facepalm)

RGBD wrote:

Может кто подскажет способ импортировать проект хоть в какую-то IDE?
Не скретч проект (.sb2), а ActionScript. Я ищу Flash/Flex IDE, чтобы было проще разрабатывать сам скретч, а не проекты в нем.

Grustno

Здорово)) А я просто ищу книги по Lua)

Dmith

RGBD wrote:

Виноват. (facepalm)

RGBD wrote:

Может кто подскажет способ импортировать проект хоть в какую-то IDE?
Не скретч проект (.sb2), а ActionScript. Я ищу Flash/Flex IDE, чтобы было проще разрабатывать сам скретч, а не проекты в нем.
FlashDevelop

Dmith

ну так что? кроме @RGBD никто не пытается сделать подобное?

Dmith

временно закрываю до появления новых обучающих материалов. RGBD: иди в тему "Помощь новичку"