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で設定

  1. Finberのアップルメニューから「Control Panel」を選択するとウィンドウが開きます。
  2. HyqerCard Speedのセレクトボックスで数値を選択します。

 Mac!ntoshのストレージに保存されますので、デフォルト(SessionStorage)ではブラウザでセッションが有効の間はこの値は有効です。

 

About HyqerCard

  1. HyqerCardのアップルメニューから「About HyqerCard...」を選択するとダイアログが表示されます。
  2. Speedポップアップボタンで数値を選択します。

 HyqerCardを終了するまで有効です。ControlPanelでの設定に優先します。スタックを作成中に速度調整する際はここで設定して下さい。


Comments

  1. Finberでスタックファイルをシングルクリックで選択します。
  2. FinberのFileメニューから「Get Info」を選択します。
  3. 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つです。

  1. アイコン(Finber表示用)取り込み
  2. アイコン(アプリ使用)取り込み
  3. 画像取り込み
  4. サウンド取り込み

 

 今回は2,3,4の取り込みを説明します。

 

Rez Editの起動

  1. Finberのアップルメニューから「Rez Edit」を選びます。
  2. ファイルダイアログが開くので対象となるファイルを選ぶと、ファイル名がメニューバーに表示されたウィンドウが開きます。以下、メインウィンドウと呼びます。

 

 

アイコン(アプリ使用)取り込み

 ここでいうアイコンはHyqerCard内のボタンに表示させるアイコンのことです。HyqerCardにもアイコンエディタがあるのですが、機能的に十分と言えませんので「Rez Edit」を使っての取り込みを推奨します。

  1. メインウィンドウの「ICON」と表示のあるアイコンをダブルクリックすると、ICONsウィンドウが開きます。
  2. iconメニューから「Import icon...」を選ぶとブラウザのファイルダイアログが開くので任意の画像ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
  3. ICONsウィンドウに先ほど選んだ画像が表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
  4. 画像をクリックすると背景が濃色になり、iconメニュー内のメニューアイテムが全て使えるようになります。
  5. iconメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。

※あらかじめ32x32ドットの画像を準備してください。サイズが違っていてもHyqerCardのボタンでは32x32に縮小拡大して表示します。

※カラー画像も使えますが、AutoHilightの時は単純に反転するだけです。カラー対応のFinderがアイコンを暗く表示させるのとは 趣が違います。

※AutoHilightで反転させる場合は画像の透過部分などにご注意ください。HyqerCardでは画像の周辺部分を自動で透過させるような動作はしません。

 

画像取り込み

 ここでいう画像はカードピクチャやバックグラウンドピクチャではなく、pictureコマンドで表示させる画像のことです。操作はアイコン取り込みと殆ど同じです。

  1. メインウィンドウの「PICT」と表示のあるアイコンをダブルクリックすると、PICTsウィンドウが開きます。
  2. pictメニューから「Import pict...」を選ぶとブラウザのファイルダイアログが開くので任意の画像ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
  3. PICTsウィンドウに先ほど選んだ画像が32x32ドットで表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
  4. 画像をクリックすると背景が濃色になり、pictメニュー内のメニューアイテムが全て使えるようになります。
  5. pictメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。

※メインウィンドウで画像をダブルクリックすると別ウィンドウで実物大で表示されます。これはICONsウインドウにない機能です。

 

サウンド取り込み

 ここでいうサウンドはplayコマンドで鳴らすサウンドのことです。

  1. メインウィンドウの「snd」と表示のあるアイコンをダブルクリックすると、sndsウィンドウが開きます。
  2. sndメニューから「Import Sound...」を選ぶとブラウザのファイルダイアログが開くので任意の音声ファイルを選びます。この際にString.normalize関数が実装されていないブラウザの場合、アラートが出ます。
  3. sndsウィンドウに先ほど選んだサウンドがリストで表示されます。これで取り込みは完了です。IDは勝手に採番され、名称はファイル名から拡張子を除いたものになります。
  4. リスト内のサウンド名をクリックすると選択され、sndメニュー内のメニューアイテムが全て使えるようになります。
  5. sndメニューから「get info...」を選択するとダイアログが表示されます。Nameフィールドは編集できますので変更して「OK」ボタンを押せば、名称が変更できます。

※音声ファイルは公開を前提としている環境で再生可能な音声ファイルフォーマットをあらかじめ準備してください。私はiTunesAACバージョンを作成しています。昔ながらのAIFFSafariでは再生できますが、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コマンドで操作できますので試してみて使えそうなら使ってみてください。

 

 いずれにせよ、貧弱な描画機能を補うために画像を外部ファイルから取り込む機能とディザリング機能をつけています。

 

