スクラッチでオンラインゲームを作る⑧ クローンを使おう

スクラッチでオンラインゲームを作る⑧ クローンを使おう
グリフパッチ(動画)
ok-scratch(解説記事)

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

クローンを作って別プレイヤーを表示させて動きを同期するぞ!
スターター
プロジェクト
なし
難しさ

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

LOADING...

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

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

前回(ぜんかい)クラウド変数(へんすう)受信(じゅしん)して新規(しんき)プレイヤーなら入場(にゅうじょう)処理(しょり)とデータ更新(こうしん)を、既知(きち)プレイヤーならデータ更新(こうしん)のみを実行(じっこう)するようにプレイヤー管理(かんり)ができる仕組(しく)みを(つく)ったぞ!でもまだまだリストのデータが更新(こうしん)されただけで、()()(なに)()わってないんだよねぇ。っということでここから()()()えていくぞ。これでオンラインゲーム(かん)がグッと()してワクワクが大爆発(だいばくはつ)すること間違(まちが)いなしだ!
スクラッチでオンラインゲームを作る⑧ クローンを使おうを語るok-scratch ok-scratch

u003cpu003e今回(こんかい)からスクラッチ公式(こうしき)サイトでブロックのカラーが更新(こうしん)されたエディターを使(つか)っていくね。なので前回(ぜんかい)までとスクショ(ない)のブロックカラーなど(ちが)うけど機能的(きのうてき)には(まった)(おな)じなので問題(もんだい)ないよ。u003c/pu003e

今回(こんかい)目標(もくひょう)「クローンを(つく)って(べつ)プレイヤーを表示(ひょうじ)させる」

(べつ)プレイヤーを表示(ひょうじ)させる一番(いちばん)いい方法(ほうほう)はクローンを使(つか)うことだよね。今回(こんかい)クローンを使(つか)って(べつ)プレイヤーを自分(じぶん)画面(がめん)表示(ひょうじ)させる。ただまぁクローンを使(つか)うと物事(ものごと)がより複雑(ふくざつ)になっていくんだよねぇ。仕方(しかた)ないけど。(あせ)らず(いそ)がず、じっくり()()めば大丈夫(だいじょうぶ)。それに(じつ)(いま)までのコーディングはクローンを使(つか)うことを想定(そうてい)して(つく)ってきているから、(おも)ってるより複雑(ふくざつ)にならないかも。なにより(ぼく)一緒(いっしょ)にいるから絶対(ぜったい)大丈夫(だいじょうぶ)だって!チラッと完成(かんせい)動画(どうが)()せちゃう↓
やってみよう!

クローンを(つく)

いきなりクローンを(つく)っていくよ。最初(さいしょ)作戦(さくせん)(つた)える。(かく)クローンには(こと)なる変数(へんすう)「プレイヤー(ばん)(ごう)」を()たせて管理(かんり)していくんだ。プレイヤー(ばん)(ごう)さえ()かれば「★プレイヤーUID一覧(いちらん)」と「★プレイヤーデータ一覧(いちらん)」のどこを()ればいいか()かるから、これだけで()プレイヤーとの区別(くべつ)(おこな)えるようになっているんだ。クローンを(つく)るときによくある手法(しゅほう)として、スプライト自身(じしん)()表示(ひょうじ)のままにしてクローンだけ表示(ひょうじ)するっていう方法(ほうほう)をここでも採用(さいよう)するぞ。スプライト自身(じしん)変数(へんすう)「プレイヤー(ばん)(ごう)」は空白(くうはく)のままにしておくことで、クローンかどうかを区別(くべつ)もできる。おいおい変数(へんすう)「プレイヤー(ばん)(ごう)」めっちゃ優秀(ゆうしゅう)じゃんか!?最高(さいこう)だね!

クローンブロックを()

変数(へんすう)「プレイヤー(ばん)(ごう)」をセットした直後(ちょくご)にクローンを(つく)ろう。
こうすればクローンはプレイヤー(ばん)(ごう)保持(ほじ)した状態(じょうたい)生成(せいせい)されるね。そしてスプライト自身(じしん)はこのあとの処理(しょり)でプレイヤー(ばん)(ごう)空白(くうはく)(もど)してあるのでバッチリだ。

クラウド - ティックを()()ったときの処理(しょり)()ける

さて、クローンを使(つか)(とき)問題点(もんだいてん)として、本体(ほんたい)(がわ)実行(じっこう)されているループ処理(しょり)をクローンも実行(じっこう)してしまうというのは有名(ゆうめい)だよね。問題(もんだい)ないケースもあるんだけど、(たと)えば今回(こんかい)のメッセージ「クラウド - ティック」をうけとった(とき)処理(しょり)本体(ほんたい)だけしか実行(じっこう)してほしくない。いや、もっと正確(せいかく)()うと、本体(ほんたい)のティック処理(しょり)とクローンのティック処理(しょり)別々(べつべつ)にしたい(おも)ってる。

