HyqerTalkの注意事項 その3
文字列の比較
元祖HyperTalkでは文字列の比較に大文字小文字を区別しませんが、HyqerCardでは大文字小文字を区別します。これはHyqerTalkの'is','='や'is not',’<>'を単純にjavascriptの'==='とか'!=='に変換しているからです。手抜きですみません。特に注意願いたいのは関数の返り値です。基本的に文字列を返す関数は小文字で返しています。例えばsoundとかmouseです。
the sound is "done"
the mouse is "up"
などのように小文字で比較してください。
the sound is "DONE"
the mouse is "UP"
は期待通りの挙動をしません。あと、ついでながら現時点(2017/6/24)、mouse関数は私が挙動をよく理解できていなくて正しく値を返していないように思われます。
真偽値
元祖HyperTalkのtrue,falseは文字列として扱いますが、HyqerTalkでは真偽値として扱われます。ですので
the mouseClick is true
the enabled of cd btn 1 is true
などのように真偽値を返す関数やプロパティーは定数(true,false)で評価や設定をしてください。
the mouseClick is "true"
the enabled of cd btn 1 is "true"
のように文字列で値を評価しないでください。
座標指定上の注意
座標指定でマイナス値を指定する場合は変数を使ってください。ロジックを追っていないので不具合箇所を特定していないのですが、とにかく
set loc of cd btn 1 to -30,-30
というような指定はエラーになります。
put -30 into hensu1
put -30 into hensu2
set loc of cd btn 1 to hensu1,hensu2
という風にして下さい。
確認していませんが、rectangle指定も同様だと考えます。
2017/7/3追記
domenu "Quit HyperCard"
アプリ名はHyqerCardですが、メニューで終了させる時は"Quit HyperCard"です。これは、HyperCardとの互換性のためで、domenuコマンドで終わらせる時は
domenu "Quit HyperCard"
です。
play stopの挙動
play stopはなっているサウンドを取り消すコマンド&引数ですが、fluteがなっている場合は止まりませんのでご注意ください。"Quit HyperCard"でも終了しません。止める場合はブラウザでreloadしてください。HyqerCard Referrenceにも記載があります。
実行速度の調整
HyqerCardの実行速度は4段階に調整できます。古いスタックを再現するためにあえて遅くできるようにしたものです。
0:少し早い
1:普通(0の2倍くらい)
2:少し遅い(0の4倍くらい)
3:遅い(0の6倍くらい)
あくまでも相対的なものです。デフォルトでは1です。私のClassicⅡ(68030の16MHz)ですと、体感でだいたい2〜3くらいの感じです。
この速度は今時のMacやPCであればどの環境でもほぼ同じくらいだと思います。古いiOSデバイスだと多少もたつくかもしれません。今のHyqerCardの設計だとJavaScriptの仕様の都合でどんなにCPUが早くなっても体感できるほどの速度アップはないと思います。
この値の設定方法は3通りあります。
ControlPanelで設定
- Finberのアップルメニューから「Control Panel」を選択するとウィンドウが開きます。
- HyqerCard Speedのセレクトボックスで数値を選択します。
Mac!ntoshのストレージに保存されますので、デフォルト(SessionStorage)ではブラウザでセッションが有効の間はこの値は有効です。
About HyqerCard
- HyqerCardのアップルメニューから「About HyqerCard...」を選択するとダイアログが表示されます。
- Speedポップアップボタンで数値を選択します。
HyqerCardを終了するまで有効です。ControlPanelでの設定に優先します。スタックを作成中に速度調整する際はここで設定して下さい。
Comments
- Finberでスタックファイルをシングルクリックで選択します。
- FinberのFileメニューから「Get Info」を選択します。
- Comments欄に文字列で「speed:0」のように数値を指定します。
ContolPanelの設定に優先しますが、「About HyqerCard」の設定の優先度の方が高いです。公開するときはここで設定してください。
過去のスタックを再現するのであれば、このような調整が必要になりますが、新規に作るのであればspeed:0にしておいてwaitコマンドで調整するのがいいかと思います。ただし、visual effectはspeed設定に応じて所要時間が変わるようにしていますので、そこにこだわるのであれば試してみてください。visual effectのspeed調整ですが、0はPowerPC G3 300Mhzの機器、3は68030 16MHzの機器に近づけました。1,2はその間を適当にという感じです。
リソースの取り込み
リソースの取り込みは「Rez Edit」というアプリで取り込みます。もちろん「Res Edit」をもじっているのですが操作性はさほど似ていないので説明します。
機能としては以下の4つです。
- アイコン(Finber表示用)取り込み
- アイコン(アプリ使用)取り込み
- 画像取り込み
- サウンド取り込み
今回は2,3,4の取り込みを説明します。
Rez Editの起動
- Finberのアップルメニューから「Rez Edit」を選びます。
- ファイルダイアログが開くので対象となるファイルを選ぶと、ファイル名がメニューバーに表示されたウィンドウが開きます。以下、メインウィンドウと呼びます。
アイコン(アプリ使用)取り込み
ここでいうアイコンはHyqerCard内のボタンに表示させるアイコンのことです。HyqerCardにもアイコンエディタがあるのですが、機能的に十分と言えませんので「Rez Edit」を使っての取り込みを推奨します。
- メインウィンドウの「ICON」と表示のあるアイコンをダブルクリックすると、ICONsウィンドウが開きます。
- iconメニューから「Import icon...」を選ぶとブラウザのファイルダイアログが開くので任意の画像ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
- ICONsウィンドウに先ほど選んだ画像が表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
- 画像をクリックすると背景が濃色になり、iconメニュー内のメニューアイテムが全て使えるようになります。
- iconメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。
※あらかじめ32x32ドットの画像を準備してください。サイズが違っていてもHyqerCardのボタンでは32x32に縮小拡大して表示します。
※カラー画像も使えますが、AutoHilightの時は単純に反転するだけです。カラー対応のFinderがアイコンを暗く表示させるのとは 趣が違います。
※AutoHilightで反転させる場合は画像の透過部分などにご注意ください。HyqerCardでは画像の周辺部分を自動で透過させるような動作はしません。
画像取り込み
ここでいう画像はカードピクチャやバックグラウンドピクチャではなく、pictureコマンドで表示させる画像のことです。操作はアイコン取り込みと殆ど同じです。
- メインウィンドウの「PICT」と表示のあるアイコンをダブルクリックすると、PICTsウィンドウが開きます。
- pictメニューから「Import pict...」を選ぶとブラウザのファイルダイアログが開くので任意の画像ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
- PICTsウィンドウに先ほど選んだ画像が32x32ドットで表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
- 画像をクリックすると背景が濃色になり、pictメニュー内のメニューアイテムが全て使えるようになります。
- pictメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。
※メインウィンドウで画像をダブルクリックすると別ウィンドウで実物大で表示されます。これはICONsウインドウにない機能です。
サウンド取り込み
ここでいうサウンドはplayコマンドで鳴らすサウンドのことです。
- メインウィンドウの「snd」と表示のあるアイコンをダブルクリックすると、sndsウィンドウが開きます。
- sndメニューから「Import Sound...」を選ぶとブラウザのファイルダイアログが開くので任意の音声ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
- sndsウィンドウに先ほど選んだサウンドがリストで表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
- リスト内のサウンド名をクリックすると選択され、sndメニュー内のメニューアイテムが全て使えるようになります。
- sndメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。
※音声ファイルは公開を前提としている環境で再生可能な音声ファイルフォーマットをあらかじめ準備してください。私はiTunesでAACバージョンを作成しています。昔ながらのAIFFはSafariでは再生できますが、GoogleChromeでは再生できませんのでご注意ください。
※説明を省いていますが、「Try Sound」メニューアイテムを選択するとサウンドがなります。ただし「Delete Sound」でいずれかのサウンドを削除し、残ったサウンドを再生しようとすると別のサウンドが鳴るという不具合があります。その場合は一旦ファイルを保存して「Rez Edit」を再起動してファイルを読み直すと解消します。
アラート対応
先述のとおりファイルを選んだ時にString.normalize関数がない場合はアラートが出ます。ファイル名に濁点や半濁点がある場合にHyperTalk内で記述される文字コードと異なる文字コードでリソース名が記録されています。なので例えば「play ブーイング」などという場合、文字コードが違うのでサウンドが見つからず音がなりません。これを回避するには「get info...」ダイアログで名称を入力し直してください。見た目は変わりませんが、文字コードは変わります。
ファイルの保存
Fileメニューから「Save」を選択してください。これをしないと保存されません。メインウィンドウをクローズボックスで閉じると保存せずにファイルを破棄してしまいますのでご注意を。
Rez Editの終了
Fileメニューから「Quit」を選択してください。メインウィンドウをクローズボックスで閉じても「Rez Edit」は終了していません。
HyperCardとの挙動の違い その1
スタックの変更タイミング
元祖HyperCardではスタックは自動保存されます。どうやらidleのタイミングでディスク書き込みを行うらしいのですが、HyqerCardはデフォルトでは"Quit HyperCard"やgoコマンドで別のスタックに移動する時、CloseStackメッセージの処理後にセーブされます。編集途中で保存しておくべきポイントがあればアップルメニューから「Save Stack」を選んでください。あと、undo機能が一切ありません。困った時はブラウザでreloadして前回のセーブポイントまで戻してください。
フィールド内のフォント、スタイル
元祖HyperCardではフィールド内でフォントやスタイルを変えることができますが、HyqerCardではフィールドのフォントやスタイルは一意です。
メッセージ伝達
元祖HyperCardは以下のとおりメッセージ伝達しますが
ボタンorフィールド → カード → バックグラウンド → スタック → Homeスタック
HyqerCardは以下のとおりHomeスタックにいきません。
ボタンorフィールド → カード → バックグラウンド → スタック
HyqerCardにおいてHomeスタックはHyqerCardを起動した時にデフォルトで開かれるスタックにすぎません。
※ HyqerTalkコマンドはgoコマンドを除いて上記メッセージ伝達をせず、いきなり実行します。例えばHyperTalkであれば
on play snd
put snd into cd fld 1
pass play
end play
とすれば途中でplayコマンドをインターセプトできますが、HyqerTalkではできません。
ショートカット
元祖HyperCardのショートカットはCommandキー+アルファベットというものが基本ですが、HyqerCardではOptionキー+アルファベットとしています。Commandキー+アルファネットはブラウザで予約されているためこのようにしました。
画像取り込みとディザリング
HyqerCardの描画機能は大変貧弱です。頑張ってみたものの、未実装の機能や動作がおかしいものが多いです。特にバケツツールの不具合はひどいです。まともにこれで描画しようとは思わないでください。ただ、実装したものについては一応HyqerTalkからchooseコマンドやdomenuコマンドで操作できますので試してみて使えそうなら使ってみてください。
いずれにせよ、貧弱な描画機能を補うために画像を外部ファイルから取り込む機能とディザリング機能をつけています。
画像取り込み
- Objectsメニューの「Card Info...」や「Bkgnd Info...」を選びます。
- ウィンドウ右中程に「pitcure...」という文字列とその下に「ファイルを選択」ボタンがありますのでボタンを押します。
- ブラウザのファイルダイアログが開きますのでローカルドライブから画像ファイルを選択してください。
- カードやバックグラウンドに画像が描かれます。画像サイズがカードサイズより大きい場合は勝手に縮小表示します。
※PNGとJPGは取り込み確認しています。ただしJPGを取り込んでもPNG形式で保存します。カラーの画像の場合はカラーで表示され、そのまま保存もできますが、HyperCardらしさを出すためや、ファイルサイズを抑えるためにディザリング機能をつけました。
ディザリング
HyqerTalkの注意事項 その2
関数定義上の制限
関数の中でrepeat文は使わないでください。
使えないというより正しく動作しません。かなりダメな仕様ですみません。
同一オブジェクト内に関数とハンドラを同じ名前で作らないでください。
on abc
play flute c d e
end abc
function abc
return pi
end abc
手抜き仕様で作成したため、上記のように定義すると、先に定義したものが後で定義したものに上書きされてしまいます。
関数使用上の注意
関数の引数に関数を入れたり、()を使ったりできません。
HyqerTalkの致命的な設計ミスにより上記のことができません。
例えば、下記のような場合
put max( random( 10 ) , ( 5 + 1 ) ) into hensu
以下のようにしてください。
put random( 10 ) into hensu1
put (5 + 1 ) into hensu2
put max( hensu1 , hensu2 ) into hensu
関数名の後ろの括弧の前にスペースは入れないで下さい。
put random ( 10 ) into hensu ← 失敗します
put random( 10 ) into hensu ← うまくいきます
仕様を勘違いしていて関数名と括弧の間にスペースを入れてはいけないと思っていました。このあたりは弄ると他に影響が出そうなので直しません。
2017/6/26追記
複数引数がある場合はフィールドなどのオブジェクトを引数に指定しないでください
ちょっと条件が複雑ですがmaxやminなどのように引数を複数とる場合は、フィールドやボタン(殆どそういう使い方はしないと思いますが)を指定するとエラーが出ます。
以下のように引数が一つであれば大丈夫ですが、
put random( cd fld 1 ) into hensu
以下のように引数が複数ある場合はエラーが出ます。
put max( 5 , cd fld 1 ) into hensu
こういう場合は以下のようにして下さい。
put cd fld 1 into hensu1
put max( 5 , hensu1 ) into hensu
条件を覚えるのは面倒ですから、関数の引数は文字列、数値、変数のいずれかと考えておくと良いかもしれません。
2017/6/27追記
関数内でparams、param、paramcountの関数は正しい値を返しません
以下のような関数に出くわしたのですが、正しく動きませんでした。
function funcTest arg
put paramcount() into hensu
put random( heusu ) into hensu2
put param( hensu2 ) into hensu3
return hensu
end funcTest
上位ハンドラでの値を返してしまします。
HyqerTalkの注意事項 その1
HyqerTalk Referenceというものがあるので公開します。あまり体裁の良いものではありませんし、記載に誤りがあるかもしれませんが、機能の実装状況が概ねわかるかと思います。HyperCard2.0のHyperTalk Referenceをベースにしました。
それはさておき、特に注意しておきたいことを二つほど。
if文表記
以下のよう2行や3行に分けるif文というのは、よく記述されることがあるのですが、HyqerTalkでは対応していません。
if 条件式 then 命令文
else 命令文
if 条件式
then 命令文
else 命令文
次のように記述してください。
if 条件式 then 命令文 else 命令文
または
if 条件式 then
命令文
else
命令文
end if
カード、ボタン、フィールドの指定
カード、ボタン、フィールドを指定するときに名前で指定する際「&」を用いて文字列結合することがあります。
例えば次のような感じ
go card ("card"&i)
show cd btn ("b"&i)
ですが、これはHyqerTalkの致命的な設計ミスで対応できません。
名前は単体の変数もしくは文字列で指定してください。
go cardの場合
put "card"&i into hensu
go cd hensuu
もしくは
go cd "card0"
---------------------------------------------
show cd btnの場合
put "b"&i into hensu
show cd btn hensu
もしくは
show cd btn "b0"
その他、カード番号やボタン、フィールド番号を指定するときに関数を使うケースも同様です。
例えば次のような感じ
go card random(10)
set loc of cd btn random(5) to 100,100
同様に単体の変数で指定してください。
go cardの場合
put random(10) into hensu
go cd hensuu
---------------------------------------------
show cd btnの場合
put random(5) into hensu
set loc of cd btn hensu to 100,100