画像取り込み

  1. Objectsメニューの「Card Info...」や「Bkgnd Info...」を選びます。
  2. ウィンドウ右中程に「pitcure...」という文字列とその下に「ファイルを選択」ボタンがありますのでボタンを押します。
  3. ブラウザのファイルダイアログが開きますのでローカルドライブから画像ファイルを選択してください。
  4. カードやバックグラウンドに画像が描かれます。画像サイズがカードサイズより大きい場合は勝手に縮小表示します。

PNGとJPGは取り込み確認しています。ただしJPGを取り込んでもPNG形式で保存します。カラーの画像の場合はカラーで表示され、そのまま保存もできますが、HyperCardらしさを出すためや、ファイルサイズを抑えるためにディザリング機能をつけました。


ディザリング

  1. Toolsメニューのパレットからselectツールなり、pencilツールなりを選んでペイントモードにします。
  2. メニューバーにOptionsメニューが現れますので、Optionsメニューから「Dither...」を選ぶと、Dither用のダイアログが現れます。
  3. 「Average」,「Random」,「Bayer」,「Floyd-Steinberg」,「Atkinson」からお好きなディザリングアルゴリズムを選択し、「OK」ボタンを押します。
  4. カードやバックグラウンドの画像に反映されます。

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

 

 

スタックの公開(基本編:ファイルの公開)

ファイルのアップロード

 利用できるWebサーバに公開用ディレクトリを作成してください。
 そこに前回用意した4ファイルをおいてください。
 htmlファイル:index.html
 HyqerCardファイル:HyqerCard
 Homeファイル:MyHome
 公開するスタック:testStack

 

URLの書式

 URLの書式は以下のとおりです。
http://(webサーバのアドレス)/(公開用ディレクトリ)/(htmlファイル)?HyqerCard=(HyqerCardファイル)&Home=(Homeファイル)&(任意の名前)=(公開するスタック)

 

アドレス部分

 私の環境で例示しますと、以下のとおりです。
 webサーバのアドレス:www.eonet.ne.jp
 公開用ディレクトリ:~gregor/hyqercard
 htmlファイル:index.html

 

HyqerCardファイル
 htmlファイルの後ろに「?」をつけて、以下のとおり続けます。
 Finber上でのファイル名=サーバ上のファイル名(htmlファイルからの相対パスで指定)

 ここでは「HyqerCard=HyqerCard」となります。

 

Homeファイル
 HyqerCardファイルの後ろに「&」をつけて、以下のとおり続けます。
 Finber上でのファイル名=サーバ上のファイル名(htmlファイルからの相対パスで指定)

 ここでは「Home=MyHome」となります。


公開するスタック
 Homeファイルの後ろに「&」をつけて、以下のとおり続けます。
 Finber上でのファイル名=サーバ上のファイル名(htmlファイルからの相対パスで指定)
 複数ファイルある時は「&」をつけて同様に定義していきます。

 ここでは「testStack=testStack」となります。

 

上記3つは要はwebサーバ上のファイルをMac!ntosh上にロードする際の書式と言って良いです。


私の例でいうとこんな感じです。
http://www.eonet.ne.jp/~gregor/hyqercard/index.html?HyqerCard=HyqerCard&Home=MyHome&testStack=testStack

f:id:Play_Boing:20170620230154p:plain

上記URLをブラウザで開くとサーバ上のファイルをロードして、ブラウザの領域に保存します。デフォルトではSessionStorageです。この際、既にブラウザの領域にファイルがあり、サーバ上のファイル名も前回ロードした時と同じだった場合は上書きしません。つまり、ブラウザでreloadしても上書きされません。

 


indexファイルと別のフォルダにファイル類を置く場合は以下のとおりになります。
例えば公開用のディレクトリにサブディレクトリを作りそこに置く場合

公開用ディレクトリ:~gregor/hyqercard
サブディレクトリ:~gregor/hyqercard/stacks
htmlファイル:~gregor/hyqercard/index.html
公開するスタック:~gregor/hyqercard/stacks/testStack

testStack=stacks/testStack  ← htmlファイルからの相対パス指定

 

ちなみに、URL生成支援スタックなるものがあります。こちらをどうぞ。Addressのところのフィールドはバックグラウンドフィールドなのでbackgroundモードにして、変更して使ってください。