新しいブロックを作ってみよ

前回は環境を整えるだけでおわってしまったので
いよいよ「新しいブロックをつくる」を試してみたいと思います。

Modding環境をつくる記事はこちら

ほとんど情報がないので手探りでのmoddingですが
まだやったことがない人も一緒にやってみませんか!

先生いそがしいので、またしてもお絵描きの人がmoddingしています。
ヘンなところがあったら教えて下さいね!



↓↓[つづ]きを読む↓↓をご[らん]ください 
 

Scratch Moddingで新しいブロックを作ろう

HelloとScratchとWorldのブロックを作ってみる

ふだんから「HelloとWorld」のブロックに不満を感じていました。
だいたい「あなたのスコアは○○です」みたいに
最低でも3つは入力項目がほしいところです。

他のプログラムなら「文字列+文字列+文字列…」とか「文字列.文字列.文字列....」みたいに
カンタンに文字列結合できるのですが
Scratchはブロックなので組み合わせないといけないところが面倒なんですよね。

なので今回は3つの文字を結合できる
「Hello と Scratch と World」のブロックを作りたいと思います!

改造できるところを探してみよう

まずブロックを作っているところを探してみましょう。
IntelliJ IDEAでプロジェクト全体を検索するには
「Ctrl + Shift + F」
を押します。

何を検索したらいいのかわからないのですが
多分「文字列結合」的な英語で名前がついていると思いますので
WS0834
 
Google先生に聞いてみました。
「結合」は「concatenation」フムフム

WS0836

検索マドに「concate」と入力してみましょう。
入力途中でも検索してくれるので途中までで大丈夫です。

候補がたくさん出てくるのですが
いちばん下の「Spaces.as」と「Primitices.as」に入っているのが怪しそうです 

行をダブルクリックすると、そのソースを開いてくれますので
「Spaces.as」を開いてみましょう 。

WS0837
中を見てみると、見覚えのある単語がたくさん出てきました!
Motion(動き)Looks(見ため)Sound(音)Pen(ペン)などなど

ここ、カテゴリの名前とか色とか決めているところですね。

WS0838
緑の旗とかのアイコンなどなど
見た目だけならすぐに変えられちゃいますね。


どんどん下に進んでいくと…
ブロックを作っているところがありました!

動きブロックってこんな感じになってたんですね~
「ブロックの名前」「タイプ」「カテゴリ」「オペコード」「デフォルト値」
WS0840

move %n steps が ○歩進むのブロックですね。

helloとworldのブロックは演算カテゴリのなかにあるので
Operatorsのところを探してみましょう。
WS0841
 
ありました!
ここに「helloとscratchとworld」のブロックを追加してみましょう。

ブロックを追加してみよう

改造ポイントを発見してしまえばこっちのもの。
さっそく追加してみましょう。

WS0844

["join %s %s", "r", 8, "concatenate:with:", "hello ", "world"],
["join2 %s %s %s", "r", 8, "concatenate2:with:", "hello ", "scratch ", "world"],

このように
join%s%s…の下に、join2をつくってみます。

「concatenate2」というオペコードを新しく作ったので
これもどこかで設定しないといけませんね。


「concatenate:with」という名前で設定している場所が
あるはずなので、探してみましょう。

「Ctrl + Shift + F」をおして検索します。
WS0843

するとPrimitives.asのなかに設定している部分が見つかりました。
ダブルクリックでこの場所に移動してみましょう。

WS0845

primTable["concatenate:with:"] = function(b:*):* { return ("" + interp.arg(b, 0) + interp.arg(b,1)).substr(0, 10240); };

と書かれた場所がみつかりました。
このコードをコピーして

WS0846


primTable["concatenate2:with:"] = function(b:*):* { return ("" + interp.arg(b, 0) + interp.arg(b, 1)+
                                   interp.arg(b, 2)).substr(0, 10240); };

こんな感じで、concatenate2を増やしてみましょう。
使える文字列を増やしたいので interp.arg(b, 2)も追加しています。

ビルドして動作確認してみよう

追加がおわったら、ちゃんと動くかどうか確認してみましょう。
「Scratch.swf」をswfビューワで開くと確認できるんですが
Scratch2のフォルダにつっこんでも動きます。

WS1103

もともとのScratch.swfはちょっと別の名前にしてよけておきます。
(上書きしちゃうとあとで復帰できなくなるので注意!)


Scratch.swfをフォルダに入れて、「Scratch2.exe」を起動すると…


WS1102

ジャン!演算ブロックの中に
「join2」というブロックが追加されています!

「○○と言う」のブロックに組み合わせると
ちゃんと文字列結合されていることがわかりますね。

日本語化ファイルがないのでjoin2のままですが
Scratch 2\localeフォルダの中にある「ja.po」ファイルをメモ帳などで開いて
「"msgid "join2 %s %s %s
"msgstr "%s と %s と %s」
みたいにすれば日本語化できます。

WS1104
ちゃんと「helloとscratchとworld」のブロックになりましたね。

Scratch2フォルダにつっこんで動作確認した人は
ちゃんともとのファイルに戻しておきましょう。

さいごに

もともとはScratchのコミュニティでModdingが話題になっていて
ちょっと試してみよう!と思ってやってみたのですが
導入の段階でかなりめんどくさかったですね。

もし興味がある人は試してみるといいんじゃないでしょうか!