Вверх ↑
MCGL 9
Описание

   Позволяет исполнять текст программы для отображения анимационных надписей в проекторе или воспроизведения тех или иных звуковых эффектов.
Написание программы
   Для того, чтобы в проекторе отобразился текст отличный от текста по умолчанию (надпись MCGL 9), необходимо написать программу на языке JavaScript, которая этот текст отобразит. Программы пишутся в обычном блокноте
, который вставляется в MCGL9, а тот уже вставляется в проектор.



   Игроки, которые знакомы с разработкой на JavaScript, могут воспользоваться шаблоном программы. Шаблон добавляет автодополнение в редакторе кода для стандартных объектов mcgl9, позволяет собирать скрипт из нескольких модулей, использовать дополнительные функции, которых нет в mcgl9 изначально (например, setTimeout, Promise). Подробнее можно прочитать по ссылке.
Структура программы
   Программы должна содержать две основные функции:

function init() {
// код инициализации
}

function update(time) {
// обновление состояния элементов или перерисовка всего экрана
// time - текущее время в миллисекундах
}

В программе могут использоваться все стандартные конструкции JavaScript. Доступ же к специальным функциям реализуется через отдельные объекты и их методы.
Объект display
Содержит следующие методы:

size(width, height) - определяет размер виртуального экрана, могут принимать значения от 1 до 3 блоков. Текст и иконки, которых выходят за пределы экрана будут обрезаны.

orientation(mode) - ориентация текстовых элементов: 0 - направление в сторону установки проектора, 1 - всегда направлены на игрока. При mode = 1 виртуальный экран меняется с плоскости заданного размера на куб со сторонами в 5 блоков и центом в точке установки проектора.

depth(value) - позиция по z координате от 0 до 16 (нужно выставлять, если перед проектором стоят блоки)

clear() - очистка всего вывода

print(text) - печать текста с текущим цветом, масштабом и координатами, смещает текущую координату курсора X на длину текста, возвращает объект Operation

cursor(x, y) - передвинуть текущие координаты курсора (0-15 - текущий блок, 16-31 следующий и т.д.)

offset(x, y) - тоже самое что и cursor только добавляет к уже установленной позиции курсора новые значения

color(value) - цвет текста

log(text) - вывод текста в консоль (использовать для отладки)

font(type) - тип шрифта от 0 до 3 (большой, маленький, нормальный и терминал)

icon(slot) - отображает иконку предмета из слота с индексом slot из контейнера, который стоит над проектором (работать будет только с контейнерами, чье содержимое грузится на клиент, например, проектор), возвращает объект Operation

voxel(x, y, z, color) - отображает воксель заданного цвета в указанных координатах
Объект Operation
Этот объект возвращают методы print, icon и voxel объекта display. Содержит поля, которые можно менять в любое время:

cursorX - координата X на экране

cursorY - координата Y на экране

cursorZ - координата Z на экране (глубина)

scale - масштаб

color - цвет

text - текст надписи

Методы:

move (x, y, z) - устанавливает значения всех трех координат cursorXXX

offset (x, y, z) - смещает значения всех трех координат cursorXXX

remove () - удаляет текущий элемент (удаление происходит не сразу, а после завершения текущего цикла отрисовки элементов)
Объект key
press(code) - возвращает true, если нажата клавиша с кодом code и false в противном случае

