スクラッチでオンラインゲームを作る⑥ 別プレイヤーを検知する

スクラッチでオンラインゲームを作る⑥ 別プレイヤーを検知する
グリフパッチ(動画)
ok-scratch(解説記事)

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

別プレイヤーの存在を検知する処理を実装するぞ!
スターター
プロジェクト
なし
難しさ

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

LOADING...

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

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

前回(ぜんかい)はバッファリングを実装(じっそう)して欠落(けつらく)のない(うご)きの再現(さいげん)成功(せいこう)したぞ!これ↓がバッファリングに成功(せいこう)した状態(じょうたい)だ。
変数(へんすう)「★送信(そうしん)(よう)データ」をエンコードしてクラウド変数(へんすう)1に一括(いっかつ)でセットしている様子(ようす)()()れるね。ここからは()プレイヤーとのクラウド変数(へんすう)共有(きょうゆう)意識(いしき)した実装(じっそう)(すす)めていく。ややこしくなってきたねぇ!

今回(こんかい)目標(もくひょう)「UIDを実装(じっそう)して(べつ)プレイヤーを検知(けんち)する」

自分(じぶん)他人(たにん)区別(くべつ)するためにUID(=ユニークID)を実装(じっそう)していこう。これを使(つか)えば(だれ)がクラウド変数(へんすう)更新(こうしん)したのか()かるようになるんだ。(いま)のままだと、(べつ)タブで(おな)作品(さくひん)(ひら)いてみるとタブAでもタブBでもクラウド変数(へんすう)1を更新(こうしん)するため、(だれ)座標(ざひょう)データなのか識別(しきべつ)不能(ふのう)状態(じょうたい)なんだ。そこで今回(こんかい)は、クラウド変数(へんすう)1に(わた)すデータにUIDというプレイヤーを識別(しきべつ)できるデータを追加(ついか)していきたいというわけ。座標(ざひょう)以外(いがい)のデータをクラウド変数(へんすう)(わた)練習(れんしゅう)にもなるよ。まぁ方法(ほうほう)座標(ざひょう)のときと(おな)じ!エンコードしてクラウド変数(へんすう)にセットして、()()(がわ)ではデコードしてデータを分解(ぶんかい)して使(つか)うよ。おっと、ただそのまえに1つやることがあるんだ。そのあたりも順番(じゅんばん)()ていこう。今回(こんかい)やることをざっくりまとめるとこう↓
  • (あたら)しいリスト「★クラウドデータ」を(つく)
  • (なが)数字(すうじ)文字(もじ)()する
  • プレイヤーUIDを(おく)
  • プレイヤーUIDを()()
  • プレイヤーUIDを調(しら)べる
こんな(かん)じで(すす)めていくよ。

直前(ちょくぜん)のクラウド変数(へんすう)中身(なかみ)保持(ほじ)するリストを(つく)

このあとの実装(じっそう)で、クラウド変数(へんすう)更新(こうしん)されたかどうかを調(しら)べる(こう)(ほど)がある。そこで直前(ちょくぜん)のデータと最新(さいしん)のデータを比較(ひかく)しないといけないので、直前(ちょくぜん)のデータを保存(ほぞん)しておくためのリストを用意(ようい)したいと(おも)う。

リスト「★クラウドデータ」を(つく)

このリストに直前(ちょくぜん)のデータを追加(ついか)していく。

初期(しょき)()する

クラウド変数(へんすう)()をクラウドデータに保管(ほかん)しておく

これでこのあと、クラウド変数(へんすう)1の中身(なかみ)(まえ)のティックから()わってるかどうかを判断(はんだん)するのに役立(やくだ)つ!

(なが)数字(すうじ)比較(ひかく)する

