2ヶ月近くのブランクがあいての続編。
シリーズ全エントリーはこちら↓
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)
前回まででスクラッチの「◯◯を送る」ブロックを使って、スクラッチから Ruby のプログラムに対してメッセージを送ってみた。
次に、スクラッチの変数の情報を Ruby のプログラムに送ってみよう。
前回同様、スクラッチの遠隔センサー接続を有効にし、スクラッチからのメッセージをのぞき見る Ruby のプログラムをスタートさせる。
スクラッチで「a」という変数を「すべてのスプライト用」に作る。
すると、変数を作った瞬間
というメッセージが Ruby のプログラムに送られる。
これを前回同様、ASCII文字コードをたよりに解読すると、
となる。
sensor-update(センサーの値を更新、という意味)という命令に続いて、スペースを一つおいて変数名 a を " (ダブルクオート)で囲み、変数の値 0 に続いてスペースという順に並んでいる。
スクラッチで新しく変数を作ると、最初は自動的に 0 が入ったよ、という情報が Ruby のプログラムに送られたのだ。
試しに変数を変えてみよう。
まず a の値を 1 に変えたあと、次に 2 に変えてみた。
最初に変えたときに送られたメッセージは、
次に変えたときに送られたメッセージは、
変数の値の部分が最初は 1 に、次に 2 に変わっているのがわかる。
『「すべてのスプライト用」の変数に値を入れると、その変数の名前と新しくセットされた変数の値の情報を、スクラッチ以外のプログラムに送ることができる』ことがわかった。
今まではスクラッチから Ruby のプログラムに命令や情報を送る例を見てきた。
今度は逆に、Ruby のプログラムからスクラッチに命令を送っている様子を見てみよう。
スクラッチに命令を送る Ruby のプログラムは次のように書ける。
コメント行を抜かした最初の2行は、前回までのスクラッチからの命令を受けるプログラムと一緒だ。
外部のプログラムからスクラッチに送るメッセージの形式は、いままでのスクラッチから外部のプログラムに送られるメッセージの形式と同じで、最初の4バイトは命令文の長さを表しており、その後に命令文自体が続く。
という命令の長さを
で求め、
でバイト列に変換している。
そして最後に
でこの Ruby プログラムがつながった先、つまりスクラッチに命令を送っている。
スクラッチに送った命令の内容は、
で Scratch Wiki に書かれている情報から組み立てたものなのだが、これはスクラッチの「a を送る」ブロックと同じ命令だ。
つまり、スクラッチの「a を送る」と同じことを、スクラッチではない Ruby のプログラムから実行できるということだ。
「a」を受け取ったら「こんにちは」とネコが言うスクリプトを作ってみて、Ruby のプログラムからネコに「こんにちは」と言わせてみよう。
『スクラッチとつながったプログラムからスクラッチに対して、「○○を送る」と同じ仕組みの命令を送ることができる。スクラッチではこの命令を「○○を受け取ったとき」ブロックで受け取ることができる』ということがわかった。
シリーズ全エントリーはこちら↓
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その1)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その2)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その3)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その4)
» Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)
スクラッチの変数の情報を Ruby のプログラムに送ってみる
前回まででスクラッチの「◯◯を送る」ブロックを使って、スクラッチから Ruby のプログラムに対してメッセージを送ってみた。
次に、スクラッチの変数の情報を Ruby のプログラムに送ってみよう。
前回同様、スクラッチの遠隔センサー接続を有効にし、スクラッチからのメッセージをのぞき見る Ruby のプログラムをスタートさせる。
スクラッチで「a」という変数を「すべてのスプライト用」に作る。
すると、変数を作った瞬間
0000001473656e736f722d75706461746520226122203020
というメッセージが Ruby のプログラムに送られる。
これを前回同様、ASCII文字コードをたよりに解読すると、
00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 30 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 0 SP
(SP はスペース)
となる。
sensor-update(センサーの値を更新、という意味)という命令に続いて、スペースを一つおいて変数名 a を " (ダブルクオート)で囲み、変数の値 0 に続いてスペースという順に並んでいる。
スクラッチで新しく変数を作ると、最初は自動的に 0 が入ったよ、という情報が Ruby のプログラムに送られたのだ。
試しに変数を変えてみよう。
まず a の値を 1 に変えたあと、次に 2 に変えてみた。
最初に変えたときに送られたメッセージは、
00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 31 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 1 SP
(SP はスペース)
次に変えたときに送られたメッセージは、
00 00 00 14 | 73 65 6e 73 6f 72 2d 75 70 64 61 74 65 20 22 61 22 20 32 20
長さ20バイト s e n s o r - u p d a t e SP " a " SP 2 SP
(SP はスペース)
変数の値の部分が最初は 1 に、次に 2 に変わっているのがわかる。
『「すべてのスプライト用」の変数に値を入れると、その変数の名前と新しくセットされた変数の値の情報を、スクラッチ以外のプログラムに送ることができる』ことがわかった。
Ruby のプログラムからスクラッチに命令を送ってみる
今まではスクラッチから Ruby のプログラムに命令や情報を送る例を見てきた。
今度は逆に、Ruby のプログラムからスクラッチに命令を送っている様子を見てみよう。
スクラッチに命令を送る Ruby のプログラムは次のように書ける。
コメント行を抜かした最初の2行は、前回までのスクラッチからの命令を受けるプログラムと一緒だ。
外部のプログラムからスクラッチに送るメッセージの形式は、いままでのスクラッチから外部のプログラムに送られるメッセージの形式と同じで、最初の4バイトは命令文の長さを表しており、その後に命令文自体が続く。
broadcast "a"
という命令の長さを
length = command.length
で求め、
bytes = [length].pack("N")
でバイト列に変換している。
そして最後に
socket.write(bytes + command)
でこの Ruby プログラムがつながった先、つまりスクラッチに命令を送っている。
スクラッチに送った命令の内容は、
broadcast "a"
で Scratch Wiki に書かれている情報から組み立てたものなのだが、これはスクラッチの「a を送る」ブロックと同じ命令だ。
つまり、スクラッチの「a を送る」と同じことを、スクラッチではない Ruby のプログラムから実行できるということだ。
「a」を受け取ったら「こんにちは」とネコが言うスクリプトを作ってみて、Ruby のプログラムからネコに「こんにちは」と言わせてみよう。
『スクラッチとつながったプログラムからスクラッチに対して、「○○を送る」と同じ仕組みの命令を送ることができる。スクラッチではこの命令を「○○を受け取ったとき」ブロックで受け取ることができる』ということがわかった。
2014/11/05 09:00:00