Коды клавиш
ESCAPE = 1;
1 = 2;
2 = 3;
3 = 4;
4 = 5;
5 = 6;
6 = 7;
7 = 8;
8 = 9;
9 = 10;
0 = 11;
MINUS = 12;
EQUALS = 13;
BACK = 14;
TAB = 15;
Q = 16;
W = 17;
E = 18;
R = 19;
T = 20;
Y = 21;
U = 22;
I = 23;
O = 24;
P = 25;
LBRACKET = 26;
RBRACKET = 27;
RETURN = 28;
LCONTROL = 29;
A = 30;
S = 31;
D = 32;
F = 33;
G = 34;
H = 35;
J = 36;
K = 37;
L = 38;
SEMICOLON = 39;
APOSTROPHE = 40;
GRAVE = 41;
LSHIFT = 42;
BACKSLASH = 43;
Z = 44;
X = 45;
C = 46;
V = 47;
B = 48;
N = 49;
M = 50;
COMMA = 51;
PERIOD = 52;
SLASH = 53;
RSHIFT = 54;
MULTIPLY = 55;
LMENU = 56;
SPACE = 57;
CAPITAL = 58;
F1 = 59;
F2 = 60;
F3 = 61;
F4 = 62;
F5 = 63;
F6 = 64;
F7 = 65;
F8 = 66;
F9 = 67;
F10 = 68;
NUMLOCK = 69;
SCROLL = 70;
NUMPAD7 = 71;
NUMPAD8 = 72;
NUMPAD9 = 73;
SUBTRACT = 74;
NUMPAD4 = 75;
NUMPAD5 = 76;
NUMPAD6 = 77;
ADD = 78;
NUMPAD1 = 79;
NUMPAD2 = 80;
NUMPAD3 = 81;
NUMPAD0 = 82;
DECIMAL = 83;
F11 = 87;
F12 = 88;
F13 = 100;
F14 = 101;
F15 = 102;
F16 = 103;
F17 = 104;
F18 = 105;
KANA = 112;
F19 = 113;
CONVERT = 121;
NOCONVERT = 123;
YEN = 125;
NUMPADEQUALS = 141;
CIRCUMFLEX = 144;
AT = 145;
COLON = 146;
UNDERLINE = 147;
KANJI = 148;
STOP = 149;
AX = 150;
UNLABELED = 151;
NUMPADENTER = 156;
RCONTROL = 157;
SECTION = 167;
NUMPADCOMMA = 179;
DIVIDE = 181;
SYSRQ = 183;
RMENU = 184;
FUNCTION = 196;
PAUSE = 197;
HOME = 199;
UP = 200;
PRIOR = 201;
LEFT = 203;
RIGHT = 205;
END = 207;
DOWN = 208;
NEXT = 209;
INSERT = 210;
DELETE = 211;
CLEAR = 218;
LMETA = 219;
Объект sound
play(sound) - воспроизводит стандартный звук, например mob.cow (соответствует имени пути в папке resources/newsound)
Примеры программ
Игра змейка


var iam = [];
var dir = 0;
var kx = [1,0,-1,0];
var ky = [0,1,0,-1];
var lifeCounter = 0;
var apple;

function genApple() {
apple.cursorX = Math.round(Math.random() * 15);
apple.cursorY = Math.round(Math.random() * 15);
}

function createApple() {
display.color(0xff);
apple = display.print("@");
genApple();
}

function createPlayer() {
display.color(0);
display.cursor(8, 8);
iam = [display.print("*")];
}

function eat() {
sound.play("mob.pig");
display.color(0);
display.cursor(apple.cursorX, apple.cursorY);
iam.push(display.print("*"));
genApple();
}

function init() {
createPlayer();
createApple();
}

function isEqual(o1, o2) {
return o1.cursorX == o2.cursorX && o1.cursorY == o2.cursorY;
}

function selfCross() {
for(var i = 1; i ‹ iam.length; i++) {
if(isEqual(iam[0], iam[i])) {
return true;
}
}
return false;
}

function update(time) {
lifeCounter++;
if(lifeCounter == 10) {
lifeCounter = 0;
for(var i = iam.length-1; i › 0; i--) {
iam[i].cursorX = iam[i-1].cursorX;
iam[i].cursorY = iam[i-1].cursorY;
}
iam[0].cursorX += kx[dir];
iam[0].cursorY += ky[dir];
if(iam[0].cursorX ‹ 0) iam[0].cursorX += 16;
if(iam[0].cursorY ‹ 0) iam[0].cursorY += 16;
if(iam[0].cursorX › 15) iam[0].cursorX -= 16;
if(iam[0].cursorY › 15) iam[0].cursorY -= 16;

if(selfCross()) {
sound.play("random.explode");
display.clear();
createPlayer();
createApple();
}
else if(isEqual(iam[0], apple))
eat();
}

if(key.press(200)) dir = 3;
else if(key.press(208)) dir = 1;
else if(key.press(203)) dir = 2;
else if(key.press(205)) dir = 0;
}

