iPad専用アクションゲーム「スライムは投げる」

最近のエントリー

先日、MFCにてアクセラレータキーが場合によって効かなくなるという症状を書いたのですが、一応自己解決いたしましたので、報告します。
(解決案をくださったAOIさん、Thanx!)

そもそもの原因は「TranslateAccelerator」というAPIの仕様とMFCの相性が悪いことにあります。 TranslateAcceleratorはキー入力をメニューコマンドへ変換するAPIですが、メニュー状態が無効だったら変換(送信)しないという仕様になっています。そのため、 MFCのコマンド更新ハンドラで pCmdUI->Enable(TRUE); となっていても、メニュー状態が無効ならば、ショートカットキーは使えません(深い場所のメニューコマンドは)。

ちなみに浅いコマンドが効くようになったことについては、少し憶測ですが書いてみますね。 TranslateAcceleratorの仕様として、キー→メニューコマンド直前(?)に WM_INITMENUなどのメッセージを送信してきます。そのメッセージをMFCフレームワークが掴み、メニューコマンドを「コマンド更新ハンドラ」を使って更新し、最新の状態になるため、ショートカットが効いたのだと思われます。
(ルート直下のメニューコマンドしか更新しません)

さて、深い位置のメニューコマンドを効かせるために、まず思いつくのが、「メニュー状態を更新する」という方法です。しかしいつ更新してよいのかわかりません。毎回キー入力(またはTranslateAcceleratorが送信してくるWM_INITMENUなど)でメニューコマンド全ての状態を更新することは負荷となりパフォーマンスの低下に繋がることは目に見えています。

で、私が使用した解決方法は、以前ちょろっと書きましたが、アクセラレータ処理を「TranslateAccelerator」を使わず自前で実装するという事です。もともとEDGE2はショートカットキーのカスタマイズに対応しており、キーの設定をリソースではなく、通常のデータ(謎)として持っているため、WM_KEYDOWNやらWM_SYSKEYDOWNメッセージを捕まえて、メニューコマンドへ変換し、SendMessage(WM_COMMAND・・・);しています。幸い、MFCはコマンドを実行する直前でコマンドUI更新ハンドラを呼び出して、コマンドを実行可能か調べているため、例えば「実行出来ないはずのメニューコマンドを実行する」というような事も起こりません(コマンド更新ハンドラでEnable(FALSE)となっているとwarningはTRACEされますが^^;)。

現在公開しているEDGE2β版では既にこの方法で実装しています。今のところ問題も出ていませんので、おそらく大丈夫かと思われます。

というわけでだいぶ時間が掛かりましたが、EDGE2 Ver.0.90 beta000の公開を始めました~。シェアウェアで、しかも価格が有名ソフトと同じぐらいですので、ユーザー登録数はあんまり無いかとは思いますが、長くほそぼそとやっていこうと思います。

次はアニメーション機能・・・の前にハイカラーパレットとかの対応からかな^-^;

ダウンロードなどはこちらから

2005
4月
26

イース最新作 「イース-フェルガナの誓い-」の発売日が6/30に決まり、予約受け付けも始まったようです。

この最新作はイース3の物語がベースとなっているらしいのですが、
予約特典としてイース3関連のCD全7枚がついてくるというのが凄すぎです_| ̄|○

イース3自体は、イースシリーズの中で一番最初にやったので、かなり思い入れのある作品です。どんな風になったか楽しみです(笑)

