Beta.05B rev7 からの続き
バグ修正履歴
バージョン | 修正対応 | 詳細 | 備考 |
---|---|---|---|
05C rev1 | 済み | 名前の重複登録 | af_cmp の方 |
05C rev1 | 仮対応 | +A-M:Hori-Flip の出現位置 | 移動量 12 px 迄なら正常 |
05C rev2 | 仮対応 | +A-M:Vert-Flip の出現位置 | 移動量 12 px 迄なら正常 |
05C rev2 | 済み | 名前が登録されない | oi_controlled の方 |
05C rev2 | 済み | Align >> Vert (T to B) | Anim Frame Start index 1 >> 0 |
05C rev2 | 済み | Align >> Zigzag の Margin 指定 | 実装を忘れてた |
05C rev2 | 仕様変更 | 予約変数(3) を ag で利用 | 予約変数(2)から(3)へ |
05C rev2 | 済み | Reversal Movement の Anim Dir | 自動化対応 |
05C rev2 | 済み | Set Alpha Coefficient | プロパティ値無効のバグ修正 |
05C rev2 | 済み | Align >> Circle | Anim 停止と AnimFrame 設定 |
05C rev2 | 済み | Align:Grid を Rectangle Matrix へ | 主に名前変更+その他調整等 |
05C rev2 | 済み | Align:Rhombus は Square Matrix | 正方行列が必須 |
05C rev2 | 仕様変更 | Sleep に Time Interval 追加 | rev1 との非互換性 |
05C rev3 | 済み | Extension Properties の TEXT | 変更が反映されないバグ修正 |
05C rev3 | 済み | REGEX PARAM の White Space | 空白利用にあった制限を解消 |
05C rev3 | 廃止? | Grid Align : Rhombus | Align:LMS Trapezoid を推奨 |
インスタンス変数の予約一覧 (05C rev.4)
予約変数位置 | 略語 (Abbreviations) | 詳細 | 備考 |
---|---|---|---|
(0) | id | ID | インスタンス ID として |
(1) | sl | Sleep | Sleep 用フレームタイム |
(2) | ti | TimeInterval | Sleep 用フレームタイム |
(3) | ag | Angle | 角度 (-180 ~ 0 ~ +179) |
(4) | gt | TimeInterval | GrowRadius 1 用フレームタイム |
※ Grow Radius には Orbital 動作の場合タイムインターバル数値が二つあり、05C rev.4 では実用上問題が無いはずなので 1 のみ数値取得できるようにしました。
新機能
バージョン | 名前 | 対応 | 詳細 | 備考 |
---|---|---|---|---|
05C rev1 | ※ sleep | 完了 | sleep の挿入 | 全動作対応 |
05C rev2 | ※ Time Interval | 完了 | タイムインターバル | Sleep 用 |
05C rev1 | reversal movement | 完了 | 移動量の反転 | 全動作対応 |
05C rev1 | change target | 完了 | ターゲット変更 | Orbital に対応 |
05C rev2 | ※ angular rotation | 完了 | 角度指定移動 | ※タイムインターバル含む |
05C rev2 | Momentary Pause | 完了 | 角移動後一時停止 | Orbital 専用 |
05C rev2 | Update Control List | 完了 | コントロールリスト更新 | Destroyの検出(手動) |
05C rev2 | Reject Time Delay | 完了 | 指定時間経過後 Reject | 全動作対象 |
05C rev2 | Align:Semi-Circle | 完了 | 半円 + 方向指定 | 整列 |
05C rev2 | Align:Rhombus | 完了 | ひし形の Matirx | Trapezoid に統合? |
05C rev3 | Align:Trapezoid | 完了 | 台形の Matrix | Hexagonal や Rhomb も可 |
05C rev3 | Align:GRows Ofst | 未 | 行ヘッダーにオフセット | 方向指定可能 |
05C rev3 | Convert AG 2 aDirs | 未 | 角度を Anim-Dirs 変換 | Expression |
05C rev3 | Invert AnimDirs | 未 | Animation Dirs 一括反転 | 32 方向で反転 |
05C rev3 | WCtrl:Alternative | 完了 | Window Size Control | Windows OS 11 用 |
05C rev4 | Grow Radius | 完了 | Radius を動的に変更 | Orbital + SineWave |
05C rev5 | Swap A to B | 仮対応 | object 位置を swap | +A の MoveToward |
05C rev5 | Detect Clipboard : BITMAP | 完了 | Clipboard 更新管理 | Surface Object 連携用 |
05C rev5 | IsFileExists | 完了 | 指定 File の存在確認 | FileSystem : Conditions |
※ Sleep は概念的には一時停止 (Stop | Pause) と同じですが、Sleep 後に必ず目覚める (動作を再開する) 前提の Stop とは異なる機能として Object Control には実装されています。「停止→再開」という動作をセットで行う「コンビネーション」が Sleep だと思ってください。
※ タイムインターバル = TimeInterval >> 指定したフレーム時間経過後に動作を Sleep する、Sleep 後自動的に動作再開する。 Orbital 以外は Sleep からタイムインターバルを設定する。Orbital は専用の TimeInterval 機能を持っているので Sleep から設定された TimeInterval 値は無効化される。Orbital の TimeInterval 値を無効化する Momentary Pause というオプションが有効化されると自動停止後に動作を自動再開しなくなる。MomentaryPause は Angular Rotation 機能から設定する。
※ angular rotation = 角度指定移動 >> Orbital に対応。Angular Rotate はサブ機能として TimeInterval と Memontary Pause 設定を含む。Angular Rotate 中に Sleep も併用可能だが Sleep の TimeInterval は Orbital では無効化されます。
動作サンプル
バージョン | 名前 | 詳細 |
---|---|---|
05C rev2 | Motion Control Debug Template | 一部修正 |
05C rev2 | Change Target+Sleep+Reversal Mov | Orbital の活用例 |
05C rev2 | Update List+Sleep_Time Interval | コントロールリストの更新 |
05C rev2 | Reject Sample (Choose_Ur C) | ゲームメニューの作例 1,2 |
05C rev2 | Angular Rotate (for Orbital) | 角移動とタイムインターバル活用 |
05C rev2 | Horizontal Align >> Zigzag | 整列サンプル (マージン利用) |
05C rev2 | Exceptional_Align (use Orbital) | 特殊な整列 (六角形) |
05C rev2 | Align : Rhombus | 菱形のマトリックス |
05C rev2 | Align : Rhomb to Hexagonal Matrix | Hexagonal Matrix の作例 |
05C rev2 | Align : Trapezoid | Trapezoid を活用した配置例 |
05C rev3 | WCtrl:Alternative | Window Control の作例 |
05C rev4 | Grow Radius : Sinewave Compare | Grow Rad の Sinwave 比較 |
05C rev4 | Grow Radius : Orbital Compare | Grow Rad の Orbital 比較 |
05C rev4 | Grow Radius : Orbital Fireworks | Grow Rad のパラメータ作例 |
05C rev5 | +A-Motions : Swap A to B | MoveToward の簡易版 |
05C rev5 | surface 連携用 | Clipboard 更新管理 : Conditions |
05C rev5 | isFileExists | FileSystem : Conditions |
Orbital
05B rev7 でメニューだけ実装してあった By Name 系モーション Orbital を 05C rev1 へ2種類実装。+A-Motions とほぼ同じ機能だが +B-Motions はもう少し高度なことがデフォルトからできるようになっている。高度なことができる半面パラメータ入力が多くなってしまうのでここからパラメータ入力に正規表現を利用していく。
正規表現を利用することでパラメータの入力は6つの異なる数値を一つのパラメータとして送信できる。具体的には以下のような記述で
"100, 100, 002, 90, 0,-10"
Radius1, Radius2, AngularVelocity, StartupAngle, CentreXoffset, CentreYoffset が上記、正規表現を使うので少しだけ見やすく文字列を整形することができる。例えば各要素間にスペースを挿入したり、桁を揃えるために 0 fill 使ったりが可能。まだちょっと不具合もあるが実用上は問題ない。
複数パラメータを一つにまとめたことによって数値の一覧性が向上、パラメータの部分的修正が簡単になどが良い面。悪い面としては文字列として送信するので正規表現使って6つの値に分解するためのコストがかかる。そしてもう一つ、入力パラメータに不備があるとそれを検出・訂正する機能は無いのでフェイルセーフでは無いかもしれない点。メリットとデメリットが相克する内容なので評価は分かれるかも。
パラメータの集約は成功したので今後は複雑なパラメータも一つのインターフェースから送信できるようになった。+A-Motions はパラメータの入力が最小限になるよう工夫されたデフォルト動作、+B-Motions はパラメータに REGEX 使って集約パラメータとして送信することによって複数パラメータを一度に送信できる高度なデフォルト動作。A と B で Motions にはこのような区別がある。
+B-Motions : 楕円 ( Oval )
+B-Motions の Orbital は楕円軌道 ( Elliptic orbit )を描けるように調整されています。+A-Motions はデフォルトで真円のみ、+B-Motions は Radius 値を二つ送信して楕円を作れます。Radius は一方の値を 0 にすれば Flip のような動作も作れますが、動作を組み合わせることでもっと複雑な動作を作ることもできます。
上の動画 GIF はパラメータの異なる円動作を3つ組み合わせ、05C rev1 から実装された Reversal movement を利用してクリック毎に対象の移動量を反転させています。Orbital の円動作はターゲットに追従するため瞬時に予想できない複雑で滑らかな曲線軌道を描くこともできます。
ByName Motion Controller は複数オブジェクトを一括操作するのが得意なのでパーツを用意して組み合わせればこんな怪物を簡単に作ることができます。
rev2 からは Angular Rotate 機能も実装され、指定角度で毎回一時停止するパラメータを利用可能です。
円運動から角度を提出
Orbital 系の動作は ID 自動の割り振り以外に角度情報を各インスタンス変数に送信しています。
AngluarVelocity で回転方向を決定していますが、数値が正値の場合時計回り、負の場合半時計回り、アングル開始位置は時計の針 0 時( 12 時)を基準にしてあります。AVE が +1 の場合 60 FPS 動作だと一秒で 60 度回転して 6 秒で一回転。つまり AVE が分かれば角度なんて自在に求められるので、インスタンス変数に送信しているのはそういう角度情報ではありません。作者用なので一般向けではないかもしれませんが -180 〜 0 〜 +179 の範囲で制約された数値です。0 から始まって +179 で数値が -180 に切り替わり 0 になるまで増加していくパターン。角度がマイナスの時は左、プラスの時は右など方向を検出できるのと、絶対値 ( abs ) を使うとマイナス値とプラス値で同じ値を得られるようになっています。これも主に方向などを検出するための仕組みです。
05B まではまだ仕様が曖昧だった部分ですが、05C からは上記仕様が全ての Orbital に適用されてます。
Reversal Movement
移動量を判定して移動方向を反転させる命令。05C rev1 から実装されました。移動方向が反転した時に Animation Direction も追従します。
ByName 系命令なので名前を空で送信すると登録された全オブジェクトが対象の命令となります。送信された名前に該当がない場合(たとえば大文字と小文字を間違えたとか)には何もせずエラーも返しません。送信された情報とグループ名が一致すれば一致したオブジェクトインスタンスのみが対象の命令となります。
移動量については各 Motions で縦移動・横移動・角速度と異なるのですがモーションの違いはエクステが検出するので、ユーザー的には命令を送信すればいい後はエクステが自動で判別しなんとかする。異なるモーションでも一括で動作反転可能になっています。
Sleep
Frame Time を使った Sleep の挿入命令です。動作に Sleep を入れてストップモーション動作、あるいはゲーム FPS が 60 の場合、Sleep を 59 とすれば一秒毎に動く。
Sleep は概念的には一時停止 (Stop | Pause) と同じですが、Sleep 後に必ず目覚める (動作を再開する) 前提の Stop とは異なる機能として Object Control には実装されています。「停止→再開→停止」とセットで動作を行う「コンビネーション」が Sleep だと思ってください。Sleep 中に別命令で Stop が発行された場合、Sleep 用のカウンタも停止しています。
rev2 以降、第 3 パラメータに Time Interval 設定追加、高度なタイミング制御が可能になりました。Time Interval 値は Frame Time と同義、指定時間経過後に Sleep に入り、Sleep 動作から再開してまた Sleep に入るためのタイマーが Time Interval 値です。
第 4 パラメータは繰り返し処理回数の指定。-1 の場合永久ループ、0 の場合 Time Interval を無効化、1 以上の場合数値に応じた回数繰り返して 0 になったら Time Interval を無効化します。
Sleep は Null を除く全モーション対応ですが Orbital に対してだけ Time Interval 値の設定が無効化されます。 Orbital は Angular Rotate という Orbital 専用機能に Time Interval が設けられているため、Sleep の Time Interval は重複を避け無効になるよう調整されています。Sleep 機能自体は Orbital に対しても有効。
Change Target
動作ターゲットを切り替える命令、現在はターゲットを使った処理が Orbital だけなので Orbital around TargetXY 動作でのみ機能する命令です。ターゲット切り替えのタイミングやそれぞれの距離が遠すぎると不自然な動きになるので、これらを考慮しながら使うと便利な機能になる。
動作サンプルではゲームメニューの作例などに活用されています。
動作サンプルを追加
05B rev7 までの機能を使った動作サンプルが概ね完成。動作サンプルを作るために 05B rev7 から Debug Template というテンプレ mfa を添付してあります。デバッグ情報の取得はすこし手順が複雑なので毎回作らなくてもよいテンプレを用意してこれを利用すれば製作が楽になります。
05C からは Shader も実験していくので動作サンプルに passthrough というシェーダも添付します。このシェーダは一番基本となる「何もしない」シェーダ、RGB を無加工で出力する( パススルーする )だけのシェーダです。05C rev1 サンプルで利用されたシェーダは基本的なものだけ、一応サンプルファイルとともにシェーダも添付されています。シェーダで警告が出たら effects フォルダにシェーダをコピーしてください。
05C rev1 準備中
12 月頃。今年最後のリリースバージョンとなる予定。05B rev7 との動作互換性はありますがサンプルも更新追加したので古いファイルは消してください。今後も使うので警告が出た場合エフェクトにシェーダを追加していただければ幸いです。
05C rev1 公開
05C は 05B rev7 から正当進化したバージョンアップ + バグフィックス版。05B では安定しなかった動作互換性を 05C では互換性維持しながら新機能を追加していく方針。ただし 05C で実装された新機能については来年のアップデートで互換性を切る可能性があります。そのため新機能を使った動作サンプルも付属していません。
05C rev1 は動作サンプルが増えました。05B rev7 が完成した時点で一度コーディング作業から離れてここまでに実装された機能でしっかりと動作サンプル作ると決めていたので、アイディア出しながら素材作ったり動作作ったりの中で「次はこんな機能が欲しいな」を考えながらメモってました。その結果 05C rev1 にはまず Sleep と Reversal Movement と Change Target が実装されそれぞれ具体的な活用法については来年公開の rev2 で紹介できると思います。
REGEX の後に動作コントローラを作り始めた当初はそもそもコントローラを作ることに意味あるのか自分でも疑問だったのですが、いくら考えても答えが出ないのでとりあえず作ることにしました。05B rev7 が出来た時点でこれ結構使えるかもと思うようになったけど、開発のネタが尽きないから作業の終わりもまだ見えない。どの辺を着地点とするのか考えながら、まずは今年一年ありがとうございました。また来年もよろしくおねがいします。
Start Angular Rotation ( for Orbial )
※ 05C rev2 から実装
Orbital 専用、指定された角度で動くタイムインターバルを含んだセットアップ・モーション。
メタ動作に新項目を追加するか Orbital のサブ機能として実装するかでまず悩んだ。最終的にその両方がボツ案となってコントローラから操作する機能として決着、既存機能と競合しない形で実装できるか実際に動くまでかなり不安だった。仕様・実装が二転三転したので最終的なコードの量以上に試行錯誤の時間が多くかかった機能。実用性は結構あると自負。
Sleep 機能とは別にタイムインターバルを持つ機能なので自動で動き出し自動で停まりまた動き出すを繰り返す。
Sleep 用のタイムインターバルを追加
rev1 互換性を切って Sleep にタイムインターバルを追加。rev2 以降。
Orbital の Angular Rotate にはインターバル後に自動で動き出すオプションがあって、既存機能である Sleep と組み合わせることもできる。タイムインターバルはその他のループ動作にも適用したかったので仕様を考えていたが最終的に Sleep と合体させ実現した。何が出来るのかって話だが時間経過後に停まったり動き出したりが自動化できる。停まっている間にインスタンス変数に数値を渡しておくので製作者はその数値を利用してモーション動作や一時停止中に独自のアクションを追加できる。
Sleep の Time Interval は Orbital 動作には適用されない。Orbital は Angular Rotate にタイムインターバル機能を持っているのでこれと重複するから。だから Sleep 自体は Orbital でも機能するが Sleep 設定からタイムインターバル指定しても Orbital では無視される仕様になってる。
新サーバへの移行とデータベース更新など
年末にやろう思っていたサーバのデータ移行とデータベース更新を完了。ワードプレスも内部的には刷新されキャッシュも入れたので、見た目変わらないがページレスポンスはかなり改善。速い。
MMF2 Archaeological も一応直したがこちらは過去にテーマを直接カスタムしてしまった代償としてそのテーマを今更直せなくなっていたので、仕方がない新しいテーマで仮運用中。
WordPress は使い始めた当初、ここまで立派な CMS に育つと思っていなかった。Movable Type 後継としては有力な選択肢の一つと考えていたけれど他にも Joomla! があったし、Joomla! の方がトータル完成度は高いと思ってすらいたが一年ごとにシェアを確実に伸ばした WordPress は今や不動の地位を築いた感ある。Wordpress は単純なブログとしては確かに使いやすいし機能も運用も分かりやすかった。
しかし WordPress も多機能化が進むに連れ動作が重くなりエディターが特にひどくレスポンス悪、これで嫌になって Hugo とか静的サイトジェネレータを試すようになった。ユーザからのコメントとかレスポンス受け付けないタイプのブログサイトなら WordPress である必要はないからだ。
WordPress の新しい「Gutenberg」というエディタも慣れない。GMS1.4 のページはデータベースを切り分けて WordPress 設定など含め新環境試したり php 埋め込んだり MMF/CF25 サイトとは作り方が異なっているのだが、いろいろアップデートしたら一部壊れてしまい直そうにも Gutenberg というブロックエディタが邪魔で治す気が消失。Classic Editor の何が悪いのかさっぱり分からんし、ブロックエディタの利点も今の処分からない。
rev2 用の動作サンプル
rev.1 新機能を使った動作サンプルがほぼ揃った。デバッグも兼ね少し時間置いて詳細忘れた頃に動作サンプル作るとうまい具合にバグを見つけることができたりする。プログラムをする人間は本能的に不具合起こす動作を避ける習性あるから機能実装する人とデバッグする人は別人格であったほうが良い、理想だが。
動作仕様を全部書き出すのは量を貯めてからだと忍耐も困難な作業になるので動作サンプルをこまめに作り定期的に内容を見直し追記・修正するのは重要な開発作業の一部だと個人的に思っている。
+A|B-Motions の新機能開発は Orbital で一度停止し rev.2 ではここまでコントローラの新機能追加に専念。目標として Beta06 へバージョンアップしたいと思っていたが、必要な機能がまだあるので取り敢えず rev.03 を目指すことになる。2023 年の 1 月から整列機能を増やす。
Align Semi-Circle
指定角度で開始し半円を描くように整列する機能を「Semi-Circle」として実装。整列させてから Animation Directions を自動で設定して Clickteam Movement の Bouncing Ball を使って発射したりできる。
Clickteam Movement の Bouncing Ball は衝突判定のある標準動作だが、衝突判定を使わずにシューティングの敵弾など動作を自動設定する機能として使ったりもする。ここで一つ問題になるのが角度指定。Clickteam Bouncing Ball は最大 32 方向に対応だが複数オブジェクトインスタンスに対して同じ値で角度を一括設定するのは楽、しかしインスタンスごとに角度を変え個別設定したい場合はループを回し、角度を Direction に変換する計算が必要になる。
上記画像を見ても分かるが Named Motion Controller は右回り、Clickteam 系は左回りなので互換性が無い。正直これはマズいことをしたと思ったが作り始めた当初アニメーション方向を指定する機能を付けるとか真面目に想定してなかったので我主張無罪確定。
しかたがないので今回、Named Motion Controller から出力する角度情報を Animation Direction へ変換する機能も Expression に実装したが Align の Semi-Circle では計算不要、整列と同時に角度指定とアニメーション方向変更までを自動で行う。Semi-Circle は「半円」を描く機能としてデザインされたが第二引数 REGEX Params を利用して円や楕円も描けるので、配置と同時に角度を決めボタン押し一つで発射完了までが自動化される。
シューティングの敵弾配置とかマウスクリック時の演出を自動化するための機能として実装した。これまでと少し毛並みの違う配置機能になったが、整列と同時に Animation Direction が自動設定されるのはこれが最初の機能となる。
rev.02 に追加される動作サンプルまとめ
Align : Grid に Rhombus 追加
正方行列 (Square Matrix) を使って整列機能でひし形 (Rhombus) を形作る。3×3 など行要素と列要素が同数になる行列を正方行列という。
ひし形は 4 つの辺全ての長さが等しい時に成立する図形だから、Rectangel Matrix では作れないケースもあるので Square Matrix が必要ですという仕様にした。要するに正方形を 45 度傾ければ菱形になるよね、だから最初に座標変換で求めたら浮動小数点数計算の丸め誤差が発生して 1 pixel 単位で位置が微妙にずれたりする。Motion の場合 1 pixel ずれても動きがあるから誤魔化せるのだけど整列だとそうもいかないのであくまでも整数でのみ成り立つ計算をしなければいけなくなった。
発展形として Trapezoid Matrix を使って Hexagonal Matrix を作れるのでこれを実装したい。
rev2 公開
期限が来たので公開。Align : Hexagonal Matrix や Object Control : Grow Radius など未実装な機能がある。これらは rev3 で優先して実装される。rev3 は公開期限をまだ決めていないが 04 月頃?もっと早い?まだ分からない。rev2 にバグが少なければ 04 月公開で、早急に修正が必要なら rev3 をいつでも出せるようにと考えている。
rev2 は rev1 に新機能を追加したものだが rev1 にあった不具合は作者が把握しているものに関しては概ね解決。新機能よりもバグフィックスやサンプル追加に費やした時間が多かったと思う。rev2 は Time Interval の実装で少しイベントの作成がややこしくなった感。Sleep の Time Interval が Orbital では無効になるとか、Orbital には Angular Rotate が実装されたのでそっちの Time Interval を使ってくれとか。Time Interval という概念が Reject で使える Reject Time Delay 機能とか。
Time Interval が実装されたことで出来ることは増えた、しかしタイミング制御は可視化が難しい部分もあるのでこのセットアップモーションを作者以外が使いこなせるかどうかはちょっと自信無い。デバッグも怖い、パラメータも多い。
rev2 公開直前に駆け込み実装された reject time delay などは一日で実装完了したのでほとんどテストして無いに等しい。一応 rev3 の機能だが動作サンプルは rev2 にも付属してる。
とりあえず rev2 に実装された Time Interval という機能を体験してみて欲しい。
rev.3 新機能 Align : LMS Trapezoid
ゲーム実行中に Active Objects を Trapezoid (台形) に 1 Action で整列できる機能。整列オプションから左揃え、右揃え、中央揃えなどを選べる。さらに Top Row の Grid Element 数を 1 に設定すれば Rhombus (菱形) も作れる。もちろん台形をベースにした六角形 (Hexagonal) 配置も可能。
Align : Rhombus は Square Matrix を前提とした整列機能だったので要素に余りが出たらその分は無視というかもう適当に処理していたが、Align : Trapezoid は繰り返し処理を導入したので要素数に余りが出ても大丈夫、要素数による縛りとかはなくなった。さらに LMS 命令なので一番最後に作成されたオブジェクト位置を自動参照する仕様なのでポジション設定用のパラメータ入力が不要になど。
完全に上位互換機能として Align : Rhombus を食ったので rev2 で実装された Align : Rhombus は廃止の可能性が高くなった。Trapezoid で全部できる。
Align : Rhombus は苦労した機能だったので惜しまれるが、計算方法とか実装ほぼ同じものをフルスクラッチで作り直したらさすがに機能的完成度やコード処理は圧倒的に Trapezoid の方が高くなり、結果的にだが Align : Rhombus は Align : LMS Trapezoid を産み出すための礎になった。
というわけで Align : Rhombus の利用は非推奨です。コードメンテナの都合上 Align : Rhombus 機能は rev.3 以降に削除される可能性が高くなりました。
REPRESENTATION OF EVENTS IN NERVE NETS AND FINITE AUTOMATA
筆者用メモ:S.C. Kleene 博士のワーキングペーパーとアスタリスク記号の起源および活用に関する
アスタリスク「 * (Asterisk)」の起源は非常に古い。氷河期時代 (ice age) の古代洞窟壁画に起源を持つとも言われており、ヨーロッパ各地の古代洞窟壁画で確認された 32 のシンボルの一つにアスタリスクは入っている。この時代はまだ象形文字 (pictograph) であり意味も明確な星ではなく「神、天の国、空」だったと分析もされているが誰も確かな答えは持っていない。Don’t Think, Feel!
現代に通じる文字記号としては約 2000 年前のパピルスで使われていた例が現存する最古であり、故にギリシャ語由来の「aster (小さい星) 」が起源とされる。ホメーロス叙事詩研究の大家だったサモトラケのアリスタルコス (Aristarchus of Samothrace 220 – 143 bc) が編集作業の際に余白にアスタリスク記号を注釈に使ったと伝聞されているが、彼自身の著作は断片的に残された Scholia 以外全て失われかつ現物は存在しない。
時は流れ、1951 年 12 月 15 日付でリリースされた S. C. Kleene 博士の正規表現に関するワーキングペーパー「REPRESENTATION OF EVENTS IN NERVE NETS AND FINITE AUTOMATA」にて、閉塞演算子として「*」が初めて利用された例を確認できる。しかし S.C. Kleene は二項演算子 (Binay Operator) として利用しているため現代コンピュータ上における REGEX 処理で利用される単項演算子 (unary operator) としてのアスタリスクとは使い方が異なっている。
引用 : RM-704 Page 49
If E and F are events which constructed, the by E*F we shall mean the event which consists of zero or more consecutive occurrences of E preceded by one of F.
この「E*F」が閉塞演算子としてアスタリスクが利用された初出なのだが、この時点では E と F を結ぶ二項演算と定義されてた。このワーキングペーパー上では「E*」のような単項演算子としての活用については定義を避けている。
引用 : RM-704 Page 50
The reason we do not define E* separately as a unary operation (中略) instead of E*F as a binary operation, (略)
しかしここからワイルドカードとして単項演算子のアスタリスクがコンピュータ上で利用されるようにまでそれほど時間はかからなかった。
参考;RAND Corporation Research memorandum series (15 Dec 1951 : RM-704)
参考:What the mysterious symbols made by early humans can teach us about how we evolved
参考:( Wikipedia ) Aristarchus of Samothrace
参考:( Wikipedia ) Asterisk
Window Control の代替機能として
ちょっと試しに作ってみた。
Windows 11 OS 上で CF25 標準機能から「Full Screen」を選択し実行するとアプリケーション単位の dpi 設定を勝手に変更されてしまう。しかもフルスクリーン化するときに画面切り替えに一定時間を費やすためストレス大、不便なだけで致命的では無いが代替機能を欲していた。
参考:高 DPI モニタ環境でテストビルド時にウィンドウが小さくなるトラブルとその解決策
試していたら Application Window のタイトルバーからアクセスできるアイコンの中にウィンドウサイズを最大化する「Maximize (いわゆる最大化)」ボタン、あれが使えることわかった。以前の挙動を覚えてないのだが Windows 11 ではタイトルバーをダブルタップするとやはり「ウィンドウを最大化」できるがどちらも「最大化」であって「フルスクリーン化」とは違うようだ。あまり評判がよろしく無い「画面の端に持っていくと自動的に最大化」もある。
フルスクリーンではない「ウィンドウの最大化」は CF25 標準機能には機能実装が無く、拡張機能である「Window Control Extension」からウィンドウの状態をチェックしたり「最大化 | 最小化」が実行できる。
しかしよく考えると「自動切り替え機能」が無い。筆者の考える「自動切り替え (Toggle)」というのはウィンドウが最大化している時は「通常サイズに戻り」、通常サイズの時は「ウィンドウを最大化」する、つまりウィンドウの状態をチェックして最大化と通常サイズを交互に切り替える機能のこと。
テレビのリモコンに手を伸ばして電源ボタンを押す、するとテレビに電源が入って画面が映る、電源が入っている状態でもう一度リモコンからボタン押せば電源は切れるよね。テレビの電源を付けたり消したりするためにボタンあるいは選択肢を二つにする必要は無い。ボタンは一つでいい理由は電源が入っている状態を確認して電源を消すか付けるか判断しているからだ。
というわけで筆者が欲しているものがだいたい分かってもらえたのではないかということで、「Window Control Extension」の代替機能を作った。一つの条件から最大化を選択するだけでウィンドウ最大化と通常サイズの変更を切り替えることができる機能として実装してある。
事前に述べた高 dpi モニタ利用時のフルスクリーン化で発生する懸念も「最大化」で解決できる場合がある。一応見た目はフルスクリーン化とまったく変わらないので実行時パフォーマンスは違うかもだが簡単に利用できる「フルスクリーンもどき」が実現できていると言う点ではやはり便利。ついでにタスクバーの表示・非表示とウィンドウの最小化も機能実装してある。タスクバーの表示・非表示切り替えは本家の「Window Control Extension」にはできない機能かもしれない(試してない)。
05C rev.3 以降から利用できます。05C rev.3 は四月頃公開予定。
アイコンのデザインを変更
もう半年以上適当なアイコンでエクステを作っていたが、ようやく、ようやく、デザインが出来た。
CF25 デフォルトのアプリケーション外観は去年のアップデートで大幅に改良され、古いアイコン群は一応まだ残っているけれど、CF25 本体は透過 png が使えるようになってアイコンサイズも内部的には 48 pixel に統一、そしてアイコンを自在に変更したり外観のカスタム機能も強化された。
ところがエクステは透過 png 使えない 8 bit BMP = 256 色で 32 pixel のまま。え?
アップデートが入る以前からアイコンのデザインは色々試していたのですが 32 pixel のドット絵という縛りは作者にとって辛い作業で、でかい画像でまずイメージを作っても 32 pixel に縮小すればボロボロになってしまう。つまり最初からドット絵で作るか相当シンプルなものをデザインしないといけない。そして視認性が良いことなど。そんな試行錯誤中に外観を変えられ…
シンプルを追求した結果「正規表現のアスタリスク記号」をシンボルに使う案が残り、最終的にドット記号と組み合わせ、色は CF25 の新しくなった標準スキンからカラーパレット選んでなるべく標準スキンで利用しても違和感のない配色に決定。そして試していたら Dark Mode という2つ目のスキンを発見。二つのスキンで違和感無いように調整する必要性。
というわけで、頑張りましたがもうこれで勘弁してください。
標準の Dark Skin はデザインによってはアイコンの視認性がかなり悪くなるのが分かったので、遠目に見てもこれは「REGEX ECMA」だながすぐ分かるような色を使っています。
基本的に標準のスキンならどれを選んでもアイコンが見えないとかは無いはず。05C rev.3 から新しいアイコンになります。
rev.3 を公開
機能的な未実装が多数あったけど期限が来たので公開。メニューだけ先に作って中身がまだ無いとかがある。rev.4 に向けて頑張る予定。
rev.3 に実装する予定だった機能に「Move Toward」という新しいモーション定義がある。A というオブジェクトを B というオブジェクトを目標に定めて自動移動させるという機能だが、既にある Easing Object にコンセプトは似ている。違うのは名前を使った「群」を対象に目標を定めることが出来るという点。この概念を整理するのに頭を使っていたのだがターゲットが複数ある場合のターゲット割り振りのアルゴリズムとか、実際にどういう動作になるのかとか、作ってみないと分からない部分や手間のかかる部分もあって難儀してる。パラメータが現時点では結構多くなってしまうのも難点で、パラメータを省略した +A-Motions から実装を急ぐべきかなと考えている。
アイディア的には自動追尾弾とか自動回転砲塔( Gun Turret )を作りたいと。
rev.4 準備中
開発速度が鈍っているため新規実装は「Grow Radius」のみ。Orbital や SineWave 動作の半径(Radius・SineWave の場合 Amplitude)を動的に変更する機能です。
半径を変更する単純な機能ではなく、半径の最大値と最小値を往復する動作を簡単に作るための機能としてデザインされています。Orbital の楕円軌道にも対応したので必要なパラメータは最大10個。Regex Param なので動作サンプルに付属するパラメータをコピペするだけで知識が無くとも動作は作れます。
現在テスト中ですがパラメータをほんの少し弄るだけで結構おもしろい動作を作れます。
開発中の Move Toward については下拵えがまだ終わらず。rev.4 には間に合いそうにないのでまた一ヶ月ほど期間をもらって rev.5 で実装したいと思っています。現在機能追加についてはのんびり作業してます。
Extension の正式名が ASTER に決定
悩んで悩んだ結果、「小さな星」を意味するラテン語由来の「ASTER」になりました。正規表現を扱う拡張として「*(アスタリスク)」をシンボルにしたアイコンを作った後、REGEX ECMA をそのままエクステの名前にしようかと思っていたのですが名前長いし、オブジェクトコントロールがどんどん高機能化している割に正規表現関連機能は半年以上更新や追加も無い。
いろんな機能を持った小さくてもキラリと光る拡張機能として輝くようにという願いを込めて「ASTER」です。たぶん作者が作る最後のエクステになります。なってくれ。
というわけで 05C rev.4 以降エクステ名は「ASTER」で、よろしくおねがいします。
Grow Radius の実動作と予約変数
Repetition がまだ未実装ですが Grow Radius 動作は半径を動的に変更するカスタムパラメータおよびその実動作です。効果は「半径 = Radius」もしく「振幅幅 = Amplitude」を利用する動作全般、つまり Orbital と Sine Wave が対象。
Orbital については半径設定が二つある都合上、パラメータは各半径毎個別に設定可能になっているため必要パラメータの数が非常に多い「10 パラメータ」。REGEX PARAM なので文字列送信で一括処理しますが、このパラメータ数の多さは開発中に作者も何度か間違えました。とても見辛いです。なので…
"150, 0,+1,300,-1, 150, 0,+1,300,-1"
REGEX PARAM は文法をチェックしませんが書式は厳密にチェックしてます。書式さえ満たせば正規表現のエラーは出ないので、パラメータを見やすいようにホワイトスペース入れて整形したり「+」や「-」など特にマイナス値の入力が可能なパラメータには符号を使って区別することなどを推奨してます。
ちなみに上記パラメータ例は「半径1」と「半径2」に対してそれぞれカスタムパラメータを送信しているのですが、Sine Wave の場合「振幅幅」は一種類なので「10 パラメータ」のうち半分は不要なのですが動作互換性の都合上 REGEX PARAM は不要なパラメータを省略して送信することはできないようになっています。05C rev.4 ではそういう仕様になってますが内部処理で区別することもできるので、将来的に Sine Wave は 「5 パラメータ」で済むようになる可能性があります。
Grow Radius はタイムインターバル設定が可能です。これも各半径毎に異なる値を送信できるよう設計されています。ただし 05C rev.4 では実用性を考えた上で「半径1」のタイムインターバル値のみをオブジェクトインスタンスの変数から取得できるようになっています。
スクリーンショットの
(4) gt
というのが新しく追加された予約変数 = タイムインターバル値です。Grow Radius 専用なので Sleep 用の (1) sl
や Angular Rotate 用の (2) ti
とは独立した作用をします。
Grow Radius は Angular Rotate や Sleep と同時実行できるため、05C rev1 と比較すれば 05C rev.4 ではカスタムパラメータを駆使してかなり細かく動作を作り込むことができるようになりました。もちろん Stop|Pause や Reversal Movement と併用もでき、動作実行中にタイムインターバル値を監視してタイミングを検出すれば半径が最大値になった時点で弾を発射したり、半径が最小値になった時点でなにか別のイベントを作ったりなども可能。
というわけで作例ではタイムインターバルと (3) ag
を使って「花火あるいは弾幕」を表現してみました。かなり複雑な動作ですが円運動に関する部分は全てパラメータ入力だけで作れます。
Pingback: Beta.05B 更新履歴|仕様変更など – CF2.5 ガイド
Pingback: REGEX ECMA Beta.05C rev.4 Public – CF2.5 ガイド