開発中

Alexaでスロットゲームを作りたくて

苦労の末ようやく形になってきたので

近日公開に先駆け、まだ開発中ですが応募したいと思います。

これを書いている時点で残り1時間、間に合うかな。

 

作品紹介

スロットゲームです。

ネズミが駆け抜けます。

尻尾で撃退してください。

 

技術紹介

AlexaのAPL1.1をフル活用しています。

技術的に困難だった点を列挙します。

・リールの無限ループ

動画では一周回っていませんが、継ぎ目なくリールをループさせるのは相当苦労しました。

スクロール位置瞬間移動できず単純な上下スクロールしか出来ないScrollViewコンポーネントですが、

これを前後に2つ重ね合わせ、

  1. 透明度を変更してオモテのみ表示
  2. オモテを下スクロールし、同時に透明なウラを上スクロール。
  3. 一番先まで下がりきった瞬間、透明度を変更してウラのみ表示。
  4. ウラを下スクロールし、同時に透明なオモテを上スクロール。

おおよそこの繰り返しです。ロープウェイや井戸のつるべをイメージすると分かりやすいかも。

・リールを止めた位置が正確に取得できない

ScrollViewコンポーネントにはスクロール位置(小数点6ケタくらい)がプロパティに含まれており、

値をサーバーに送る命令もあるのですが、

実機で実行すると何故か整数で送られてくる挙動があり。

小技を使って問題回避しています。

https://qiita.com/kyukkyu81/items/267b21725e65c134ae7f

alexa技術サポートにAPL直してって相談してたら返事返って来なくなっちゃった。(※)

(※11/6追記)返事来ました、調査中とのことです。宜しくお願いします…

・指定した量だけ正確にスクロールしてくれない

ScrollViewコンポーネントはスクロール速度を指定できないため、

出来るだけ少ない量からだんだんスクロール幅を増やしていくコマンドを後から送る事で

なめらかなリール動作を実現しています。

スクロール量を指定する単位は「コンポーネントの縦幅=1」なので

1/16だけスクロールさせたかったら「0.0625」という指定になるのですが、

・実際の端末のピクセル移動量に小数点が出てしまうと、移動量が整数で丸められてしまう

という仕様があるようで、「微小な移動量×移動回数=全体移動量」とならないのです。

この式をなんとか成立させるため、

①画面の高さからコンポーネントの高さを割り出す

②コンポーネントの高さを素因数分解

③割り切れない要素となる3や7が含まれない最大の数を1から割った数が、誤差なく移動できる最小の量

という法則を編み出して算出しています。

Echo Show 5の場合:縦幅480

コンポーネントが80vh ⇒ 480×0.8 = 384 = 2*2*2*2*2*2*2*3

3や7を含まない最大数=128

1/128 = 0.0078125

これで、掛け算の時に残った3ドットだけスクロールする事が出来ます。

ちなみにこれをEcho Showで確認した場合、縦幅800なので

コンポーネントが80vh ⇒ 640 = 2*2*2*2*2*2*2*5

640 / 128 = 5

5ドットスクロールになるようです。

上記素因数分解で3や7を含まなかったので、Echo Showは1ドットスクロールできるかもしれません。

(その場合、機種ごとの出し分けが必要となります。)

最初レイアウトの都合でコンポーネントの高さを70vhにしてしまい、ピクセル数が割り切れず

全然なめらかに回せなかったのはいい思い出です…

 

ひとまずこれにて。

 

API・素材等
チーム名
きゅっきゅ
チーム
プロトタイパー
役割