スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回は
クラウド変数を受信して新規プレイヤーなら入場処理とデータ更新を、既知プレイヤーならデータ更新のみを実行するようにプレイヤー管理ができる仕組みを作ったぞ!でもまだまだリストのデータが
更新されただけで、
見た
目は
何も
変わってないんだよねぇ。っということでここから
見た目も変えていくぞ。これでオンラインゲーム
感がグッと
増してワクワクが
大爆発すること
間違いなしだ!
ok-scratch
u003cpu003e今回からスクラッチ公式サイトでブロックのカラーが更新されたエディターを使っていくね。なので前回までとスクショ内のブロックカラーなど違うけど機能的には全く同じなので問題ないよ。u003c/pu003e
今回の目標「クローンを作って別プレイヤーを表示させる」
別プレイヤーを
表示させる
一番いい
方法はクローンを
使うことだよね。
今回は
クローンを使って別プレイヤーを自分の画面に表示させる。ただまぁクローンを
使うと
物事がより
複雑になっていくんだよねぇ。
仕方ないけど。
焦らず
急がず、じっくり
取り
組めば
大丈夫。それに
実は
今までのコーディングはクローンを
使うことを
想定して
作ってきているから、
思ってるより
複雑にならないかも。なにより
僕も
一緒にいるから
絶対大丈夫だって!チラッと
完成動画を
見せちゃう↓
やってみよう!
クローンを作る
いきなりクローンを
作っていくよ。
最初に
作戦を
伝える。
各クローンには
異なる
変数「プレイヤー
番号」を
持たせて
管理していくんだ。
プレイヤー番号さえ分かれば「★プレイヤーUID一覧」と「★プレイヤーデータ一覧」のどこを見ればいいか分かるから、これだけで
他プレイヤーとの
区別が
行えるようになっているんだ。クローンを
作るときによくある
手法として、
スプライト自身は非表示のままにしてクローンだけ表示するっていう
方法をここでも
採用するぞ。スプライト
自身の
変数「プレイヤー
番号」は
空白のままにしておくことで、クローンかどうかを
区別もできる。おいおい
変数「プレイヤー
番号」めっちゃ
優秀じゃんか!?
最高だね!
クローンブロックを置く
変数「プレイヤー
番号」をセットした
直後にクローンを
作ろう。
こうすればクローンはプレイヤー
番号を
保持した
状態で
生成されるね。そしてスプライト
自身はこのあとの
処理でプレイヤー
番号を
空白に
戻してあるのでバッチリだ。
クラウド - ティックを受け取ったときの処理を分ける
さて、クローンを
使う
時の
問題点として、
本体側で
実行されているループ
処理をクローンも
実行してしまうというのは
有名だよね。
問題ないケースもあるんだけど、
例えば
今回のメッセージ「クラウド - ティック」をうけとった
時の
処理は
本体だけしか
実行してほしくない。いや、もっと
正確に
言うと、
本体のティック処理とクローンのティック処理は別々にしたいと
思ってる。
本体とクローンを区別する
ここで
再び
役立つのが
変数「プレイヤー
番号」だったね!
条件分岐させてみよう!
条件ブロックを置く
とりあえずクラウドティックを
受け
取るところに「もし」ブロックを
置こう。
条件式を作る
変数「プレイヤー
番号」が
空白でなければクローンだね。この
作り
方は
何通りかあるけど
今回は
下記のような
方法でOKだ。
否定ブロックを
使う
方法もあるけど、こっちのほうがシンプルじゃない?これを
条件式として
使うとこうなる↓
うん、いいね。この
中の
条件ブロックの
中にはクローンしか
来れない
状態ができたね。では
中身も
作り
込んでいこう!
ブロック定義「クローンティック」を用意する
クローン
専用のティック
処理をブロック
定義にまとめておくよ。
使う
条件ブロック
内に
置いて、さらにそれ
以降の
処理は
実行されないように「このスクリプトを
止める」ブロックも
置こう。
これで「もし」ブロック
内はクローンだけが
実行できて、「もし」ブロック
以降は
本体だけが
実行できるようになったね!
クローンティックを作る
よし、じゃあココからはクローンだけが
実行するティック
処理を
作るよ。ちなみに、ココに
至るまでにすでにブロック
定義「
順番にデコードする」を1
回実行してるのは
覚えてる?そう、プレイヤーUIDをエンコード
文字列から
取得するときに1
回実行したんだよね。じゃあ
次にデコード
処理を
実行したら
何が
取れるか
覚えてるかな?そう、X
座標だね!ではさらにもう1
回実行したら?うん、Y
座標だよね。じゃあさ、
続けてもう1
回実行したら
何が
取れるっけ?
答えは
次のイメージを
見てみてね。
うん、
取れるのは
次のX
座標だね。この
図を
参考にどんどん
順番にデコードしていって、そのたびに
座標データを
割り
当ててみよう。
デコードしてX座標を割り当てる
ブロック
定義「
順番にデコードする」を
実行しよう。
X座標に割り当てる
これで
変数「
値」にはX
座標が
入ったから、これを
割り
当てよう。
デコードしてY座標を割り当てる
2
回デコードしたから
下記のようになってるわけだ。
じゃあ
続けてY
座標も
取り
出して
割り
当てよう。
カンタンだね!
カラになったかどうか調べる
これでXとYが
取り
出されたからエンコード
文字列は
下記のようになったね。
ティック処理はどんどん実行されるから、次回もまたX座標とY座標を割り当てる処理が実行されるよね!そしてこのティック
処理は
変数「エンコード
文字列」が
カラになる(=デコードできなくなる)まで続くわけだ。
カラになったらどうしようか?
大丈夫、
安心して!その
頃にはきっと
本体側のクラウドティック
処理で
次のクラウド
変数を
受信してるだろうから、
またリスト「★プレイヤーデータ一覧」にデータが届いてるはずだよ。データをまたエンコード
文字列にセットすれば、
連続してデコード
処理が
実行していけるね。
これでエンコード
文字の
順番を2にセットしてから
余分なデータ(プレイヤーUID)をスキップするために1
回デコードしておけば……そう、またXとYを
取りたい
放題だね!めっちゃスムーズに
動きが
再現できそうな
予感がしてきた……ワクワクっ!
条件ブロックを置こう
じゃあエンコード
文字列がカラかどうか
調べよう。
条件式を作る
カラかどうか、どうやって
調べる?
気を
付けてほしいのは、
実際には
変数「エンコード
文字列」の
中身はデータが
入ったままってこと。だからエンコード
文字列が
空白かどうか、という
条件式は
使えない。そこで
変数「エンコード
文字の
順番」を
使って
次のような
演算を
作ってみよう。
現状だと、
変数「エンコード文字の順番」は変数「エンコード文字列」の長さより1つ大きい値になっているよね!そこを利用すればエンコード文字列がカラ(=全部デコード済み)かどうかが分かるっていう
算段だよ。
次のプレイヤーデータをエンコード文字列に移そう
この
中ではプレイヤーデータをエンコード
文字列に
移す
処理を
作っていくよ。
ブロック定義を用意する
ブロック
定義「
次のプレイヤーデータを
移す → エンコード
文字列」に
処理をまとめておこう。
使う
とりあえず
置いてみよう。
プレイヤーデータを取得する
各クローンが
持っている
変数「プレイヤー
番号」を
使って、
自分のプレイヤーデータを
取得しよう。
これを
変数「エンコード
文字列」に
反映するよ。
元のプレイヤーデータは消す
なにかのはずみで2
回同じデータを
取得してしまわないように、
元の場所は空白にしておこう。
プレイヤーUIDをスキップしておく
この
段階では
プレイヤーUIDは不要なので一度デコードを行ってしまおう。もちろん
直前で
変数「エンコード
文字の
順番」を2にセットすることも
忘れずに。
この
処理はとりあえずこれでOK!
仕上げる
ところで、★プレイヤーデータ
一覧にデータが
届いてなかったらどうなるだろうか。その
場合は
エンコード文字列に空白がセットされることになるんだ。このことを
利用してブロック
定義「クローンティック」にストップ
処理を
追加しておこう。
条件ブロックを置こう
プレイヤーデータを
移した
直後に
条件分岐を
作ろう。
条件式を作ろう
エンコード
文字列が
空白かどうかを
調べよう。
処理を止めよう
何も
取れなかったら
今回のティックではなにもしない、っということだね。
表示も忘れずに
おっとこのままだと
本体と
同じくクローンが
隠れたままだね。しっかり
表示させよう。
表示させるタイミングはここかな。
テストターイム!
ここまで
一気通貫で
作ってきたから、もうテストしたくてウズウズしてたんじゃないかな?!よしよし、またタブを2つ
開いてテストしてみませう!
た・の・し・いーーーーーぃ!
動いた?
動いた?ちょっと
感動じゃない!?これはやばいよね!
次回へ
今回は
別プレイヤーを
自分の
画面に
表示させて
動きを
同期させるためにクローンを
使ったね!クローンを
使うと
一気に
複雑になる……と
心配したけど、
元々クローンを
想定して
作っておいたから
思いの
外スッキリした
構造を
保てたと
思わない?
大改造したっていうよりは、ちょっと
追加しただけ、みたいな
印象だったんじゃないかな。さてさて、まだ
終わらないよ。もっと
高みへ
行こう!
現状だとタブを3つとか4つとか
開くとカクカクしちゃうときがあるよね。そう、ラグいんだよ。
次回はこの
ラグをスケールアップという技で直す!あとプレイヤーを
追加する
入場処理ができているけど、
次回か
次次回でオフラインになったプレイヤーを
除去する
退場処理も
実装しようと
思う!こうすることで
入れ
代わり
立ち
代わり
遊ぶ
人が
途切れないオンラインゲームになるってことよ。
近日中に
更新するので
待っててね~。