TOP


NewType テクニカルノート

2007年09月24日

ブログパーツNewTypeは、サイト記事をタイピングゲームにするブログパーツです。

今回、5年前に自作していたタイピングゲームをたまたま発掘し、 「よく出来てる!(自画自賛)」と思い、社内プレゼンを経てリリースとなりました。

以下、開発の際の技術情報です。

タイピング完了の際の日本語の音読には、以下のAPIを利用しています。
TEXT2VOICE

Flash上では、文節ごとにデータをArrayに保持する形で、イベント処理を行っています。
幾つか試行錯誤した点もありますので、以下に記します。

(1)タイプ順による文字列置換

今回簡易ですが、タイプ順による置換を実装しました。 例えば、tsu→tuといった変換を受け付けます。(まだ完全ではないので後ほど調整いたします)
合わせて補足ですが、本来、“ん”は“nn”で確定するのですが、“nn”直後の文字を、最初のnを打った後に打っても“ん”に確定されるので、特にサーバサイドで“n”を“nn”に置換することは行っていません。

置換処理は、以下の4ステップを行っています。

  1. タイプしたらタイプ前後3文字を取得して全リストと照合
  2. 該当している文字列のある配列があったらコピーして、以後3タイプ内のタイプの単一参照リストに
  3. タイプ文字のcharCodeが、リスト内の文字に適合したら破棄せず一文字削る(それ以外は破棄)
  4. リスト内に残った要素の最後の一文字までタイプ成功したら、該当文字列を全文字置換(処理を完了)

上記1で照合する全リストは、以下のような形で文字のグルーピングを行ってあります。

//文字のグルーピング
var typeSet:Array = [["shi", "si"], ["tsu", "tu"], ["jyo", "jo", "zyo"], ...];

5年前の処理では、文字ごとに3つの配列を用意し(日本語は最大で3タイプの変換があるため)、それを再起処理で回して3つの変数に取っておき分岐処理させる、という効率の悪い処理をしていました。
当時は外部テキストファイルを設定ファイルとしていましたので、以下のような設定の方が視認性に優れていたのだと思います。

//外部ファイルに書かれたリストが・・
&typeStr1=shi,tsu,jyo...&
&typeStr2=si,tu,jo...&
&typeStr3=,,zyo...&
//Flash上で配列に置換されていました
typeArr1 = ["shi", "tsu", "jyo", ...];
typeArr2 = ["si", "tu", "jo", ...];
typeArr3 = [,,"zyo", ...];
(2)AS3は文字列の置換が便利

タイプ文章の処理文字には,(コンマ)も含まれる場合があり、toString()で処理してしまうと不具合が起きます。

上記を受け、置換イベントがおきた場合、Arrayの文節データを特定キーワードでjoinさせた後、該当文字列で置換、Arrayの文節データに戻すという処理を行っています。
文字列の置換は、AS3で正式に実装されたRegExpクラスとStringクラスのreplaceを用いて一気に置換しています。

/**
 * 文字列置換(抜粋)
 */
var myPattern:RegExp = new RegExp(置換される文字列, "g");
str = _dat.arrr.join("|nt|");
result = str.replace(myPattern, 置換する文字列);
_dat.arrr = result.split("|nt|");
投稿者

  • Pagetop

BM11祉

  • BM11泣若剛荀