しょぼーんってなるけど、ここでみんなにスクラッチの(こま)った仕様(しよう)を1つご紹介(しょうかい)しないといけない。それは(なが)数字(すうじ)比較(ひかく)(かん)するものだ。(たと)えばここに250ケタの(ちょう)(なが)数字(すうじ)があったとする。(実際(じっさい)クラウド変数(へんすう)(いろ)んなデータをエンコードしまくって()れてると(なが)くなることはある)これはテストだからみんなはやらなくてもいいけど、()になったらためしにやってみ。
こういう(なが)数字(すうじ)比較(ひかく)してみたいと(おも)う。
うん、ふつうに「() = ()」はTRUE((しん))だね!じゃあこれは?↓
() = (() + 1)」だね。いやいや、そりゃあFALSE((にせ))でしょ。()たり(まえ)じゃん。こんなん(だれ)でも(ぶん)か……
おおおおおい!?なんかTRUE((しん))ってなってるんですけど!?絶対(ぜったい)(ちが)うじゃんか……。WHY!?スクラッチピーポー!【悲報(ひほう)】じつはスクラッチさん、(なが)数字(すうじ)理解(りかい)できません↓
250ケタの()に1を加算(かさん)すると、スクラッチの限界(げんかい)()えてしまって理解(りかい)不能(ふのう)数字(すうじ)になってしまうんです……。そしてこれを比較(ひかく)使(つか)うとさっき()(とお)りなんでもTRUEになっちゃう……。しかもエラーにもならないっていうバグの温床(おんしょう)でもある。アンビリーバボーだぜ!

(なに)(こま)るの?

これで(なに)(こま)るのかって()うと、このあとの実装(じっそう)(こま)る。このあとクラウド変数(へんすう)1の()変更(へんこう)されたかどうかを調(しら)べていくんだけど、そのときに直前(ちょくぜん)()現在(げんざい)()比較(ひかく)したいんだ。でももしデータが(なが)すぎてスクラッチの限界(げんかい)()えてたら、なんでもかんでもTRUEになっちゃうんだよね。つまり直前(ちょくぜん)()現在(げんざい)()(つね)(おな)じ(=変更(へんこう)なし)って判定(はんてい)になってしまう。これでは(ただ)しく(うご)かないよね。これを未然(みぜん)(ふせ)ぐために(さく)(こう)じておきたいと(おも)うぜ。

数字(すうじ)文字(もじ)明示的(めいじてき)(なお)

(なが)数字(すうじ)理解(りかい)できないなら(なが)文字(もじ)にすればいいじゃない?という一見(いっけん)するとマリー・アントワネットばりの理不尽(りふじん)見解(けんかい)(※)だけど、スクラッチに(かん)しては正解(せいかい)なんだ。
スクラッチでオンラインゲームを作る⑥ 別プレイヤーを検知するを語るok-scratch ok-scratch

u003cpu003e※「パンがないならケーキを()べればいいじゃない?」っていうマリー・アントワネットが()ったとされる名言(めいげん)迷言(めいげん))がある。ただし本人(ほんにん)はそんなこと()ってないという(せつ)有力(ゆうりょく)。ネガティブ・キャンペーンってやつか。u003c/pu003e

明示的(めいじてき)数字(すうじ)文字(もじ)(なお)方法(ほうほう)はカンタン。文字(もじ)数字(すうじ)をくっつければOK。
これはアルファベットの「c」と変数(へんすう)()」をくっつけてから比較(ひかく)してる。(c + ())=(c + (() + 1))こうすると(こた)えはFALSE((にせ))になるから正解(せいかい)だね。ふぅ!あっぶね。

文字(もじ)()する

じゃあクラウド変数(へんすう)1を明示的(めいじてき)文字(もじ)にしよう。くっつける文字(もじ)(なん)でもいいんだけど、クラウド(Cloud)の「c」にしとこうか。

テストする

うん、cがついてて文字(もじ)になってるね。文字(もじ)だからもう計算(けいさん)には使(つか)えないけど、これを計算(けいさん)する予定(よてい)はないので問題(もんだい)ない!

