From Test-Scratch-Wiki

< Ukr:Довідка:Scratchblocks

Revision as of 07:14, 4 September 2020 by Yar 2010g (talk | contribs) (incomplete, WIP)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Псевдокод для графічного відображення оточується тегами:

Спрощене пояснення можна знайти на форумі (англ.)

Текст кожного блоку починається з нового рядку і має бути написаний саме так, як він виглядає у Скретч. Приміром:

Код Відображення
[scratchblocks]
коли @greenFlag натиснуто
завжди
    поворот @turnRight на (15) градусів
    говорити [Привіт!] (2) сек
    якщо <мишку натиснуто?> то
        змінити [натиск миші v] на (1)
    end
end
[/scratchblocks]
коли @greenFlag натиснуто
завжди
    поворот @turnRight на (15) градусів
    говорити [Привіт!] (2) сек
    якщо <мишку натиснуто?> то
        змінити [натиск миші v] на (1)
    end
end

Аргументи

Аргументи, тобто вхідні дані для блоку, представляються у псевдокоді за допомогою певної розмітки.

Числовий ввод

Поле для суто числового вводу, кругле, задається звичайними дужками: (10).

перемістити на (10) кроків
перемістити на (10) кроків

Текстовий ввод

Поле для текстового вводу задається квадратними дужками: [lorem ipsum]

говорити [Привіт]
говорити [Привіт]
подумати [бувай]
подумати [бувай]

Блоковий ввод

Булеві блоки та блоки-репортери задаються такою розміткою: <булевий> та (репортер) відповідно.

