
前回は環境を整えるだけでおわってしまったので
いよいよ「新しいブロックをつくる」を試してみたいと思います。
Modding環境をつくる記事はこちら
ほとんど情報がないので手探りでのmoddingですが
まだやったことがない人も一緒にやってみませんか!
先生いそがしいので、またしてもお絵描きの人がmoddingしています。
ヘンなところがあったら教えて下さいね!
Scratch Moddingで新しいブロックを作ろう
HelloとScratchとWorldのブロックを作ってみる
ふだんから「HelloとWorld」のブロックに不満を感じていました。だいたい「あなたのスコアは○○です」みたいに
最低でも3つは入力項目がほしいところです。
他のプログラムなら「文字列+文字列+文字列…」とか「文字列.文字列.文字列....」みたいに
カンタンに文字列結合できるのですが
Scratchはブロックなので組み合わせないといけないところが面倒なんですよね。
なので今回は3つの文字を結合できる
「Hello と Scratch と World」のブロックを作りたいと思います!
改造できるところを探してみよう
まずブロックを作っているところを探してみましょう。IntelliJ IDEAでプロジェクト全体を検索するには
「Ctrl + Shift + F」を押します。
何を検索したらいいのかわからないのですが
多分「文字列結合」的な英語で名前がついていると思いますので

Google先生に聞いてみました。
「結合」は「concatenation」フムフム

検索マドに「concate」と入力してみましょう。
入力途中でも検索してくれるので途中までで大丈夫です。
候補がたくさん出てくるのですが
いちばん下の「Spaces.as」と「Primitices.as」に入っているのが怪しそうです
行をダブルクリックすると、そのソースを開いてくれますので
「Spaces.as」を開いてみましょう 。

中を見てみると、見覚えのある単語がたくさん出てきました!
Motion(動き)Looks(見ため)Sound(音)Pen(ペン)などなど
ここ、カテゴリの名前とか色とか決めているところですね。

緑の旗とかのアイコンなどなど
見た目だけならすぐに変えられちゃいますね。
どんどん下に進んでいくと…
ブロックを作っているところがありました!
動きブロックってこんな感じになってたんですね~
「ブロックの名前」「タイプ」「カテゴリ」「オペコード」「デフォルト値」

move %n steps が ○歩進むのブロックですね。
helloとworldのブロックは演算カテゴリのなかにあるので
Operatorsのところを探してみましょう。

ありました!
ここに「helloとscratchとworld」のブロックを追加してみましょう。
ブロックを追加してみよう
改造ポイントを発見してしまえばこっちのもの。さっそく追加してみましょう。

["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」をおして検索します。

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

primTable["concatenate:with:"] = function(b:*):* { return ("" + interp.arg(b, 0) + interp.arg(b,1)).substr(0, 10240); };
と書かれた場所がみつかりました。
このコードをコピーして

このように
join%s%s…の下に、join2をつくってみます。
「concatenate2」というオペコードを新しく作ったので
これもどこかで設定しないといけませんね。
「concatenate:with」という名前で設定している場所が
あるはずなので、探してみましょう。
「Ctrl + Shift + F」をおして検索します。

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

primTable["concatenate:with:"] = function(b:*):* { return ("" + interp.arg(b, 0) + interp.arg(b,1)).substr(0, 10240); };
と書かれた場所がみつかりました。
このコードをコピーして

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のフォルダにつっこんでも動きます。

もともとのScratch.swfはちょっと別の名前にしてよけておきます。
(上書きしちゃうとあとで復帰できなくなるので注意!)
Scratch.swfをフォルダに入れて、「Scratch2.exe」を起動すると…

ジャン!演算ブロックの中に
「join2」というブロックが追加されています!
「○○と言う」のブロックに組み合わせると
ちゃんと文字列結合されていることがわかりますね。
日本語化ファイルがないのでjoin2のままですが
Scratch 2\localeフォルダの中にある「ja.po」ファイルをメモ帳などで開いて
「"msgid "join2 %s %s %s
"msgstr "%s と %s と %s」
みたいにすれば日本語化できます。

ちゃんと「helloとscratchとworld」のブロックになりましたね。
Scratch2フォルダにつっこんで動作確認した人は
ちゃんともとのファイルに戻しておきましょう。
さいごに
もともとはScratchのコミュニティでModdingが話題になっていてちょっと試してみよう!と思ってやってみたのですが
導入の段階でかなりめんどくさかったですね。
もし興味がある人は試してみるといいんじゃないでしょうか!
コメント