ユーザーブロマガは2021年10月7日(予定)をもちましてサービスを終了します

JavaScript歴1年ちょいのペンギンがアツマールのAPIについて語る
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

JavaScript歴1年ちょいのペンギンがアツマールのAPIについて語る

2019-01-31 03:15
    ハイ皆さんこんにちは。青いペンギンこと荒上理紗斗(あらがみ りさと)です。

    本日は、RPGアツマールの各種APIについてちょっとだけ語っていこうと思います。

    最近、RPGアツマールさんではAPIを使った様々なサービスが提供されています。
    「スコアボード(ランキング)」「グローバル変数」「シグナル」などなど。

    このようなAPIを使ってみたいけど、使い方がよくわからん… という方も多いんじゃないでしょうか。
    かくいう私も今でこそ若干分かりますが、一年前だったら多分同じことを言っていると思います。

    ということで、私の把握している限りでアツマールAPIについて語っていこうと思います。

    【基礎知識】
    アツマールのAPIは promise という形式を用いた非同期処理です。
    非同期処理とは、「データ取得が完了するまでタイムラグがある」という感じに捉えてもらえればいいと思います。

    見よう見まねでリファレンスのAPIをコピペしたけど上手く動かない… という場合は、だいたいこいつのせいです。

    ではそいつの仕組みについて簡単に説明しましょう。

    下の画像の左側が通常の処理の流れです。
    ツクールのイベントもこんな感じですよね。

    ただ、非同期処理が絡むと右のようになります。

    普通なら「指示を出して、返事が来たら次へ進む」という流れなのですが、
    非同期処理は「指示だけ出して、返事を受け取るのは後回し」という感じなのです。

    そのため、本来返事が返っているべき場所でもまだ返事が来ていないことが起こりえます。

    ではどうすればいいのか。

    そういうときに優秀なのが then() です。
    こいつを非同期処理の後ろにくっつけてやると、「お返事がきたらカッコの中に書いた処理をやるよ」という意味になります。お返事が来た後の行動を予約できる感じですね。

    【書き方(「プレイヤーのユーザーデータ取得」を用いた例)】

    window.RPGAtsumaru.experimental.user.getSelfInformation().then(function (result) {
     $gameVariables.setValue(10, result.id);
     }, function () {
     throw new Error("読込に失敗しました");
    });

    【解説】
    上記の青い部分は、「ユーザーデータを取得してね」という指示です。
    ただこの時点では先ほども言った通り指示しか出していません

    そこで、赤い太字で書いた then を使います。
    こいつをつけると、「お返事が来たらカッコの中身をやるよ」という行動予約ができます。

    ではそのカッコの中身を見てみましょう。緑色の部分は、取得に成功した際の処理です。
    このとき、設置する無名関数(function)の引数部分(カッコの中)に、何かしらの文字列を入れます。上記の例だと、緑の太字になっている result です。
    これをすると、「その無名関数の中限定で、その文字列を使えばデータが呼び出せるぞ」という宣言になります。
    実際、その次の行で result を使っていますよね。

    ちなみに、入手したデータには複数の情報が入っています。
    ただ、必要な情報だけ得られれば他はいいですよね。
    ということで、欲しい情報だけを抜きましょう!

    今回用いた「ユーザー情報取得」では、以下の情報が入手できます。
    ・アツマールでのユーザID(id
    ・アツマールでのユーザ名(name
    ・プレミアム会員かどうかの真偽(isPremium
    ・アツマールでのプロフィールコメント(profile
    ・プロフィールで設定したツイッターID(twitterId
    ・プロフィールで設定したサイトのURL(url

    呼ぶ方法は簡単!さっき指定した文字列(上記の例では result )にドットをつけてから指定のタグを添えるだけ!
    「指定のタグ」は、数行上の「入手できる情報」欄の右にカッコで書いた太字の英語です。

    つまり、例えば「アツマールでのユーザ名」が知りたければ
    result.name
    となり、「プロフィールコメント」が知りたければ
    result.profile
    となるわけです。

    それを踏まえて先の例の緑の部分に戻ると、
    $gameVariables.setValue(10, result.id);
    となっていますね。

    $gameVariables.setValue(10, result.id);
    は、「変数番号10番に result.id の値を代入しろ」という意味です。
    つまり、非同期処理によって入手したユーザーデータのうちユーザID変数10番に代入しているということになります。

    次はそのあとの黄色い部分ですが、ここは「データの取得に失敗したらエラーを出してね」と言っているだけなので割愛!

    こんな感じにすると、欲しいデータを変数に突っ込むことができます。
    これを応用すれば、シグナルの受信グローバル変数の取得、他にもランキングデータの取得も可能になります。すごい!

    注意!
    then() はあくまでもお返事を受信した後の行動予約に過ぎません。
    実際にデータが変数に代入されるまでには少々のラグがあります。
    そのため、受信データを用いて動かしたいイベントがある際は then() の中にそのイベント開始のトリガーを仕込んだり、もしくは十分な猶予時間を取ってからイベントを開始するような対策が必要です。

    -----

    いかがでしょうか。
    APIコンテストも近いことですし、皆さんが上手くAPIを使いこなせるきっかけになることができれば幸いです…。
    エターなることを恐れずに、どんどん新作をツクっていきましょう!

    質問やご意見などがございましたら、コメント欄や私のツイッターまでどうぞ。

    おしまい!


    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。