(べつ)タブでテストしてみる

このタイミングでまたタブを2つ(ひら)いて(となり)同士(どうし)(なら)べて(うご)きを確認(かくにん)しておこう。
この動画(どうが)拡大(かくだい)してみてみて。タブ(ひだり)(うご)いてるときにタブ(みぎ)のクラウド変数(へんすう)1がどんどん更新(こうしん)されてるよね。これはタブ(ひだり)からの座標(ざひょう)データと、タブ(みぎ)自身(じしん)座標(ざひょう)データが交互(こうご)にクラウド変数(へんすう)1を更新(こうしん)しているからなんだ。つまり、2つあるデータのうち1つはタブ(ひだり)のもの、もう1つはタブ(みぎ)のものという状態(じょうたい)だね。で、どのデータがどっちのデータなのか、それを(あき)らかにするために冒頭(ぼうとう)(つた)えたUIDというものを実装(じっそう)していくよ。

UIDを実装(じっそう)する「送信(そうしん)(へん)

UID自体(じたい)はランダムな数字(すうじ)羅列(られつ)にするよ。たとえば214843みたいな意味(いみ)のない、だけど滅多(めった)重複(じゅうふく)しない数字(すうじ)

変数(へんすう)「★(より)プレイヤーUID」を(つく)

すべてのスプライト(よう)(あたら)しい変数(へんすう)(つく)ろう。

初期(しょき)()する

メッセージ「クラウド - セットアップ」を()()ったところに乱数(らんすう)1から9,999,999(9が7())で初期(しょき)()しよう。
これで滅多(めった)重複(じゅうふく)しないでしょう!こんな(かん)じ↓

エンコード文字列(もじれつ)先頭(せんとう)追加(ついか)する

(いま)まではXとYの座標(ざひょう)データしかエンコードしてなかったけど、これからは最初(さいしょ)にUIDをエンコードして()れるようにするよ。ブロック定義(ていぎ)同期(どうき)する」(うち)にブロックを追加(ついか)しよう。
これで変数(へんすう)「エンコード文字列(もじれつ)」に(より)プレイヤーUIDがエンコードされて追加(ついか)されたね。ちょっと()てみようか。
バッチリ。エンコードが(ただ)しく機能(きのう)してて、なんか気持(きも)ちいい!

UIDを実装(じっそう)する「受信(じゅしん)(へん)

自分(じぶん)から(おく)るデータにプレイヤーUIDを()けることには成功(せいこう)した。(つぎ)はクラウド変数(へんすう)をデコードしてプレイヤーUIDを()()って、それが自分(じぶん)のものか(べつ)プレイヤーのものかを判定(はんてい)するところだ。っとそのまえに1つ変更(へんこう)したいことがある。

ブロック定義(ていぎ)同期(どうき)する」の名前(なまえ)()える

同期(どうき)するだと送信(そうしん)する意味(いみ)受信(じゅしん)する意味(いみ)(ふく)まれてて、ちょっとアイマイだから名前(なまえ)()えておきたい。ブロック定義(ていぎ)同意(どうい)する」を(みぎ)クリックして編集(へんしゅう)(えら)ぼう。
明確(めいかく)に「クラウド変数(へんすう)送信(そうしん)する」に変更(へんこう)しておこうかな!

ブロック定義(ていぎ)「クラウド変数(へんすう)受信(じゅしん)する」を(つく)

これの(たい)になるブロック定義(ていぎ)「クラウド変数(へんすう)受信(じゅしん)する」を(つく)っていこう。引数(ひきすう)には☁《くも》(ばん)(ごう)更新(こうしん)データの2つを()るようにしよう。ちなみに☁はクラウドっていう意味(いみ)()めてる。

使用(しよう)する

