スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回は
基本的なキー操作を検知して、さらにモバイル対応の礎になるスティックの重要変数「可動域」と「有効範囲」を定義したね!こっからはクライマックスに
向けて
爆走していく!
感動の
マルチタップ可能なモバイル対応ジョイスティックを
堪能する
日は
近いぞ
諸君!
今回の目的「マルチタップ可能なモバイル対応を完成させる」
今回でモバイル
対応を
終わらせるよ!シングルタッチではなくてマルチタッチ
可能なモバイル
対応されたスティックをバックパック
化しておけば、これから
作る
作品はすべてモバイル
対応出来ると
言っても
過言ではない。しかもサクッと。YES!
ok-scratch
u003cpu003eモバイル対応された作品のことを「モバイルフレンドリーな作品」と呼ぶよ。u003c/pu003e
スティックを有効化する
まずはスティックを
有効化する。
有効範囲内でタップを
検知したらスティックが
動くようにしていくよ。
有効範囲内でタップされたか調べる
条件分岐ブロックを
配置しよう。
条件式にはこの3つを
使っていく。
これを
組み
合わせて
条件式にハメよう。
タップ(=クリック)された
際に、マウスまでの
距離が
有効範囲内にあればスティックを
有効化する
処理を
呼び
出そう!
有効化する処理を作る
ブロック
定義「スティックを
有効化する」を
作るよ。
条件ブロック
内で
呼び
出そう。
指が離れるまで処理を繰り返す
使うのはこちらの3つ。
組み
合わせて「
指(マウス)が
離れるまで
繰り
返す」というループを
作ろう。
スティックXに値をセットする
パソコン
操作の
際には
右矢印やDキーといったキー
操作で
値をセットしていた
変数「★スティックX」を、ここからはスティックの
動きによって
値が
決まるように
作っていくよん。とりあえず
変数に
値をセットするブロックを
置こう。
こちらの3つを
使って
値を
決定していく!
この3つをどう
演算していけばいいか、まずはほぼ
答えから
見てみよう。
まずは「マウスのX
座標」から「(スティックの)X
座標」を
引いた
値を
算出して、それを
可動域で
割っているね。
組み
合わせるとこう↓
どういうことだろうね!?
相対距離を算出する
最初に「マウスのX
座標」から「スティックのX
座標」を
引いた
値について
考えてみる。
上の
図を
見てみてね。マウスのX
座標が200だとして、スティックのX
座標が80だとするよね。「マウスX - スティックX」って
計算することで
赤い
線の
距離を
算出しているんだ。このたとえだと200-80で
赤い
線の
長さは120っていうことが
分かる。これによって
ユーザーがスティックをどのくらい動かしたのかが分かるんだ!さらに
言うと、マウスのXが60でスティックのXが80なら
赤い
線の
長さは-20となる。
マイナスになったということはユーザーは左にスティックを動かした、ということも
分かるね。この
赤い線のことを相対距離と呼ぶことにするね。
ノーマライズする
相対距離が
算出できたのはいいけど、ちょっと
待って。
前回スティックの
要件を
確認したよね。そこで
「右なら1、左なら-1になる」っていう要件があったね。
相対距離が120とかマイナス20だと、この
要件から
値が
大きく
逸脱《いつだつ》してしまう。そこで、
さらにこの相対距離を可動域で割っていくわけだ。そうするとどうなるかな。たとえば
相対距離が120だとして、
可動域の
値が32だとしよう。そうすると
答えは3.75なんだ(
計算機使ったw)まだ1より
大きいけど、それでもちょっと
近づいてきたね。あとは1より
大きかったら
強引に
値を1にするっていう
処理を
追加すれば
要件を
満たせる。
このように
大きすぎる値を最小値(今回はマイナス1)から最大値(今回は1)の範囲に収める計算は「ノーマライズする」とか「正規化する」と呼ばれているんだ。
ok-scratch
\u003cp\u003e3Dグラフィックスとかだと頻繁に登場するノーマライズ処理。一応日本語だと正規化って呼ぶこともあるそうだけど、正規化ってプログラミングの文脈だといろんな意味があるからノーマライズと呼ぶ方が多い気がする、僕は。\u003c/p\u003e
値が1かマイナス1を超えているか調べる
ということで
上限が1で
下限が-1になるように
条件ブロックを
追加していくよ。
値が1より
大きいか、マイナス1より
小さいかを一
発で
判定するには、
絶対値を
使うと
便利。
ok-scratch
\u003cp\u003e3の絶対値は3だし、マイナス3の絶対値も3だから、プラスマイナスに関係なく値の大きさを知りたいときは絶対値が超絶便利だよ。\u003c/p\u003e
値を1かマイナス1に固定する
またまたプラスマイナスに
関係なく
値をセットしたいので、そう、
絶対値の
登場だ!とりあえず
変数ブロックを
置こう。
ここに
絶対値を
使った
割り
算で、
強引に
値を1かマイナス1に
丸めていく!
順番は「
変数」÷「
変数の
絶対値」だよ。
具体的な
数字で
考えてみようか。たとえば
変数の
値が3なら3÷3=1だし、
変数の
値が-3なら-3÷3=-1になるということ。
便利!
スティックYに値をセットする
まるっとコピペして
各所を
修正しよう。
処理は
同じだけど、ちょっと
見にくいから
順番を
変えてみた↓
テスト
うぉぉぉ!
動くぞぉ!ってまだ
普通のモバイル
対応の
範疇《はんちゅう》だけどね。
ちゃんと
有効範囲外をタップしても
反応しない
様子も
見て
取れるね。
良きかな。
最初のタップをセンターにする
ゲームをしていると
最初のタップはセンターにしてくれたほうがストレスなくプレイできることに
気づく。というか、
最初のタップがセンターじゃないと
不便なんだよね。カンタンに
解決しちゃおうと
思う。
これだけ!これだけでプレイストレスがだいぶ
減る。お
得すぎる!
ブロック定義にまとめる
ジャンプの
処理に
移る
前に、
有効化する
処理をブロック
定義にまとめることでリファクタリングしよう。リファクタリングとはカンタンに
言うとコードの
改善のこと。
スティック操作を検知する
ブロック
定義「_スティック
操作を
検知する」を
作ろう。
再描画は
不要。
処理を移動する
スティックを
有効化する
処理をまるっと
移動しよう。
ブロック定義を呼び出す
ジャンプ処理を検知する
スペースキーを
押したらジャンプするという
処理もモバイル
対応していこう。
ブロック定義を作る
ブロック
定義「_タップを
検知する」を
作るよ。
再描画は
不要。
スティック操作の検知後に呼び出す
使用箇所はこちら。
タップによって変数の値を変える
スペースキーが
押されたときの
処理と
同じように
作っていくよ、とりあえずね。
条件式を作る
条件式はタップだけど、これは
マウスのクリックで代用できるよ。
タップされたら加算する
タップされてないときはゼロにする
テスト
おっと、
動いてるけど、スティックを
有効化する
最初のタップでプレイヤーがジャンプしちゃうね。これはトラブルのもとになりそう。
ラッチを作る
ラッチというのは、
ある変数の値が決まった値になってないと処理が動かないようにする仕組みのこと。
今回は
有効化のタイミングでジャンプしてしまうので、
最初のタップではジャンプしないようなしくみを
作るよ。
方法としては、
変数「★スティックボタン」の
値を
有効化のタイミングでは
空白にしておいて、ブロック
定義「_タップを
検知する」で「
空白ならジャンプしない」という
条件ブロックを
設置すればOK。
スティックボタンを空白にする
有効化のタイミングでは
必ず
変数「★スティックボタン」が
空白になるようにしよう。
条件式を作る
次にタップを
検知した
際にスティックボタンの
値が
空白かどうかを
調べる
条件ブロックを
置こう。
条件式は
変数「★スティックボタン」が空白よりも大きいかどうか、というちょっと
変わった
条件式を
作るよ。
これを
条件式にハメよう。
これで
初回のタップ時には加算処理は実行されないね。
結果的にジャンプもしないってなるからOKだね!
テスト……失敗
これでテストしてみると、うん、ジャンプはしなくなったけど、
そもそもジャンプができなくなってると
思う!これでは
本末転倒なので、もう
少し
変えていくよ。
有効化の条件を変える
「マウスが
離されるまで
繰り
返す」というループの
条件を
変えるよ。
かわりの
条件式を、
次の3つを
使って
作っていくよ。
組み
合わせるとこんな
感じ↓
これによって、タップされた
位置が
有効範囲内にあるかぎりはスティックの
有効化が
続くようになるよ!つまり、
初回のタップはジャンプしないけど、2回目以降のタップが有効範囲内であればジャンプしてくれるようになるっていうことだ。
条件式にはめておこう!
テスト
よぉしリベンジだ!テストしてみるぞ。
どう?
最初はスティックボタンの
中身は
空白だけど、一
回マウスを
離すと0になって、そのあとにタップ(クリック)するとジャンプしている
様子が
見て
取れるかな。このタイミングでタブレットでもテストしてみようと
思う。
刮目せよ!iPadでテスト
ok-scratch
u003cpu003eタブレットを持っている人はテストしてみよう。持ってない人は以下の動画を見てね。タブレットで非共有の作品にアクセスするには、一度タブレット側でスクラッチにログインするよ。でもそうするとパソコン側のスクラッチが自動でログアウトされちゃうから、もしプロジェクトの保存がまだの人がいたら、必ずパソコン側のスクラッチを保存しておこう。u003c/pu003e
これが
夢のマルチタップだぁ!!うぉぉぉ!
スティックの見た目を調整する
さぁさぁマルチタップは
成ったぞ。あとはちょこっと
見た
目を
調整したいと
思う。
ok-scratch
u003cpu003eスタータープロジェクトは使ってるかな?中に必要なコスチュームは入っているから、使ってないよという人はu003ca href=u0022https://scratch.mit.edu/projects/884126571/u0022 target=u0022_blanku0022 rel=u0022noreferrer noopener nofollowu0022u003eスタータープロジェクトu003c/au003eのコスチュームを書き出してインポートすると楽だよ。u003c/pu003e
グリグリ動く部分を作る
指に
合わせてグリグリ
動いてくれる
白い
部分を
作るよ。ちなみにコスチューム
名はスティック。スプライト
名と
同じだからちょっと
分かりづらい。
コスチュームを着替える
クローンを作る
コスチュームを元に戻す
無効化する処理を作る
さて、スティックを
有効化する
処理はいままで
作り
込んできたけど、クローンを
作ったタイミングで
無効化の
処理も
作っておこうと
思う。といってもカンタンで、クローンを
消すだけだから
安心してね。
メッセージ「スティックを無効化します」を作る
有効化の最後でメッセージを送る
クローンされた時の処理を作る
これだけでOK!
スティックの動きを作る
では
改めてスティックの
動きを
作っていこう。
スティックのクローンのときだけ走る処理を作る
まずはクローンされたときに、
スティックのクローンかどうかを
調べるよ。コスチューム
名で
分かるね。
条件ブロックにコスチューム
名がスティックかどうかを
調べる
条件式をハメよう。
レイヤーを前にする
白いスティックはベースよりも
上にあってほしいから、レイヤーを1
階層前に
出そう。
透明度を0にする
ベースの
透明度が80だけど、スティックは0にしておくことでクッキリ
見えるよ。
スティック用のメインループを作る
よし、このメインループの
中も
作っていこうか。
自分自身に移動する?
っと、ここでトリッキーな
裏技を
紹介するぜ!スクラッチには「◯◯へ
行く」というブロックがあるんだけど、
選択肢に
自分自身というものがないから
クローンに本体を追いかけてほしい時に困るんだ。ひょっとしたら
経験あるかな?
下のスクショを
見てみて。これはスプライト「スティック」を
表示した
時の「◯◯へ
行く」ブロックの
選択肢なんだけど、スティックはないでしょ?
そこで
裏技の
登場だ。
手順を
説明するよ。
- いったんスプライト「プレイヤー」を選んでみて。
- 「◯◯へ行く」ブロックの選択肢を開いてみて。スティックがあるよね。
- スティックを選んだらドラッグ・アンド・ドロップで、スプライト「スティック」にコピーしてみて。
- これでスプライト「スティック」を開いてみよう!
- どこかに今のブロックが見つかるはず!
わぉ!
出来ないと
思っていたことが
出来ちゃったね!
メインループ内に置く
これで
常に
白いグリグリ
動かすスティックが、ベースの
部分のセンターにくっついてくるようになったぞ!ナイスぅ!
ok-scratch
u003cpu003eiPadの画面収録だとうまく指が見せられないから、チュートリアルではパソコンのマウスが見えるように引き続きPCでテスト動画撮っていくね。マルチタップが重要なところではiPadで画面収録するので。u003c/pu003e
左右上下に動くようにする
ただ、ずっとセンターに
白いスティックがあるだけでは
意味ないよね。
指の
動きに
合わせて
白いスティックが
動くようにしよう。カンタンだよ。
左右に動くようにする
ポイントは
円の
内側からはみ
出ないようにするところだけど、すでに
一度実装したからサクッとやっちゃおう。この4つを
使っていくよ。
組み
合わせてX
座標が
円の
内側で
動くような
演算にしよう!
メインループ
内に
置くよ。
上下に動くようにする
コピってY
座標にも
動きをつけよう。
テストしてみよう、なんかビビる!
うぉぉぉぉ!スティックやんけぇ!ってなる!ならないw?
右側のスティックも作る
よしよし、
左側のスティックは
完成だ。あとは
マルチタップできることをユーザーに分かりやすく伝えるために、
右側にもスティックを
表示するようにしよう。
ok-scratch
u003cpu003e「ユーザーに分かりやすくする」ことをユーザビリティを高めるとかユーザー体験を向上させるとかって呼んでて、とくにスマホが普及してからはu003cemu003eITの世界ではめっちゃ重視されている考えの1つu003c/emu003eなんだ。ユーザー体験のことをUXって略したりするのだけど、見たことある人もいるかな?u003c/pu003eu003cpu003eUXを語りだしたらそれだけで本が書けるくらい奥が深い専門ジャンルだから、とりあえずu003cemu003e「ユーザーに分かりやすくするのは大事」u003c/emu003eってことを覚えておいてね。u003c/pu003e
待機中のクローンを作る
コスチュームはすでにスタータープロジェクト
内に
入っているものを
使うよ。
名前は「待機中」というコスチュームね。
置く場所に注意
着替えよう!
必ずコスチューム「スティック」の前に置こう。
クローンを作る
反対側(右側)に表示する
単純にX
座標をマイナスからプラスにすれば
反対側に
表示できる。
値の
変更はカンタンだよ、
下の
動画をチェックしてね。
タップしたら表示されるようになった!
タップ(クリック)したら
表示されて、スティックが
無効化されたら
消えている
様子が
見て
取れるね!ナイス!
タップで有効化させる
待機中は「タップで
有効化」という
文字が
出ているね。つまりタップしたら
有効化されるようにするのだけど、
実はその
処理はもう
出来てる。あとはコスチュームを
有効化状態に
変更すればいいだけだよ。
有効化のタップを検知する
このクローンが
表示されているということは
左側のスティックがタップされているはずなので、
有効化するには「
指が
離れたら」という
条件式を
作ればOK。
指が離れると変数「★スティックボタン」の値が0になるから、次のタップからはジャンプが機能するというわけだね。ちょい
直感的に
分かりづらいね。
次の3つを
使うよ。
組み
合わせて
配置する。
コスチュームを着替える
このコスチュームもスタータープロジェクト
内にあるよ。
指が離れたら有効化されるようになった
有効化されて
文字が
消えているのが
分かるね!OK!
フィードバックを実装する
さっきユーザビリティの
話を
少ししたけど、ここでも
重要なユーザビリティの
処理を
実装するよ。
本物のボタンなら
押したらカチって
音がしたり、
押した
触感が
指にあるよね。そういう
押したって分かることをフィードバックと
呼んだりする。いろんな
呼称があるけど、フィードバックが
分かりやすいかなと。
タップされたかどうかで濃さを変える
今のままだと
右スティックをタップしたらプレイヤーがジャンプするから、まぁ
押せたんだねってユーザーにも
伝わるけど、さらに一
歩進めて
右スティックがタップされたら
色を
濃くしてみようと
思う。カンタンに
実装できるからやっちゃおう!
右スティック用のメインループを作る
条件ブロックを置く
タップされたか調べる
タップされたら透明度を25に減らす
タップされてないときは透明度を75にする
最終テスト
これですべての
必要な
処理が
実装できた!お
疲れ
様!
最後にiPadでマルチタップのテストをしてみるね!
バックパック化して使ってみる
これで
完成!あとはバックパック
化して
実際に
他の
作品をモバイル
化してみようか。
次回はこのスティックを
実践的に
使っていくサンプル
手順を
提示したいと
思う!といってもスティック
自体はもう
完成しているから、どんどん
自分の
作品でモバイル
対応を
試しちゃおう!