目次
スタックの公開(オプション編:Storage) ← 2017/7/1新規
スタックの公開(オプション編:Controlファイル) ← 2017/7/5新規
HyqerTalkの注意事項 その2 ← 2017/6/27追記
HyqerTalkの注意事項 その3 ← 2017/7/3追記
HyqerTalkの注意事項 その4 ← 2017/6/29新規
HyperCardとの挙動の違い その1 ← 2017/7/1追記
高速化 ← 2017/7/3新規
iOSデバイス上での動作 ← 2017/6/29新規
不具合情報 ← 2017/8/14新規
2017/9/9
HyqerCard01.jsのアップデートを行いました。カード表示時の挙動の修正です。最新版は「August 26 2017 14:32 Asia/Tokyo」です。「About the Finber...」から確認できます。以前のものがブラウザのキャッシュに残る場合がありますのでご注意下さい。
2017/7/8
HyqerCard01.jsのアップデートを行いました。message boxの挙動変更です。最新版は「July 06 2017 20:29 Asia/Tokyo」です。
2017/7/1
HyqerCard01.jsのアップデートを行いました。hide状態でのオブジェクトの位置変更時のrectangleの値不具合の修正です。最新版は「July 01 2017 15:53 Asia/Tokyo」です。
2017/7/1 HyqerCard01.jsのアップデートを行いました。iOSでのmouse関係の座標不具合の修正です。最新版は「July 01 2017 11:56 Asia/Tokyo」です。
2017/6/30 HyqerCard01.jsのアップデートを行いました。HyqerTalkのエラーダイアログ挙動の修正です。最新版は「June 30 2017 18:22 Asia/Tokyo」です。
2017/6/26 HyqerCard01.jsのアップデートを行いました。mouse関数の修正です。最新版は「June 26 2017 23:28 Asia/Tokyo」です。
2017/6/25 HyqerCard01.jsのアップデートを行いました。「Importer」と「Rez Edit」の修正です。最新版は「June 24 2017 20:45 Asia/Tokyo」です。
不具合情報
バックグラウンドボタン不具合
バックグラウンドボタンをPopupにした場合、正しく動作しないのと、イベントが発生しません。
if文不具合
以下のようにelse ifとelseを用いた場合、正しく分岐しません。
if <condition> then
<statements>
else if <condition> then
<statements>
else
<statements>
end if
例えば、以下のような場合hensuが0の場合、命令1と命令3が実行されてしまいます。
if hensu = 0 then
命令1
else if hensu > 0 then
命令2
else
命令3
end if
一例として以下のようにすれば期待通りになります。
if hensu = 0 then
命令1
else
if hensu > 0 then
命令2
else
命令3
end if
end if
スタックの公開(オプション編:Controlファイル)
ControlPanelの設定を保存しておいて、公開する時に反映することができます.
ControlPanelの起動
Finberのアップルメニューから「ControlPanel」を選ぶとControlPanelプログラムが起動します。
ControlPanelの項目説明
Screen Size
Mac!ntoshのスクリーンサイズ
- Window:ブラウザのウィンドウサイズを使います。
- Standard 9"(512x342):コンパクトMacのスクリーンサイズです。
- PowerBook(640x400):初期のPowerBookのスクリーンサイズです。
- Large(640x480):VGAのスクリーンサイズです。
下の3つはHyqerCardのスタックサイズ指定に合わせています。ウィンドウ中央に括弧内のピクセルでデスクトップを表示し周囲は黒くしています。スタックサイズにスクリーンサイズを合わせると、全画面表示になります。コンパクトMacの時代に512x342で作られたスタックは沢山あり、その雰囲気を出すためのものです。
Font
Finberやダイアログなどで使用される標準のFontを指定します。
Number of Cols
Finberで表示するアイコンを横に何個並べるかを指定します。3〜6が指定でき、ファイル数がこの数を超えると2段目以降に並べます。
Font Smoothing
CSSのFontSmoothingです。過去のスタックの画像を利用すると、文字が画像として書かれている場合、ビットマップフォントで書かれているのに対し、HyqerCardのボタンやフィールドの文字は標準的にはアンチエイリアスがかかってしまい、雰囲気が変わってしまいます。そのような時はFontSmoothingをnoneにするとアンチエイリアスが外れます。この値はSafari、GoogleChromeで有効です。FireFoxでは無効です。
HyqerCard Speed
実行速度の調節を参照
FontSmoothingとHyqerCard Speedは当初、controlPanelでの制御をしていましたが、のちにスタックファイルのコメントに
speed:0
FontSmoothing:none
などと書くことで、controlPanelの設定に優先して反映されるようになっています。
ControlPanel設定の保存
ControlPanelを起動し、Fileメニューから「Save...」を選択し、任意の名前で保存します。デフォルトでcontrolPanelです。このファイルをExporterでローカルファイルに任意の名前で保存します。
ControlPanelファイルの修正
ControlPanelファイルはJSON形式のテキストファイルなので必要に応じでテキストエディタなどで修正してください。書式はあえて説明しませんが、上記説明を見て、テキストファイル内を見れば、なんとなくわかると思います。ScreenSizeは任意のサイズに変更できます。
公開時の反映方法
公開する時にControlPanelファイルを「.controlPanel」というファイル名でMac!ntosh上にダウンロードされるようにしてください。冒頭「.」のファイルは隠しファイルです。
つまり以下のような感じです。
高速化
ゲームなどで処理を速くしたい場合は、この記事を参考にして下さい。
行数を減らす
HyqerCardでは(javacriptの)setTimeoutで間隔を置いて1行ずつ読んで実行しています。間隔はspeed設定(実行速度の調整を参照)に応じて変えています。
- 0: 4ミリsec(Javascriptの仕様で4ミリsecが最小値のようです)
- 1: 8ミリsec
- 2: 16ミリsec
- 3: 24ミリsec
なので、行数が少なければ処理が速くなります。
if 条件式 then
命令1
else
命令2
end if
とするより
if 条件式 then 命令1 else 命令2
とした方が速いのです。ただし可読性が落ちる場合があります。
読み飛ばし
以下は読み飛ばします。
- 空白行
- コメント行
- if文で条件がfalseの時の命令行(if,repeat,else,endなどの文は読み飛ばしません)
基本的に空白行とコメント行は読み飛ばすので、可読性のための空白行やコメント行は入れましょう。読み飛ばしのための負荷は0ではありませんが本当に微々たるものです。ただし、ハンドラ内の1行目は空白行、コメント行も読んでしまうので、1行目は有効な命令やif,repeat文などを記述してください。
on handler
-- コメント ← 1業目なので読み飛ばされない
命令1
← 空白行なので読み飛ばされる
命令2
-- コメント ← 読み飛ばされる
if 1 = 1 then
命令3
else
命令4 ← 読み飛ばされる
if 2 = 2 then
命令5 ← 読み飛ばされる(if 1 = 1の条件に対してfalseであるため)
else
命令6 ← 読み飛ばされる
end if
end if
end handler
裏技(関数の使用)
ハンドラ内の命令は複数行あれば複数回に渡って読み出し・実行しますが、関数内の命令は複数行あっても実行する時は一気に実行してしまいます。本来、関数は引数を渡して何らかの演算をして値を返すものですが、上記仕組みを利用して複数行を一気に1行分の読み込みで実行させることができます。なので以下のようなことができます。
on handler
get kansu
end handler
function kansu
show cd btn 1
show cd btn 2
show cd btn 3
show cd btn 4
return true
end kansu
ハンドラにshowコマンドを書けば4回の読み出し・実行が必要になりますが、上記の例だと1回ですみます。ただし、関数は非常に制限が多いので使用にご注意を。特にrepeatが使えないため利用できないシーンが多いかと思います。
スタックの公開(オプション編:Storage)
Mac!ntosh上のファイルはデフォルトでSessionStorageに保存されますが、保存先を変更することができます。
他の保存先はmemoryとLocalStorageです。SessionStorageとLocalStorageはHTML5で規格化されたWebStorageですが、memoryは無理やりJavaScriptの変数上に格納します。ちなみにSessionStorageとLocalStorageはSafariがプライベートブラウズモードの時、I/Oに失敗するため、Mac!ntoshが起動しません。memoryはそれを回避するために作ったモードです。
ただし、LocalStorageモードは、ご自身で使う分には良いですが、他者に公開することは推奨しません。また、LocalStorageに不正なデータが混入した場合、Finber上にファイル表示されなくなる可能性がありますので環境設定で開発メニューを表示させておいて、いざという時にLocalStorageの操作ができるようにしておくことをお勧めします。
それぞれの挙動と特徴
memory
- 画面右上のディスクの名前が「memoryStorage」となる。最大サイズは不明。
- reloadするとreload前のファイルは全て消える。
- アップルメニューから起動するアプリ数が少ない。ControlPanelなどは継続的なstorageとreloadを前提としているため。
SessionStorage
- 画面右上のディスクの名前が「SessionStorage」となる。最大サイズはブラウザに依存する。
- SafariではプライベートブラウズモードではMac!ntoshが起動しない。
- セッションが続いている間はStorage上のファイルが保持される。reloadしてもファイルがきえない。
LocalStorage
- 画面右上のディスクの名前が「LocalStorage」となる。最大サイズは5M。
- SafariではプライベートブラウズモードではMac!ntoshが起動しない。
- 永続的にStorage上のファイルが保存される。とされるのですがSafariでキャッシュクリアしたら消えました(泣)。
- 「Quit HyperCard」時の自動保存がされません。必要であればアップルメニューから「Save Stack」をしてください。
- いくつかの隠し機能が表示される。
スタックの公開(基本編:ファイルの公開)で説明したとおりhtmlファイルの後ろに
Finber上でのファイル名=サーバ上のファイル名
と記載するとサーバ上のファイルをダウンロードしてFinber上に保存すると説明しました。
この書式は「webサーバ上のファイルをMac!ntosh上にロードする際の書式と言って良いです」と書いたとおりですが、例外が一つだけあって、Storage指定の書式がそれです。
Storage指定の書式
htmlファイルの直後に
?storage=(ストレージ名)
と書くとストレージを指定できます。
ストレージ名は「momory」「session」「local」の3つが指定できます。
以下のように指定します。
http://www.eonet.ne.jp/~gregor/hyqercard/index.html?storage=memory&HyqerCard=HyqerCard&Home=MyHome
※htmlファイルの直後以外だとwebサーバ上の(ストレージ名)というファイルをMac!ntosh上にstorageという名前で保存をすると解釈します。
iOSデバイス上での動作
HyqerCardは、まず「MacのSafariでHyperCardの動作を真似る」というところから始めているのでiOSでの稼働を前提としていません。試しにiOS上で動くか試したら案の定、起動させることすらできなかったのですが、ちょっと改修加えたらなんとか立ち上がったので、少しだけ手を加えて多少動くようにしたというような状況です。
編集機能
iOS上ではドット単位で細かい作業をするのに向かないので、オブジェクトの移動やサイズ変更などはマウスでやるような訳にはいきません。なのでToolsメニューを非表示にして編集機能は全面的に使えないようにしています。そもそも移動、サイズ変更などは機能的にも対応させていませんので、Toolsメニュー表示させても使えません。
もしかしたらiPadProであればApplePencilを使ってうまく操作できるのかもしれませんが、生憎所有していないのでなんとも言えません。
メッセージ
以下はマウス関係のメッセージの対応状況です。念のためテストしてみました。
◯ mouseDown
△ mouseLeave(touchEnd後、他のオブジェクトにアクセスする時に発生)
△ mouseEnter (touchEnd時に発生)
◯ mouseUp
◯ mouseStillDown
△ mouseWithin(touchEnd後に発生。他のオブジェクトにアクセス時に停止)
JavaScript的には以下のイベントに紐付いています。
mouseDown → mouseDown/touchStart
mouseLeave → mouseOut
mouseEnter → mouseOver
mouseUp → click
mouseStillDown → 対応するイベントなし
mouseWithin → 対応するイベントなし
mouseLeave、mouseEnter、mouseWithinは発生タイミングが変なので使えないと考えてください。
それにしてもJavascriptのmouseOutやmouseOverイベントが(おかしなタイミングですが)発生しているとは思っていませんでした。
カーソル
カーソルはブラウザのカーソルをそのまま使っていますので、iOSでは一切表示されません。
HyqerTalkの注意事項 その4
ちゃんと動かない記述例
例1. put the number of this card - 1 into hensu
今のカード番号 - 1 を変数にいれるというものですが、エラーが発生します。以下のとおりにして下さい。
put (the number of this card) - 1 into hensu
または
put the number of this card into hensu1
put hensu1 - 1 into hensu
例2. repeat with i=(120 + random(number of btns)) down to 1
repeat with文の変数の初期値設定のところでエラーが出ます。どうも括弧の解釈に不具合が有る模様。
以下のとおりにして下さい。
put random(number of btns) into hensu
repeat with i=(120 + hensu) down to 1
または以下のとおり
put 120 + random(number of btns) into hensu
repeat with i=hensu down to 1