メッセージ「クラウド - ティック」を()()ったタイミングで使(つか)おう。
1つ()引数(ひきすう)に「1」を()れたね。1はクラウド変数(へんすう)1を意味(いみ)するよ。(べつ)チュートリアルでこの1が()意味(いみ)(あき)らかになるから、(いま)はとりあえず1はクラウド変数(へんすう)1なんだな、って認識(にんしき)しておいてね。2つ()引数(ひきすう)にはクラウド変数(へんすう)文字(もじ)()したものを()れるよ。さっきリスト「★クラウドデータ」に()れた(さい)文字(もじ)()した処理(しょり)(まった)(おな)演算(えんざん)「c + クラウド変数(へんすう)1」だよ。よし、じゃあブロック定義(ていぎ)「クラウド変数(へんすう)受信(じゅしん)する」の(なか)(つく)()んでいこう!

変更(へんこう)がなければ(なに)もしない

もしクラウド変数(へんすう)中身(なかみ)直前(ちょくぜん)()()わってないなら(なに)もしないよ。とりま「もし」ブロックをカチッと。

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

(つぎ)に、クラウド変数(へんすう)中身(なかみ)比較(ひかく)するにはリスト「★クラウドデータ」が役立(やくだ)つ。これはクラウド変数(へんすう)直前(ちょくぜん)()格納(かくのう)されているリストだったね。そして最新(さいしん)()は2つ()引数(ひきすう)更新(こうしん)データ」に(はい)ってる。だからこの2つを比較(ひかく)する演算(えんざん)(つく)ってみよう。
これを条件(じょうけん)(しき)にハメよう。

このスクリプトを()める

で、更新(こうしん)されてないなら(なに)もしなくてOKと。

変更(へんこう)があれば★クラウドデータを更新(こうしん)する

もしも変更(へんこう)があったら直前(ちょくぜん)のデータを最新(さいしん)のデータで更新(こうしん)しよう!

テスト

クラウド変数(へんすう)1とクラウドデータの()同期(どうき)されるようになったね!
()きかな。

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

更新(こうしん)されたデータが(だれ)のものなのか調(しら)べていこう!なにげにここはエキサイティングに(かん)じる!だって(ほか)(ひと)がいるかどうかってオンラインゲームにとって重要(じゅうよう)なことだもんね。どうやって調(しら)べるのか!?そりゃデコードっしょ。デコードしてプレイヤーUIDを取得(しゅとく)していくぞ!

エンコード文字列(もじれつ)()()れる

デコードするためにはまず変数(へんすう)「エンコード文字列(もじれつ)」にデコード対象(たいしょう)となるデータを()れる必要(ひつよう)があったね。

エンコード文字(もじ)順番(じゅんばん)指定(してい)する

さて、この更新(こうしん)データの中身(なかみ)ってなんだっけ?さっき★クラウドデータに()れた()()てみると「c78280511206...」ってなってるね。(まえ)はエンコード文字(もじ)順番(じゅんばん)素直(すなお)に1文字(もじ)()から(はじ)めてたけど、(いま)って文字(もじ)()使(つか)った「c」がいるからエンコードを(はじ)めるのは2文字(もじ)()からじゃないとダメだね。
そうと()かればカンタン。
マジックナンバーになってしまうのが気持(きも)(わる)いけどとりあえずOK。
  • マジックナンバーとは? マジックナンバーとは?

    マジックナンバーというのはカンタンに言うと「パッと見では何を意味しているのか分からない数字」のこと。例えばいきなり「変数を10ずつ変える」とあったら「この10って何?いったいどこから来たの?勝手に変えていいの?」とよく分からないけど、10をジャンプ力という変数に入れておけば「10はジャンプ力ってことね」と見ただけで分かるようになる。

    マジックナンバーが多いプロジェクトは、リミックス難易度が高くなりがち。後日、自分で修正するときも困るから、どこかのタイミングでマジックナンバーを変数化しておくと便利。

デコードする

ここはブロック定義(ていぎ)使(つか)(まわ)す!(さい)利用(りよう)最高(さいこう)
これで変数(へんすう)()」にはプレイヤーUIDが(はい)っていることになるね!

