キー操作の改善

Issue #78 new
k4nagatsuki repo owner created an issue

画面上でのキー操作について、次のような問題・提案が出ている。それぞれ議論を経てどうするか(急がずゆっくり)決めたい。大本は#75の議論を参照。

  • CWではエフェクトブースターの一時描画がF9キーで飛ばせる。CWPyではEnterで最速で描画を終える事ができる仕様で、F9の機能はアニメーション中でも従来と変わらない。これは操作性の統一のためにCWと合わせるか、オプションを提供するべきではないか。
  • メッセージについて、描画速度が最速でない時に1文字ずつ表示されるが、これを一気にすべて表示するキーがEnterとは別であった方がいいという意見がある。一気に表示した後、誤ってそのままメッセージを飛ばしてしまう事があるため。

ご意見やその他の改善案等あれば、コメントをいただければと思います。

Comments (19)

  1. takuto_cw

    できることなら、キーコンフィグがほしい派。

    プレイヤーが実際にカスタマイズしなくてもいいのです。自分はしますけど。わざわざ readme なんて引っ張り出さなくても「操作キー一覧を設定から見られる」という、おまけ効果が地味に便利。

    こちらにしてみれば、他の…例えば Shift キー機能あたりも一緒に紹介できたり。#75 では取説作ってそこで説明、なんて書きましたが。大半のプレイヤーは多分見ないでしょうし……。

    でもそもそもこんなの作れるのでしょうか、もし仮に作れるとしても、ものすごく大変ですよね……。 厳しそうなら、演出カットは Enter、文章一気に表示は、Enter・左クリック+他キー(Ctrl あたりが空いてる? Shift もいけるか)なんてどうでしょう。

    むやみに対応キーを増やしたくないけれど、前者と後者では使う場面の多さも、その機能を知っているプレイヤーの数もぜんぜん違うはず。個人的にその、「みんなが慣れればいいんだよ」みたいなことはあまり言いたくなくて。後者を単純に変更したくないという気持ちがあります。キーを増やすのであれば、使い方を知っていれば#75 の一時最速飛ばし読みができるし、知らなくてもこれまで通りのプレイは保障されるし。

  2. k4nagatsuki reporter

    メッセージの全表示は使う場面が非常に多いのがJPY1の件と最も違うところです。たぶんメッセージを最速にしていないすべてのCWのプレイヤーが日々使っているのではないでしょうか。使用頻度の高い操作を変えると問題が出る例は古今東西に限りなしという感じです。

    キーカスタマイズの実装難度については、実際にはインタフェースを除けばそこまでではないと思います。関係するのはcw/eventrarey.pyとcw/eventhandler.py、それとbreakflagで検索してくる数箇所だけではないでしょうか。

    やる気があれば、いっそ実装を進めてしまってもいいと思います。プレイヤーから見えない所で改造を進めていってある日カスタマイズ機能がドンと出現でもいいわけですし。

    私が追加した変な機能についてはリリース前にまとめとかないといけませんね……。

  3. takuto_cw

    実装難度については、実際にはインタフェースを除けばそこまでではないと思います。

    おおっ、そうですか。ではここは、言いだしっぺである自分がやってみます! もしかしたら後で「こういう処理をしたいのですが、どのへんのコードが参考になるでしょうか?」などと、質問に来るかもしれません。お時間が許すなら、お相手していただけると嬉しいです。

  4. k4nagatsuki reporter

    了解です。コメントでもメッセージでもいつでもお尋ねください。

    よろしくお願いします。

  5. takuto_cw

    現在、共通のイベントだけ手を入れた状態です。何をどうしたのか自分でも分からなくなりそうなので、進捗報告がてら変更点を貼り付け。eventhandler.pysetting.pysprite/statusbar.py。setting.py は、将来 Settings.xml から設定を読み込むようにしたいけど、今はまだ直に書いてます。

    こんな感じで、メッセージ表示中イベントなどもやっていこうかと(もっといいやり方をご存知の方がいらしたら、ぜひ教えてください)

    ところでリポジトリ所有者でなく、かつissueを立てた本人でもない場合、担当者変更の権限がないみたいです。自分が立てた issue では、右上に「解決」「ワークフロー」「編集」「添付」ボタンが出てきて、編集ボタンから担当者変更できそうなのですが(#77など)、この issue は添付ボタンしか出ません。イタズラ防止策??

  6. k4nagatsuki reporter

    管理者権限が必要なんでしょうか? とりあえず担当者割り当てしておきます。

    イベントハンドラのメソッド名の変更は結構色んな所に波及しますね。Pythonはコンパイルエラーは発生しないのでバグが生まれそうですが、名前をそのままにしてもコードがすっきりしない。

    歴史的経緯でこういう名前になってますという感じでメソッド名をそのままにしてしまってもいいとは思うのですが、これは難しい所です。全文検索して使用箇所を探すのを忘れないようにすれば大丈夫かもしれません。

  7. takuto_cw

    担当割り当て、ありがとうございます。

    メソッド名は……バグを作ってしまいそうだしそのままで行こうか悩んだものの、後から見た人(1年後の自分など)に分かりやすいことを優先して、思い切って変えてみました。

    変えたからには、バグらないよう念入りに検索しますね。(現時点で既に変更漏れがあるので、まずはそこからやっていきます)

  8. takuto_cw

    経過報告です。

    前回まで:
    まず(key:value) =(イベント:キー)という辞書を作る。起こりえないイベントを排除する(バックログ表示されていないのに、バックログ終了イベントが呼ばれるなど)方法として、辞書を分けてみた。

    問題点:
    Esc キーの様に、複数のイベントが関連づけられているキーがあるため、イベントとキーを結びつけた「だけ」ではまずい。想定外のイベントが優先されてしまう可能性がある(バックログを終了したいのに、カードワースの終了イベントが呼ばれるなど)。何らかの方法でイベントの優先順を決める必要がある。

    改善案1(ボツ):
    setting.xml での記述順=優先順として、OrderedDict を使う。あるいは辞書の key:value を、キー:(イベントのタプル。優先度高い順)にする。

    改善案1の問題点:
    イベント優先順はプログラム側で修正できた方が後々都合がいい。となると優先順はそもそも、setting.xml に格納しない方がいいんじゃないか。

  9. takuto_cw

    改善案2:
    setting.xml には イベント:キー の辞書だけ格納することとし、イベント優先順などの定義は全部、プログラム側で行う。イベント検出には、辞書と定義リストとを併用する方式で。

    案2だと「起こりえないイベントを排除」云々も、プログラム側での定義に組み込んでしまえるから、辞書を分ける必要もなくなる。

    案2を試しに実装したらこうなりました(パッチファイルなのでソースコードにあててください)。ついでにアルファベットと Ctrl, Alt キーも拾えるように。setting.xml とのデータやりとりは手付かずです。

    一応動くものにはなっていますが、至らないところが多々あることでしょう。こんないい方法があるだとか、バグを見つけたとか、何かお気づきの点がありましたら書き込みください。

  10. k4nagatsuki reporter

    いいですね、ちょっと試してみた限りでは問題なく動いています。キーとイベントの結びつけの再実装が出来上がったら、後は設定を加えるだけですね。

    一つ問題があるとすれば、それはダイアログ上での操作です。ダイアログはpygameではなくwxPython側で動いている世界なので、イベントハンドラ改造の影響を受けません。結構な数があるので、個別に手を入れるより統一的な仕組みを作りたいところですが……。

    別の話になりますが、こうした試験的な実装については、hg上でブランチを切って行うといいと思います。hgのリポジトリは、複数の異なるバージョンを同時並行で開発できるようにできています。もしご存じなかったら、調べてみてください。

    新機能開発用のブランチを用意しておけば、それらをpullするのもマージするのも楽々です。例えばTachiGigasさんはフォントに関する改造版を専用のブランチを作って行っています。

  11. takuto_cw

    テストとコメント、ありがとうございます。作った分は動いてくれてるようで、ほっとしました。

    イベントハンドラをいじり倒して、作業をかなり終わらせたつもりになっていましたが……そういえばダイアログ関連の記述は、あそこにありませんでしたね。wxPython側、と。

    こうした試験的な実装については、hg上でブランチを切って行うといい

    そんな方法があったとは。今までずっと pull するたびに、シェルフして戻して、とやってました。シェルフを知る前は手動でファイル退避してたり。便利な機能はちゃんと揃っているものですね~……教えていただいて、ありがとうございます。

  12. takuto_cw

    今回は自分のリポジトリに push してみました。

    前回まで:
    内部で設定したイベントとキーとの対応、イベント優先順等が、pygame での処理に反映されるようになった。

    今回やったこと:
    コンビネーションキーに手を出してみる(将来ショートカットキーでセーブできるようになるとしたら、やっぱり Ctrl + s 使いたいな、等と欲が出てきた)。ダイアログにも少し手をつけてみた。他こまごまと。

    今回わかったこと:
    Tab・矢印・Enter といったキーの検出&イベント発生は、wxpython 内部(という言い方でいいのだろうか)で既に定義されているらしい。

    そのままでは wxpython 内で処理されてしまうキー検出&イベント発生を、何とかして CWPy に横取りさせなきゃいけない。

    (上記キー以外なら、wx.EVT_KEY_DOWN をボタンにかたっぱしから Bind すれば検出できるはず。でも肝心の矢印キーのイベントが変えられないと、多分次のことができない。「宿が複数あると、キーボードだけではオープニングの宿選択画面から先に進めないのを直す」「キャラクター情報ダイアログにて、上下矢印キーでホールドするカードを選べるようにする」)

    既に一部のダイアログで使われている AcceleratorTable というのを用いれば、CWPy でのキー検出&イベント発生を行えるようになる。

  13. takuto_cw

    今後の予定:
    他のダイアログでも AcceleratorTable を使う方向で進めようかと思っております(何か問題や、もっといい方法などありましたら、ご指摘ください)。それが終わったら先送りしている setting ファイルの読み込み等。

    あと、興味持って見に来てくださった人たちにも分かるよう、パッチの当て方・ pull して動作確認する方法の説明も書く。前回自分で書いておいてなんですが「パッチをソースコードにあててください」では、知っている人しか実行できないですよね…。「動作テストに参加してみようかな」と来てくれた人が、置いてきぼりにならないよう、「やり方はこちら」というリンクが貼れるように。


    (今更だけどブランチの名前は、何のブランチかすぐ分かるものにした方が良かったかも)

  14. k4nagatsuki reporter

    見ました。CWで使うキーは限定されているし、キー操作はダイアログのダイアログ上のどこにカーソルが合っていようと効く必要があるので、たしかにAcceleratorTableですべてフックしてしまうのがよさそうです。

    動作方法ですが、ゼロからであればcloneするのが一番早いでしょうね。hg clone https://bitbucket.org/takuto_cw/cardwirthpy-reboot -b extensionでできるはず。自分でリポジトリを持っている人はpullすることになるでしょう。どちらもMercurialの一般的な使い方を調べればだいたい分かることかと思いますので、解説を探してリンクを貼るのがいいのではないでしょうか。

    ブランチ名はたしかに何のためのブランチか分かる名前にするのがいいです。gitだと試験的ブランチはSpikeとつけるのが一般的らしいけどhgはどうなんだろう……。

  15. takuto_cw

    さっそくレスありがとうございます(ああそうか、ボタンにバインドした場合、ボタンからカーソルが外れたら効かなくなるのか…)。では、 AcceleratorTable でいきます。にわか知識なもので、ホントに全部これにしていいのか不安でしたが、おかげさまで安心して取り組めます。

    解説も、別に自作しなくても、リンク貼らせてもらうという手がありましたね。良さそうなのがないか探してみます。ブランチ名は…今回のは公開してしまったので、次からで…。

  16. k4nagatsuki reporter

    pull request #359

    これまでほとんど欠けていたダイアログ上のキー操作を一気に追加しました。

    AcceleratorTableを設定している部分のパラメータを設定から引き出してくるようにすればカスタマイズ可能になるはずです。

  17. 暗黒 騎士

    キーボードでの操作なのですが、「カード解説文を見たりキャラクター情報ダイアログを開くキー」がPyにはないように思われます。

    CWではCtrl+リターンキーで出来ると1.20ヘルプに書いてあり、1.50においても有効なようでした。 一応自分の方でやったやつです。(へぼい)

    あとついでに\キーとBackSpaceキーでもEscキーの動作をするようです。Pyだと入力を含むダイアログがあるのであえてやってないのかもですが、情報ダイアログ系なら方向キーの近くにある利便性の方が勝るかなと。

  18. k4nagatsuki reporter

    ありがとうございます。コードを見させていただきました。

    • self.infokeyidの処理をするところとOnRightUpの処理をするところでfuncの内容が同じなので、CardControlのメソッド化して共有した方がよさそうです。
    • キーコード92を直に書いている所は、ord('\\')の方がいいかもしれません。

    全体としていい感じだと思います(_でも閉じるとは知らなかった)。よろしければPull Requestしていただけないでしょうか。

  19. Log in to comment