LoginSignup
0

More than 3 years have passed since last update.

Alexa APL:一見取れなさそうな場所にあるバインド変数を取得・設定する

Last updated at Posted at 2020-12-20

はじめに

本記事はスマートスピーカー Advent Calendar 2020の10日目の記事ですが、20日目の記事を書く際に発見した事をもう少し共有してみようと思い、20日目の後に書きました。

お題

SetValueコマンドで値を設定するとき、

実行する場所取得元設定先がみんな違う時、どうするか?

です。

今回の例は1つのキャラを実装するところまでのコードですが、実際のゲームではキャラクタ同士の衝突判定など、「ゲーム進行役の処理」が必要になってきます。ここでもhandleTickを使うことを考えた際、それぞれのバインド変数がそれぞれのコンポーネントにあるため、「キャラクタのバインド変数が取れない」という壁にぶつかります。

以下のように記述することで、任意の場所のバインド変数を任意のコンポーネントのバインド変数に突っ込むことが出来ます。
例えば・・・

"from"というIDを持つコンポーネントの"departure"というバインド変数に入っている値を
"to"というIDを持つコンポーネントの"arrival"というバインド変数に代入する
という処理を、
LambdaからのExecuteCommandディレクティブで行ってみたいと思います。

実践

1:下準備

mainTemplate内、一番大元のContainerコンポーネントに名前を付け(ここでは"root")、バインド変数に以下のように定義します。

ExtremeSetValue-1
{
    "type": "Container",
    "id": "root",
    "bind": [
        {
            "name": "G_var1",
            "value": 0
        }
    ]
}

※ 正確には、後述の取得元設定先が含まれるコンポーネントであればOKです。

2:取得した値を仮置き場に代入

一旦1で作ったバインド変数に値を入れます。

ExtremeSetValue-2
{
    "type": "SetValue",
    "componentId": "from",
    "property": "G_var1",
    "value": "${event.target.bind.departure}"
}

G_var1は一番大元のコンポーネントのバインド変数なので、いわばグローバル変数のようなスコープとなり、どのコンポーネントからでも参照可能となっています。
(「ExecuteCommandディレクティブという場所」からG_var1を参照しているのではなく、「fromというIDのコンポーネント」からG_var1を参照している点に注意)

componetIdで指定したコンポーネントのバインド変数を取得するには、"event.target.bind.~"で取得可能です。

3:仮置き場の値を設定先に代入

(2に続けて)1で作ったバインド変数から値を取り出し、目的の場所に設定します。

ExtremeSetValue-3
{
    "type": "SetValue",
    "componentId": "to",
    "property": "arrival",
    "value": "${G_var1}"
}

できました!:thumbsup:

要は、

  • グローバル変数(のようなもの)を作って、A⇒tmp⇒Bと2段階代入する

ということです(おっと1行で説明できてしまったぞ・・・)。

あとがき

ここまでくるとネタというか大道芸のレベルに突入してそうな気もします…:sweat:

複数の場所で使う場合はそのぶん変数を用意するなど、値の混在に特に気を付けましょう。特にその場でバインド変数があてがえないrenderdocument直下のonMountやLambdaからのexecutecommandディレクティブで重宝するかも?

「なんでそんな事しないといけないの?」と思う方が多いと思いますが、実際に行き詰った方は共感して頂ける…はず…:confounded:例えば"value": "${component.from.bind.departure}"などといったようにバインド変数を取得したいコンポーネントIDを直接指定できればなぁ。(念のためですがそのような記法は存在しないので後で検索で見つけて喜ばないでね)

以上です!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0