本体(ほんたい)とクローンを区別(くべつ)する

ここで(ふたた)役立(やくだ)つのが変数(へんすう)「プレイヤー(ばん)(ごう)」だったね!条件(じょうけん)分岐(ぶんき)させてみよう!

条件(じょうけん)ブロックを()

とりあえずクラウドティックを()()るところに「もし」ブロックを()こう。

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

変数(へんすう)「プレイヤー(ばん)(ごう)」が空白(くうはく)でなければクローンだね。この(つく)(かた)(なに)(どお)りかあるけど今回(こんかい)下記(かき)のような方法(ほうほう)でOKだ。
否定(ひてい)ブロックを使(つか)方法(ほうほう)もあるけど、こっちのほうがシンプルじゃない?これを条件(じょうけん)(しき)として使(つか)うとこうなる↓
うん、いいね。この(なか)条件(じょうけん)ブロックの(なか)にはクローンしか()れない状態(じょうたい)ができたね。では中身(なかみ)(つく)()んでいこう!

ブロック定義(ていぎ)「クローンティック」を用意(ようい)する

クローン専用(せんよう)のティック処理(しょり)をブロック定義(ていぎ)にまとめておくよ。

使(つか)

条件(じょうけん)ブロック(ない)()いて、さらにそれ以降(いこう)処理(しょり)実行(じっこう)されないように「このスクリプトを()める」ブロックも()こう。
これで「もし」ブロック(ない)はクローンだけが実行(じっこう)できて、「もし」ブロック以降(いこう)本体(ほんたい)だけが実行(じっこう)できるようになったね!

クローンティックを(つく)

よし、じゃあココからはクローンだけが実行(じっこう)するティック処理(しょり)(つく)るよ。ちなみに、ココに(いた)るまでにすでにブロック定義(ていぎ)順番(じゅんばん)にデコードする」を1(かい)実行(じっこう)してるのは(おぼ)えてる?そう、プレイヤーUIDをエンコード文字列(もじれつ)から取得(しゅとく)するときに1(かい)実行(じっこう)したんだよね。じゃあ(つぎ)にデコード処理(しょり)実行(じっこう)したら(なに)()れるか(おぼ)えてるかな?そう、X座標(ざひょう)だね!ではさらにもう1(かい)実行(じっこう)したら?うん、Y座標(ざひょう)だよね。じゃあさ、(つづ)けてもう1(かい)実行(じっこう)したら(なに)()れるっけ?(こた)えは(つぎ)のイメージを()てみてね。
うん、()れるのは(つぎ)のX座標(ざひょう)だね。この()参考(さんこう)にどんどん順番(じゅんばん)にデコードしていって、そのたびに座標(ざひょう)データを()()ててみよう。

デコードしてX座標(ざひょう)()()てる

ブロック定義(ていぎ)順番(じゅんばん)にデコードする」を実行(じっこう)しよう。

X座標(ざひょう)()()てる

これで変数(へんすう)()」にはX座標(ざひょう)(はい)ったから、これを()()てよう。

デコードしてY座標(ざひょう)()()てる

(かい)デコードしたから下記(かき)のようになってるわけだ。
じゃあ(つづ)けてY座標(ざひょう)()()して()()てよう。
カンタンだね!

カラになったかどうか調(しら)べる

これでXとYが()()されたからエンコード文字列(もじれつ)下記(かき)のようになったね。
ティック処理(しょり)はどんどん実行(じっこう)されるから、次回(じかい)もまたX座標(ざひょう)とY座標(ざひょう)()()てる処理(しょり)実行(じっこう)されるよね!そしてこのティック処理(しょり)変数(へんすう)「エンコード文字列(もじれつ)」がカラになる(=デコードできなくなる)まで(つづ)わけだ。
カラになったらどうしようか?大丈夫(だいじょうぶ)安心(あんしん)して!その(ころ)にはきっと本体(ほんたい)(がわ)のクラウドティック処理(しょり)(つぎ)のクラウド変数(へんすう)受信(じゅしん)してるだろうから、またリスト「★プレイヤーデータ一覧(いちらん)」にデータが(とど)いてるはずだよ。データをまたエンコード文字列(もじれつ)にセットすれば、連続(れんぞく)してデコード処理(しょり)実行(じっこう)していけるね。
これでエンコード文字(もじ)順番(じゅんばん)を2にセットしてから余分(よぶん)なデータ(プレイヤーUID)をスキップするために1(かい)デコードしておけば……そう、またXとYを()りたい放題(ほうだい)だね!めっちゃスムーズに(うご)きが再現(さいげん)できそうな予感(よかん)がしてきた……ワクワクっ!

条件(じょうけん)ブロックを()こう

じゃあエンコード文字列(もじれつ)がカラかどうか調(しら)べよう。

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

