Discuss Scratch

inoking
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

何をしたいかという程度にもよりますが

このトピックを最初から見ていくだけで一次情報になると思います。
その中にある Scratch 3.0の拡張機能を作ってみよう などは特に有用です。

JavaScript はまともに扱ったこともない私でさえ
「数週間単位の時間や最低数千円単位の書籍代」もかけることなく、
ポイントを絞ればソースの解析はできています。
apple502j
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

私としては、一次情報は
・ソースコード
・Issue/Pull Request/コミットメッセージ
・STメンバーのプロフィールコメント
・ときどきフォーラム投稿
ですね。
inoking
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

質問コーナー3 #7644 より:
スケジューラについて調べました。
33ミリ秒毎にメインループが起動され各スプライトの処理が順番に実行されます。
秒待つ
等では時間が満了していない場合は yield され次回の処理に回されるので
これが33ミリ秒単位の待ち時間になるという理由と思われます。
※この辺の作りは Scratch 2.0 と同様のようです。

メインループ起動の流れ:
1. 緑旗のクリック時 VirtualMachine::start() が呼ばれます(と思われる)。
https://github.com/LLK/scratch-gui/blob/develop/src/containers/controls.jsx#L17
handleGreenFlagClick (e) {
e.preventDefault();
if (e.shiftKey) {
this.props.vm.setTurboMode(!this.props.turbo);
} else {
if (!this.props.isStarted) {
this.props.vm.start();
}
this.props.vm.greenFlag();
}
}
2. VirtualMachine::start() では Runtime::start() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js#L171
start () {
this.runtime.start();
}
3. Runtime::start() では 33(1000 / 30)ミリ秒毎に Runtime::_step() を呼び出すよう設定します。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L700
static get THREAD_STEP_INTERVAL_COMPATIBILITY () {
return 1000 / 30;
}
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2557
start () {
// Do not start if we are already running
if (this._steppingInterval) return;

let interval = Runtime.THREAD_STEP_INTERVAL;
if (this.compatibilityMode) {
interval = Runtime.THREAD_STEP_INTERVAL_COMPATIBILITY;
}
this.currentStepTime = interval;
this._steppingInterval = setInterval(() => {
this._step();
}, interval);
this.emit(Runtime.RUNTIME_STARTED);
}
4. Runtime::_step() では Sequencer::stepThreads() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2019
_step () {
...
const doneThreads = this.sequencer.stepThreads();
5. Sequencer::stepThreads() では インターバル(33ミリ秒)の 75% を消費するまでループが実行され、これがメインループです。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/sequencer.js#L70
stepThreads () {
// Work time is 75% of the thread stepping interval.
const WORK_TIME = 0.75 * this.runtime.currentStepTime;
...
while (this.runtime.threads.length > 0 &&

numActiveThreads > 0 &&

this.timer.timeElapsed() < WORK_TIME &&

(this.runtime.turboMode || !this.runtime.redrawRequested)) {

秒待つ
https://github.com/LLK/scratch-vm/blob/develop/src/blocks/scratch3_control.js#L110
wait (args, util) {
if (util.stackTimerNeedsInit()) {
const duration = Math.max(0, 1000 * Cast.toNumber(args.DURATION));

util.startStackTimer(duration);
this.runtime.requestRedraw();
util.yield();
} else if (!util.stackTimerFinished()) {
util.yield();
}
}
inoking
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

心の叫び wrote:

Scratch 2.0 のオフラインエディターで編集していた開発版プロジェクトが
(上限の50MBよりは少し小さいのだけれど)いつの間にか保存できなくなってる。。

Scratch 3.0 のオフラインエディタでは読み込んで保存できるものの
.sb2 では 1.2MB だった project.json が
.sb3 では 5.2MB に膨れ上がり
そのせいでオンラインにアップできない。。

Scratch 3.0 は圧縮効率が向上しているはずではなかったのか?

・Scratch 2.0 のサイズ制限を緩和した Mod では保存もできるのでそちらで続けるか、
・Scratch 3.0 のオフラインエディターで編集を続けるか、
思案中。。。
というわけで
Scratch 3.0 の project.json のサイズがなぜ膨れ上がるかなのですが
targets.blocks にある各ブロック(↓ のような単位)
歩動かす
にそれぞれ20文字の一意識別子のようなものが付加されていて相互参照しているようです。
使われているブロックの数だけこの識別子は付加されていますから
それだけでも膨れ上がらせるには十分でしょう。
inoking
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

JSON のビューアとしては「J_and_E」がいい感じです。

Scratch 3.0 の改行なし project.json も放り込んでやれば整形してくれます。

Last edited by inoking (June 27, 2020 15:56:08)

akku--n11
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

こんなの
こんなの
の違いが書いてあるところはありますか?(json内)
jiroz_2nd
Scratcher
100+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

ハックしたプロジェクトは共有してもいいのでしょうか?
apple502j
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

akku--n11 wrote:

こんなの
こんなの
の違いが書いてあるところはありますか?(json内)
基本はopcode-type対応表を用意します。
ただし、変数ブロックは別です。(変数ブロックは「入力欄」として扱われています)
musicmansub
Scratcher
1 post

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

部外者ですいません。scratch3.0ではハッキングすることってできますか?
jun50
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

可能です。
akku--n11
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

jiroz_2nd wrote:

ハックしたプロジェクトは共有してもいいのでしょうか?
多分大丈夫です。
危険なもの(危ないユーザースクリプトなど)を使ったプロジェクトは投稿しないように。
apple502j
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

その場合は、利用規約の4.4(modされたScratchを使ったプロジェクトの共有禁止)にも気を付けてください。
Scratch外での共有は問題ありません。
tsumuri3
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

Windows1000000 wrote:

dream1030 wrote:

inoking wrote:

ベータ版はアップロード機能をもうサポートしているのでしょうか?
ダウンロードしただけのファイルでもアップロードできませんか?
すみません、私は試していません。
※この話題なら Scratch3.0について話し合う所 のほうがいいかも
アップロード機能はもう使えるみたいです。

ところで、ふと思ったことがあったので、実験してみました。
zipだったファイルの拡張子をもう一度sb3に戻してアップロードを試してみましたが、うまくいきませんでした。
僕もうまくいきませんでした。しかも、sb3に拡張子を変えても、アイコンはzipのままでした。
展開したやつは、.sb3ではなく、(windowsの場合だが)フォルダごと、右クリックして、送るでzipにしてください。

Last edited by tsumuri3 (Aug. 3, 2020 08:42:05)

inoking
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

tsumuri3 wrote:

Windows1000000 wrote:

僕もうまくいきませんでした。しかも、sb3に拡張子を変えても、アイコンはzipのままでした。
展開したやつは、.sb3ではなく、(windowsの場合だが)フォルダごと、右クリックして、送るでzipにしてください。
それは2年前の投稿でベータ版の話ですよ。
投稿前に日付を確認しましょう。
bakabaka99
Scratcher
100+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

趣旨にずれている気がしたので削除

Last edited by bakabaka99 (Aug. 11, 2020 21:33:45)

MINITOMATO10
Scratcher
100+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

変数を後ろに下げる方法ってありますか?質問コーナー4で質問したのですが、このトピックの目的が、っぽかったので投稿させていただきました

Last edited by MINITOMATO10 (Aug. 12, 2020 08:44:10)

momonngamon
Scratcher
10 posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

MINITOMATO10 wrote:

変数を後ろに下げる方法ってありますか?
無いと思うなぁ
momonngamon
Scratcher
10 posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

ハッキングはだめですよね
aorubomerkun-s_test
Scratcher
100+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

momonngamon wrote:

ハッキングはだめですよね
このトピックのハッキングとあなたが思っているハッキングでは意味が違います。
単にハッキングと言っても悪いことだけではありません。
akku--n11
Scratcher
1000+ posts

Scratch 3.0 をハック(動作や構造を解析すること)しよう!

このトピックもStickyにされましたね!!

Powered by DjangoBB