@tscratch3/typescratcher
v0.0.45
Published
TypeScript library that generates Scratch 3-style drawings
Readme
@amami-harhid@typeScratcher
This is a TypeScript library that generates Scratch 3-style drawings.
準備
npm ci
テスト実行
npm run dev /test/
ビルド
npm run webpack
npm publish
- npm adduser
- npm publish
TODO
赤ボタンで停止した後、旗クリックが効かない
赤ボタンで停止した後に旗クリックをすると、動作が始まらない。 赤ボタンで停止するとき、 Proxyで「このスクリプトを止める」フラグオンとしスローを発生させている。フラグオンのままなので再実行ですぐにスローしていた。 フラグをオフに(Proxyを再生成)した。 完了 ---> 0.0.17
実行中スレッドの数の監視
停止したスレッドは、スレッドプールから適切に削除されていること
QuestionBoxElement内で半角スペース入力抑止
半角スペース入力抑止をしている理由を忘れてしまった。 そもそも、抑止をしている場所が「文字列入力終了」時点であるのが不思議な感じがしている。
スプライトクリックされたときを実装
実装 0.0.19
一時停止中に旗クリックしても動作開始をしない
ScratchEvent.ts 修正 Threads.ts 修正 一時停止すると、スレッドインターバルを抑止してしまうので、旗クリック時に抑止解除する
終わるまで音を鳴らす(連続)
「終わるまで音を鳴らす」の実行中に同じ音で「終わるまで音を鳴らす」をすると前回の再生が止まる(新しく先頭から鳴り出す) これは正解か? → Scratch3本家の同じ動作であるので正解とする。
Sprite#Scale 設定変更
0.0.19
メッセージ受信処理
0.0.19
threadObjを作り出しステータスはYIELDにせずに threadManager.registThread() をする メッセージIDに紐づく 配列へthreadObjを追加していく メッセージIDのScratchEventを受信(on)したとき(※1) ・配列からthreadObjを取り出し、取り出したすべてのthreadObjへ対して、 ・・ステータスが実行中の場合、強制終了 ・・ステータス(YIELD以外)の場合、YIELD (待機中)にする
ImageEffect 実装
実装: 色、幽霊、ピクセルなど(0.0.20)
PEN機能 (+Stamp)
実装: 0.0.21
スプライト PNG画像
サイズを半分にするとちょうどいい。 なぜか?検証が必要。
ステージ背景、PNG画像
どんな感じになるかを検証すべき 検証済。 ステージのupdate処理にバグあり。修正済。
エンティティ.Image.effect 参照NGとした
0.0.22 #02
エンティティ第二階層
0.0.22 #02
小文字始まりにする 例 apple.Looks.Effect.clear() ↓ apple.Looks.effect.clear()
Bubble willReadFrequently対応
0.0.22 #02 同時に、ELementを ScratchElementと名称変更
全てのスレッドが終了したとき
赤ボタンを非活性にする 0.0.22 #03
Timer.wait を使用不可にする
0.0.22 #04
playground → engine と名称変更
~ engine.start() のみを公開 0.0.22 #05
背景切り替え時のイベント処理
0.0.22 #06 (実装済) 0.0.22 #07 (実装済)
背景切替、コスチューム切替の個別指定
名称ではなく、Imageを渡すほうが直感的だと思う 0.0.23 #01 (実装済)
メッセージ送受信時の引数
0.0.24 #01 (実装済)
一時停止中に旗クリック
音がならなくなる不具合あり。 0.0.25 #01
文字列をSVG化してコスチュームにできるようにした
0.0.25 #05 ( 実装済 )
Font-Family の設定方法を調査すること
0.0.25 #05 ( 実装済 )
text.setAttribute('font-family', 'Marker');
## test/007
コスチューム変化を 2秒ごと、背景変化を 1秒ごと ==> だんだんとずれていく
コスチューム変化を 4秒ごと、背景変化を 1秒ごと ==> だんだんとずれていく(ずれる具合が大)
コスチューム変化を 1秒ごと、背景変化を 1秒ごと ==> ずれない
コスチューム変化を 4秒ごと、背景変化を 4秒ごと ==> ずれない
Scratch3本家も同様の傾向にあるので仕様通りとする
Timer.wait(sec) のなかで setTimeout(()=>{}, sec*1000) でPromise終了をさせている。
Scratch3本家の実装に寄せると、yield を使うことになり、利用者にとって面倒になるし、
今のままでも本家の動作結果と大差がないので 本家実装には寄せないことにする。
## クローン
実装中 (0.0.27)
クローンされたときのイベントで、クローン側のプロパティを操作すると
本体側も変化してしまうような事象あり。
## vite 実行時のエラー
[vite-plugin-static-copy] Error: No file was found to copy on D:\Scratch3\ts\typeScratcher\CNAME src.
==> 対処 vite.config.js で 静的コピーを削除した
## test/012/
・ 旗クリックを短時間で連続して押すと、背景の変化が速くなる(しばらくすると元に戻る)
==> 対処 0.0.27 #08
・ クローンが大量にあるとき、ときどき、動きが止まるような感じがする。
クローンするとき Skinを新たに作成していた。本体のSkinと共有するようにした。
==> 対処 0.0.27 #08
・ 動いているスレッド(ネコ回転)があるのに、赤ボタンが非活性
==> 対処 0.0.30 #03
・ 赤ボタンを押しても 背景変化がすぐには止まらないような気がする
==> 対処 0.0.30 #03
・ 赤ボタンを押して、旗クリックをしても 動き出さないときがある(いつも動かない気がする)
==> 対処 0.0.30 #03
・ クローンを削除すると、本体側の音が止まる
クローン削除時に音を止めているが、本体とクローンでSoundインスタンスを共有しているため、クローンで止めると本体も止まる
音のデータは 共有するが Soundインスタンスは共有せずにクローン用に作り直す
==> 対処 0.0.28 #01
==> 対処 0.0.29 #01
==> 対処 0.0.30 #02 同じ音を複数スプライトで共有するときの対応
# test/001/
・ await playUntilDone(); の後に wait(0.5)を入れると 鳴り終わった後に次の音が鳴り始めると「カッカッ」という雑音が入る。
==> 対処 0.0.30 #02 「同じ音を複数スプライトで共有するときの対応」により改修されている
# test/001/
スプライトが0.5秒ごとにコスチュームを変えているとき
赤ボタンを押したあとに スプライトコスチュームが一回変わる
==> 対処 0.0.30 #03 赤ボタン押下で全エンティティの 描画を抑止する
==> 対処 0.0.30 #04 エンティティのisRunningプロパティは不要なので削除
## Motion.move.glideTo() 実装
glideTo()を同時に並列動作させたときの動作を 本家に寄せられないか?
同じにした。
==> 対処 0.0.31 #01
Glide中に停止ボタン、旗ボタンクリックで、Glideを停止させる
==> 0.0.34 #01
# スピーチ機能を実装 ( test/013)
==> 0.0.31 #02 スピーチ実装中
同じ文字列のときでも 文字列を音に変換している( SoundPlayerを生成している)
文字列変化がないときは、保存したSoundPlayerを使うことにしたい。
==> 0.0.31 #03 スピーチ実装完
==> 0.0.32 #01 スピーチ改良完了
# (004) 赤ボタン押下時に スピーチが止まらない
==> 0.0.33 #01
# (004) 一時停止ボタン押下時に、メッセージ送信イベントが止まらない?
一時停止時には描画を止めていたが、スレッド実行を止めていなかった。止めるようにした。
==> 0.0.33 #02
# マウスがステージの外に出たときの対応
ステージの外に出たときでも マウス位置を把握できるようにしたい。
これは本家の仕様でもある
==> 0.0.33 #05
# スプライトを進めていきステージ外に出たときの動作
==> 0.0.33 #04
本家と同じ動作にしたい。ステージの枠のところで止まるようになっているか?
==> 0.0.33 #04
# 動作中の旗クリック時
メッセージ送信で開始したスレッドが止まらない。
・メッセージ受信スレッド
・キー押下スレッド、など
==> 0.0.33 #06
==> 0.0.34 #01
# (0.0.33 #05)動作中の赤ボタンクリック時、ふきだしがきえない
==> 0.0.33 #06
==> 0.0.34 #01
# (0.0.33 #05) キー押下して離したのに、キー押下と判定される
==> 0.0.33 #06
==> 0.0.34 #01
# 一時停止ボタン 動いているスレッドがないなら非活性(変化しない)
==> 0.0.34 #02
# 座標がステージの外に出ているときの位置プロパティ
位置プロパティ は ステージの外に出ている状態で、描画位置だけステージの端に引っかかっている状態にするべきでは?
本家は プロパティ座標 = 描画されている位置
現状(0.0.34 #02)の TypeScratcher 通りでOKである。
# ステージサイズ(StageBounds)
0.0.35 #01
# (0.0.35 #01) マウスが触ったとき
スプライトに触れていない状態で、マウスポインターをステージ外に出すと音がなる。
ステージの上下に出すと音がならない。
ステージの左右に出すと音がなる。
ブラウザを非アクティブにすると音がなる。
if(this.Sensing.mouse.isTouching) { await this.Sound.playUntilDone(CatSound); }
### 原因
spriteSensingMouseの renderer.pick() へ与える座標を間違えていた
Stage(Canvas)左上基準の Offset座標( 表示拡大率 を考慮しない実座標 )が正しい。
### 対応
0.0.36 #01
# this.Looks.costume.next() とかけてしまう
でも動作はしない。
## costume
sprite.Costume.add(); // OK
sprite.Costume.names // OK
sprite.Costume.他 // 不可にする
sprite.Looks.costume.add(); // 不可にする
sprite.Looks.costume.names // 不可にする
sprite.Looks.costume.他 // OK
sprite.Backdrop.~ // 不可にする
sprite.Looks.backdrop.add() // 不可にする
sprite.Looks.backdrop.names // 不可にする
sprite.Looks.backdrop.next() // OK
## backdrop
stage.Backdrop.add(); // OK
stage.Backdrop.names // OK
stage.Backdrop.他 // 不可にする
sprite.Looks.backdrop.add(); // 不可にする
sprite.Looks.backdrop.names // 不可にする
sprite.Looks.backdrop.next() // OK
==> 0.0.38 対処
# マウス座標を取得するとき間違えている
==> 0.0.38 対処
# クローンが端に触れているかの判定
大きなサイズの本体からクローンしてクローンサイズを小さくするとき、クローンをマウス座標の位置にするとき
クローンが常に「端に触れている」状態になってしまう。
クローンのサイズを小さく設定した後、Scratch-renderへサイズ変更を教える前に 端に触れたかを判定しているので
クローンも本体のサイズだとレンダー処理が思ってしまうため。
==> 0.0.38 対処
# 半透明のスプライトからクローンを作るとき
クローンしたときに 本体スプライトの半透明効果が無くなり、すぐに元に戻るように見える
ちなみに、本家ではそのようなことにはならない。
## 原因の推測
幽霊効果50% の本体からクローンを作成する
幽霊効果を引き継ぐクローンが同じ場所、同じ大きさで表示される
そのため 幽霊効果が弱くなったように見えた。
## 改善の方向性
クローン作成する --> Drawing が作成される --> UPDATE処理を数回スキップする?
0.0.39 解決済
# 音追加済のスプライトでボリューム・ピッチを設定しているときクローンに引き継がれない。
SpriteControlのなかで音の効果をクローンへ引き継ぐようにした。
0.0.40 解決済