カラかどうか、どうやって調(しら)べる?()()けてほしいのは、実際(じっさい)には変数(へんすう)「エンコード文字列(もじれつ)」の中身(なかみ)はデータが(はい)ったままってこと。だからエンコード文字列(もじれつ)空白(くうはく)かどうか、という条件(じょうけん)(しき)使(つか)えない。そこで変数(へんすう)「エンコード文字(もじ)順番(じゅんばん)」を使(つか)って(つぎ)のような演算(えんざん)(つく)ってみよう。
現状(げんじょう)だと、変数(へんすう)「エンコード文字(もじ)順番(じゅんばん)」は変数(へんすう)「エンコード文字列(もじれつ)」の(なが)さより1つ(おお)きい()になっているよね!そこを利用(りよう)すればエンコード文字列(もじれつ)がカラ(=全部(ぜんぶ)デコード()み)かどうかが()かるっていう算段(さんだん)だよ。

(つぎ)のプレイヤーデータをエンコード文字列(もじれつ)(うつ)そう

この(なか)ではプレイヤーデータをエンコード文字列(もじれつ)(うつ)処理(しょり)(つく)っていくよ。

ブロック定義(ていぎ)用意(ようい)する

ブロック定義(ていぎ)(つぎ)のプレイヤーデータを(うつ)す → エンコード文字列(もじれつ)」に処理(しょり)をまとめておこう。

使(つか)

とりあえず()いてみよう。

プレイヤーデータを取得(しゅとく)する

(かく)クローンが()っている変数(へんすう)「プレイヤー(ばん)(ごう)」を使(つか)って、自分(じぶん)のプレイヤーデータを取得(しゅとく)しよう。
これを変数(へんすう)「エンコード文字列(もじれつ)」に反映(はんえい)するよ。

(もと)のプレイヤーデータは()

なにかのはずみで2(かい)(おな)じデータを取得(しゅとく)してしまわないように、(もと)場所(ばしょ)空白(くうはく)にしておこう

プレイヤーUIDをスキップしておく

この段階(だんかい)ではプレイヤーUIDは不要(ふよう)なので一度(いちど)デコードを()ってしまおう。もちろん直前(ちょくぜん)変数(へんすう)「エンコード文字(もじ)順番(じゅんばん)」を2にセットすることも(わす)れずに。
この処理(しょり)はとりあえずこれでOK!

仕上(しあ)げる

ところで、★プレイヤーデータ一覧(いちらん)にデータが(とど)いてなかったらどうなるだろうか。その場合(ばあい)エンコード文字列(もじれつ)空白(くうはく)がセットされることになるんだ。このことを利用(りよう)してブロック定義(ていぎ)「クローンティック」にストップ処理(しょり)追加(ついか)しておこう。

条件(じょうけん)ブロックを()こう

プレイヤーデータを(うつ)した直後(ちょくご)条件(じょうけん)分岐(ぶんき)(つく)ろう。

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

エンコード文字列(もじれつ)空白(くうはく)かどうかを調(しら)べよう。

処理(しょり)()めよう

(なに)()れなかったら今回(こんかい)のティックではなにもしない、っということだね。

表示(ひょうじ)(わす)れずに

おっとこのままだと本体(ほんたい)(おな)じくクローンが(かく)れたままだね。しっかり表示(ひょうじ)させよう。表示(ひょうじ)させるタイミングはここかな。

テストターイム!

ここまで一気(いっき)通貫(つうかん)(つく)ってきたから、もうテストしたくてウズウズしてたんじゃないかな?!よしよし、またタブを2つ(ひら)いてテストしてみませう!
た・の・し・いーーーーーぃ!(うご)いた?(うご)いた?ちょっと感動(かんどう)じゃない!?これはやばいよね!

次回(じかい)

今回(こんかい)(べつ)プレイヤーを自分(じぶん)画面(がめん)表示(ひょうじ)させて(うご)きを同期(どうき)させるためにクローンを使(つか)ったね!クローンを使(つか)うと一気(いっき)複雑(ふくざつ)になる……と心配(しんぱい)したけど、元々(もともと)クローンを想定(そうてい)して(つく)っておいたから(おも)いの(ほか)スッキリした構造(こうぞう)(たも)てたと(おも)わない?(だい)改造(かいぞう)したっていうよりは、ちょっと追加(ついか)しただけ、みたいな印象(いんしょう)だったんじゃないかな。さてさて、まだ()わらないよ。もっと(たか)みへ()こう!現状(げんじょう)だとタブを3つとか4つとか(ひら)くとカクカクしちゃうときがあるよね。そう、ラグいんだよ。次回(じかい)はこのラグをスケールアップという(わざ)(なお)!あとプレイヤーを追加(ついか)する入場(にゅうじょう)処理(しょり)ができているけど、次回(じかい)(つぎ)次回(じかい)でオフラインになったプレイヤーを除去(じょきょ)する退場(たいじょう)処理(しょり)実装(じっそう)しようと(おも)う!こうすることで()()わり()()わり(あそ)(ひと)途切(とぎ)れないオンラインゲームになるってことよ。近日(きんじつ)(ちゅう)更新(こうしん)するので()っててね~。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

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

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

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