Объект color
Используется для формирования цвета по его компонентам:

rgb (r, g, b) - возвращает код цвета по трем компонентам и с alpha = 0xff, компоненты должны иметь значения от 0 до 255 (0 - 0xff)

rgba (r, g, b, a) - возвращает код цвета по всем 4м компонентам (аналогично rgb)

rgbf (r, g, b) - тоже самое, что rgb, только компоненты цвета должны быть заданы в float числами от 0 до 1

rgbaf (r, g, b, a) - аналогично rgba, только компоненты цвета должны быть заданы в float числами от 0 до 1
Объект user
Предоставляет доступ к некоторым параметрам игрока

name () - ник

x () - позиция X относительно проектора, в котором выполняется программа (нулевая точка это центр проектора)

y () - позиция Y относительно проектора

z () - позиция Z относительно проектора
Советы по написанию эффективного кода
   Программа в проекторе выполняется в отдельном потоке и никак не влияет на скорость рендера за исключением двух операций: добавление новой сущности методом print/icon/voxel и их очистка методом clear. Эти методы не могут одновременно выполняться с отрисовкой элементов на экране, поэтому пока элемент добавляется или очищается список, отрисовка будет ждать и соответственно наоборот: пока происходит отрисовка текущего кадра программа при попытке добавить новый элемент или очистить вывод будет ждать своей очереди. Чтобы такого не происходило не рекомендуется добавлять новые элементы или очищать их из метода update.
BB-code статьи для вставки
Всего комментариев: 12
Хорошая вещь
OCTOPUS2019-09-25 08:46:51
Тут уже нужно видео с гайдами как пользоваться. И вообще - это не опасно, а то специалисты сейчас накалякают вредоносные проги.
admin2019-09-25 17:59:51
OCTOPUS писал(а):
И вообще - это не опасно, а то специалисты сейчас накалякают вредоносные проги.

По умолчанию скрипт выполняется только в доверенных зонах (в тех, где прописан игрок и в системных). Не рекомендуется менять эту настройку без явной необходимости.
Paddles_Redstone2019-09-27 16:41:25
А как вставить блокнов в МСГЛ 9 лет?
Shumiha2019-09-27 21:17:06
Paddles_Redstone писал(а):
А как вставить блокнов в МСГЛ 9 лет?

Press F (не рофл)
OCTOPUS2019-09-30 12:14:19
admin писал(а):
OCTOPUS писал(а):
И вообще - это не опасно, а то специалисты сейчас накалякают вредоносные проги.

По умолчанию скрипт выполняется только в доверенных зонах (в тех, где прописан игрок и в системных). Не рекомендуется менять эту настройку без явной необходимости.



Ну фиг знает, мало ли чего придумают. Лучше сделать какую то систему проверки кодов, допустим игрок пишет код и тестирует его где нибудь на Build, а после проверки получает его на нужном сервере.
Bone_Andrews2019-10-08 21:46:30
Сложновато...Действительно, гайд бы надо, либо инструкция пошаговая попроще.
Avdoss2019-10-17 08:41:51
Было бы здорово иметь метод, позволяющий использовать блок проектора в качестве источника сигнала (для ред. схем).
admin2019-10-30 17:47:54
Avdoss писал(а):
Было бы здорово иметь метод, позволяющий использовать блок проектора в качестве источника сигнала (для ред. схем).

Максимум, что возможно, это чтение сигнала, но никак не его генерация, т.к. программы выполняются только на стороне клиента.
Sucashi2019-10-31 10:57:52
Мне вообще почему-то не пришла мсгл 9 смотрю в бендер а её нету(
fzt2019-11-12 06:23:15
Будет добавлена возможность писать на джаве? Убогий синтаксис говно-скрипт хоть вешайся
fzt2019-11-14 05:52:45
Было бы здорово добавить соединение между экранами
Пример - игра для нескольких игроков
Комментарий
...