アドベントカレンダー「Scratch Advent Calendar 2015」の12月9日の担当の記事です。
前回同様、投稿日と担当の日の日付の差異は生暖かく以下略…。

はじめに

どうしていまさらクラウド変数について書くの?

まず、この話題を取り上げようと思ったのは、日本語でクラウド変数について良くまとめられたコンテンツを見つけられなかったからです。それで、私自身のためのメモのついでに情報共有できればと思った次第です。
ただ、技術情報としては非常に薄っぺらい内容です。実は私、技術的な記事を書くのは苦手だし嫌いなんですよ。何故かと言えば、書いている側から情報が古くなって役に立たなくなるからです。それでも以前は少々書いていました。でも、情報を粗製濫造しただけだったので速攻でやめました。
なので、今回は可能な限り、流行廃りに振り回されにくい情報を書くよう努めています。

この記事の対象者

今回の内容は、プログラミングの基礎知識が少々あってScratchはそれほど使ったことのない方・Scratchの情報をどこで調べたら良いのかいまひとつ分かっていない方向けです。「Scratch wiki(英語)」などに殆ど目を通していない方なども含みます。ゆえに、ググレカスレベルの内容が多いです

Scratch2.0の変数について

Scratch2.0には3種類の変数があります。グローバル変数ローカル変数クラウド変数です[*1:参照]

グローバル変数

全てのスプライトを通じてアクセスできる変数です。
他の言語で言うところのpublic、global などの修飾子がつく変数です。「すべてのスプライト用」にチェックを入れて作成します

ローカル変数

1つのスプライトの中でしか使用できない変数です(ステージには作成不可)
他の言語で言うところのprivate、static などの修飾子がつく変数です。「このスプライトのみ」にチェックを入れて作成します。

クラウド変数

2.0から新たに加わった変数で、グローバル変数の亜種です。
「Cloud variable」にチェックを入れて作成します。

「よくある質問(FAQ)」の「クラウドデータ」の項によると、
クラウドデータは、プロジェクトのデータを保存しオンラインで共有するためのScratch 2の機能です。
とあります。ザックリ言うと、他の変数とは異なり、入力した値をサーバ上に恒久的に保存することができます。

ところで、クラウド変数は「Scratcher」のみ利用できる機能です。限られたユーザにのみ使用が許可されている特性上、Scratchにログインした状態でないと利用出来ません
Scratcherになるには幾つかの条件があります。2つ以上のプロジェクトを作成すること、他ユーザに幾つかのコメントや「お気に入り」「好き」を付けていること、最低でもアカウント作成から2週間以上経過していること[*2:参照]などです。Scratcherになるために頻繁に作為的な行動をしていると当然のことながらマナー違反で注意を受ける[*3:参照]ますので御注意を…。また、Scratch黎明期の頃から利用している場合は「特に通知もなくいつの間にかScratcherになっていた」というケースもある模様です。
自分がScratcherかどうかはログイン後の「プロフィール」から確認することができます。


クラウド変数とそうでない変数の違い

グローバル変数とローカル変数、クラウド変数の違いが分かりやすい実際の例を紹介します。
まず、スペースキーを押すとグローバル変数、ローカル変数、クラウド変数それぞれ「1つずつ変える」だけのプロジェクトを作成します。


変数の種類は、ステージに表示したときに区別できるようになっています。
無印のものがグローバル変数、「[Sprite Name]:変数名」がローカル変数、雲のマークのあるものがクラウド変数です。

ここで改めて各変数のスコープ(参照範囲)をおさらいすると下図のようになります。


さてさて。先のプログラムで10回スペースキーを押すと、全ての変数の値が10になります。

グローバル変数とローカル変数は実行中のウインドウの中でだけ有効なので、ブラウザの「更新」ボタンを押したりウインドウを閉じてしまうと、実行前(プロジェクトのページを開いて緑の旗をクリックする直前)の状態に戻ってしまいます。新しいタブ開いて同じプロジェクトを実行すると、もちろん実行前の状態から始まります。




グローバル変数は入力した値がクラウド上(サーバ上)に保存されるため、実行前の状態に戻ることはありません。


クラウド変数の特徴

FAQやwikiにも説明がありますが、おおよそこんな具合です。
  • 入力可能な値は数字のみ
  • 1プロジェクトにつき10個まで
  • 他ユーザが「中を見る」でアクセスして変数の値を編集しても反映されない
  • リミックスした際の変数は元プロジェクトのものとは別物扱い
