さぁ、スクラッチでナニ作る!?
端タッチの消失点から文字幅を逆算する設計が光っている。文字幅を返すAPIがScratchに存在しないにもかかわらず、「端に触れた/触れていない」という二値のセンシングだけで定量的な幅の数値を得る発想が面白い。さらに計測時に2倍拡大して結果を÷2するという一工夫で、小数点以下の精度まで確保している。この仕組みをどう組み立てているのか、作り方を見ていこう。
動画で見てみよう
チュートリアルの元になった作品
今回の目標
スターター作品をリミックスしよう
このチュートリアルにはスターター作品があります。使わなくても大丈夫だけど、最低限の素材などが用意されてるので便利です。
スターター作品をダウンロード
#1計測ブロックの準備
準備
スプライト「テキスト」を開く
| スプライトについて |
|---|
| 文字コスチュームの幅を計測してFONT_HALVESリストに格納するスプライト。テキスト描画システムの土台となる。 |
| どんな役割か |
| 文字の幅を自動で計測するしくみを作るよ!各文字コスチュームを順番に表示して、何ピクセル幅かを調べてリストに記録していくよ。これがあとのテキスト描画に使われるんだ。 |
カスタム定義「フォント幅を計測する」を追加
ズーム倍率と補正値を受け取り、全コスチュームの幅を計測してFONT_HALVESリストに格納するプロシージャ
リスト「■フォント半幅リスト」の追加
各文字コスチュームの計測済み幅(補正値込み)を格納するグローバルリスト。テキスト描画時の文字間隔計算に使用する。
実装
まず大きさを ( ) %にするでスプライトのサイズを「ズーム倍率」ぶん拡大して、「■フォント半幅リスト」を( )のすべてを削除するで空にするよ。1pxきざみでしか動かせないから、元サイズのまま測ると丸め誤差が出ちゃうんだ。いったん拡大してから測って後で元に戻せば、サブピクセル単位の精度が確保できるってわけ。
そのあとコスチュームを ( ) にするでコスチューム番号を「四捨五入(0)」に切り替える。Scratchではコスチューム0を指定するとなぜか最後のコスチュームにラップするという、ちょっと変な仕様があるんだ。これを逆手に取れば、次のステップで「次のコスチューム」を呼ぶだけで先頭からキレイに全コスチュームを走査できる仕掛けになる。
#2画面端にセット
#31pxずつ幅を測る
( ) 回繰り返すでコスチュームの数だけループして、毎回次のコスチュームにするで次の文字に切り替えるよ。文字を切り替えたらx座標を-9999にして画面の左端に押し付けて、( ) まで繰り返すで「端に触れた」のではないまで1ピクセルずつ右に動かす。端から離れた瞬間のx座標に240を足せば、その文字の半分の幅がわかるんだ。
#4倍率を反映する
準備
変数「文字幅」を追加
計測中の文字コスチュームの幅(ピクセル単位)
実装
#5元の状態に戻す
計測用に拡大していたから、終わったあとに戻さないとスプライトがデカいまま画面に居座っちゃうんだ。カスタムブロックの中で状態を変えたら、出る前に必ず戻す。これがプログラミングでいう「後片付け」ってやつだよ。
#6旗クリックで実行
そして( )で「フォント幅を計測する」を「ズーム倍率」2、「補正値」0で呼び出すんだ。拡大倍率が2だと、1pxループは整数のx座標でしか止まれなくても、元サイズに÷2で換算すれば0.5pxきざみの解像度で幅が決まる仕組みだね。旗を押すと「■フォント半幅リスト」に全文字の幅データが入るはず――確認してみよう!
まとめ
「端に触れた」の瞬間がそのまま文字の境界になるなんて、発想の転換だよね。APIが存在しないなら既存ブロックで代替する、このプログラマー的な問題解決が今回の醍醐味だ。次はこのデータを使って、文字をきれいに並べるテキスト描画システムを作っていこう!あ、ちなみにRPG風の会話ボックスを作るっていう連載チュートリアルがすでにあるから、気になる人は是非チェックしてくれぃ!