TurboWarp Bubble ブロック利用マニュアル

このマニュアルでは、turbowarp-bubbleをTurboWarpのカスタム拡張機能として使い、SVG本体、文字、キャラクター表情、目パチ、口パク、「次へ」アイコンを組み合わせたBubbleを表示します。

紙芝居DSL 4.0集約ランタイム: 集約ランタイムのパレットでBubble見出し直下のドキュメントボタンを押すと、このマニュアルを開けます。集約されたブロックも、ここで説明するstyle、配置、portrait、逐次表示、音声、待機、animation、clone、自動解放の動作を保ち、拡張機能別の名前空間とBubbleアイコンで由来を識別できます。

Next1とNext2を個別登録し、入力listenerを準備してBubble内蔵待機を使うブロック例

1. 必要な拡張機能

入力待ちを含む完全な例では5つの拡張機能を使います。TurboWarpの拡張機能ライブラリからTemporary Variablesを追加し、選択した機能に必要なカスタム拡張機能を「サンドボックスなしで実行」を許可して読み込みます。BubbleはSVG Text 0.8.1のhost-neutral layout providerをbundle内に持ち、既定のSVG overlayではskinを作りません。portrait、lip-sync、continue indicator、フルボイス、表示効果音などのメディアアセットにはAsset Managerが必要です。Async InputとRuntime Expressionはconditionを使うBubble待機またはclose policyで必要です。timeoutだけのclose policyにはどちらも不要です。

順番 拡張機能 読み込み先
1 Temporary Variables TurboWarpの拡張機能ライブラリから追加
2 Async Input 0.4.0 https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-async-input@0.4.0/dist/async-input.js
3 Runtime Expression 0.4.0 https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-runtime-expression@0.4.0/dist/runtime-expression.js
4 Asset Manager 0.12.1 https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-asset-manager@0.12.1/dist/asset-manager.js
5 Bubble 0.10.0 https://cdn.jsdelivr.net/npm/@kubohiroya/turbowarp-bubble@0.10.0/dist/turbowarp-bubble.js

開発中のBubbleを試す場合は、このリポジトリのdist/turbowarp-bubble.jsをローカルカスタム拡張機能として読み込みます。既定SVG overlayに必要なrenderer APIがない場合、画像・メディア機能の使用時にAsset Managerがない場合、condition待機の開始時にAsync InputかRuntime Expressionがない場合は、Bubbleが明示的なエラーを返します。低レベルComposition APIでは別のtext capabilityを注入できます。

参考:

2. 表情画像を準備する

例ではAssetsという素材用spriteに、次のcostumeを入れます。素材用spriteは画面上で非表示でも構いません。

costume Asset Managerへ登録する名前 内容
HeroFace HeroFace 顔、髪、輪郭などのベース。動かす目と口は含めない
HeroEyesOpen HeroEyesOpen 開いた目だけを描いた透明差分
HeroEyesClosed HeroEyesClosed 閉じた目だけを描いた透明差分
HeroMouthClosed HeroMouthClosed 閉じた口だけを描いた透明差分
HeroMouthOpen HeroMouthOpen 開いた口だけを描いた透明差分
Next1 Next1 「次へ」アイコンの1枚目
Next2 Next2 「次へ」アイコンの2枚目

ベース、目、口の画像は同じcanvasサイズと同じ中心位置で作ります。差分画像の背景は透明にしてください。位置やcanvasサイズが異なると、レイヤーを重ねたときに目や口がずれます。

Asset Managerのブロックで各costumeを登録します。

register resource [costume:Assets:HeroFace] as asset [HeroFace]
register resource [costume:Assets:HeroEyesOpen] as asset [HeroEyesOpen]
register resource [costume:Assets:HeroEyesClosed] as asset [HeroEyesClosed]
register resource [costume:Assets:HeroMouthClosed] as asset [HeroMouthClosed]
register resource [costume:Assets:HeroMouthOpen] as asset [HeroMouthOpen]
register resource [costume:Assets:Next1] as asset [Next1]
register resource [costume:Assets:Next2] as asset [Next2]