色々と制約があるようですが、抜け道もなくはないようで、そのあたりは調べると情報が出て来ます。
また、有効数字の精度は、クラウド変数に限らずActionScriptの仕様(癖?)に引っ張られているので[*4:参照]、現状はそのあたりを踏まえつつ利用するのが吉です。

クラウド変数の使用例とTips [*5:参照]

  1. 最新データの保存
  2. マルチプレーヤーゲームを作る
  3. クラウドリスト
  4. ブロードキャスティング

1. 最新データの保存

複数のユーザがプレイした時の最高得点、複数のユーザが特定のテーマに沿って票を入れて逐次集計し、それを表示する例です。

★ハイスコアの記録の例: TOKYOGAME (@tensaiotoko)
★投票結果の例: 第一回Scratchキャラ選挙! 2013 V1.2 (@mtaiking)

2. マルチプレーヤーゲームを作る

マルチプレーヤーゲームは、wikiにてキーボードをシェアして2人で遊ぶローカルなゲームと、クラウド変数を使ったオンラインゲームの2通りの作例が紹介されています

★マルチプレーヤーゲームの作例: Knight of Orange Ver1.2 beta (@mikoto)

3. クラウドリスト

日本のScratcherの間でも少々話題になっているのが「クラウドリスト」です。
ざっくり言えば「クラウドに保存できるリスト」です。現在の仕様ではリストはクラウド上(サーバ上)に保存できないため、クラウド変数を代用します。
変数にリストのデータを保存する際、リストの1項目1項目の値が区別できるように(n番目の値がどこからどこまでか分かるように)しなければならず、少々工夫が必要です。
ところで、クラウド変数は仕様により数字しか保存出来ません。ユーザ名を保存するために、もうひと工夫必要になります。各文字に対応した換字表を作成しておくのです。換字表に従って1文字ずつ文字コードに変換して保存(エンコード)したり、文字コードを解読して文字に直す(デコード)を行います。wikiにてエンコードとデコードの作例が紹介されていますので、一度参考にすると良いと思います。ちなみに作例は英数字で構成されたユーザ名の一覧を保存する方法になっています。
ここで、文字コードに併せて1つ1つのデータを区切るためのコードを用意しておけば(今回の場合は「00」)、そのコードを境に別のデータであることが分かります。このようにすれば、クラウド上に保存することができなかったリストのデータを保存の仕組みを実装することができるのです。


(↑エンコードとデコードの作例を読んでもイメージできない方のための説明用の図)

★クラウドリストの他の作例

4. ブロードキャスティング

イベントの「〜を送る」にクラウド変数を入れて、メッセージを一斉送信します。
(特に面白げな作例見つからず…)

私もクラウド変数を使ったプロジェクトを制作してみた

FAQによるとマルチプレーヤーゲームの制作は困難とあります。理由は
マルチプレイヤーゲームは、ネットワークの速度と同期の問題のため、作るのが困難です。しかし、何人かのScratcherは、クラウド変数をターン制や他のゲームに使う創造的な方法を考案しています。
ということです。
とりあえず、そこの辺を完全スルーして(オイ)マルチプレイヤーゲームっぽいものを制作してみました。

制作してみて気が付いたこと

  • 通信の問題による処理の遅延は不可避(だからそう書いてあったじゃないの…)
  • ↑の件でウッカリな処理を書くと簡単にデッドロック状態になる…
  • 根本的に同時に遊ぶ人がいないと寂しい…
    →閑古鳥泣いているプロジェクトでどうしても遊びたい場合は、周囲への声掛けが必要。
    (動作チェックは複数アカウントを所持していれば一応支障なく出来るけれど…寂しい…)
  • new Scratcherとログインしていないユーザには関係がない…
    →万人向けにするなら、シングルプレイヤーでも遊べるように設計する必要がある。
  • 「仕様」とは完全に言いきれないような部分を考慮する必要が増える
    →回線の問題などによる値が反映されるまでの遅延を考慮したりするなど。

まとめ

ざっくり言えば「クラウド変数を使いこなすには、Scratch自体の仕様の理解と、さほど難しくないレベルのアルゴリズム構築を苦痛に感じない程度の技量を求められる」というところでしょうか。FAQやwikiを読まなくても良いから、他人のソースを読んで理解しようと努めたり、見よう見まねで書いてみるくらいは出来て欲しい難易度です。
そんなこんなで、こういった機能も上手に使いこなしたいところです。その上で、他のユーザとも色々と交流できるような楽しい仕掛けを盛り込んだプロジェクトをもっともっと制作していきたいところですね。

雑なまとめですが、現場からは以上です!