スクラッチでオンラインゲームを作る⑤ バッファリングを実装する

スクラッチでオンラインゲームを作る⑤ バッファリングを実装する
グリフパッチ(動画)
ok-scratch(解説記事)

和訳解説は動画作者のグリフパッチさんご本人から許可をいただいて掲載しております。
チャンネルはYOUTUBE ( by griffpatch )からどうぞ。

クラウド変数を使った同期を究極的にスムーズにできるバッファリングという技を実装するぞ!
スターター
プロジェクト
なし
難しさ

任意)自分の作業中のスクラッチ作品URLを記録しておこう!再開するときに便利だよ。

LOADING...

※ この記録は今使ってるPCに保存されます。別のPCで作業するときは表示されません。

スクラッチプログラミングに挑戦している皆さん、どうも!スクラッチコーチです。

前回(ぜんかい)はマイナス()対応(たいおう)して一気(いっき)(うご)きの同期(どうき)確認(かくにん)まで(すす)めたぞ!下記(かき)動画(どうが)前回(ぜんかい)までの成果物(せいかぶつ)だ。(あらた)めてチェックしてみてほしい。タブA((ひだり))で更新(こうしん)されたクラウド変数(へんすう)1を、タブB((みぎ)(がわ)()()って座標(ざひょう)()()てることで(うご)きの同期(どうき)(おこな)われている様子(ようす)だ。
かーなーり、スムーズに同期(どうき)されているけどまだ完璧(かんぺき)ではないんだ。なぜって?それはスクラッチの仕様(しよう)(げん)(いん)があるんだ。そのあたりを(あき)らかにして、この遅延(ちえん)解決策(かいけつさく)実装(じっそう)するというのが今回(こんかい)(なが)れだ。これによってますますスムーズな同期(どうき)実現(じつげん)できる。いったいどこまでスムーズになってしまうんだ!

今回(こんかい)目標(もくひょう)「バッファリング」

せっかくスムーズな同期(どうき)(つく)ったのになぜかまだカクカクしている……そんな頭痛(ずつう)(たね)(かか)えている我々(われわれ)だが、大丈夫(だいじょうぶ)頭痛(ずつう)といえばそう、頭痛(ずつう)にはバッファリングだ!((くさ))スクラッチの仕様(しよう)による遅延(ちえん)をバッファリングという(わざ)使(つか)って解決(かいけつ)するぞ。必要(ひつよう)なのはスクラッチへの情熱(じょうねつ)(やさ)しさだ!なぜって?そりゃバッファリングの半分(はんぶん)(やさ)しさでできているからだ!((くさ)2(かい)())このバッファリングを使(つか)えば(しん)意味(いみ)でクラウド変数(へんすう)たった1つだけで出来(でき)同期(どうき)処理(しょり)完成(かんせい)するんだ。よっしゃ、()こう!

遅延(ちえん)原因(げんいん)(なに)

()(うご)かす(まえ)(なに)をするのか、(おお)まかな全体像(ぜんたいぞう)(つた)えておくね。前回(ぜんかい)X座標(ざひょう)とY座標(ざひょう)をエンコードして1つにまとめて、クラウド変数(へんすう)1つで同期(どうき)処理(しょり)実現(じつげん)するところまで完成(かんせい)したよね。これによってクラウド変数(へんすう)を2つ使(つか)っていた方法(ほうほう)よりも(ばい)以上(いじょう)のスムーズさを実現(じつげん)できた。素晴(すば)らしい。これだけでもゲームの種類(しゅるい)によっては十分(じゅうぶん)だと(おも)うけど、今回(こんかい)はトップクラスのスクラッチオンラインゲームの(つく)(かた)目指(めざ)しているので、もっと(きわ)めて()くぞ!問題(もんだい)()きたら原因(げんいん)調(しら)べる、これがプログラミングのベストプラクティスだ。

「ずっと」ループは1秒間(びょうかん)に30(かい)更新(こうしん)

さっそく原因(げんいん)究明(きゅうめい)するよ。(つぎ)画像(がぞう)をみてほしい。
スクラッチの「ずっと」ループでは基本的(きほんてき)に1秒間(びょうかん)に30フレーム更新(こうしん)されるっていう仕様(しよう)なんだ。専門的(せんもんてき)()うとfps30っていう状態(じょうたい)。つまりエンコードされたX座標(ざひょう)とY座標(ざひょう)()が1秒間(びょうかん)に30(かい)ほどクラウド変数(へんすう)1にセットされるわけだ。
そしてこれはクラウド変数(へんすう)なので、全員(ぜんいん)共有(きょうゆう)されるわけだけど、ここに(わな)がある。

クラウド変数(へんすう)は1秒間(びょうかん)に10(かい)更新(こうしん)

(じつ)クラウド変数(へんすう)は1秒間(びょうかん)に10(かい)までしか同期(どうき)されないんだ。ずっとループでは1秒間(びょうかん)に30(かい)更新(こうしん)しているのに、クラウド変数(へんすう)は1秒間(びょうかん)に10(かい)しか同期(どうき)されないってことだ。つまり3(ふん)の1しかデータが(おく)れないわけだ……。どうにも(いや)予感(よかん)がするよね。(つぎ)のイメージを()てみよう。
タブAでは30(かい)(ぶん)座標(ざひょう)データがあっても、クラウド変数(へんすう)仕様(しよう)でタブBには10(かい)(ぶん)しか(とど)かない。そのため(じょう)のイメージだと②と③のデータは欠落(けつらく)してしまうことになる。これがカクカクが(のこ)ってしまう原因(げんいん)になっているんだ。つまり、タブBでは①の(つぎ)は④の座標(ざひょう)しか()()ってないから、欠落(けつらく)した②と③の(うご)きは再現(さいげん)できないということだね。よし、原因(げんいん)さえ()かればだいたい解決策(かいけつさく)存在(そんざい)するものだ。
スクラッチでオンラインゲームを作る⑤ バッファリングを実装するを語るok-scratch ok-scratch

u003cpu003eちなみに1秒間(びょうかん)に10(かい)までしか(おく)れないというのは、レッスン1で()いた「クラウド変数(へんすう)同期(どうき)するのに0.1(びょう)のラグがある」というルールを()()えただけだよu003c/pu003e

遅延(ちえん)解決策(かいけつさく)はバッファリングにあり

問題(もんだい)をカンタンに()うと「3(かい)に1(かい)しか(おく)れない」こと。なら1(かい)で3(かい)(ぶん)(おく)ればいいじゃん?っていうのが解決策(かいけつさく)。くわしく()くね。(うえ)画像(がぞう)だとさ、①も②も③も(おく)ろうとするから結局(けっきょく)①しか(おく)れてない、っていう状態(じょうたい)になってるんだ。だからいっそのこと(ぜん)データを毎回(まいかい)(おく)るのは(あきら)めて、①と②のデータもまとめて③の(とき)(おく)るっていう作戦(さくせん)()きたい。
スクラッチでオンラインゲームを作る⑤ バッファリングを実装するを語るok-scratch ok-scratch

u003cpu003e給食(きゅうしょく)当番(とうばん)(たと)えると、ご(はん)(くば)(とき)に1つずつ(くば)るんじゃなくて、トレーに3つ()せてから(くば)ろうっていうイメージ。u003c/pu003e

①と②ではエンコードしたデータを()めておいて、③になったら(または④になったら)データをクラウド変数(へんすう)1にセットするということだよ。そして、この()めてから(おく)手法(しゅほう)がバッファリングという(わざ)なんだ!

()(うご)かすぞ!

うっし、じゃあ()(うご)かしていくぞ!

プロジェクトのコピーを保存(ほぞん)する

とりあえずプロジェクトのコピーを保存(ほぞん)しておこう。プロジェクトの名前(なまえ)はそうだね……ここまでは「オンラインゲームの(つく)(かた)1」にしておいて、ここからは「オンラインゲームの(つく)(かた)2」とかにしたらいいんじゃないかな。もちろん自分(じぶん)()かりやすい名前(なまえ)問題(もんだい)ないよ。

スプライト(めい)を「(より)プレイヤー」に()える

いまあるスプライトの名前(なまえ)を「(より)プレイヤー」にしようか。

スプライトを複製(ふくせい)する

(みぎ)クリックでスプライトを複製(ふくせい)しよう。

スプライト(めい)を「クラウドプレイヤー」に()える

複製(ふくせい)したスプライト(めい)は「クラウドプレイヤー」だ。これはクラウド変数(へんすう)同期(どうき)して(うご)(よう)のスプライトだ。(いま)まで()うところの数字(すうじ)キー2を()したときの(うご)きをする(よう)のスプライトみたいなものなんだ。

(より)プレイヤーを整理(せいり)する

まずはスプライトの選択(せんたく)(より)プレイヤーに(もど)そう。

不要(ふよう)なコードを削除(さくじょ)する

(みどり)(はた)()した(とき)のコード以外(いがい)は、ほぼすべて()すよ。
数字(すうじ)の2キーが()されたとき」を()
エンコードを()
デコードを()
(みどり)(はた)がおされたとき」の一部(いちぶ)()
これだけ(のこ)す↓
めっちゃ()ったw

(より)スプライトからメッセージを(おく)

イベント「クラウド - セットアップ」を(つく)

(あたら)しいイベントを(つく)るよ。イベントのメッセージのブロックから「(あたら)しいメッセージ」を(えら)んで、名前(なまえ)「クラウド - セットアップ」を指定(してい)しよう。

配置(はいち)する

最初(さいしょ)(おく)るようにするよ。(おく)るではなくて、(おく)って()つブロック使(つか)うよ。

リスト「★送信(そうしん)(よう)データ」を(つく)

リストを用意(ようい)しよう。これには座標(ざひょう)データを()れる予定(よてい)だよ。
スクラッチでオンラインゲームを作る⑤ バッファリングを実装するを語るok-scratch ok-scratch

u003cpu003e先頭(せんとう)に★が()いてるね。これは(ぼく)のマイルールなんだけど、「すべてのスプライト(よう)」の変数(へんすう)やリストを(つく)ったら(かなら)ず★を()けておくようにしてる。理由(りゆう)()かりやすいからってだけ。★がなくても(うご)きに(ちが)いはないよ。動画(どうが)では★は()けてないし、どっちでもOK!u003c/pu003e

座標(ざひょう)追加(ついか)してみる

X座標(ざひょう)とY座標(ざひょう)をリストに追加(ついか)してみよう。

テストする

これで(うご)かすとどうなるかな?
うわ!リストの(なが)さがどんどん()えていく!これはバグる予感(よかん)がヒシヒシするね!(あか)いボタンを()して()めておこう。でも安心(あんしん)してほしい!この座標(ざひょう)データはずっと保持(ほじ)しておく必要(ひつよう)はなくて、クラウド変数(へんすう)(わた)したら過去(かこ)データは不要(ふよう)になるわけだから、その都度(つど)()すようにすれば大丈夫(だいじょうぶ)。やってみよう。

イベント「クラウド - ティック」を(つく)

今度(こんど)はループ(ない)で1フレームごとに送信(そうしん)されるメッセージ「クラウド - ティック」を(つく)ろう。

配置(はいち)する

よし、このままでは(なに)()わらないけど、とりあえず(つぎ)に「クラウドプレイヤー」(がわ)(ととの)えよう。
  • ティックってなに? ティックってなに?
    u003cpu003e日本語(にほんご)だとあまり適切(てきせつ)(わけ)がないんだけど、tickティックは「秒針(びょうしん)が1つ(すす)()」みたいな意味合(いみあ)いで使(つか)われる。ここでは「ずっとループ」(うち)でフレームが1つ(すす)()っていうイメージだね。u003c/pu003eu003cpu003e「tick-tockチクタク」っていう擬音語(ぎおんご)なら有名(ゆうめい)だよね。あれのtickなんだ。u003c/pu003e

クラウドプレイヤー(がわ)(ととの)える

ではスプライトを()()えよう。

不要(ふよう)なコードを削除(さくじょ)する

こっちも不要(ふよう)なコードは()していくぞ。

(みどり)(はた)がおされたときを()

数字(すうじ)キー2が()されたときも()

エンコードとデコードだけ(のこ)

この2つは(のこ)しておこう!

メッセージ「クラウド - セットアップ」を()()

(つづ)けてコーディングしていこう!まずは「クラウド - セットアップ」の(ほう)から()くぞ。

初期化(しょきか)処理(しょり)(つく)

ここで最初(さいしょ)(おこな)われる初期化(しょきか)処理(しょり)(つく)っていくよ。

まず(かく)

とりあえずスプライトを(かく)しておこう。

過去(かこ)データを()

さっそくだけど過去(かこ)データを(そら)にしておこう。セットアップし(なお)すから過去(かこ)データは一切(いっさい)不要(ふよう)だ。
よし、とりあえずこれでOKだ。

メッセージ「クラウド - ティック」を()()

(つぎ)にクラウド - ティックの()()処理(しょり)(つく)ろう。これはスプライト「(より)プレイヤー」のループ(ない)実行(じっこう)されるから、1秒間(びょうかん)にだいたい30(かい)くらい()んでくるメッセージだね。でも(ぼく)らの作戦(さくせん)としてはこのメッセージは3(かい)または4(かい)に1()だけクラウド変数(へんすう)にセットして、それ以外(いがい)のときはデータをためるバッファリングを(おこな)うってことだったね。そのあたりをここで実装(じっそう)していくよ。

変数(へんすう)「クラウドティック」を(つく)

何回目(なんかいめ)のメッセージ「クラウド - ティック」を()()ったのかを管理(かんり)するために同名(どうめい)変数(へんすう)(つく)っておくよ。

初期(しょき)()する

メッセージ「クラウド - セットアップ」のところに初期化(しょきか)処理(しょり)追加(ついか)しておこう。

加算(かさん)処理(しょり)をする

メッセージ「クラウド - ティック」のところでは1ずつ加算(かさん)するようにしよう。

ブロック定義(ていぎ)同期(どうき)する」を(つく)

(かい)か4(かい)(おく)ったら同期(どうき)するっていう処理(しょり)をブロック定義(ていぎ)にしてまとめていくよ。

条件(じょうけん)分岐(ぶんき)ブロックを追加(ついか)する

もしも変数(へんすう)「クラウドティック」が指定(してい)した回数(かいすう)(たっ)していたら、っていう条件(じょうけん)(つく)りたい。そんなときも「もしも」ブロックだね。

条件(じょうけん)(しき)(つく)

さて、演算(えんざん)はどうしようか。やり(かた)はいろいろあるけど今回(こんかい)剰余(じょうよ)演算子(えんざんし)使(つか)っていこう。「()った(あま)り」を調(しら)べる演算子(えんざんし)のことだよ。
これだね。空欄(くうらん)にブロックをはめていこう。こんな(かん)じ↓
これの(かい)が0より(おお)きいときはまだデータを()める段階(だんかい)ってこと。
たとえば「回数(かいすう)」が4なら、クラウドティックが1なら1÷4の(あま)りは1だからゼロより(おお)きい。2,3も(あま)りがでる。4÷4のときに(あま)りがゼロになるね。これを条件(じょうけん)(しき)として使(つか)おう。

処理(しょり)()めておく

とりあえず処理(しょり)()めておけばOK。

リストを()

そして色々(いろいろ)上手(うま)()った(あと)(あらた)めてリストを()すようにしておくぞ。これはテスト(よう)だからすぐ修正(しゅうせい)するけどね。

ブロック定義(ていぎ)()()

ではメッセージを()()った(とき)にこのブロック定義(ていぎ)()()そう。引数(ひきすう)には4を指定(してい)しておくよ。

テストする

リストの(なが)さに注目(ちゅうもく)
よし、だいたいいいね!精度(せいど)としては十分(じゅうぶん)だ。

エンコードする

もちろん座標(ざひょう)をエンコードして(わた)していくのが目的(もくてき)だから、このままでは()われないね。こっからが本番(ほんばん)だ。

テスト(よう)のブロックを()

リストデータを()すところはいったん()してOK。

変数(へんすう)「エンコード文字列(もじれつ)」を初期(しょき)()する

()した場所(ばしょ)変数(へんすう)「エンコード文字列(もじれつ)」の初期化(しょきか)処理(しょり)()こう。空白(くうはく)初期(しょき)()するよ。

リストの中身(なかみ)全部(ぜんぶ)エンコードするループを(つく)

リストの(なが)さを使(つか)ってループブロックを(つく)ろう。
ループにはめる↓
これを追加(ついか)するぞ。

リストの先頭(せんとう)をエンコードしていく

このループ(ない)でブロック定義(ていぎ)「エンコードする」を()()そう。
引数(ひきすう)にはリストの1つ()をハメる。
これを()れよう。

先頭(せんとう)()

直後(ちょくご)に1つ()のデータを()してしまおう!
ちょっとトリッキーだけど、これでどんどん先頭(せんとう)がエンコードされていくんだ。リストの1つ()をエンコードした(あと)にリストの1つ()()したら、自然(しぜん)と2つ()のデータが先頭(せんとう)()るからね!

クラウド変数(へんすう)1を更新(こうしん)する

最後(さいご)にクラウド変数(へんすう)更新(こうしん)しよう!

テストする

さぁどうなるかな。
よぉし!クラウド変数(へんすう)次々(つぎつぎ)更新(こうしん)されているね!さっきまでよりも(なが)くなっているのがバッファリングした(ぶん)一気(いっき)にエンコードしている(あかし)だね。

次回(じかい)

今回(こんかい)はここまでにしておこう!バッファリングという(むずか)しい仕様(しよう)実装(じっそう)することに成功(せいこう)したね。今回(こんかい)やったことをまとめると(つぎ)のようになるよ。
  • スプライトを2つに()けて
  • (より)プレイヤー(がわ)からは「ずっとループ」が1フレーム(すす)()ごとに、「★送信(そうしん)(よう)データ」に座標(ざひょう)データを追加(ついか)して「クラウド - ティック」というメッセージを(おく)った
  • クラウドプレイヤー(がわ)では「クラウド - ティック」を()()って、4フレームごとに「★送信(そうしん)(よう)データ」をエンコードしてクラウド変数(へんすう)1にセットした
よしよし、順調(じゅんちょう)だ。次回(じかい)(べつ)のタブでも(おな)じプロジェクトを(うご)かしてみよう。タブA(がわ)でタブBがクラウド変数(へんすう)更新(こうしん)したことを検知(けんち)して、(あたら)しいプレイヤーの追加(ついか)処理(しょり)実現(じつげん)してみるぞ。それだけ()くと(まえ)のチュートリアルで実現(じつげん)したことと(おな)じだけど、今回(こんかい)はバッファリングされたバージョンだからね!かつてあったカクカクは極限(きょくげん)まで(すく)なくなっているはずだ!次回(じかい)もすぐ更新(こうしん)予定(よてい)だから()っててね!
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

スクラッチプログラミングのゲーム攻略

スクラッチプログラミングのゲーム

    • 厳選されたスクラッチ人気作品リストがレビュー付きで楽しめます
      趣味に関するスクラッチ作品例
      勉強になるスクラッチ作品