URL画像を使う場合は、RESOURCE_IDへHTTPS URLを指定します。Bubbleに設定できるのは、Asset Managerへ登録済みでMIME typeがimage/*のアセットだけです。

3. 文字layout styleを選ぶ

standalone BubbleはSVG Text 0.8.1のlayout compositionを内包し、2つのBubble styleを組み込みます。sayはspeech本体とspeech tail、thinkはthought本体とround trailを持ち、本体とtail/trailの形は別項目ではなく1つのvisual styleとして選びます。短いsay [MESSAGE]think [MESSAGE]ブロックが対応styleを自動選択するため、基本経路にはstyle定義もstyle入力も不要です。どちらも予約text profile default、内容に追従するサイズ、14px Helvetica、右側優先・収まりに応じた左反転、block入力の330文字上限、空文字でのcloseを使います。4pxのSVG strokeを白いfillより先に描き、内側半分を隠すことで、見かけの輪郭をTurboWarp標準と同じ細さにします。それ以外のtext style名やstyle設定ブロックを使うとcustom profileになります。custom text styleは初回参照時に背景透明のSVG Text既定styleとして初期化されます。stock SVG Text 0.8.1をBubbleより先に別拡張として読み込んだprojectでは、Bubbleが公開getLayoutCapability()を使い、SVG Text blockで定義したnamed styleを維持します。handoffのない古いSVG Textがロード済みならstyleを黙って置換せず互換errorを返し、必要な場合だけ文書化済みscratch-render fallbackを選択します。

define bubble style [hero-dialogue] using text style [default]

独自のfont、色、alignmentを使うアプリhostは、createSvgTextLayoutComposition()へstyleを定義し、createSvgTextOverlayTextCapability()でBubbleへ注入します。custom profileは同じlayoutText()を使い、既定overlay backendではSVG文字skinを生成しません。Bubbleの配置、tail、吹き出し外形はBubble側が担当します。

4. Bubble styleを定義する

基本Bubbleでは短いブロックをそのまま使います。組み込みBubble style saythinkがそれぞれ自動選択されます。

say [こんにちは!]
think [うーん…]

TurboWarp標準との比較

次の画像は、1つのTurboWarp Editor projectで英語UIを使い、Cat spriteをx=-80y=0、サイズ80%、Stageを白背景、入力をHello!Hmm...に揃えて撮影した実画面です。左列はTurboWarp標準の見た目ブロックです。右列は対応する組み込みsaythink styleを使うBubbleの短い基本ブロックで、定義ブロックもsetterも使っていません。

TurboWarp標準のsay・think吹き出しとBubble基本profileを同じStageで比較した実画面

Stage図では、右側配置、内容に追従する本体、Actor側へ向くspeech tail/thought trailを同じ条件で確認できます。Bubbleは独立したSVG surfaceを描画しており、全4panelとも実際のTurboWarp Stageを切り出したものです。

TurboWarp標準のsay・thinkブロックと、設定不要のBubble基本say・thinkブロックおよび組み込みdefault profile値を比較したスクリーンショット

ブロック図は設定不要の基本経路と、custom style用の統合表示ブロックを示します。短いブロックは対応する組み込みstyleを自動選択します。calloutでは不可分な本体+tail/trailの組、両styleが使う予約text profile default、共通のfont、行高、幅、padding、角丸、色、border描画順、配置を示します。named custom styleにはshow [MESSAGE] with bubble style [STYLE]を使います。旧styled say/think opcodeは保存済みproject互換用の非表示定義として残します。

次のsetterを使うと、意図的にcustom profileへ切り替わります。

define bubble style [hero-dialogue] using text style [default]
set bubble placement [up-right] for bubble style [hero-dialogue]
set bubble distance [12] for bubble style [hero-dialogue]
set bubble visual style [NORMAL] for bubble style [hero-dialogue]
set bubble tail length [18] for bubble style [hero-dialogue]
set bubble offset x [0] y [0] scale [100] % for bubble style [hero-dialogue]

Actor相対と背景相対のplacement

Actor相対の16方向・角度指定と、背景相対の3配置を比較する図

Actor相対の16方向は、各方向をActor、Bubble外形、tail、文字を含む独立したミニシーンで示しています。三角形tailの基部2点は実際の本体border上にあり、本体polygonとのJSClipper union後の単一pathを描くため、接合部に内部border線は残りません。

背景相対3図はStage外枠、安全領域、Bubble外形寸法、水平中央線、基準辺/中心を示します。外形はBubble側の共有renderBubbleSvgで生成しており、TurboWarp Editorで本体drawableを生成するrendererと同じです。

Actor相対placementはcustom profileへ適用され、Actor中心からBubble全体の中心へ向かう方向を指定します。未変更の基本profileはScratch標準の右側優先・自動左反転を使います。menuには次の16正規方向があります。

up / up-up-right / up-right / right-up-right
right / right-down-right / down-right / down-down-right
down / down-down-left / down-left / left-down-left
left / left-up-left / up-left / up-up-left

northnorth-northeastnortheastなどのcompass aliasも直接入力またはreporterから指定できます。数値はScratch方向と同じ0〜360度で、0は上、90は右、180は下、270は左、3600へ正規化されます。任意角度は16方向へ丸めません。placementを設定しないstyleはup-rightになります。

背景相対はActorから生える方向を持たず、Stage安全領域へ配置します。

placement 配置
HEADER_LIKE Stage安全領域上部、水平中央
CENTER Stage安全領域の水平・垂直中央
FOOTER_LIKE Stage安全領域下部、水平中央

背景相対placementはActorの座標、bounds、可視性に依存しません。Stageからsaythinkを実行する場合も、この3値のいずれかを設定します。背景相対のBubble bodyにはActorを指すtailを描画しません。

Actorとの距離、tail、本体の位置・拡大率

Actor相対のdistance、tail length、offset、scaleを実際のBubble SVGで比較する図

scaleは外形だけでなく、SVG Textの文字、表情ベース・目パチ・口パク、次へアイコン、内部余白へ一体で適用されるため、表示上のフォントサイズも同じ比率で変わります。scaleだけを変更すると、本体中心を拡大半径分だけActorから離してActor側の間隔を維持します。x/y offsetはその後に加算し、tail先端を固定したまま本体borderとのunionを再生成するため、offset後のtail実長は基準値から変化します。

Stage端では、拡大後のBubble全体を画面内へ収めるクランプが優先されるため、指定距離を保てない場合があります。背景相対のHEADER_LIKECENTERFOOTER_LIKEでは、これらのActor相対設定を使用しません。

幅・自動改行・禁則処理

maxWidthの違いによる自動改行と、日本語禁則処理の例

図の改行結果はproductionのwrapTextを直接実行して生成しています。@cto.af/linebreakがUnicode UAX #14の改行候補を返し、Intl.Segmenterの書記素境界で絞り込んだ後、実測幅の上限に収まる最後の候補を選びます。句読点、閉じ括弧、小書き仮名、長音、結合emojiの途中で不自然に分割しません。

Bubble visual styleの形状例

10種類のBubble visual styleを同じSVG rendererで比較する図

形状候補はNORMALTHINKINGDREAMINGYELLINGOFF_PANELWAVYWHISPERINGANNOUNCEMENTNARRATIONNO_BUBBLEです。次のblockでBubble styleごとに選択します。

set bubble visual style [YELLING] for bubble style [hero-dialogue]

図とTurboWarp Editorの本体drawableはBubble側の共有renderBubbleSvgから生成しています。三角形tailを持つ形状はplatener/jsclipperによる本体との和集合です。THINKINGDREAMINGは丸trailのためunion対象外です。Actor相対ではActorを向くtailを生成し、背景相対ではtailを付けません。NO_BUBBLEでは本体drawableを非表示にして文字・表情などだけを表示します。

visual styleを省略した場合はNORMALです。本体drawableは文字・portraitより先に生成して背面へ置きます。close this bubble、対象sprite/cloneの停止、runtime破棄時には、本体drawableとBubbleが所有するSVG skinも解放します。

NEGATIVEはfill colorとborder colorで表現できるため独立styleにはしません。orientationとsegmentsも公開入力にせず、幅、フォント、文字数、禁則処理後の行数から外形寸法を自動計算する方針です。

続けて、表情レイヤーと入力待ちアイコンを設定します。

set portrait base [HeroFace] for bubble style [hero-dialogue]
set portrait [top-left] offset x [-4] y [6] zoom [120] % corner radius [12] px for bubble style [hero-dialogue]

set blink frames [HeroEyesOpen,HeroEyesClosed]
  every [0.4] seconds for bubble style [hero-dialogue]

set lip-sync frames [HeroMouthClosed,HeroMouthOpen]
  every [0.1] seconds for bubble style [hero-dialogue]

set continue frames [Next1,Next2]
  every [0.2] seconds for bubble style [hero-dialogue]

ASSETSはカンマ区切りのAsset Managerアセット名です。名前の前後の空白は除去されます。アセット名自体にカンマは使用できません。

5. 逐次表示、音声、表示サイズ

Bubbleはセリフ全体を一度に描画するだけでなく、CHARACTERWORDLINEBLOCKの単位で順次表示できます。WORDは形態素解析を行わず、空白または指定した区切り文字集合で分割します。区切り文字を表示するかどうかも選べます。

set bubble reveal unit [CHARACTER] every [0.05] seconds layout [RESERVED] for bubble style [hero-dialogue]
set bubble word delimiters [ /] show [false] for bubble style [hero-dialogue]
set bubble reveal sound [Typewriter] for bubble style [hero-dialogue]
set bubble voice [HeroVoice] for bubble style [hero-dialogue]
show [海へ出発!] with bubble style [hero-dialogue]
finish [CHARACTER] with condition [input == "pressed"] or timeout after [10] seconds

DYNAMICは表示単位ごとに吹き出しの大きさと配置を再計算し、RESERVEDは最終的な文字量を先に計測して表示中の外形を予約します。set bubble reveal soundは単位ごと、set bubble voiceは表示開始時にAsset Managerの名前付き音声を再生します。音声がなくても文字表示は利用できます。

6. セリフを表示して入力を待つ

sayまたはthinkはBubbleを表示するとすぐ次のブロックへ進み、初期animation modeはtalkingになります。

set runtime variable [input] to []
listen for key [Space] set runtime var [input] to [pressed]
listen for touch on this sprite set runtime var [input] to [pressed]
show [海へ出発!] with bubble style [hero-dialogue]
wait with this bubble until condition [input == "pressed"] or timeout after [10] seconds
close this bubble

まずTemporary Variablesでinputを初期化してから、Async Inputのキー入力とタップのlistenerを登録します。Bubbleの待機ブロックは、input == "pressed"をRuntime Expressionへ委譲し、開始直後とVMの各フレームで評価します。待機中は自動的にawaiting-continueとなり、口パクを停止してset continue framesの画像をループします。条件成立またはtimeout後はidleへ移り、次のclose this bubbleへ進みます。timeoutを0にすると時間制限なしです。

次の待機に入る前にinputを空文字へ戻してください。前回のpressedが残っていると、次の条件が直ちに成立します。別のBubble表示、close、対象targetの停止、projectの開始・停止、runtime破棄では、targetが所有する待機とlistener、timerをキャンセルして解放します。

同じ終了規則を再利用する場合は、名前付きBubble close policyを使います。triggerはconditiontimeoutcondition-or-timeoutから明示的に選びます。policyの適用は定義をsnapshotし、成立まで待ち、Bubbleのhide animationと解放までを1つの待機commandとして実行します。

define bubble close policy [advance-or-timeout] trigger [condition-or-timeout] condition [input == "pressed"] timeout [10] seconds
show [海へ出発!] with bubble style [hero-dialogue]
wait and close this bubble using close policy [advance-or-timeout]

timeoutだけのpolicyは現在のanimation modeを変えず、入力用拡張を必要としません。conditionを含むpolicyはawaiting-continueへ移り、既存の統合待機と同じAsync Input/Runtime Expression設定を使います。待機中に同じ名前を再定義しても、変更は次回の適用から有効です。Bubbleの置換やlifecycle cleanupは待機中policyをcancelし、置換後のBubbleを閉じません。

音声再生や別の文字送り処理と組み合わせる場合は、それらが完了した時点でawaiting-continueへ切り替えます。

sayで口パクし、awaiting-continueでcontinue framesを動かし、入力成立後にBubbleを閉じるアニメーション

アニメーションGIFを再生できない環境では、次の比較図で各animation modeを確認できます。

talking、awaiting-continue、idleの目パチ、口パク、continue framesの状態比較

7. Animation modeの使い分け

mode 目パチ 口パク continue frames 主な用途
talking 実行 実行 非表示 セリフ表示中、音声再生中
awaiting-continue 実行 停止・非表示 ループ ユーザによる「次へ」操作待ち
idle 実行 停止・非表示 停止・非表示 Bubbleを表示したまま静止

set this bubble animation mode [MODE]は、呼び出したsprite、clone、またはStageが所有するBubbleだけを変更します。先にsayまたはthinkを実行していない場合はエラーになります。

8. 表示開始・表示中・表示終了animation

表示開始はfadeInfloatInzoomInriseUp、表示終了はfadeOutfloatOutzoomOutsinkから選べます。これらはDYNAMICRESERVEDのどちらにも適用できます。

set bubble show animation [fadeIn] for [0.2] seconds for bubble style [hero-dialogue]
set bubble hide animation [fadeOut] for [0.2] seconds for bubble style [hero-dialogue]
animate this bubble [shake]
shake this bubble direction [90] count [2] ease [easeInOut]
explode this bubble relative scale [1.15] count [2] ease [easeOut]
animate bubble shape to [WAVY] speed [1] for [0.5] seconds

TurboWarp adapterはこれらをschedulerのフレームごとに進め、各フレームの進行率へeaseを適用します。shakeは吹き出し全体を方向・回数付きで揺らし、explodeはportraitと文字を含むsurface全体を拡大して元へ戻し、animate bubble shapeは指定時間中に現在の外形からTHINKINGDREAMINGYELLINGWAVYWHISPERINGなどへcross-fadeします。仕様では、吹き出しが表示される時点を「表示開始」、隠れる時点を「表示終了」と呼びます。

表示中のBubbleを消すときはclose this bubbleを使います。設定済みの表示終了animationを実行してから、Bubbleのtimerと描画resourceを解放します。set bubble hide animation ...は終了時の演出を設定するだけで、このブロック自体はBubbleを消しません。組み込み基本profileでは、saythinkへ空文字を渡してもTurboWarp標準と同様にcloseします。closeは非表示instanceを保持せず表示を破棄するため、別のhideブロックは公開しません。

9. named Bubble styleを表示する

show [MESSAGE] with bubble style [STYLE]

選択したBubble styleが、本体とtail/trailの形を一体で決め、text profile、表情レイヤー、placement、animation設定も保持します。set bubble visual styleNORMAL(speech本体+speech tail)やTHINKING(thought本体+round trail)のような不可分の組を選ぶブロックで、tail形状だけを独立して指定する設定はありません。standalone extensionは、表示ブロックに競合し得る別の種類を選ばせず、そのstyleから内部描画kindを導きます。

同じsprite、clone、またはStageで新しいsaythinkを実行すると、以前のBubbleをtimerやdrawableごと破棄してから置き換えます。Stageでは背景相対placementだけを使用できます。

10. cloneで使う

Bubble styleの定義は拡張機能内で共有されますが、表示中のBubbleはsprite/cloneごとに所有されます。

  1. 元spriteで、緑の旗が押されたときにアセットとstyleを1回定義します。
  2. 各clone自身からsayまたはthinkを実行します。
  3. animation mode変更とcloseも、表示したのと同じcloneから実行します。

cloneが停止・削除された場合は、そのtargetに属するtimer、overlay DOM、画像leaseが自動解放されます。明示的なscratch-renderではskinとdrawableも解放されます。

11. ブロック一覧

ブロック 説明
define bubble style [STYLE] using text style [TEXT_STYLE] Bubble styleを定義または再定義する
define bubble close policy [POLICY] trigger [TRIGGER] condition [CONDITION] timeout [TIMEOUT] seconds 名前付きの終了条件を定義または置換する
set bubble placement [PLACEMENT] for bubble style [STYLE] Actor相対方向・角度、または背景相対領域を設定する
set bubble distance [DISTANCE] for bubble style [STYLE] Actor boundsからtail先端までの距離を設定する
set bubble visual style [VISUAL_STYLE] for bubble style [STYLE] 不可分なSVG本体+tail/trailの組を10種類から設定する
set bubble tail length [LENGTH] for bubble style [STYLE] Bubble borderからtail先端までの基準長を設定する
set bubble offset x [X] y [Y] scale [SCALE] % for bubble style [STYLE] 本体位置と、文字を含む全体のscaleを設定する
set portrait base [ASSET] for bubble style [STYLE] portraitのベース画像を設定する
set portrait [PLACEMENT] offset x [X] y [Y] zoom [ZOOM] % corner radius [RADIUS] px for bubble style [STYLE] portraitの有無、端/隅の配置、変形、角丸を設定する
set blink frames [ASSETS] every [SECONDS] seconds for bubble style [STYLE] 目パチ差分と間隔を設定する
set lip-sync frames [ASSETS] every [SECONDS] seconds for bubble style [STYLE] 口パク差分と間隔を設定する
set continue frames [ASSETS] every [SECONDS] seconds for bubble style [STYLE] awaiting-continue中の「次へ」アニメーションを設定する
set bubble reveal unit [UNIT] every [SECONDS] seconds layout [LAYOUT] for bubble style [STYLE] CHARACTER/WORD/LINE/BLOCKの逐次表示を設定する
set bubble word delimiters [DELIMITERS] show [SHOW] for bubble style [STYLE] WORDの区切り文字集合と表示可否を設定する
set bubble reveal sound [ASSET] for bubble style [STYLE] 表示単位ごとの効果音を設定する
set bubble voice [ASSET] for bubble style [STYLE] 表示開始時のフルボイスを設定する
finish [UNIT] with condition [CONDITION] or timeout after [TIMEOUT] seconds 未表示単位を最後まで進め、条件またはtimeoutを待つ
set bubble show animation [MOTION] for [SECONDS] seconds for bubble style [STYLE] 表示開始animationを設定する
set bubble hide animation [MOTION] for [SECONDS] seconds for bubble style [STYLE] 表示終了animationを設定する
animate this bubble [MOTION] Bubble全体のanimationを再生する
shake this bubble direction [DIRECTION] count [COUNT] ease [EASE] 吹き出し全体を指定方向へ揺らす
explode this bubble relative scale [SCALE] count [COUNT] ease [EASE] 吹き出し全体を相対倍率で変化させる
animate bubble shape to [VISUAL_STYLE] speed [SPEED] for [SECONDS] seconds Bubble外形を時間経過で切り替える
say [MESSAGE] 組み込みsay styleのspeech本体+tailを表示する
think [MESSAGE] 組み込みthink styleのthought本体+round trailを表示する
show [MESSAGE] with bubble style [STYLE] styleが持つ本体+tail/trailの一組を表示する
set this bubble animation mode [MODE] talkingawaiting-continueidleからmodeを選ぶ
wait with this bubble until condition [CONDITION] or timeout after [TIMEOUT] seconds Runtime Expressionの条件成立またはtimeoutまで待つ
wait and close this bubble using close policy [POLICY] policyをsnapshotし、成立を待ってBubbleを閉じる
close this bubble 自分のBubbleと所有resourceを解放する
Bubble version Bubble実装versionを返す

say/think [MESSAGE] with bubble style [STYLE] opcodeを使う保存済みprojectは引き続き動作しますが、この互換ブロック2個はpaletteに表示しません。新しいscriptでは統合showブロックを使い、選択styleだけで本体とtail/trailの形を決めます。

12. よくあるエラー

状況 原因と対処
Asset Managerを要求するエラー 画像・メディアアセットを使う前にAsset Manager 0.12.xを読み込む
SVG overlay backendのエラー renderer.addOverlay()対応hostを使うかscratch-renderを明示する
Async Inputを要求するエラー Bubble待機より前にAsync Input 0.3.xをサンドボックスなしで読み込む
Runtime Expressionを要求するエラー Bubble待機より前にRuntime Expression 0.3.xをサンドボックスなしで読み込む
bubble style is not defined 組み込みの短いsay/thinkを使うか、named custom styleを先に定義する
bubble close policy is not defined 名前付きclose policyを適用前に定義する
image assetが未登録 register resource ... as asset ...の完了後にBubbleを表示する
assetが画像ではない MIME type of asset [NAME]image/*か確認する
continue framesが1枚 2枚以上にするか、空にしてcontinue表示を解除する
frame intervalエラー SECONDSを0より大きい有限値にする
StageからActor相対表示した placementをHEADER_LIKECENTERFOOTER_LIKEにする
placementが不正 16方向、alias、0〜360度、背景相対3値のいずれかを指定する
目や口がずれる ベースと全差分のcanvasサイズ、中心、透明領域を揃える

13. 自動解放されるタイミング

次の場合、Bubbleが所有するtimer、overlay DOM、画像leaseは自動的に解放されます。scratch-renderを明示した場合はtext skinとrenderer drawableも解放されます。

Asset Managerへ登録したアセット自体はBubbleの所有物ではありません。不要になった登録画像をメモリから削除する場合は、Bubbleを閉じた後にAsset Managerのdelete asset [NAME] from memoryを使います。

14. マニュアル画像の再生成

図とGIFはリポジトリ内のスクリプトから再生成できます。GIF生成にはImageMagickのmagickコマンドが必要です。

2つのturbowarp-say-think-*-comparison.pngはrenderer previewから生成した図ではなく、TurboWarp Editorの実画面です。第4章に記載した撮影条件を使い、docs:renderでは上書きしません。

pnpm docs:render
pnpm docs:check

docs:checkは、SVGのviewBox、production renderer/wrapText由来marker、全visual style、GIFの寸法・16フレーム・ループ設定、マニュアルから画像と全16ブロックへの参照、およびPages用HTMLが最新であることを検証します。