(だれ)のデータなのか調(しら)べる

いよいよ(だれ)のプレイヤーUIDが(おく)られてきたのか調(しら)べるぞぉ!

バリデーションする

っとそのまえにデータが(こわ)れていたり、自分(じぶん)自身(じしん)のUIDだったりしたら処理(しょり)()めるようにガード処理(しょり)(つく)っておこう。こういうデータの正当性(せいとうせい)調(しら)べる作業(さぎょう)をバリデーションって()んだりする。
条件(じょうけん)ブロックを()いておく
とりあえず「もし」ブロックと処理(しょり)()めるブロックを()いておこう。
条件(じょうけん)(しき)(つく)
処理(しょり)()める条件(じょうけん)1はデータが(こわ)れている場合(ばあい)。1未満(みまん)みたいな()だったら(こわ)れていると判断(はんだん)しよう。
(こわ)れない、って(おも)っててもスクラッチは(だれ)でも(なか)改変(かいへん)できるからね。ひょっとしたら(だれ)かが(あやま)った変更(へんこう)(くわ)えて(こわ)れた()()んでくるなんてことも十分(じゅうぶん)ありえる。あとは自分(じぶん)のUIDだった場合(ばあい)だね。
このどちらかであったら処理(しょり)()めるってしておこう。最終的(さいしゅうてき)にはこうなる↓
よし、()めのテストに(うつ)ろうか。

プレイヤー(ばん)(ごう)(つく)

テストも()ねて変数(へんすう)「プレイヤー(ばん)(ごう)」を(つく)るよ。あとで実装(じっそう)でも使(つか)うから一石二鳥(いっせきにちょう)だよ。
初期(しょき)()する
空白(くうはく)初期(しょき)()するよ。
配置(はいち)する
あとで()えるけど、いったん変数(へんすう)()」を代入(だいにゅう)して様子(ようす)()よう。

テスト

タブを(なら)べて(うご)かしてみよう!
おおお!タブ(ひだり)のプレイヤーUIDが、タブ(みぎ)変数(へんすう)「プレイヤー(ばん)(ごう)」に(はい)ってるね。(ぎゃく)(おな)じだ!完璧(かんぺき)ぃ!これで(ほか)のプレイヤーの座標(ざひょう)データを処理(しょり)する準備(じゅんび)(ととの)ったというわけだ!イエス!

次回(じかい)

今回(こんかい)はプレイヤーUIDを実装(じっそう)して(べつ)プレイヤーを検知(けんち)するところが完成(かんせい)したね。オンラインゲームにとってまさに重要(じゅうよう)なキーポイントだったと(おも)うよ。今回(こんかい)やったことをカンタンに()(かえ)ろう。
  • (あたら)しいリスト「★クラウドデータ」を(つく)って、直前(ちょくぜん)のクラウド変数(へんすう)()保持(ほじ)できるようにした
  • (なが)数字(すうじ)文字(もじ)()して、(ただ)しくデータの比較(ひかく)ができるようにした
  • プレイヤーUIDをエンコード文字列(もじれつ)先頭(せんとう)追加(ついか)した
  • プレイヤーUIDをデコードして自分(じぶん)以外(いがい)のプレイヤーの存在(そんざい)検知(けんち)できるようにした
(つぎ)からは(べつ)プレイヤーのデータを処理(しょり)して、自分(じぶん)画面(がめん)(べつ)プレイヤーを表示(ひょうじ)させるところを実装(じっそう)しよう。もちろん表示(ひょうじ)するだけじゃなくて(うご)きも同期(どうき)させるぞ!ワクワクが()まんねぇ!また2,3(にち)更新(こうしん)するので()っててね。
ブクマよろしくお願いします! ブクマよろしくお願いします!
どんどん追記・更新していくので、ブックマークやシェアよろしくお願いします!

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

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

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