11

Scratchまたはそれ以降のスナップで使用されるプログラミング ブロックのミニ バージョンを作成する必要があります。またはオープンブロック。

それらのすべてのコードは大きく、追跡するのが難しく、特に SmallTalk のある種のサブセットで記述されている Scratch ではわかりません。

ブロックを解析して、Scratch のようなアニメーションやゲームなどで動作する一連の命令に変換するためにすべてが使用するアルゴリズムはどこにありますか?

プログラミング ブロックの概念の背後にあるアルゴリズムまたはアーキテクチャに非常に興味があります。

4

1 に答える 1

23

これは非常に一般的な説明に過ぎず、詳細を理解するのはあなた次第です。

ブロックの定義

Blockすべてのブロックが継承するクラスがあります。それらは、ラベル (名前)、形状、およびメソッドへの参照で初期化されます。それらが実行/呼び出されると、関連するメソッドに現在のコンテキスト (スプライト) と引数が渡されます。

正確な実装はバージョンによって異なります。たとえば、Scratch 1.x では、メソッドはブロックの引数に対応する引数を取り、コンテキスト (thisまたはself) はスプライトです。2.0 では、ブロックのすべての引数とコンテキストを含む単一の引数が渡されます。スナップ!1.xの方法に従っているようです。

スタック (コマンド) ブロックは何も返しません。レポーターブロックが行います。

通訳

インタプリタはこのように動作します。各ブロックには、次のブロックへの参照と、任意のサブルーチン (引数のレポーター ブロック、C スロットのコマンド ブロック) が含まれます。

まず、すべての引数が解決されます。レポーターが呼び出され、その戻り値が保存されます。これは、互いに内部にある多くの Reporter ブロックに対して再帰的に行われます。

次に、コマンド自体が実行されます。理想的には、これは単純なコマンド (移動など) です。メソッドが呼び出され、ステージが更新されます。

次のブロックに進みます。

C ブロック

C ブロックの手順は少し異なります。これらはif <>スタイルであり、repeat <>ものです。通常の引数に加えて、「ミニスクリプト」サブルーチンを参照します。

単純なif/elseC ブロックの場合、該当する場合はサブルーチンを通常どおり実行します。

ただし、ループを処理する場合は、適切にスレッド化されていることを確認し、他のスクリプトを待つ必要があります。

イベント

キープレス/クリック イベントは十分に簡単に処理できます。キーを押す/クリックするだけで実行できます。

ブロードキャスト スタックの実行時にハットを実行すると、ブロードキャストのようなことができます。

他のイベントは、自分で解決する必要があります。

待機ブロック

これは、スレッド化とともに、私にとって解釈の最も紛らわしい部分です。基本的に、スクリプトをいつ続行するかを判断する必要があります。おそらく時間後に実行するようにタイマーを設定しますが、それでも適切にスレッド化する必要があります。

これが役立つことを願っています!

于 2014-08-10T08:09:45.707 に答える