図1を参照して、この発明に係る圧電ブザー素子を用いる入力装置の一利用例である体感卓球ゲーム装置10は、ゲーム機12を含み、このゲーム機12には、ACアダプタ14によって直流電源が与えられる。ただし、それは電池16に代えられてもよい。ゲーム機12は、さらに、AVケーブル22を通して、テレビジョンモニタ20のAV端子18に接続される。
ゲーム機12は、また、ハウジングを含み、このハウジング上に電源スイッチ24が設けられるとともに、操作キー26および28が設けられる。選択キー26は、たとえばテレビジョンモニタ20の表示画面上においてメニューやゲームモード選択のためにカーソルを移動させたりするために用いられる。決定キー28はゲーム機12への入力を決定するために用いられる。ただし、図示しないキャンセルキーが、ゲーム機12への入力をキャンセルするために、設けられてもよい。
ゲーム機12にはさらに、赤外線受光部30が設けられていて、この赤外線受光部30は、後述のラケット型入力装置32の赤外線LED34からの赤外線信号を受ける。
この実施例では、2つのラケット型入力装置32が用いられる。それぞれのラケット型入力装置32には赤外線LED34が設けられるとともに、サーブスイッチ36が設けられる。サーブスイッチ36は、卓球ゲームにおいてサーブを打つときに操作されるものである。また、上述のように、赤外線LED34からの赤外線信号がゲーム機12の赤外線受光部30によって受光される。後に説明するように、ラケット型入力装置32には、加速度センサとして利用される圧電ブザー素子が設けられていて、ゲーム機12はその圧電ブザー素子からの加速度相関信号を受信して、図2に示すゲーム画面上のボール38に変化を与える。
図2を参照して、体感卓球ゲーム装置10におけるテレビジョンモニタ20で表示されるゲーム画面は、対戦型ゲームのとき、上下2つの画面に仕切られ、上側に一方のゲームプレイヤからみた画像が、下側に他方のゲームプレイヤからみた画像が、それぞれ表示される。上下いずれにも、ボール38および選手キャラクタ40がスプライト画像として、そしてネットキャラクタ42およびテーブルキャラクタ44が、テキストスクリーンとして表示される。また、上下いずれの側にも、該当するゲームプレイヤのスコアを表示するスコア表示部46が形成される。
この体感卓球ゲーム装置10では、ゲーム画面上に表示されたボール38の移動タイミングに合わせてラケット型入力装置32をゲームプレイヤが実際に振ったとき、ゲームプロセサが、圧電ブザー素子からの加速度相関信号を、赤外線LED34から赤外線受光部30へ伝達される赤外線信号によって検出し、たとえばラケット型入力装置32が所定の移動速度に達したタイミングとボール38の画面上での位置とに従って、あたかもボール38がラケットにはじき返されたように、ボール38をテーブル44の相手側方向に向かって移動させる。ボール38が移動した位置に応じて、アウトかインか等を識別する。ただし、ラケット型入力装置32を振ったタイミングとボール38の画面上での位置とにずれがある場合には、たとえば空振りとして認識する。
図3を参照して、ラケット型入力装置32は、上述のように、赤外線LED34およびサーブスイッチ36を含み、さらに加速度センサ回路48を内蔵している。加速度センサ回路48は、後述の図5に示すように圧電ブザー素子66とその関連回路を含み、この加速度センサ回路48からの加速度相関信号がMCU50に与えられる。MCU50は、たとえば8ビットの1チップマイコンであり、圧電ブザー素子からの加速度相関信号をディジタル信号に変換して赤外線LED34に与える。
2つのラケット型入力装置32のそれぞれの赤外線LED34からのディジタル変調された赤外線信号は、ゲーム機12の赤外線受光部30によって受光されかつディジタル復調されてゲームプロセサ52に入力される。このディジタル信号の1ビットがスイッチ36のオンまたはオフに応じて「1」または「0」として伝送され、したがって、ゲームプロセサ52は、そのビットをチェックすることによって、どちらのゲームプレイヤからサーブが打ち込まれたか判別することができる。
ゲームプロセサ52としては、任意の種類のプロセサを利用できるが、この実施例では、本件出願人が開発しかつ既に特許出願している高速プロセサを用いる。この高速プロセサは、たとえば特開平10−307790号公報[G06F13/36,15/78]およびこれに対応するアメリカ特許第6,070,205号に詳細に開示されている。
ゲームプロセサ52は、図示しないが、演算プロセサ,グラフィックプロセサ,サウンドプロセサおよびDMAプロセサ等の各種プロセサを含むとともに、アナログ信号を取り込むときに用いられるA/Dコンバータやキー操作信号や赤外線信号のような入力信号を受けかつ出力信号を外部機器に与える入出力制御回路を含む。したがって、赤外線受光部30からの復調信号および操作キー26−28からの入力信号がこの入出力制御回路を経て、演算プロセサに与えられる。演算プロセサは、その入力信号に応じて必要な演算を実行し、その結果をグラフィックプロセサ等に与える。したがって、グラフィックプロセサやサウンドプロセサはその演算結果に応じた画像処理や音声処理を実行する。
プロセサ52には、内部メモリ54が設けられ、この内部メモリ54は、ROMまたはRAM(SRAMおよび/またはDRAM)を含む。RAMは一時メモリ,ワーキングメモリあるいはカウンタまたはレジスタ領域(テンポラリデータ領域)およびフラグ領域として利用される。なお、プロセサ52には外部メモリ56(ROMおよび/またはRAM)が外部バスを通して接続される。この外部メモリ56にゲームプログラムが予め設定される。
プロセサ52は、赤外線受光部30や操作キー26−28からの入力信号に従って上記各プロセサで演算、グラフィック処理、サウンド処理等を実行し、ビデオ信号およびオーディオ信号を出力する。ビデオ信号は前述の図2に示すテキストスクリーンとスプライト画像とを合成したものであり、これらビデオ信号およびオーディオ信号は、AVケーブル22およびAV端子18を通して、テレビジョンモニタ20に与えられる。したがって、テレビジョンモニタ20の画面上に、たとえば図2に示すようなゲーム画像が、必要なサウンド(効果音、ゲーム音楽)とともに、表示される。
この体感卓球ゲーム装置10では、簡単にいうと、ゲーム機12すなわちゲームプロセサ52は、2つのラケット型入力装置32からの赤外線信号に含まれる加速度データを受け、ラケット型入力装置32の移動加速度がピークに達したとき、ボール38(図2)の移動パラメータを決定し、そのパラメータに従って、ゲーム画面上で、ボール38を移動させる。
ラケット型入力装置32は、図4に示すように、グリップ部分58とそのグリップの先端から延びる打球部分ないしラケット面部分60とを含み、これらグリップ部分58およびラケット面部分60は、たとえば2つ割りのプラスチックハウジングによって一体的に形成される。
ラケット型入力装置32のプラスチックハウジングのラケット面部分60の内部には、2つ割りハウジングを互いに接合するためのボス62およびボス64が形成され、ボス62にはさらに加速度センサ回路48(図3)を構成する圧電ブザー素子66が固着される。圧電ブザー素子66は、よく知られているように、金属板68上に貼付されたセラミック板70を含み、金属板68とセラミック板70上の電極との間に電圧を印加するとブザー音を発生するというものである。この発明では、このような構成の圧電ブザー素子66を加速度センサとして利用するものである。つまり、セラミック板70は、圧電セラミックであり、その圧電セラミックに応力が作用したとき、圧電セラミックから電気信号が発生することがよく知られている。そこで、この発明では、金属板68と上記電極との間で、圧電ブザー素子66すなわちラケット型入力装置32の移動に応じてセラミック板70で発生する電気信号を取り出す。ただし、この実施例では、後述のように、電気信号に従って所定のディジタル信号処理をすることによって、MCU50に、加速度相関ディジタル信号またはデータを取り込むようにしている。
さらに、下側のハウジング内にはさらにボス72が形成され、そのボス72にプリント基板74が取り付けられる。プリント基板74上には、サーブスイッチ36が装着されるとともに、図3に示すMCU50が装着される。下側ハウジングにはさらにボス76が形成され、このボス76にはLED基板78が固着され、このLED基板78に赤外線LED34が取り付けられる。
図5を参照して、先に説明した圧電ブザー素子66は、加速度センサ回路48に含まれる。また、MCU50には、外付けの発振回路80が設けられ、MCU50は、この発振回路80からのクロック信号に応答して動作する。
そして、MCU50は、矩形波信号を出力ポート0から出力し、たとえば10kΩの抵抗82を通して、圧電ブザー素子66の一方電極66aに印加する。圧電ブザー素子66の電極66aは、たとえば0.1μFのようなコンデンサ84を介して接地される。電極66aにはまたダイオード回路86が接続されていて、それによって電圧の変動幅が一定以内になるようにされている。
圧電ブザー素子66の他方の電極66bは、MCU50の入力ポート0に接続されるとともに、ダイオード回路88に接続され、それによって電圧の変動幅が一定以内になるようにされている。なお、圧電ブザー素子66の2つの電極66aおよび66bは、たとえば1MΩのような比較的高抵抗90で電気的に分離されている。
図6(A)に示す矩形波信号が圧電ブザー素子66の電極66aに印加されると、MCU50の入力ポート0には、コンデンサ84の充放電に伴って、図6(B)のような三角波信号が入力される。ただし、矩形波信号の大きさ(波高値)および三角波信号の大きさ(波高値)は、ダイオード回路86および88によってそれぞれ決まる。
ラケット型入力装置32(図4)が静止しているとき、すなわち、変位されていないとき、図6(B)の左端に示すように、三角波信号のマイナス(負)側レベルは変化しない。しかしながら、ラケット型入力装置32が操作者によって三次元空間内で変位されると、その変位に伴なう圧電効果によって、圧電ブザー素子66に電圧が生じる。この加速度相関電圧は、三角波信号のマイナス側レベルをバイアスする。したがって、ラケット型入力装置32が変位されると、その変位加速度の大きさに応じたレベルの加速度相関電圧が圧電ブザー素子66に生じ、したがって、MCU50の入力ポート0に入力される三角波信号のマイナス側レベルが図6(B)に示すように、加速度相関電圧92のレベルに応じて変動する。
MCU50は、後述のように、このような三角波信号のマイナス側レベル変動を加速度データに変換し、その加速度データに応じてLED34を駆動する。
ここで、図7および図8を参照して、図1実施例の体感卓球ゲーム装置10の概略動作を説明する。図1に示す電源スイッチ24をオンしてゲームスタートとなるが、図2に示すゲームプロセサ52は、まず、ステップS1で初期化処理を実行する。具体的には、システムおよび各変数を初期化する。
その後、ゲームプロセサ52は、ステップS2で画像信号を更新してモニタ20に表示される画像を更新する。ただし、この表示画像更新は、1フレーム(テレビジョンフレームまたはビデオフレーム)毎に実行される。
そして、ゲームプロセサ52は、ステート(状態)に応じた処理を実行する。ただし、最初に処理するのは、ゲームモードの選択である。このゲームモード選択では、操作者ないしゲームプレイヤは、図7のステップS3で、図1に示す選択キー26を操作して、1人プレイモードまたは2人プレイモードあるいはシングルスモードまたはダブルスモードを選択するとともに、ゲームの難易度等を設定する。
実際の卓球ゲームは、サービスからラリーへ移行するが、サービスのためには、ボール38(図2)ゲーム画面内でをトスする必要がある。そこで、ゲームプロセサ50は、ステップS4でトス前の処理を実行し、ついでステップS5で、トス処理を実行する。つまり、トス前処理でサーブスイッチ36が押されれば、トス処理に移行し、トス処理においてラケット型入力装置32のスイングが行われなかった場合には、トス前処理に戻る。そして、トス処理中にラケット型入力装置32のスイングが行われた場合には、その後、ステップS6でのラリー処理に移行する。そして、ラリー処理においてポイントが確定すると、次のステップS7でのポイント処理に移る。また、ポイント処理において、そのポイントがゲーム終了条件を満たしたか満たさなかったかによって、ゲームモード選択(S3)あるいはトス前処理(S4)に戻ることになる。
なお、図7に示すように、ステップS5でのトス処理の後、およびステップS6でのラリー処理の後、ステップS8で、ラケット型入力装置32からの加速度データに従ってボール38(図2)をゲーム画面内で変位させるために、ボール38の座標演算処理を実行する。
その後、ビデオ同期信号による割り込みがあれば、ステップS2(図7)の画像更新を実行する。また、ステップS9の音声処理は、音声割り込みが発生したとき実行され、それによってゲーム音楽や打球音のような効果音を出力する。その音声処理以外の割り込みが発生したとき、図7のステップS10で、ゲームプロセサ52は、赤外線受光部30から入力される赤外線信号(コード)を受信する。
図9を参照して、この図9はMCU50の全体動作を示し、この最初のステップS11では、MCU50は、後に説明する検出オフセット値,オフセットカウンタ等のMCU50が取り扱う変数を初期化するとともに、入力ポートおよび出力ポート(図5)を初期化する。
その後、ステップS12の加速度検出処理(後に詳述)を経て、ステップS13で、MCU50は、ラケット型入力装置32が第1プレイヤのものかどうか判断する。MCU50の特定の入力ポートが「1」に設定されていれば第1プレイヤであり、「0」なら第2プレイヤであるので、このステップS13ではMCU50のその特定の入力ポートをみればよい。そして、ステップS13で“YES”の場合、すなわち、第1プレイヤの場合ステップS14で、“NO”の場合、すなわち、第2プレイヤの場合ステップS15で、それぞれ、送信ステートであるかどうか判断する。
MCU50は、図示しないが、ステートカウンタをソフトウェアカウンタとして有していて、このステートカウンタが一定値になる毎に、送信ステートとなる。したがって、ステップS14およびS15では、このステートカウンタが一定値になったかどうかを検出することになる。ステップS14またはS15で“NO”の場合には、ステップS16で送信コードを「0」とし、またはステップS14またはS15で“YES”の場合にはそのまま、ステップS17のコード送信処理(後に詳述)に進む。ステップS17でコード送信処理を実行した後に、ステップS18でステートカウンタ(図示せず)をインクリメント(+1)してステップS12に戻る。なお、後述のように、コード送信処理は、ビットシリアルに行われるが、その必要時間は、数マイクロ秒程度と極めて短時間である。
図10が図9のステップS12を詳細に示すフロー図であり、この加速度検出処理の最初のステップS21では、MCU50は、レジスタ(図示せず)に設定されている検出オフセット値をオフカウンタ(図示せず)にコピーする。「検出オフセット値」は、図6(A)に示す矩形波判断のハイレベルおよびローレベルを、圧電ブザー素子66に電圧が発生していないときに、時間的に等分に入力するための値であり、動作スタート時にはこの検出オフセット値は任意のデフォルト値に設定されている。
ステップS21に続くステップS22では、MCU50は、その出力ポート0に「1」を設定する。つまり、「1」すなわちハイレベルを出力する。ついでステップS23で、MCU50は、入力ポート0からデータを読込む。
ステップS24では、ステップS23で読込んだ入力ポート0のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS25で、MCU50は、積算カウンタ(図示せず)をインクリメント(+1)する。「積算カウンタ」とは、ハイレベルを読み取った期間を算出するためのカウンタであり、当該入力ポートが「1」またはハイレベルのときにインクリメントされ、「0」のときにはなにもされない。
ステップS25で積算カウンタをインクリメントした場合、またはステップS24で“NO”を判断した場合には、続くステップS26で、MCU50は、オフセットカウンタをインクリメントし、次のステップS27でそのオフセットカウンタのカウント値が規定値に達したかどうか判断す。つまり、ステップS22で出力ポート0に「1」をセットした後、このステップS27で“NO”が判断される限り、MCU50は、出力ポート0の「1」を継続して出力する。
そして、このオフセットカウンタのカウント値が規定値に達したとステップS27で判断した場合には、次のステップS28で、MCU50は、その出力ポート0に「0」すなわちローレベルをセットする。次のステップS29では、MCU50は、レジスタに設定されている検出オフセット値をオフカウンタにコピーする。
続くステップS30では、MCU50は、入力ポート0からデータを読込む。ステップS31では、ステップS30で読込んだ入力ポート0のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS32で、MCU50は、積算カウンタをインクリメント(+1)する。
ステップS32で積算カウンタをインクリメントした場合、またはステップS31で“NO”を判断した場合には、続くステップS33で、MCU50は、オフセットカウンタをディクリメント(−1)し、次のステップS34でそのオフセットカウンタのカウント値がゼロに達したかどうか判断す。つまり、ステップS28で出力ポート0に「0」をセットした後、このステップS34で“NO”が判断される限り、MCU50は、出力ポート0の「0」を継続して出力する。
そして、ステップS34で“YES”が判断されたとき、すなわち、オフセットカウンタがゼロ(0)になったとき、続くステップS35において、MCU50は、積算カウンタのカウント値から中間値を引いて、差分を求める。ここで、「中間値」とは、ステップS27からステップS23に戻るハイレベル検出のための繰り返し数およびステップS34からステップS30に戻るローレベル検出のための繰り返し数の合計回数を「N」とした場合の「N/2」である。このステップS35で中間値を使って差分値を求めるのは、理想的な圧電ブザー素子でかつどんな加速度相関電圧も圧電ブザー素子に発生していない状態でのハイレベルとローレベルとの期間の比(デューティ50%)を加速度決定の基準とするためである。
詳しく述べると、積算カウンタは、上述のように、「1」またはハイレベルを入力ポート0に読込んだ回数であり、理想的な圧電ブザー素子でありかつ電圧が発生していない場合、ステップS35での「積算カウンタ−中間値」の差分はゼロになるはずである。しかるに、圧電ブザー素子66に何らかの電圧が発生している場合には、その差分として有意な数値が得られる。そこで、ステップS36で、この差分値に従ってラケット型入力装置32の変位加速度を決定する。基本的には、差分値データに所定の係数を掛けたものが加速度データとなる。
その後、ステップS37で、ステップS35で求めた差分値に基づいて、検出オフセット値を補正する。つまり、初期状態ではゲームプレイヤないし操作者はラケット型入力装置32をスイングしていないので、圧電ブザー素子66には加速度相関電圧は発生していない。それにも拘わらずステップS35でゼロではない差分値が検出されたということは、ステップS21で設定していた検出オフセット値が、そのラケット型入力装置に用いた圧電ブザー素子の特性からみて、正しくなかったことを意味している。つまり、圧電ブザー素子が理想的な圧電ブザー素子ではないことを意味している。そこで、このような場合、圧電ブザー素子の個々の特性の理想的な圧電ブザー素子の特性からのずれを補正するために、ステップS37で差分値に従って検出オフセット値を補正するようにしている。
他方、ステップS37で必ず検出オフセット値を変更または補正するようにすれば、圧電ブザー素子が実際に加速度相関電圧を発生した結果の差分値であっても検出オフセット値を補正することになる。しかしながら、圧電ブザー素子の電圧発生期間は他の期間に比べて非常に短い。そのために、ステップS37を差分値検出の都度実行しても特に問題はない。すなわち、、実際の卓球ゲームの開始時には適正な補正が行われているので、その後、ステップS37を加速度検出の都度実行しても検出オフセット値に大きな変動を生じることがなく、したがって、実際の卓球ゲームに何の支障もない。
次のステップS38では、MCU50は、入力ポート1からキースイッチすなわちサーブスイッチ36からの値「1」か「0」を読み込み、続くステップS39では、MCU50は、そのキースイッチ36からの値と先のステップS36で決定したラケット型入力装置32の変位加速度または移動加速度に基づいて、さらにパリティビットを付加して、送信コードを算出し、メインルーチンのステップS13(図9)にリターンする。
ここで、図11を参照して、ステップS17(図9)でのラケット型入力装置32からゲームプロセサ52へのコード送信について説明する。最初のステップS41では、MCU50は、ステップS12またはS16で作成した送信コードをテンポラリデータレジスタ(図示せず)にコピーする。そして、その最上位ビットが「1」かどうか判断する。最上位ビットが「1」であれば、ステップS42で“YES”が判断され、続くステップS43では、MCU50は、出力ポート1に「1」をセットしてLED34(図5)をオンする。その後、ステップS44で一定の待機時間の経過を待つ。ただし、ステップS42で“NO”なら、つまり最上位ビットが「0」であればそのまま、ステップS44に進む。
ステップS44で規定待機時間経過した後、ステップS45で、MCU50は、出力ポート1に「0」をセットし、LED34をオフする。その後、ステップS46で一定の待機時間の経過を待つ。
ステップS46で規定待機時間経過した後、ステップS47で、MCU50は、1ビット左シフトし、送信済みビットを最下位ビットとする。つまり、ビットシリアル送信のために、送信ビットを入れ替える。そして、ステップS48で、全ビットの送信が完了したかどうか判断する。“NO”ならステップS42に戻りろ、“YES”なら終了して、図9に示すステップS18に進む。
ここで、図12を参照して、図7のステップS10で示すゲームプロセサ52によるコード受信処理について説明する。このコード受信処理は、タイマ割り込みによって処理するため、最初のステップS51では、ゲームプロセサ52は、タイマ割り込みがあるかどうか判断する。“NO”ならステップS52でタイマ割り込みを設定して、“YES”ならそのまま、ステップS53に進む。
ステップS53では、ゲームプロセサ52は、メモリ54(図3)内にコード受信用のテンポラリデータ領域を確保する。そして、次のステップS54で、赤外線受光部30からの出力信号が入力される入力ポートのデータを読込む。次のステップS55では、ゲームプロセサ52は、テンポラリデータを右シフトし、ステップS54で読込んだデータをそのテンポラリデータの最下位ビットとする。
その後、ステップS56で全ビットの受信を完了したかどうか判断し、“NO”ならステップS57で次のタイマ割り込みを待機する。“YES”なら、ステップS58でタイマ割り込みを解除して、ステップS59で、テンポラリデータを受信コードとしてコピーする。ゲームプロセサ52は、この受信コードを用いて図7のゲーム処理を実行する。
先の図7に示すように、ステップS3でゲームモードを選択した後、ゲームプロセサ52は、次のステップS6で、「トス前」処理を実行する。このトス前処理は、具体的には、図13に示すフロー図に従って実行される。
トス前処理の最初のステップS61では、ゲームプロセサ52は、サーバ側プレイヤの受信コードから、キースイッチすなわちサーブスイッチ36(図1)の状態を検出する。そして、そのステップS36がオンされているかどうか、つまりキースイッチコードが「1」かどうかステップS62で判断する。
スイッチ36が押されているといことは、そのラケット型入力装置を使っているプレイヤがサーブをしなければならないことを意味し、したがって、ゲームプロセサ52は、次のステップS63で、「トス中」処理で実行されるボール38(図2)の投げ上げ(トス)のために、ボールの各軸速度Vx,Vy,Xzを決定する。その後、ステップS64でステートを「トス中」に移行させる。
「トス中」処理は、具体的には、図14で示すフロー図に従って実行される。すなわち、最初のステップS71では、ゲームプロセサ52は、トスされたボールの各軸座標Px,Py,Pzをチェックし、その座標に基づいて、ステップS72において、ボールの位置がサービス(サーブ)可能な範囲を超えたかどうか判断する。たとえば、Z軸位置すなわちボール高さが一定値以下になればサーブできないので、ボールがそのような予め設定しているサーブ可能範囲を超えたかどうか判断する。
ステップS72で“YES”が判断されると、つまりボールがサーブ可能範囲外にあれば、次のステップS73で、ゲームプロセサ52は、トスしたボールの各軸座標をトス前の状態に戻して、続くステップS74で、ステートを再び「トス前」に移行させる。
ステップS72で“NO”が判断されると、つまりボールがサーブ可能範囲内にあれば、次のステップS75で、ゲームプロセサ52は、サーバ側プレイヤのラケット型入力装置から送られてくるコードから、当該入力装置のラケット面60(図4)に垂直な方向の変位加速度を検出する。そして、ステップS76で、ステップS75で検出した現在の加速度が図示しないレジスタに保留されている保留値より小さくなったかどうか判断する。ラケット型入力装置32のスイングの初期においては、この保留値はごく小さく、したがってステップS76では“NO”が判断される。この場合、ステップS77で、現在加速度を保留値に置き換え、加速度保留値を更新する。
逆にステップS76で“YES”が判断されるということは、その時点でラケット型入力装置の加速度がピークに達したことを意味し、ステップS78において、ゲームプロセサ52は、その時点でサーブが行われたとみなし、ラケット型入力装置の加速度保留値に基づいて、サービス時のラケット(ラケット型入力装置)の速度を決定する。
そして、ステップS79において、ゲームプロセサ52は、そのときのボールの各軸座標と、ステップS78で求めたラケット速度とによって、サーブ後のボールの各軸初速度Vx,Vy,Vzを計算し、ステップS80でステートを「ラリー中」に移行させる。
「ラリー中」処理は、具体的には、図15で示すフロー図に従って実行される。すなわち、最初のステップS81では、ゲームプロセサ52は、サーブで打ち込まれたボールの各軸座標Px,Py,Pzをチェックし、その座標に基づいて、ステップS82において、ボールの位置がレシーブ可能な範囲に達したかどうか判断する。このステップS82では、ボールが予め設定しているレシーブ可能範囲に入ってきたかどうか判断する。このステップS82で“NO”なら、終了する。
ステップS82で“YES”が判断されると、つまりボールがレシーブ可能範囲内に入ってきたのであれば、次のステップS83で、ゲームプロセサ52は、ボールがレシーブ可能範囲をオーバーしたかどうか判断する。上述のようにレシーブ可能範囲として予め一定の各軸X,Y,Zの範囲を設定していて、この範囲内でレシーバ側のプレイヤがボールを打ち返せるものとしている。したがって、ステップS82およびS83では、ゲームプロセサ52は、ボールがそのようなレシーブ可能範囲内にあるかどうか判断していることになる。
ステップS83で“YES”を判断したとき、すなわち、ボールがレシーブ可能範囲に一旦は入ったものの何の処理もされないまま再びレシーブ可能範囲外へ出ていった場合には、ステップS84で「レシーブミス」を確定し、次のステップS85でステートを「ポイント処理」に移行させる。
ステップS83で“NO”が判断されると、つまりボールがレシーブ可能範囲内にあれば、次のステップS86で、ゲームプロセサ52は、レシーバ側プレイヤのラケット型入力装置から送られてくるコードから、当該入力装置のラケット面に垂直な方向の変位加速度を検出する。そして、ステップS87で、ステップS86で検出した現在の加速度が図示しないレジスタに保留されている保留値より小さくなったかどうか判断する。ラケット型入力装置32のスイングの初期においては、この保留値はごく小さく、したがってステップS87では“NO”が判断される。この場合、ステップS88で、現在加速度を保留値に置き換え、加速度保留値を更新する。
逆にステップS87で“YES”が判断されるということは、その時点でレシーバ側のラケット型入力装置の加速度がピークに達したことを意味し、ステップS89において、ゲームプロセサ52は、その時点でレシーブが行われたとみなし、レシーブ側のラケット型入力装置の加速度保留値に基づいて、レシーブ時のラケット(ラケット型入力装置)の速度を決定する。
そして、ステップS90において、ゲームプロセサ52は、そのときのボールの各軸座標と、ステップS89で求めたラケット速度とによって、レシーブ後のボールの各軸初速度Vx,Vy,Vzを計算し、ステップS91でレシーバとなるプレイヤを交代させる。つまり、レシーブが成功した場合、今度は他方のプレイヤのラケット型入力装置からのデータをレシーバ側データとして取り扱う。
図7に示すように、ステップS5のトス中処理が終了した後、またはステップS6のラリー中処理が終了した後には、ステップS8で示すボール座標演算処理に進む。このボール座標演算処理は、具体的には、図16のフロー図に従って実行される。
最初のステップS101では、ゲームプロセサ52は、そのときのボールの各軸座標Px,PY,Pzをチェックし、続くステップS102では、ゲームプロセサ52は、ボールのY軸座標がテーブル44(図2)のテーブル面のY軸座標と等しいかどうか、つまりボール38がテーブル44の面上に達したかどうか判断する。この判断において“NO”なら、ボールはまだ空中を移動中であることを意味し、ステップS103に進む。
ステップS103では、ゲームプロセサ52は、ボールの位置がネット42の接触範囲かどうか判断する。つまり、ネット42の各軸範囲が予め設定されていて、ボール38の各軸座標のいずれか1つがそのネット接触範囲にあれば、このステップS103で“YES”が判断され、ボール38の各軸座標がすべてネット接触範囲外ならステップS103で“NO”が判断される。
ステップS103で“NO”が判断されたということは、ボール38がネット42に引っかからなかったことを意味し、次のステップS104で、ゲームプロセサ52は、ボール38のY軸速度Vyを数1に従って更新する。なお、この実施例では、テーブル44の奥行き方向をZ軸として、またテーブル44の幅方向をX軸としてそれぞれ設定している。Y軸は高さ方向である。
(数1)
Vy=Vy−g・dt
ただし、g:重力加速度、dt:前回更新時からの経過時間である。
その後、ボール38の各軸座標をステップS105で数2に従って更新する。
(数2)
Px=Px+Vx・dtPy=Py+Vy・dtPz=Pz+Vz・dt
このようにして、空中を移動中のボール38の位置座標を刻々更新する。
なお、ステップS103で“YES”が判断されたときには、ボール38がネット42に引っかかったのであるから、ゲームプロセサ52は、ステップS106で、前回のサーブまたはレシーブを「ネット」としてポイントを確定させ、ステップS107でスタートを「ポイント処理」に移行させる。
先のステップS102で“YES”なら、ボール38がテーブル44にバウンドしたか、あるいはテーブル44にバウンドしないで落下したかを意味する。ボール38がテーブル44上でバウンドした場合、ステップS108で“YES”が判断され、そうでない場合、ステップS108で“NO”が判断される。
すなわち、ステップS108では、ボール38の高さがテーブル44の面上位置と等しいとき、そのXZ範囲が予め設定しているテーブル44の相手方コートのXZ範囲内かどうか判断している。このステップS108で“YES”となったとき、ゲームプロセサ52は、ボール38が正しくテーブル44上でバウンドしたと判断し、次のステップS109において、テーブル44でバウンドした後のボール38の各軸速度Vx,Vy,Vzを計算する。
その後、ステップS110で、ゲームプロセサ52は、ステップS108で検出されたボール38のテーブル上でのバウンドが2回目のバウンド(ダブルバウンズ)かどうか判断する。このダブルバウンズかどうかは、1回目のバウンドを検出したとき適宜のフラグを立てておけば、容易に判断できる。ダブルバウンズでなければ、ゲームプロセサの処理は先のステップS103に進む。
ダブルバウンズであれば、相手方のレシーブミスを示しているので、次のステップS111において、ゲームプロセサ52は、「ダブルバウンズ」としてポイントを確定するとともに、ステップS112で、スタートを「ボイント処理」に移行させる。
なお、ステップS108で“NO”の場合、ボール38がテーブル44に接触することなく落下したことを意味し、したがって、ゲームプロセサ52は、ステップS113で先のサーブまたはレシーブを「アウト」としてポイントを確定するとともに、ステップS114で、ステートを「ポイント処理」に移行させる。
「ポイント処理」は、卓球ゲームにおいてどちら側のプレイヤにポイントを加算するかを処理するもので、図17に示すフロー図に従って実行される。すなわち、最初のステップS121で、ゲームプロセサ52は、確定したポイントが「サーブアウト」または「サーブネット」であるか、「レシーブアウト」,「レシーブネット」,「レシーブミス」または「ダブルバウンズ」であるか判断する。前者である場合、ステップS122で、サーブ側プレイヤの失点として、レシーブ側プレイヤの得点をインクリメントする。後者であれば、ゲームプロセサ52は、ステップS123で、レシーブ側プレイヤの失点として、サーブ側プレイヤの得点をインクリメントする。
その後、ステップS124で、ステップS122またはS123で得点を計上した結果、ゲーム終了条件になったかどうか判断かる。たとえば、1セット21ポイント制を設定している場合、1セットマッチでは、21ポイントをどちらかのプレイヤが得点したときゲーム終了である。したがって、このステップS124では、ステップS122またはS123の結果として、ゲームを終了させるべきかどうか判断する。そして、“YES”なら、ステップS125でステートを「ゲームモード選択」に移行させるし、“NO”なら、次のポイント処理を待つことになる。
このようにして、ラケット型入力装置32を三次元空間中で変位またはスイングさせることによって、図1の体感卓球ゲーム装置10によって、モニタ20の画面内で卓球ゲームがプレイできる。
上述の実施例では、ラケット型入力装置32に1つの圧電ブザー素子66を内蔵し、それによってラケット面に垂直な方向の変位加速度だけを検出するようにした。しかしながら、図4に示すラケット方入力装置32の内部に、圧電ブザー素子を図18に示すように2軸に設け、それによってラケット面に垂直な方向の加速度だけでなく、ラケット面に水平な方向の加速度も検出するようにしてもよい。
図18の実施例であれば、圧電ブザー素子66Yが図4および図5の圧電ブザー素子66に相当し、Y軸すなわちラケット面に垂直な方向の加速度を検出する。圧電ブザー素子66Xは、新たに追加されたもので、X軸すなわちラケット面に水平な方向(ラケット面に平行な方向)の加速度を検出する。すなわち、、図18実施例では、圧電ブザー素子66Yの圧電セラミック板の主面がラケット面に垂直な軸に直交し、圧電ブザー素子66Xの圧電セラミック板の主面がラケット面に垂直な軸に直交する軸(ラケット面に水平な軸)に直交するようにそれぞれ配置される。
そのために、図19に示すように、MCU50の出力ポート0および入力ポート0を圧電ブザー素子66Yすなわち加速度センサ回路48Yに使い、出力ポート2および入力ポート2を圧電ブザー素子66Xすなわち加速度センサ回路48Xに使う。ただし、出力ポート1および入力ポート1は、図5の実施例と同様に、LED34およびサーブスイッチ36に接続される。さらに、各加速度センサ回路48Yおよび48Xの具体的回路構成は図5の加速度センサ回路48のものと同様であるので、ここでは、重複する説明は省略する。
図18および図19に示すようにラケット型入力装置32(図4)に2つの圧電ブザー素子66Yおよび66Xを組み込んだ場合、図7および図8に示す卓球ゲーム全体の動作に変化はなく、MCU50による加速度検出の具体的動作、およびゲームプロセサ52による「トス処理」,「ラリー処理」ならびに「ボール座標演算処理」の具体的動作に変更を生じる。
2軸に圧電ブザー素子を設けた場合のMCU50による加速度検出の具体的動作の一例が図20に示される。この図20は先の図10に対応するものであり、図10と同じステップ番号を付したステップでは図10の相当するステップと同じ動作を実行する。また、図10の対応のステップと類似の動作をするステップには、ダッシュ記号「’」または「"」を付している。
図20の最初のステップS21’では、MCU50は、レジスタ(図示せず)に設定されている検出オフセット値V(ラケット面に垂直な方向についての検出オフセット値)をオフカウンタ(図示せず)にコピーする。続くステップS22では、MCU50は、その出力ポート0に「1」を設定し、ついでステップS23で、MCU50は、入力ポート0からデータを読込む。
ステップS24では、ステップS23で読込んだ入力ポート0のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS25’で、MCU50は、積算カウンタV(ラケット面に垂直な方向についての積算値カウンタ:図示せず)をインクリメント(+1)する。ステップS25’で積算カウンタVをインクリメントした場合、またはステップS24で“NO”を判断した場合には、続くステップS26で、MCU50は、オフセットカウンタをインクリメントし、次のステップS27でそのオフセットカウンタのカウント値が規定値に達したかどうか判断す。つまり、ステップS22で出力ポート0に「1」をセットした後、このステップS27で“YES”が判断されるまで、MCU50は、出力ポート0の「1」を継続して出力する。
そして、このオフセットカウンタのカウント値が規定値に達したとステップS27で判断した場合には、次のステップS28で、MCU50は、その出力ポート0に「0」すなわちローレベルをセットし、次のステップS29ではレジスタに設定されている検出オフセット値Vをオフセットカウンタにコピーする。
続くステップS30では、MCU50は、入力ポート0からデータを読込む。ステップS31では、ステップS30で読込んだ入力ポート0のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS32’で、MCU50は、積算カウンタVをインクリメント(+1)する。
ステップS32’で積算カウンタVをインクリメントした場合、またはステップS31で“NO”を判断した場合には、続くステップS33で、MCU50は、オフセットカウンタをディクリメント(−1)し、次のステップS34でそのオフセットカウンタのカウント値がゼロに達したかどうか判断す。つまり、ステップS28で出力ポート0に「0」をセットした後、このステップS34で“YES”が判断されるまで、MCU50は、出力ポート0の「0」を継続して出力する。
その後、図21に示すステップS21"では、MCU50は、レジスタ(図示せず)に設定されている検出オフセット値H(ラケット面に水平な方向についての検出オフセット値)をオフセットカウンタにコピーする。続くステップS22’では、MCU50は、その出力ポート2に「1」を設定し、ついでステップS23’で、MCU50は、入力ポート2からデータを読込む。
ステップS24では、ステップS23で読込んだ入力ポート2のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS25"で、MCU50は、積算カウンタH(ラケット面に水平な方向についての積算カウンタ:図示せず)をインクリメント(+1)する。ステップS25"で積算カウンタHをインクリメントした場合、またはステップS24で“NO”を判断した場合には、続くステップS26で、MCU50は、オフセットカウンタをインクリメントし、次のステップS27でそのオフセットカウンタのカウント値が規定値に達したかどうか判断す。つまり、ステップS22で出力ポート0に「1」をセットした後、このステップS27で“YES”が判断されるまで、MCU50は、出力ポート2の「1」を継続して出力する。
そして、このオフセットカウンタのカウント値が規定値に達したとステップS27で判断した場合には、次のステップS28’で、MCU50は、その出力ポート2に「0」すなわちローレベルをセットし、次のステップS29"ではレジスタに設定されている検出オフセット値Hをオフセットカウンタにコピーする。
続くステップS30’では、MCU50は、入力ポート2からデータを読込む。ステップS31では、ステップS30で読込んだ入力ポート2のデータが「1」かどうか判断する。もし、“YES”なら、次のステップS32"で、MCU50は、積算カウンタHをインクリメント(+1)する。
ステップS32"で積算カウンタHをインクリメントした場合、またはステップS31で“NO”を判断した場合には、続くステップS33で、MCU50は、オフセットカウンタをディクリメント(−1)し、次のステップS34でそのオフセットカウンタのカウント値がゼロに達したかどうか判断す。つまり、ステップS28で出力ポート2に「0」をセットした後、このステップS34で“YES”が判断されるまで、MCU50は、出力ポート2の「0」を継続して出力する。
そして、ステップS34で“YES”が判断されたとき、すなわち、オフセットカウンタがゼロ(0)になったとき、図22に示すステップS35’において、MCU50は、積算カウンタVのカウント値から中間値を引いて、差分値Vを求める。そして、ステップS36’で、この差分値Vに従ってラケット型入力装置32のラケット面に垂直な方向の加速度を決定する。基本的には、差分値Vデータに所定の係数を掛けたものがラケット面に垂直な方向の加速度データとなる。その後、ステップS37’で、ステップS35’で求めた差分値Vに基づいて、検出オフセット値Vを補正する。
そして、図22に示すステップS35"において、MCU50は、積算カウンタHのカウント値から中間値を引いて、差分値Hを求める。そして、ステップS36"で、この差分値Hに従ってラケット型入力装置32のラケット面に水平な方向の加速度を決定する。その後、ステップS37"で、ステップS35"で求めた差分値Hに基づいて、検出オフセット値Hを補正する。
次のステップS38では、MCU50は、入力ポート1からキースイッチす36からの値「1」か「0」を読み込み、続くステップS39では、MCU50は、そのキースイッチ36からの値と先のステップS36で決定したラケット型入力装置32のラケット面に垂直な方向の加速度およびラケット面に水平な方向の加速度に基づいて、さらにパリティビットを付加して、送信コードを算出し、メインルーチンのステップS13(図9)にリターンする。
2軸の圧電ブザー素子を設けた場合の、ゲームプロセサ52が実行する「トス処理」が具体的に図23に示される。この図23は先の図14に対応するものであり、図14と同じステップ番号を付したステップでは図14の相当するステップと同じ動作を実行する。また、図14の対応のステップと類似の動作をするステップには、ダッシュ記号「’」を付している。
この場合の「トス中」処理では、最初のステップS71でトスされたボールの各軸座標Px,Py,Pzをチェックし、その座標に基づいて、ステップS72において、ボールの位置がサービス(サーブ)可能な範囲を超えたかどうか判断する。そして、ステップS72で“YES”が判断されると、次のステップS73で、ゲームプロセサ52は、トスしたボールの各軸座標をトス前の状態に戻して、続くステップS74で、ステートを再び「トス前」に移行させる。
ステップS72で“NO”が判断されると、次のステップS75で、ゲームプロセサ52は、サーバ側プレイヤのラケット型入力装置から送られてくるコードから、当該入力装置の2つの加速度(ラケット面に垂直な方向の加速度とラケット面に水平な方向の加速度)を検出する。そして、ステップS76’で、ステップS75で検出したラケット面垂直方向加速度が図示しないレジスタに保留されている保留値より小さくなったかどうか判断する。ステップS76で
“NO”が判断されると、ステップS77’で、ラケット面に垂直な加速度およびラケット面に水平な加速度のそれぞれの現在値で保留値を置き換え、2つの加速度保留値を更新する。
逆にステップS76で“YES”が判断されるということは、その時点でラケット型入力装置のラケット面に垂直な方向の加速度がピークに達したことを意味し、ステップS78’において、ゲームプロセサ52は、その時点でサーブが行われたとみなし、ラケット型入力装置のラケット面に垂直な方向の加速度およびラケット面に水平な方向の加速度のそれぞれの保留値に基づいて、サービス時のラケット(ラケット型入力装置)のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度を決定する。
そして、ステップS79aにおいて、ゲームプロセサ52は、そのときのボールのラケット面に垂直な方向の方向速度およびラケット面に水平な方向の速度と、ラケット型入力装置のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度とに基づいて、図24および数3に従ってラケットにあたった後のボール38のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度を計算するとともに、サーブ後のボールの回転角速度を計算する。
(数3)
BVh=BVh0+aω(BVh0−RVh0)
BVv=−b(BVv0−RVv)
ω=ω0+c(BVv0−RVv)
ただし、RVh:ラケットのラケット面に水平な方向の速度、RVv:ラケットのラケット面に垂直な方向の速度、BVh0:衝突前のボールのラケット面に水平な方向の速度、BVv0:衝突前のボールのラケット面に垂直な方向の速度、ω0:衝突前のボールの回転角速度、a,b,c:定数である。
ついで、ステップS79’においてボールのラケット面に垂直な方向の速度およびラケット面に水平な方向の速度ならびに各軸座標からサーブ後のボールの各軸初速度Vx,Vy,Vzを計算し、ステップS80でステートを「ラリー中」に移行させる。
2軸の圧電ブザー素子を設けた場合の、ゲームプロセサ52が実行する「ラリー処理」が具体的に図25に示される。この図25は先の図15に対応するものであり、図15と同じステップ番号を付したステップでは図15の相当するステップと同じ動作を実行する。また、図15の対応のステップと類似の動作をするステップには、ダッシュ記号「’」を付している。
最初のステップS81では、ゲームプロセサ52は、サーブで打ち込まれたボールの各軸座標Px,Py,Pzをチェックし、その座標に基づいて、ステップS82において、ボールの位置が予め設定しているレシーブ可能な範囲に達したかどうか判断する。このステップS82で“NO”なら、終了する。ステップS82で“YES”が判断されると、次のステップS83で、ゲームプロセサ52は、ボールがレシーブ可能範囲をオーバーしたかどうか判断する。ステップS83で“YES”を判断したとき、すなわち、ボールがレシーブ可能範囲に一旦は入ったものの何の処理もされないまま再びレシーブ可能範囲外へ出ていった場合には、ステップS84で「レシーブミス」を確定し、次のステップS85でステートを「ポイント処理」に移行させる。
ステップS83で“NO”が判断されると、次のステップS86’で、ゲームプロセサ52は、レシーバ側プレイヤのラケット型入力装置から送られてくるコードから、当該入力装置のラケット面に垂直な方向の加速度およびラケット面に水平な方向の加速度を検出する。そして、ステップS87’で、ステップS86で検出したラケット面に垂直な方向の加速度が保留値より小さくなったかどうか判断する。ステップS87で“NO”の場合、ステップS88’で、ラケット面に垂直な方向の加速度およびラケット面に水平な方向の加速度の現在値によって加速度保留値を更新する。
逆にステップS87’で“YES”が判断されるということは、その時点でレシーバ側のラケット型入力装置のラケット面に垂直な方向の加速度がピークに達したことを意味し、ステップS89’において、ゲームプロセサ52は、その時点でレシーブが行われたとみなし、レシーブ側のラケット型入力装置のラケット面に垂直な方向の加速度およびラケット面に水平な方向の加速度のそれぞれの保留値に基づいて、レシーブ時のラケット(ラケット型入力装置)のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度を決定する。
そして、ステップS90aにおいて、ゲームプロセサ52は、そのときのボールのラケット面に垂直な方向の方向速度およびラケット面に水平な方向の速度と、ラケット型入力装置のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度とに基づいて、先の図24および数3に従ってラケットにあたった後のボール38のラケット面に垂直な方向の速度およびラケット面に水平な方向の速度を計算するとともに、サーブ後のボールの回転角速度を計算する。
ついで、ステップS90’においてボールのラケット面に垂直な方向の速度およびラケット面に水平な方向の速度ならびに各軸座標からレシーブ後のボールの各軸初速度Vx,Vy,Vzを計算し、ステップS91でレシーバとなるプレイヤを交代させる。つまり、レシーブが成功した場合、今度は他方のプレイヤのラケット型入力装置からのデータをレシーバ側データとして取り扱う。
図7に示すように、ステップS5のトス中処理が終了した後、またはステップS6のラリー中処理が終了した後には、ステップS8で示すボール座標演算処理に進む。
2軸の圧電ブザー素子を設けた場合のこのボール座標演算処理は、具体的には、図26のフロー図に従って実行される。この図26フロー図は先の図16フローズとステップS109’が変更されているだけである。すなわち、2軸圧電ブザー素子66Y,66Xを設けた場合には、ボールの各軸速度と先に求めたボールの回転角速度とによって、テーブルにバウンドした後のボールの各軸速度および回転角速度を求める。
このように、ラケット型入力装置32内の2軸に圧電ブザー素子66X,66Yを設けた場合には、ボールの回転角速度を計算するので、1つの圧電ブザー素子66だけの実施例に比べて、ボールの移動軌跡が実際の卓球ゲームに非常に近くなり、図1実施例の体感卓球ゲーム装置におけるリアリティを一層向上できる。
さらに、図27に示すように、3軸のそれぞれの方向の加速度を検出できるように3つの圧電ブザー素子66X,66Yおよび66Zを用いるようにしてもよい。図27でいえば、圧電ブザー素子66XがX軸方向の加速度を検出し、圧電ブザー素子66YがY軸方向の加速度を検出し、圧電ブザー素子66ZがZ軸方向の加速度を検出する。3つの圧電ブザー素子を用いる場合には、図19と同様に、3つの加速度センサ回路48を用いればよい。図27実施例では、圧電ブザー素子66Yの圧電セラミック板の主面がラケット面に垂直な軸に直交し、圧電ブザー素子66Xの圧電セラミック板の主面がラケット面に垂直な軸に直交する軸(ラケット面に水平な軸)に直交し、圧電ブザー素子66Zの圧電セラミック板の主面が前2軸にそれぞれ直交する軸(第3軸)に直交するようにそれぞれ配置される。
なお、上述の実施例では、圧電ブザー素子に生じる加速度相関信号とし電圧信号を取り出すようにした。しかしながら、それを電流信号として取り出すようにしてもよい。
さらに、上述の実施例では、MCU50およびLED34がディジタル信号伝送手段を構成し、加速度相関ディジタル信号をワイアレスでプロセサ側に伝送するようにした。しかしながら、信号伝送手段はワイアレスでなく適宜のデータ伝送線を用いるものであってもよい。
さらに、加速度相関信号としてディジタル信号を出力するものを例示したが、検出した電圧値または電流値をアナログ信号として伝送するようにしてもよい。