というかそろそろブランディッシュの新作を頼みます(´・ω・`)ショボーン

(一応解決しました。)

最近はEDGE2の動作チェックなどをやっているのですが、また新たな不具合が発生しまして・・・、これがなかなか曲者でして、今まで気が付きませんでしたがなんとEDGE1でも再現します_| ̄|○・・・。

例によってシンプルなプロジェクトファイルと実行ファイルを用意しましたので、もし通りすがった方で良い解決策などをご存知の方がいらっしゃれば、私まで連絡をお願いいたします(という他力本願な日記です)。なお、興味のある方向けに実行ファイルも用意しました。

Visual C++ 6.0 プロジェクトファイル
実行ファイル

概要

今回の不具合は、アクセラレータキー(Ctrl+Zでアンドゥが効くような機構・・・ショートカットキーと呼ぶのが一般的?)が場合によって効かなくなるというものです。

再現手順

  1. 起動する
  2. 「↑(矢印)」キーが「浅い」というコマンドに割り当てられ、「↓」キーが「深い」というコマンドに割り当てられています。
    050414_00

    050414_01

    つまり、「↑」キーを押せば「浅い」が実行され、「↓」キーを押せば「深い」が実行されるというわけです。

  3. では試しに「↑」「↓」キーを押してみてください。
    どちらもコマンドが実行されるとメッセージボックスが表示され、「実行された」という事が目で見て解るようにしてあります。

    どちらのキーでも処理が実行されることを確認してみてください。
    050414_02

  4. ここで、ツールボタン「ONで有効」の凹んでる状態を解除します(OFFになります)
    050414_03

  5. すると、「浅い」や「深い」が無効状態になります(無効状態にしています)。

    メニューを表示し、各コマンドが両方とも使えなくなっていル事を確認してください(必須)
    050414_04

    050414_05

  6. さて、ここで「↑」「↓」キーを押してみてください。

    「浅い」や「深い」は使えない状態ですので、もちろん処理は実行されません。

  7. では、ツールボタン「ONで有効」をもう一度凹まし、ONの状態にしてください。

    050414_06

  8. これで内部的には「浅い」も「深い」も実行可能状態になります。
    (メニューは開かないでください。)

    このまま、「↑」「↓」キーを押してみてください。

    「浅い」は処理されますが、「深い」が処理されません。

    「浅い」位置にあるコマンド(ルートの直下)は使えるのに、
    「深い」位置にあるコマンド(サブメニュー?)は使えないのです。

    これが今回の不具合です。

  9. ちなみに、このあとメニューを開き、「深い」が有効状態になっているのを確認してから「↓」キーを押せば処理されるようになります。

EDGE1の場合・・・

EDGE1の場合は、矢印キーで選択範囲を移動する事が出来るのですが、
選択範囲が無い時点でメニューを見に行き、座標微調整コマンドが無効状態になっているのを確認してから、画像を選択し、矢印キーを押してみると、キーが効かなくなるという不具合が発生します。

考察

まだちょこっとしか調査していませんが、キーアクセラレータ機構については、キー入力系メッセージ(KEYDOWNとか)からTranslateAccelerator APIを通ってコマンド(WM_COMMAND)に変換されるようなのです。
その際にTranslateAcceleratorは、対応するメニューコマンドが無効だとコマンドを送信しない仕様らしいんです(MSDNの資料はこちら)。
だから、MFCのフレームワークで深い位置にあるメニューコマンド状態が更新されないのかなぁなどと推測しています(あんまりWindowsSDKとかメッセージ処理とか詳しくないのでどっかかん違いしていたらごめんなさい)。

仕様なのか不具合なのか、どちらにせよ、便利であるはずのライブラリに時間を取られるのだけは勘弁してほしいです(´・ω・`)ショボーン

#アクセラレータキー処理を自前でやれば問題無しかも?

#今回は矢印キーばかりでしたが、「Ctrl+A」のような感じのキーも同様です

2005
4月
06

未だに電話番で台詞を噛む時があるんですけど。
(きっと眠すぎるせいだな~)

さてさて、EDGE2のVer.0.90α版を3人ぐらいにお送りしてバグ潰しを始めました~。
バグ潰しと平行して今度はシェアウェアとして公開するにあたっての準備やら調査やらをやっていきたいと思います。その辺が問題無く終わればいよいよ公開となるわけです。

その前に某敏腕プロデューサーK氏から編曲命令が下されると公開日は2週間ぐらい延びる可能性があります(爆)