ハイハイスクールアドベンチャー_web版
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
ハイハイスクールアドベンチャー_web版 [2024/02/14 06:51] – [概要] araki | ハイハイスクールアドベンチャー_web版 [2024/02/16 01:12] (現在) – [PWA] araki | ||
---|---|---|---|
行 37: | 行 37: | ||
[[https:// | [[https:// | ||
+ | |||
+ | PWA対応なので、インストールして遊んでくれてもいいんだよ! | ||
+ | |||
+ | {{:: | ||
+ | |||
+ | インストールはアドレスバーの右端にあるボタン、またはブラウザのメニューから。 | ||
{{:: | {{:: | ||
行 243: | 行 249: | ||
if (' | if (' | ||
{ | { | ||
- | navigator.serviceWorker.register(' | + | navigator.serviceWorker.register(' |
} | } | ||
</ | </ | ||
行 273: | 行 279: | ||
' | ' | ||
' | ' | ||
- | 'js/sw.js' | + | ' |
]; | ]; | ||
行 297: | 行 303: | ||
要はキャッシュを登録しているだけである。 | 要はキャッシュを登録しているだけである。 | ||
これでオフラインでも使えるようになるらしい((そのように作られていれば))が、やってみていないのでわからない。 | これでオフラインでも使えるようになるらしい((そのように作られていれば))が、やってみていないのでわからない。 | ||
+ | |||
+ | なお、キャッシュされるオブジェクトの指定は、sw.jsのある場所からの相対パスまたは絶対パス、URIなどで、これを間違うとエラーをはいてキャッシュに失敗する。 | ||
+ | |||
+ | ブラウザによってはsw.jsがエラーを出しているとインストールボタンを表示してくれない厳格なやつもいたりするので、よく確認してほしい。 | ||
=== トラブルシュート === | === トラブルシュート === | ||
行 305: | 行 315: | ||
{{:: | {{:: | ||
+ | ==== 音とか ==== | ||
+ | |||
+ | PalmOS、Android、そして Qtでは音がある場面では音が鳴るようになっている。 | ||
+ | Web版を再公開したときに、「誰か解けたのか?」というようなことをつぶやくと「校歌は歌った」というような返事があった。 | ||
+ | そういえばWeb版では音のことをすっかり失念していた。 | ||
+ | |||
+ | HTML5ではaudioコンポーネントがあり、JavaScriptに Audioクラスが実装されている。 | ||
+ | そしてほとんどすべてのモダンなブラウザでMP3形式の音源を鳴らすことができる。 | ||
+ | |||
+ | === 音を鳴らせ === | ||
+ | |||
+ | HTMLで audio 要素を配置してもいいのだが、別に画面上に何かがいる必要はないので、適宜動的に確保する方向で実装する。 | ||
+ | 動的に確保された Audio のインスタンスは再生が終わったらガベージコレクションの対象になるって書いてあるので、音を鳴らすときに確保して、鳴らしたら勝手に消えることを期待する。 | ||
+ | |||
+ | < | ||
+ | var m = new Audio(); | ||
+ | m.src = this.base_uri + "/ | ||
+ | m.load(); | ||
+ | m.volume = 1.0; | ||
+ | m.loop = false; | ||
+ | m.play(); | ||
+ | </ | ||
+ | |||
+ | ボリュームは1.0が100%になる。 | ||
+ | |||
+ | === 音を鳴らすな === | ||
+ | |||
+ | 多分、音鳴ったら困る環境の人も少なくないだろう。 | ||
+ | いきなり、ハイハイスクールの校歌が流れたらびっくりするだろうし、大体が、この校歌結構長尺で鳴り出すと止まらないのだ。 | ||
+ | |||
+ | なので、ミュート機能はつけておいた方がいいと判断した。 | ||
+ | まあ、PCなり、スマホなりでミュートできるだろうけれど。 | ||
+ | どっちかというと、ミュートというよりデフォルトでミュートしておいて、鳴らしたい人だけ解除するイメージだ。 | ||
+ | |||
+ | まあ、単純にチェックボックスを一個置いておけばいいのだが、今時のインターフェイスとしてはちょっとカッコ悪い。 | ||
+ | そもそもこの昭和レトロなアドベンチャーゲームに何をいっているんだという向きもあるだろうが、せっかくなので、今風のスライドスイッチにしておきたい。 | ||
+ | |||
+ | Safariなら、そういう要素がサポートされているらしいが、多くのブラウザでは未サポート((2024年2月現在))なので、別の方法でやることにする。 | ||
+ | |||
+ | 世の中には優れた人が多くいて、既にCSSを駆使して、そういうものをチェックボックスに付加してくれているので、まるっとそれをいただくことにする。 | ||
+ | |||
+ | < | ||
+ | <label for=" | ||
+ | <div class=" | ||
+ | <input type=" | ||
+ | <div class=" | ||
+ | <div class=" | ||
+ | </ | ||
+ | <span class=" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | チェックボックスがスイッチの本体だが、チェックボックスを消して、代わりに circleと baseでスイッチを構成する。 | ||
+ | この部分はすべてCSSに記述されている。 | ||
+ | |||
+ | < | ||
+ | .switch { | ||
+ | position: relative; | ||
+ | } | ||
+ | |||
+ | .switch_label { | ||
+ | display: flex; | ||
+ | align-items: | ||
+ | } | ||
+ | |||
+ | .switch input[type=' | ||
+ | position: absolute; | ||
+ | width: 0; | ||
+ | height: 0; | ||
+ | } | ||
+ | |||
+ | .switch .base { | ||
+ | width: 28px; | ||
+ | border-radius: | ||
+ | height: 16px; | ||
+ | background-color: | ||
+ | } | ||
+ | |||
+ | .switch .circle { | ||
+ | position: absolute; | ||
+ | top: 2px; | ||
+ | left: 2px; | ||
+ | width: 12px; | ||
+ | height: 12px; | ||
+ | border-radius: | ||
+ | background-color: | ||
+ | transition: | ||
+ | } | ||
+ | |||
+ | .title { | ||
+ | margin-left: | ||
+ | } | ||
+ | |||
+ | .switch input: | ||
+ | background-color: | ||
+ | transition: | ||
+ | } | ||
+ | |||
+ | .switch input: | ||
+ | transform: translateX(100%); | ||
+ | background-color: | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | なお、実際に使用しているスタイルシートは、レスポンシブデザインっぽく、px使わないでサイズを指定しています。 | ||
+ | |||
+ | ==== 設定 ==== | ||
+ | |||
+ | 基本的には、特に設定項目はなかったのだが、音を鳴らすことにしたら、Qt版同様に、音を鳴らすのかどうかを覚えておいた方がいいような気がしてきた。 | ||
+ | |||
+ | まあ、毎回 Mute ONにしてしまうでもいいような気もしたが、将来何かの設定を追加したときに、それも覚えておいた方がいいような気がしたので、保存できるようにした。 | ||
+ | |||
+ | ゲームデータ保存用objectStoreはIndexedDBに作ってあったので、バージョンを2にして、設定用のobjectStoreも作るようにした。 | ||
+ | DBのアップグレードとかしないと思ってたが、いきなりすることになるとは先見の明がなさ過ぎた。 | ||
+ | |||
+ | < | ||
+ | const req = indexedDB.open(Database.DBNAME, | ||
+ | req.onupgradeneeded = (event) => | ||
+ | { | ||
+ | const db = event.target.result; | ||
+ | const oldver = event.oldVersion; | ||
+ | const newver = event.newVersion; | ||
+ | const migrations = { | ||
+ | " | ||
+ | db.createObjectStore(Database.STORENAME, | ||
+ | }, | ||
+ | " | ||
+ | db.createObjectStore(Database.PREFSTORE, | ||
+ | } | ||
+ | } | ||
+ | for (var v = oldver + 1 ; v <= newver ; v++) | ||
+ | { | ||
+ | if (migrations[v]) migrations[v](); | ||
+ | } | ||
+ | }; | ||
+ | </ | ||
+ | |||
+ | バージョン更新のやり方は、どこかで見かけたのを参考にした。 |
ハイハイスクールアドベンチャー_web版.1707893516.txt.gz · 最終更新: 2024/02/14 06:51 by araki