якщо <<мишку натиснуто?> і <(образ #) = [1]>> то
    штамп
end
if <<мишку натиснуто?> і <(образ #) = [1]>> then
    штамп
end

Свого часу булеві блоки відображувалися круглими, наче репортери. Це було виправлено у scratchblocks3.

Ввод кольору

SandCastleIcon.png This page has links to outside of the Scratch website or Wikipedia. Remember to stay safe when using the internet as we can't guarantee the safety of other sites.

Поле для вводу кольору задається розміткою [#hexcode]. Тут #hexcode – 16-річний RGB код кольору.

задати колір олівця [#00ff00]
задати колір олівця [#00ff00]

Сайт colorpicker.com може допомогти записати правильний код для обраного кольору.

Випадаючий список

Позначка випадаючого меню зі списком задається символом "v": [вибір v]. Звісно, відображення не призначене для змінювання читачем, тож насправді розкрити цей список на веб-сторінці неможливо. У псевдокоді наводиться єдине, обране автором програми, значення.

зупинити [все v]
зупинити [все v]

Можна задати кругле відображення цього поля в такий спосіб: (вибір v).

оповістити (старт v)
оповістити (старт v)

Спеціальні блоки

Певні блоки задаються особливою розміткою, зокрема ті, які всередині містять зображення-піктограми.

Блоки-шляпи

Блок Коли зелений прапорець натиснуто задається особливим синтаксисом (внаслідок можливості багатомовної локалізації):

коли @greenFlag натиснуто
коли @greenFlag натиснуто

Для блоку Коли спрайт натиснуто попередня версія блокового розширення вимагала, аби назву спрайту було вказано у квадратних дужках. Тепер це вже не потрібно, оскільки назва спрайта більше не є параметром, блок діє на той спрайт, у скрипті якого він знаходиться:

коли спрайт натиснуто
коли спрайт натиснуто

Блок Коли клавішу () натиснуто використовує випадаючий список:

коли клавішу [пропуск v] натиснуто
коли клавішу [пропуск v] натиснуто

Зчіплюючі блоки

Блок Поворот на () градусів потребує вказівки напрямку поворота. У псевдокоді напрямок позначається спеціальними словами: @turnRight (за годинниковою стрілкою, англ. clockwise); @turnLeft (проти годинникової стрілки, англ. counterclockwise).

поворот @turnRight на () градусів
поворот @turnRight на () градусів
поворот @turnLeft на () градусів
поворот @turnLeft на () градусів

Охоплюючі блоки

Охоплюючий блок має бути закритий псевдокодом "end" після останнього блоку, який має бути охоплений цип блоком. Виняток – охоплюючий блок наприкінці псевдокоду скрипта, там він буде закритий автоматично. Приміром:

повторити (10)
    перемістити на (5) кроків
    штамп
end
повторити (10)
    перемістити на (10) кроків
    штамп

відображується як:

повторити (10)
    перемістити на (5) кроків
    штамп
end
повторити (10)
    перемістити на (10) кроків
    штамп

Коментарі

Коментарі додаються до псевдокоду після повного вмісту блоку за двома косими рисками: // коментар. Вони увійдуть у графічне відображення.

перемістити на (10) кроків // чи не занадто далеко?
перемістити на (10) кроків // чи не занадто далеко?

Користувацькі блоки

If one tries to show a custom block, it will appear obsolete (red) because it has not been defined.

jump
jump

A definition can be created by writing "define" followed by the name of the block:

define jump
repeat (10)
    change y by (4)
end
define jump
repeat (10)
    change y by (4)
end

Number, boolean, and string arguments can be added:

define jump (height) <gravity on?> [message]
define jump (height) <gravity on?> [message]

Once a define hat has been made, one can then use the block inside the same <scratchblocks> tag, and it will no longer appear obsolete.

jump

define jump
repeat (10)
    change y by (4)
end
jump

define jump
repeat (10)
    change y by (4)
end

Custom Block Inputs

If one tries to use an input reporter without making a block definition first, it will appear as a variable.

say (height)
say (height)

But if it is put below a block definition, it will render as an input reporter:

define jump (height)
say (input)
define jump (height)
say (height)

List Reporters

If one tries to write a list reporter, it will look like a variable reporter, because the plugin has no way of telling them apart.

say (list of Scratch team members)
say (list of Scratch team members)

However, if one has used the list in a list block inside the same <scratchblocks> tag, then it will render correctly:

add [mres] to [list of Scratch team members v]
add [paddle2see] to [list of Scratch team members v]
add [harakou] to [list of Scratch team members v]
say (list of Scratch team members)
add [mres] to [list of Scratch team members v]
add [paddle2see] to [list of Scratch team members v]
add [harakou] to [list of Scratch team members v]
say (list of Scratch team members)

If a list block is not wanted or needed inside the same <scratchblocks> tag, :: list can be used:

say (list of Scratch team members :: list)
say (list of Scratch team members :: list)

Shortening Source Code

It is possible to make the source of ScratchBlocks code slightly shorter by removing unnecessary code. No spaces are necessary between an insert and the block text. Also, closing brackets (]) and parentheses ()) can be left off at the end of a line. Therefore, the following two snippets render identically, though the first is 226 characters, and the second only 183:

when gf clicked
ask [n=] and wait
set [n v] to (answer)
set [i v] to [0]
repeat until <(n) = [1]>
if <((n) mod (2)) = [0]> then
set [n v] to ((n) / (2))
else
set [n v] to (((3) * (n)) + (1))
end
change [i v] by (1)
end
say (i)
when gf clicked
ask[n=]and wait
set[n v]to(answer
set[i v]to[0
repeat until<(n)=[1
if<((n)mod(2))=[0]>then
set[n v]to((n)/(2
else
set[n v]to(((3)*(n))+(1
end
change[i v]by(1
end
say(i
when gf clicked
ask[n=]and wait
set[n v]to(answer
set[i v]to[0
repeat until<(n)=[1
if<((n)mod(2))=[0]>then
set[n v]to((n)/(2
else
set[n v]to(((3)*(n))+(1
end
change[i v]by(1
end
say(i

However, this is considered poor style and is not recommended.

Hacks

The blocks plugin offers hacks to allow representation of scripts from Scratch Modifications and old or unreleased versions of Scratch.

For a full tutorial on how to use scratchblocks hacks, see this topic.

Color and Shape Changing

The color and shape of a block can be changed. This can be useful for forcing non-Scratch blocks to appear correctly. Note that only color changing with the legacy syntax works in the old version. The legacy syntax is obsolete (it no longer works since scratchblocks3).

Feature Code Result
Changing category (works for any kind of block)
abc :: looks
say [I'm not a Motion block!] :: motion
eat (pen color :: pen) :: control
if <touching [mouse pointer v] :: list> then
    die :: grey
end
abc :: looks
say [I'm not a Motion block!] :: motion
eat (pen color :: pen) :: control
if <touching [mouse pointer v] ? :: list> then
    die :: grey
end
Changing color
think [Arbitrary colors?] :: #228b22
think [Arbitrary colors?] :: #228b22
Changing shape
abc :: events hat
def :: motion stack
ghi :: pen reporter
jkl :: operators boolean
abc :: events hat
def :: motion stack
ghi :: pen reporter
jkl :: operators boolean
Creating C blocks and changing category
mno {
    ...
} :: sensing
mno {
    ...
} :: sensing
C blocks with multiple branches
pqr {
    ...
} stu {
    ...
} vwx :: sound
pqr {
    ...
} stu {
    ...
} vwx :: sound
C block with cap
yz {
    ...
} :: motion cap
yz {
    ...
} :: motion cap
Adding icons
@greenFlag @turnRight @loopArrow :: grey
@greenFlag @turnRight @loopArrow :: grey

Snap!

See also: Snap!


The new plugin also supports features specific to Snap!, such as "rings". Other blocks in Snap! can be created using the color/shape hacks above.

run ({create clone :: control} @addInput :: grey ring) :: control

<() @addInput :: grey ring>

say (http:// [snap.berkeley.edu] :: sensing)

((6) × (7) :: operators)

(join [hello ] [world] @delInput @addInput :: operators)

script variables ((foo) :: grey) ((bar) :: grey) @delInput @addInput :: grey

(all but first of (list) :: list)

warp {
  move (10) steps
} :: grey

report [Done!] :: control cap

(<> @addInput) // without even the :: grey ring

which produces these blocks:

run ({create clone :: control} @addInput :: grey ring) :: control

<() @addInput :: grey ring>

say (http:// [snap.berkeley.edu] :: sensing)

((6) × (7) :: operators)

(join [hello ] [world] @delInput @addInput :: operators)

script variables ((foo) :: grey) ((bar) :: grey) @delInput @addInput :: grey

(all but first of (list) :: list)

warp {
  move (10) steps
} :: grey

report [Done!] :: control cap

(<> @addInput) // without even the :: grey ring

GP

This plugin also includes hacks to GP.

when tracking (mouse x :: variables) (mouse y :: variables) :: hat control

((1) != (0) :: operators)

define(a function :: motion) :: custom hat
return (1) :: control

say (pi :: operators) :: motion

when I receive [go] :: control

wait @addInput :: control

(isNil [obj v] :: operators)

(touching mouse :: sensing)

((--( :: #ffffff) :: operators) :: operators)

if (--( :: #ffffff) :: operators) {
} @addInput :: control