I Have two eyeballs in my head (so familiar)
−− 私達の頭には ふたつの目玉(それは おなじみ)
何はともあれ、文字入力ができないと話になりません。 WSの貧弱な入力デバイスで、何とかなるんでしょうか? とりあえず、メジャーな入力方法を検討してみます。
画面上にキーボードを表示し、カーソルで選んで入力する方法です。 実装は一番簡単でしょう。問題は入力効率の悪さと、スペースを喰うことです。
ドラクエIIの復活の呪文の入力は面倒だったなー。という訳で、この案は却下です。
といっても、僕は携帯もPHSも持ってないので、最近の方式は知りません。 ここで言っているのは、例えば「ク」を入力するときにカ行のボタンを3回押す、 という方法です。
実装は割と楽でしょう。問題はキーの数です。 WSのキーはSTARTとSOUNDを除いても10個ありますから、日本語の子音は ひととおり収まるんですが、濁点や記号、英数モード切り替え、 さらに最終的には漢字変換などのキーも必要になるので、やはり足りません。 多段シフトを導入すれば何とかなるんですが、キーストロークが 多くなりすぎるなあ。ソフトウェアキーボードよりはましだけど。
タッチパネルがあればなあ。
Graffiti(スペル違う?)やUnistrokeといった一筆書き文字をカーソルで 入力できないかなー、と思ったんですが、やっぱり無理そうです。 実装も面倒だし。という訳で却下。
冗談だよ。
メジャーなのはだめでした。ってゆーか、メジャーなもの作ってもつまらん。
パイメニュー(pie menu)とは、項目が丸く並んでいるメニュー方式の こと……だと思います。カスケードされている場合、項目を選ぶとその項目を 中心として、サブメニューが表示されます。
増井俊之氏がUNIX MAGAZINE(アスキー)で連載している「インターフェースの街角」 に書いてあったような……記憶違いかな、見つからないなあ。 そういえば「FreeBSDカーネル入門」(アスキー)にも書いてあったはず。 これも行方不明。
パイメニューは、ポインタの移動量でなく移動方向で選択する、という 特徴があります。そのため、カスケードされたメニューの選択は 一筆書きのような感じになり、慣れると項目を見ずに選択できるのだと思います。 本来はペン型デバイスのための方式なのではないでしょうか。
しかし、メニュー形式でもあるので、慣れないうちはメニューを見ながら ゆっくり選ぶこともできます。 よく使う項目は、そのうち見ずに選択できるようになるのでしょう。
光栄の昔のゲーム(三国志とか)はほとんどのコマンドがメニューをテンキーで選ぶ、 という方式でしたので、やり込むうちに指がコマンドを覚えたという人も 多いと思います。あの感覚に近いんじゃないかなあ。閑話休題。 方向を入力するだけならカーソルキーで可能です。というわけで、 パイメニューとカーソルキーによる文字入力を実装してみることにしました。
ローマ字のほうがキーは少くてすむのですが、キーボードならともかく、 今回はキーストロークが多くなりすぎるので、 かな入力の線で検討してみることにしました。
基本方針は次の通りです。
WSのカーソルキーは斜めが入れにくいので、4方向に限定しようかとも思ったのですが、 階層が深くなるのでやめました。そのかわり、母音の選択は4方向+真ん中にして、 斜めを使わないことにします。 問題は真ん中の扱いです。ペンを使う場合はアンタップにより選択できますが、 カーソルの場合はねえ…? 最初は一定時間キーを離したら真ん中選択というのも考えたのですが、 タイミングの調整が難しそうなので却下。Aボタンを押したら真ん中、という ことにしました。
次にトップメニューですが、8方向では子音がすべて入りません。 とりあえずシフトキーを追加して、単純に2倍してみると…なんか、 今度はずいぶん余るなあ。
ちなみに、シフトキーはAボタンで兼用します。
よく数えてみると、8方向x2状態だと濁音、半濁音用の子音も入ることに気づきました。 そこで、つぎの基本方針を追加します。
どこかに「ゃゅょっ」を入れておけばいいかな…と考えていたのですが、 サブメニューの斜めが余っていることに気付きました。 前述の通り、押しにくいから空けておいたのですが、 キーストロークが増えるよりはいいか、ということで、 サブメニューの斜めは拗音に決定。
促音と撥音はどーしよーもないので、どっかに入れときましょう。
配置をひととおり紙に書いたところで、実際にWSのボタンを押してみると、 右上が押しにくいことが発覚。左手で押すから、遠いんだよね。
さすがにトップメニューの右上を削ると項目が足りないのでそれは 我慢してもらうとして、サブメニューの右上を全部空けました。
ってゆーか、もともと上からClockwiseに割りふった結果 左上が空いていたのを、Counter-Clockwiseに直したんだけどね。
もっとも、単にあいているのももったいないので、空いているところを選んだら、 サブメニューのキャンセル、ということにしました。
前節での基本方針をもとに*適当に*割り振ったあと、空いているところに 一部の記号やら、「ファ、フィ、フェ、フォ」やらを放りこんで表にしました。 真ん中の表がトップメニュー、その周りがサブメニューです。
ただしこの表は、実装して実際に文字を入力してみながらいくつか 変更したもので、初期バージョンとはやや異ります。 たとえば、トップメニューで右上を選んだ場合、サブメニューでは 右上より左下のほうが押しにくいので、左下をあけてあります。
|
|
|
|||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||
|
|
|
|
|
|
|||||||||||||||||||||||||||
|
|
|
|||||||||||||||||||||||||||
|
|
|
詳しくはソースを読んで……といいたいところですが、それじゃあんまりだし、 試行錯誤の結果かなり汚ないソース(いつものことだが)になっているので、 問題となったところをいくつか書いてお茶を濁しておきます。
やっぱり斜めは入らなかった。どうしても縦か横が先に入ってしまうんですね。 試行錯誤の結果、次のようなアルゴリズムになりました。
すべてのキーが離されるまで入力が確定しないので、縦・横が同時に入らなくても 大丈夫ですが、キーを離したときは両方同時に離れないので、 結局縦か横が入ってしまいます。そこでカウンタをつけて、縦と横のキーの 時間差を吸収します。
高速に入力する場合、シフトキーはカーソルキーと同時に押すような感覚になります。 そこで、シフトとカーソルのどちらが先に入ってもいいようにしなければなりません。 そこで、カーソルキーが押された状態でも、シフトキーの状態が変わったらシフト状態 が変化するようにしたのですが、これだとカーソルとシフトを同時に離さなければ いけません。しかし、これが以外と難しいんですね。
結局、シフトキーはレベルセンスでなくトリガ扱いにしました。 シフトキーを押すたびに、通常状態とシフト状態がトグルします。 この方式は、実際に使ってみると、
思ったよりサブメニューキャンセルは重要っぽい。というわけで、 Bボタンでキャンセルできるように変更。 Bボタンは漢字変換キーにするはずだったんだけど、まあ兼用で問題ないでしょ。
とりあえず100文字くらい打ってみましたが……これでメール書きたくはないなあ。 一筆書きで入力という感じじゃないのは、メインメニューを選んだあと、 いちどキーを離さなければいけないからだと思います。ただ、この仕様でないと、 逆に「メニュー」としての使い勝手が悪くなると思うんですよね。
でもまあ、2ないし3ストロークで1文字打てる(斜めを1ストロークと数えていいかは 疑問ですが…)ので、慣れれば毎秒1.5文字位は打てる…といいなあ。
ソフトウェアキーボードより速いのは確かです。 携帯電話式よりも速いとは思うんだけど、こっちの方が神経は使うかも知れない。 Graffitiのローマ字入力よりは…遅いか?
カタカナと英数の入力:最初は英数/かな切り替えキーとCAPSLOCKの予定 だったんだけど、キーが足りなそうなので、モード切り替えキーで かな→カナ→英数記号と切り替える予定。英数の大文字/小文字はシフトキーで。 プログラム自体はメニューデータを増すだけなんで簡単だろう。 英数の配置をどうするかが問題かな。
配置の最適化:現在は、ほぼ50音順に並んでいるけど、本当は出現頻度の低い文字を シフト状態や斜めの項目に割りつけるべきなんだろうなあ。 でも出現頻度表持ってないし。 あと、トップメニューはともかく、サブメニューは子音ごとに母音の配置が変わると、 覚えるのが大変だと思うので、どうかなあ。
ひらがなの入力、1文字削除しかできない役立たずです。