スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。
前回はクラウド
変数を
増やすスケールアップを
実装したぞ!これで
理論上は100
人でも
遊べるオンラインゲームエンジンができたわけだ。
最高かよ!ここまで
来たらギリギリまでクオリティを
高めていきたいよね。
今のままだとスクラッチを
閉じた
人でもゲームに
表示され
続けちゃうから、この
問題を
解決していこう。
今回の目標「退場処理を実装する」
入場処理は
以前実装したよね。
誰かがスクラッチゲームをプレイしたら、クラウド
変数を
通して
検知して
自分のリストにその
人のデータを
追加する、って
感じの
処理だよね。
今回はその
逆だね。
参加中の誰かがブラウザを閉じたり赤いボタンを押したりしたら、そのことを検知して自分のリストからその人のデータを削除するっていう
処理を
作るよ。
入場処理の
反対だから
退場処理って
呼ぶことにしよう。
休止中かどうかを判定する
別の
人がまだプレイしているかどうか、どうやって
検知しようか。
色々な
方法があるけど、
今回は
「ある程度の長さ動かなかったら」もう遊んでない、というふうに
考えるよ。
変数「休止中」を用意する
動いてない
長さを
知るために
休止中という
変数を
使うよ。
動きがなかった長さを知る
ブロック
定義「クローンティック」の
中で、エンコード
文字列を
座標に
反映する
処理を
作ったよね。そのときに
次のエンコード
文字列を
取得しても
空白の
場合に
備えた「もし」ブロックを
置いたことを
覚えているかな?ここが
空白ということは、
前回と
同じ
座標データが
送られてきたということなんだ。つまり、
止まっているということだね。ただ
止まっているだけなのか、それとももう
遊んでなくて
動かないのか、この
段階では
分からないから、とりあえず
変数「
休止中」に1をプラスしておこう。
一定時間動いてなかったときの処理を作る
この
変数「
休止中」の
値が
合計150を
超えたら、「この
人は
止まっているんじゃなくて、もう
遊んでない(=
落ちた)んだな」と
判断しよう。そのための「もし」ブロックを
作り、
判定の
演算をハメるよ。
退場処理の中を作る
この「もし」ブロックの
中が
退場処理の
具体的な
実装になるよ。
その人のUIDデータを消す
各プレイヤーにはユニークID(UID)があるんだよね。これはほぼ
絶対に
他の
人とは
同じにならないデータなんだ。この
値をいまはリスト「★プレイヤーUID
一覧」に
持っているから、それを
消しておこう。
消すと
言っても
空白で
置き
換えるだけだよ。リストの
行ごと
消しちゃうとバグるから
注意。
ok-scratch
u003cpu003eUIDみたいに、他とはかぶらない、同じ値が存在しないことを確約できる、という状態をシステム開発では「一意のデータ」と呼んでるよ。UIDは一意ってことだね。厳密には9,999,999分の1の確率で同じになるんだけど……それは、ね。u003c/pu003e
隠す
さらに
隠すことで
見た
目上はゲームからいなくなったようにしよう。
ちょっと修正する
おっと、一
箇所修正しておきたい。
動きに
違いはないけど、
表示するブロックの
場所を
動画に
合わせておこうと
思う。
直前の「もし」ブロックの
中に
入れておいてほしい。
テストする
右側のタブで
赤いボタンを
押した
後、
左側のタブからネコが1
体消えている
点に
注目してほしい。
休止中を解除する
おや、
止まっていた
人が
動き
出したぞ!どうやら
落ちたんじゃなくて、シンプルに
止まってただけのようだね。
変数「休止中」をリセットする
この
人は
退場させる
必要がないので、
変数「
休止中」のカウントをゼロに
戻しておこう!
OK!これで
退場処理については
完了だ。
リサイクル処理を作ろう
さて、ここまでで
入場も
退場もできて、そこそこ
安定したオンラインゲームエンジンになったんだけど、
完璧まではあと一
歩!このままだと
人の
出入りを
繰り
返すたびにリスト
内に
新しい
行が
追加されていって、
当分は
問題ないけど
理論上はいつかリストの
限界を
超えて
破綻してしまうことが
予想できる。そこで、リストが
無限に
増えていかないように、
使ってない
行があればその
行を
再び
使うように
直して、
行の
無限増殖を
未然に
防ぎたいと
思う!つまり、リサイクル
活動だ!もったいない
精神で
実装しよう。
空白行を探す
手順としては、
空白の
値が
入っている
行がリスト「★プレイヤーUID」にあるかどうかを
探して、なければ
今まで
通り
新しい
行を
追加するし、あれば
空白行をリサイクルするようにしたい。そこでまずは
空白行を
見つけよう。
手始めにブロック
定義「クラウド
変数を
受信する」で、リスト「★プレイヤーUID
一覧」の
中から
空白である
行の
番号を
取得しよう。
条件分岐ブロックを追加する
その
直後に、「もし~でなければ」ブロックをスクショを
見ながら
追加しよう。「もし~なら」の
部分には
合計4つのブロックがこの
段階では
入っているぞ。
空白行がなかった場合
プレイヤー
番号がゼロだったら、
条件式をハメよう。これは
直前でリストの空白行を探したけど結果がゼロだった、つまり空白行はなかったということを
意味しているよ。
空白行があった場合
空白行があれば
変数「プレイヤー
番号」にはゼロより
大きい
値が
入っている。それは
空白行の
場所を
示しているので、リストに
変数「
値」(これにはプレイヤーUIDが
入ってる)を
格納してリサイクル
完了だ。
テスト
右タブで
赤い
停止ボタンを
押して一
回落ちたら、
左タブからは
消えている。
画像が
粗くて
数字は
見えないけど、
左下のリスト「★プレイヤーUID
一覧」も
空白になっている。そのあとに
再び
右タブで
緑の
旗を
押すと、
左タブのリストの
空白行に
数字が
入っている
様子が
見て
取れる。
前まではどんどんリストに
新しい
行が
増えていたけど、
今回は
行は増えずに空白行のリサイクルに成功している点が
進歩だ!
大テストをする!
よぉし!やりたいことはだいたいできた。よくここまで
付いてきてくれたね!キミとコーディングできたことを
誇りに
思う。(
死亡フラグw)ここでより
野心的なテストに
挑戦したいと
思う。
自プレイヤーに処理を追加する
久しぶりにスプライト「
自プレイヤー」に
処理を
追加するぞ。
自プレイヤーをクリックする
こちら。
マウスが押されたときだけ場所を変える
テストしやすさのためにマウスが
押されたタイミングだけ
場所が
移動するようにするよ。
ぐるぐる回るようにする
ネコがその
場でぐるぐる
回るよう
処理を
自動化するよ。
5歩動かす
10度回す
回転しないようにする
見やすさのため。
色を変える
自プレイヤーだけ
色が
変わって、
他プレイヤーは
普通のスクラッチキャットにする。
タブを並べてテストする
これで
僕の
環境では4つ
並べてみた。パソコンのスペックによっては4つは
厳しいかもしれないから、2つか、
行けそうなら3つタブを
並べてテストしてみると
面白いぞ!
こんな
感じの
動きができたら、
誰かを
赤いボタンで
止めてしばらく
待とう。そしたらリストの
行が
空白になるよね!それを
確認できたら
再び
緑の
旗を
押して
再開してみよう……。
空白行がリサイクルされたら
大成功!おめでとう!
次回へ
いやぁ
素晴らしいオンラインゲームエンジンに
仕上がったね。これを
使えばどんなゲームもマルチプレイヤーすることが
可能だぞ。
夢が
広がる……。この
後はまた
動画の
更新を
待って、
記事も
追っかけ
解説していく!
乞うご
期待!あーでも、もう
待てないって
感じに
温まってるなら、
待ってちゃダメだ!どんどん
自分の
作品をオンライン
化してしまおう!