Alexaでスロットゲームを作りたくて
苦労の末ようやく形になってきたので
近日公開に先駆け、まだ開発中ですが応募したいと思います。
これを書いている時点で残り1時間、間に合うかな。
作品紹介
スロットゲームです。
ネズミが駆け抜けます。
尻尾で撃退してください。
技術紹介
AlexaのAPL1.1をフル活用しています。
技術的に困難だった点を列挙します。
・リールの無限ループ
動画では一周回っていませんが、継ぎ目なくリールをループさせるのは相当苦労しました。
スクロール位置瞬間移動できず単純な上下スクロールしか出来ないScrollViewコンポーネントですが、
これを前後に2つ重ね合わせ、
- 透明度を変更してオモテのみ表示
- オモテを下スクロールし、同時に透明なウラを上スクロール。
- 一番先まで下がりきった瞬間、透明度を変更してウラのみ表示。
- ウラを下スクロールし、同時に透明なオモテを上スクロール。
おおよそこの繰り返しです。ロープウェイや井戸のつるべをイメージすると分かりやすいかも。
・リールを止めた位置が正確に取得できない
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にしてしまい、ピクセル数が割り切れず
全然なめらかに回せなかったのはいい思い出です...
ひとまずこれにて。
YouTubeで紹介させて頂きました!
https://youtube.com/live/kR5814LdsoA