(57)【特許請求の範囲】
【請求項１】
ユーザによって３次元空間内において自由に姿勢変化されることが可能な第１ハウジングに設けられた加速度センサまたはジャイロセンサである第１センサと、前記第１ハウジングとは独立した、ユーザによって３次元空間内において自由に姿勢変化されることが可能な第２ハウジングに設けられた加速度センサまたはジャイロセンサである第２センサの出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置のコンピュータを、
前記第１センサの出力に基づいて、ゲーム制御用ベクトルの方向を決定する方向決定手段、
前記第２センサの出力に基づいて、前記ゲーム制御用ベクトルの大きさを決定する大きさ決定手段、および
前記ベクトル方向決定手段および前記ベクトル大きさ決定手段によって決定された前記ゲーム制御用ベクトルを用いてゲーム制御を行うゲーム制御手段として機能させるためのゲームプログラム。
【請求項２】
ユーザによって３次元空間内において自由に姿勢変化されることが可能な第１ハウジングに設けられた加速度センサまたはジャイロセンサである第１センサと、前記第１ハウジングとは独立した、ユーザによって３次元空間内において自由に姿勢変化されることが可能な第２ハウジングに設けられた加速度センサまたはジャイロセンサである第２センサの出力を利用してゲーム処理を行うゲーム装置であって、
前記第１センサの出力に基づいて、ゲーム制御用ベクトルの方向を決定する方向決定手段と、
前記第２センサの出力に基づいて、前記ゲーム制御用ベクトルの大きさを決定する大きさ決定手段と、
前記ベクトル方向決定手段および前記ベクトル大きさ決定手段によって決定された前記ゲーム制御用ベクトルを用いてゲーム制御を行うゲーム制御手段とを備える、ゲーム装置。
【請求項３】
加速度センサまたはジャイロセンサである第１センサを含み、かつ、ユーザによって３次元空間内において自由に姿勢変化されることが可能な第１ハウジングと、
加速度センサまたはジャイロセンサである第２センサを含み、かつ、前記第１ハウジングとは独立した、ユーザによって３次元空間内において自由に姿勢変化されることが可能な第２ハウジングと、
前記第１センサの出力に基づいて、ゲーム制御用ベクトルの方向を決定する方向決定手段と、
前記第２センサの出力に基づいて、前記ゲーム制御用ベクトルの大きさを決定する大きさ決定手段と、
前記ベクトル方向決定手段および前記ベクトル大きさ決定手段によって決定された前記ゲーム制御用ベクトルを用いてゲーム制御を行うゲーム制御手段とを備える、ゲームシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は複数の加速度センサ、または、動きまたは姿勢を検出可能な複数のセンサによってゲーム制御を行うゲームプログラム及びゲーム装置に関する。
【背景技術】
【０００２】
特許文献１には、１つのハウジング内に２つの加速度センサ（異なる軸の加速度を計測したり、直線と回転を計測する）を設けることが開示されている。
特許文献２には、２つの加速度センサでそれぞれ異なるゲーム入力を行う技術が開示されている。
特許文献３には、コントローラとして２つのレバーを用いる技術が開示されている。
特許文献４には、ニュートラルポジションの設定に関する技術が開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１０−２１０００号公報
【特許文献２】特開２００２−１５３６７３号公報
【特許文献３】特開平６−２７７３６３号公報
【特許文献４】特開２００１−１７０３５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、特許文献１の技術だと、両手の動きが固定され、ゲームプレイ中のプレイヤの動きの自由度が少ない（ダイナミックなプレイができない）という問題がある。
また、特許文献２の技術だと、２つの加速度センサによる入力が独立した入力としてゲームで利用されるだけであり、興趣性のある操作感は得られない。
また、特許文献３の技術だと、ゲームプレイ中のプレイヤの動きの自由度が少ないという問題がある。
また、特許文献４の技術だと、１つのセンサに関するものであり、複数のセンサを備えたシステムにおけるニュートラルポジションの設定について開示するものではない。
また、これらの技術はいずれも、センサによる複数の方向の動きの検出を有効に利用したものではない。
本発明は、上記のうちの少なくともいずれか１つを課題とする。
【０００５】
本発明は、下記のうち少なくとも１つを目的とする。
（１）複数の加速度センサ、または動きまたは姿勢を検出可能な複数のセンサによってゲーム制御を行う際に、ゲームプレイ中のプレイヤの動きの自由度が高く、ダイナミックな入力操作を可能とするゲームプログラム及びゲーム装置を提供すること
（２）複数のセンサによってゲーム制御を行なう場合のニュートラルポジションを適切に設定することを可能にするゲームプログラム及びゲーム装置を提供すること
（３）動きを検出可能なセンサによる複数の方向の動きの検出を有効に利用したゲームプログラム及びゲーム装置を提供すること
【課題を解決するための手段】
【０００６】
上記目的を達成するために、本発明は以下の構成を採用した。なお、括弧内の参照符号は本発明の理解を助けるために図面との対応関係の一例を示したものであって、本発明の範囲を何ら限定するものではない。
【０００７】
本発明の一実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた加速度センサまたはジャイロセンサである第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた加速度センサまたはジャイロセンサである第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの姿勢を検出する第１姿勢検出手段（Ｓ１０４）、
前記第２センサの出力に基づいて前記第２ハウジングの姿勢を検出する第２姿勢検出手段（Ｓ１０８）、
前記第１姿勢検出手段によって検出された前記第１ハウジングの姿勢と、前記第２姿勢検出手段によって検出された前記第２ハウジングの姿勢の差分を検出する姿勢差分検出手段（Ｓ１１６）、および
前記姿勢差分検出手段によって検出された差分を用いてゲーム制御を行うゲーム制御手段（Ｓ１１８）として機能させるためのゲームプログラムである。
【０００８】
上記構成により、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイを許容する。また、姿勢の差分により制御するので、直感的な動作入力を許容する。
【０００９】
なお、前記ゲームプログラムは、前記第１姿勢検出手段によって検出された前記第１ハウジングの姿勢と、前記第２姿勢検出手段によって検出された前記第２ハウジングの姿勢の平均を検出する姿勢平均検出手段（Ｓ１２４）として前記コンピュータをさらに機能させ、
前記ゲーム制御手段は、前記姿勢差分検出手段によって検出された差分および前記姿勢平均検出手段によって検出された前記平均の両方を用いてゲーム制御を行ってもよい（Ｓ１２６）。
【００１０】
上記構成により、両手の動きによって自在にゲーム制御可能である。
【００１１】
なお、例えば、差分に基いてゲームオブジェクトの第１動作を制御し、平均に基いて、当該ゲームオブジェクトの第２動作を制御してもよい。「姿勢の差分」とは、例えば、所定の軸についての回転角度の差分であってもよいし、各軸についての回転角度の差分であってもよい。
【００１２】
なお、前記ゲーム制御手段は、前記差分検出手段によって検出された前記差分を用いてゲームオブジェクトの第１動作を制御する第１動作制御手段（Ｓ１１８）を含み、
前記ゲームプログラムは、前記第１ハウジングまたは前記第２ハウジングに設けられたスイッチの出力に基づいて前記ゲームオブジェクトの第２動作を制御する第２動作制御手段（Ｓ１６４）として前記コンピュータをさらに機能させてもよい。
【００１３】
上記構成により、プレイ中の姿勢の自由度が高まる。
【００１４】
なお、前記姿勢を検出するための第１センサ及び第２センサは、加速度センサであり、
前記第１姿勢検出手段および第２姿勢検出手段は、前記第１ハウジングおよび第２ハウジングの傾きを検出するものであり、
前記第１姿勢検出手段は、前記第１センサの出力に基づいて、前記第１ハウジングが静止しているかどうかを判断する第１ハウジング状態判断手段（Ｓ１５６）を含み、
前記第１姿勢検出手段は、前記第１ハウジング状態判断手段によって前記第１ハウジングが静止していると判断された場合に、前記第１センサの出力に基づいて検出される前記
第１ハウジングの傾きを、有効な検出結果として出力し（Ｓ１５８）、
前記第２姿勢検出手段は、前記第２センサの出力に基づいて、前記第２ハウジングが静止しているかどうかを判断する第２ハウジング状態判断手段（Ｓ１５６）を含み、
前記第２姿勢検出手段は、前記第２ハウジング状態判断手段によって前記第２ハウジングが静止していると判断された場合に、前記第２センサの出力に基づいて検出される前記第２ハウジングの傾きを、有効な検出結果として出力してもよい（Ｓ１５８）。
【００１５】
上記構成により、プレイ中の不意の動きによるセンサ出力を確実に排除できる。
【００１６】
なお、ハウジング状態判断手段は、例えば、加速度センサの出力ベクトルの大きさが、当該加速度センサが重力のみを検出する場合の出力ベクトルの大きさとほぼ一致する（ある程度余裕をみてもよい）場合に、静止していると判断する。
【００１７】
なお、前記ゲーム制御手段は、前記第１ハウジング状態判断手段によって前記第１ハウジングが静止していると判断され、かつ、前記第２ハウジング状態判断手段によって前記第２ハウジングが静止していると判断されたときのみ、前記姿勢差分検出手段によって検出された差分を用いてゲーム制御を行ってもよい。
【００１８】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた加速度センサまたはジャイロセンサである第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた加速度センサまたはジャイロセンサである第２センサ（７６１）の出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて、ゲーム制御用ベクトルの方向を決定する方向決定手段（Ｓ４１０）、
前記第２センサの出力に基づいて、前記ゲーム制御用ベクトルの大きさを決定する大きさ決定手段（Ｓ４１４）、および
前記ベクトル方向決定手段および前記ベクトル大きさ決定手段によって決定された前記ゲーム制御用ベクトルを用いてゲーム制御を行うゲーム制御手段（Ｓ４１８）として機能させるためのゲームプログラムである。
【００１９】
上記構成により、プレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイを許容する。
【００２０】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた動きを検出可能な第２センサ（７６１）の出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きを検出する第１動き操作検出手段（Ｓ２３６）、
前記第２センサの出力に基づいて前記第２ハウジングの動きを検出する第２動き操作検出手段（Ｓ２５０）、
前記第１動き操作検出手段および前記第２動き操作検出手段の検出結果に基づいて、前記第１ハウジングの動き検出に関連して決定されるタイミングから同時入力受付時間以内に前記第２ハウジングの動き検出があったかどうかを検出する同時入力検出手段（Ｓ２５４）、および
前記第１ハウジングの動き検出があってから同時入力受付時間以内に前記第２ハウジングの動き検出があったことを前記同時入力検出手段が検出したときに第１ゲーム処理を実
行するゲーム制御手段（Ｓ２５６）として機能させるためのゲームプログラムである。
【００２１】
上記構成により、同時の動き操作をゲーム入力に利用することができる（同時の動き操作のタイミング差を許容する）。
【００２２】
なお、同時入力受付時間は、第１ハウジングの動き検出に関連して決定されるタイミングからの所定時間であって、一定時間であってもよいし、ゲーム状況やレベルなどに応じて変化してもよい。「動き検出に関連して決定されるタイミング」とは、動き検出の対象となった動き入力における所定のタイミングであり、例えば、当該動き検出があった時点や、当該動き検出に係る動きにおける所定時点（例えば、当該動きの開始点や終了点や所定の中間点など）が挙げられる。
さらに、同時入力検出手段が、第１動き操作検出手段および第２動き操作検出手段の検出結果に基づいて、第２ハウジングの動き検出があってから同時入力受付時間以内に第１ハウジングの動き検出があったかどうかを検出し、第２ハウジングの動き検出があってから同時入力受付時間以内に第１ハウジングの動き検出があったことを同時入力検出手段が検出したときに第１ゲーム処理を実行するようにしてもよい。
【００２３】
なお、前記ゲーム制御手段は、前記第１動き操作検出手段によって前記第１ハウジングの動き検出があってから、同時入力受付時間以内に前記第２ハウジングの動き検出があったことが前記同時入力検出手段によって検出されなかった場合には、前記第１ゲーム処理とは異なる第２ゲーム処理を実行してもよい（Ｓ２１６）。
【００２４】
上記構成により、同時の動き操作とともに片方の動き操作をゲーム入力に利用することができる。
【００２５】
なお、ゲーム制御手段は、さらに、第２動き操作検出手段によって第２ハウジングの動き検出があってから、同時入力受付時間以内に第１ハウジングの動き検出があったことが同時入力検出手段によって検出されなかった場合には、第１ゲーム処理および第２ゲーム処理とは異なる第３ゲーム処理を実行してもよい。
【００２６】
なお、前記ゲーム制御手段は、前記同時入力受付時間内に前記第２ハウジングの動き検出があったことが前記同時入力検出手段によって検出されたときには、前記第１ゲーム処理を実行し、前記同時入力受付時間内に前記第２ハウジングの動き検出があったことが前記同時入力検出手段によって検出されることなく前記同時入力受付時間が経過した時点で、前記第２ゲーム処理を実行してもよい。
【００２７】
なお、前記第１動き操作検出手段は、前記第１ハウジングの動き検出に関連して決定されるタイミングから受付禁止時間が経過するまでは、当該第１ハウジングの動き検出を新たに検出せず、
前記第２動き操作検出手段は、前記第２ハウジングの動き検出があったことを検出してから受付禁止時間が経過するまでは、当該第２ハウジングの動き検出を新たに検出しないようにしてもよい。
【００２８】
上記構成により、一度の動き操作によりしばらくの間は入力が続いてしまう問題を解決できる。
【００２９】
なお、受付禁止時間は、ハウジングの動き検出に関連して決定されるタイミングからの所定時間であり、一定時間であってもよいし、ゲーム状況やレベルなどに応じて変化してもよい。
【００３０】
なお、前記第１ハウジングおよび前記第２ハウジングのいずれか一方の動き検出があってから所定時間以内に他方の動き検出があったことを前記同時入力検出手段による同時入力検出に関連して決定されるタイミングから同時入力後受付禁止時間が経過するまでは、前記第１動き操作検出手段および前記第２動き操作検出手段は、前記第１ハウジングおよび前記第２ハウジングの動き検出を新たに検出しないようにしてもよい。
【００３１】
上記構成により、両方が入力できない状態になったときに、再度入力を許容するタイミングをあわせる
【００３２】
なお、同時入力後受付禁止時間は、同時入力検出手段による同時入力検出に関連して決定されるタイミングからの所定時間であり、一定時間であってもよいし、ゲーム状況やレベルなどに応じて変化してもよい。また、受付禁止時間と同一時間であってもよいし、それより長い時間であってもよい。「同時入力検出に関連して決定されるタイミング」とは、同時入力検出の対象となった入力における所定タイミングであり、例えば、当該同時入力検出があった時点や、当該同時入力検出に係る入力における所定時点（例えば、当該同時入力の開始点や終了点や所定の中間点など）が挙げられる。
【００３３】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた動きを検出可能な第２センサ（７６１）の出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きおよびその強さを検出する第１動き検出手段（Ｓ２３６）、
前記第２センサの出力に基づいて前記第２ハウジングの動きおよびその強さを検出する第２動き検出手段（Ｓ２５０）、
前記第１動き検出手段および前記第２動き検出手段の検出結果に基づいて、前記第１ハウジングの動き検出に関連して決定されるタイミングから同時入力受付時間以内に前記第２ハウジングの動き検出があったかどうかを検出する同時入力検出手段（Ｓ２５４）、および
前記第１ハウジングの動き検出に関連して決定されるタイミングから同時入力受付時間以内に前記第２ハウジングの動き検出があったことを前記同時入力検出手段が検出したときに、前記第１動き検出手段によって検出された前記第１ハウジングの動きの強さと、前記第２動き検出手段によって検出された前記第２ハウジングの動きの強さを利用して第１ゲーム処理を実行するゲーム制御手段（Ｓ２５６）として機能させるためのゲームプログラムである。
【００３４】
上記構成により、同時の動き操作かつ動きの大きさを利用したゲーム入力に利用することができる（同時の動き操作のタイミング差を許容する）。
【００３５】
なお、さらに、同時入力検出手段が、第１動き検出手段および第２動き検出手段の検出結果に基づいて、第２ハウジングの動き検出に関連して決定されるタイミングから同時入力受付時間以内に第１ハウジングの動き検出があったかどうかを検出し、第２ハウジングの動き検出に関連して決定されるタイミングから同時入力受付時間以内に第１ハウジングの動き検出があったことを同時入力検出手段が検出したときに、第１動き検出手段によって検出された第１ハウジングの動きの強さと、第２動き検出手段によって検出された第２ハウジングの動きの強さを利用して第１ゲーム処理を実行するようにしてもよい。
【００３６】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きを検出可能な第１センサ（７０１）と、前記
第１ハウジングとは独立した第２ハウジング（７７）に設けられた動きを検出可能な第２センサ（７６１）の出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きを検出する第１動き操作検出手段（Ｓ３０２）、
前記第２センサの出力に基づいて前記第２ハウジングの動きを検出する第２動き操作検出手段（Ｓ３１８）、
前記第１動き操作検出手段および前記第２動き操作検出手段の検出結果に基づいて、前記第１ハウジングの動き操作が行われたときに、当該動き操作から過去一定時間以内に前記第２ハウジングの動き操作が行われていたかどうかを検出する同時入力検出手段（Ｓ３１２）、および
（ａ）前記第１ハウジングの動き操作が行われたときに、当該動き操作から過去一定時間以内に前記第２ハウジングの動き操作が行われていたことが前記同時入力検出手段によって検出された場合にはゲームオブジェクトに第１動作を行わせ、（ｂ）前記第１ハウジングの動き操作が行われたときに、当該動き操作から過去一定時間以内に前記第２ハウジングの動き操作が行われていたことが前記同時入力検出手段によって検出されなかった場合には前記ゲームオブジェクトに前記第１動作とは異なる第２動作を行わせるゲーム制御手段（Ｓ３１４、Ｓ３１６）として機能させるためのゲームプログラムである。
【００３７】
上記構成により、同時の動き操作を利用したゲーム入力に利用することができる（同時の動き操作のタイミング差を許容する）。
【００３８】
なお、同時入力検出手段は、第１動き操作検出手段および第２動き操作検出手段の検出結果に基づいて、第２ハウジングの動き操作が行われたときに、当該動き操作から過去一定時間以内に第１ハウジングの動き操作が行われていたかどうかを検出し、検出された場合に第１動作を行なわせ、検出されなかった場合に第３動作を行わせるようにしてもよい。また、第１動き操作検出手段または第２動き操作検出手段によって第１ハウジングまたは第２ハウジングの動きが検出されるごとに、同時入力検出手段による検出をおこなって、第１動作または第２動作もしくは第３動作をおこなわせるようにしてもよい。
【００３９】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた傾きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた傾きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
プレイヤからの基準値設定指示を検出する基準値設定指示検出手段（Ｓ１３４）、
前記基準値設定指示検出手段によって基準値設定指示が検出されたときに、前記第１戦差の出力値および／または前記第２センサの出力値に基づいて、第１基準値および第２基準値を設定する基準値設定手段（Ｓ１４６）、
前記第１センサの出力および前記第１基準値に基いて前記第１ハウジングの姿勢を検出する第１姿勢検出手段（Ｓ１０４、Ｓ１１２）、
前記第２センサの出力および前記第２基準値に基いて前記第２ハウジングの姿勢を検出する第２姿勢検出手段（Ｓ１０８、Ｓ１１４）、
前記第１姿勢検出手段による第１ハウジングの姿勢と、前記第２姿勢検出手段による第２ハウジングの姿勢の差分を検出する姿勢差分検出手段（Ｓ１１６）、および
前記姿勢差分検出手段によって検出された差分を用いてゲーム制御を行うゲーム制御手段（Ｓ１１８）として機能させるためのゲームプログラムである。
【００４０】
上記構成により、２つの傾きセンサを利用したゲームでプレイヤが好きな姿勢でプレイできる。
【００４１】
なお、基準値設定手段は、センサの出力値自体を基準値として設定してもよいし、当該出力地から傾き値を演算した結果を基準値として設定してもよい。第１基準値と第２基準値が同一値の場合には、１つのデータを記憶するのみでもよい。
【００４２】
なお、前記基準値設定手段は、前記基準値設定指示検出手段によって単一の前記基準値設定指示が検出されたことに応じて、同一タイミングで、前記第１基準値および前記第２基準値を一度に設定してもよい。
【００４３】
上記構成により、差分がないのにゲーム入力されることを防ぐができる。
【００４４】
なお、前記基準値設定手段は、前記基準値設定指示検出手段によって基準値設定指示が検出されたときに、前記第１センサの出力値と、前記第２センサの出力値とに基く所定の演算をした値を、前記第１基準値および前記第２基準値として共通に設定してもよい。
【００４５】
上記構成により、差分がないのにゲーム入力されることを防ぐ
【００４６】
なお、所定の演算は例えば平均である。第１ハウジングと第２ハウジングの大きさや形状、操作部の有無、左手用か右手用かなどに応じて重み付けをしてもよい。
【００４７】
なお、前記基準値設定手段は、前記基準値設定指示検出手段によって基準値設定指示が検出されたときに、前記第１センサまたは前記第２センサのいずれか一方の出力値に基く値を、前記第１基準値および前記第２基準値として共通に設定してもよい。
【００４８】
上記構成により、差分がないのにゲーム入力されることを防ぐ
【００４９】
なお、前記第１ハウジングおよび／または前記第２ハウジングには、プレイヤが前記基準値設定指示を入力するためのスイッチが設けられており、
前記基準値設定手段は、前記基準値設定指示検出手段によって基準値設定指示が検出されたときに、前記第１ハウジングおよび前記第２ハウジングのうち、当該基準値設定指示の入力に用いられたスイッチが設けられてない方のハウジングに設けられたセンサの検出値に基いて、前記第１基準値および前記第２基準値を共通に設定してもよい。
【００５０】
上記構成により、ボタンによるぶれの影響をなくす
【００５１】
なお、前記基準値設定手段は、前記基準値設定指示検出手段によって基準値設定指示が検出されたときに、前記第１センサの出力値と前記第２センサの出力値に基づいて前記第１ハウジングと前記第２ハウジングの傾きの差分が一定範囲内か否かを判断する基準値設定時差分検出手段（Ｓ１４８）を含み、
前記基準値設定手段は、（ａ）前記基準値設定時差分検出手段によって一定範囲内であると判断された場合には、前記第１センサの出力値および前記第２センサの出力値に基いて、第１基準値および第２基準値をそれぞれ設定し、（ｂ）前記基準値設定時差分検出手段によって一定範囲内でないと判断された場合にはエラー処理を行ってもよい。
【００５２】
上記構成により、差分がないのにゲーム入力されることを防ぐ
【００５３】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた加速度センサまたはジャイロセンサである第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた加速度センサまたはジャイロセンサである第２センサ（７６１）の出力を利用してゲー
ム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいてゲームオブジェクトの姿勢を制御する姿勢制御手段（Ｓ４１０）、および
前記第２センサの出力に基づいて前記ゲームオブジェクトの移動を制御する移動制御手段（Ｓ４１６）として機能させるためのゲームプログラムである。
【００５４】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた少なくとも２軸方向の動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた少なくとも２軸方向の動きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングが動いた方向を示す第１動き方向を検出する第１動き方向検出手段（Ｓ５４２）、
前記第２センサの出力に基づいて前記第２ハウジングが動いた方向を示す第２動き方向を検出する第２動き方向検出手段（Ｓ５７０）、
前記第１動き方向検出手段によって検出された前記第１動き方向と、前記第２動き方向検出手段によって検出された前記第２動き方向とを合成することによって合成方向を決定する合成方向決定手段（Ｓ５５２）、および
前記合成方向決定手段によって決定された前記合成方向を用いてゲーム制御を行うゲーム制御手段（Ｓ５５４）として機能させるためのゲームプログラムである。
【００５５】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きを検出するための第１センサ（７０１）と、前記第１ハウジングとは独立した動きを検出するための第２ハウジング（７７）に設けられた第２センサ（７６１）の出力を利用してゲーム処理を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きの強さを検出する第１強さ検出手段（Ｓ５４２）、
前記第２センサの出力に基づいて前記第２ハウジングの動きの強さを検出する第２強さ検出手段（Ｓ５７０）、
前記第１強さ検出手段によって検出された前記第１ハウジングの動きの強さと、前記第２強さ検出手段によって検出された前記第２ハウジングの動きの強さとを合成することによって合成強さを決定する合成強さ決定手段（Ｓ５５２）、および
前記合成強さ決定手段によって決定された前記合成強さを用いてゲーム制御を行うゲーム制御手段（Ｓ５５４）として機能させるためのゲームプログラムである。
【００５６】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた少なくとも２軸方向の動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた少なくとも２軸方向の動きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングが動いた方向を示す第１動き方向を検出する第１動き方向検出手段（Ｓ５４２）、
前記第２加速度センサの出力に基づいて前記第２ハウジングが動いた方向を示す第２動き方向を検出する第２動き方向検出手段（Ｓ５７０）、
前記第１動き方向検出手段によって検出された前記第１動き方向と、前記第２動き方向検出手段によって検出された前記第２動き方向とが所定の関係を満たすかどうかを判定す
る動き方向関係判定手段（Ｓ５５０）、および
前記動き方向関係判定手段によって前記第１動き方向と前記第２動き方向が前記所定の関係を満たすと判定されたときに、前記第１ハウジングおよび前記第２ハウジングの少なくとも一方のハウジングの動き方向および／または動き強さに基づいてゲーム制御を行うゲーム制御手段（Ｓ５５２）として機能させるためのゲームプログラムである。
【００５７】
なお、動き方向関係判定手段は、例えば、第１動き方向と第２動き方向が略一致することを判定してもよいし、略反対方向であることを判定してもよいし、所定の角度をなすことなどを判定してもよい。また、２次元の方向（所定の２つの方向成分）を比較してもよいし、３次元の方向を比較しても良い。
【００５８】
また、ゲーム制御手段は、動き方向関係判定手段により所定の関係を満たすと判定されたときに、第１ハウジングまたは第２ハウジングのいずれか一方の動き方向に基いてゲーム制御をおこなってもよいし、両方の動き方向に基いて（例えば、加算や平均などの所定演算をして）、ゲーム制御をおこなっても良い。また、動き方向ではなく動き強さに基いてもよいし、動き方向と動き強さの両方に基いてゲーム制御をおこなってもよい。
【００５９】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた少なくとも２軸方向の動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた少なくとも２軸方向の動きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きを検出する第１動き操作検出手段（Ｓ５４２）、
前記第２センサの出力に基づいて前記第２ハウジングの動きを検出する第２動き操作検出手段（Ｓ５７０）、
前記第１動き操作検出手段および前記第２動き操作検出手段の検出結果に基づいて、前記第１ハウジングの動き検出のタイミングと、前記第２ハウジングの動き検出のタイミングとが所定の関係を満たすかどうかを判定する動きタイミング関係判定手段（Ｓ５４８）、および
前記動きタイミング関係判定手段によって前記第１ハウジングの動き検出のタイミングと前記第２ハウジングの動き検出のタイミングが前記所定の関係を満たすと判定されたときに、前記第１ハウジングおよび前記第２ハウジングの少なくとも一方のハウジングの動き方向および／または動き強さに基づいてゲーム制御を行うゲーム制御手段（Ｓ５５２）として機能させるためのゲームプログラムである。
【００６０】
なお、動きタイミング関係判定手段は、例えば、第１動きタイミングと第２動きタイミングが略一致することを判定してもよいし、所定間隔であることなどを判定してもよい。また、ゲーム制御手段は、動きタイミング関係判定手段により所定の関係を満たすと判定されたときに、第１ハウジングまたは第２ハウジングのいずれか一方の動き方向に基いてゲーム制御をおこなってもよいし、両方の動き方向に基いて（例えば、加算や平均などの所定演算をして）、ゲーム制御をおこなっても良い。また、動き方向ではなく動き強さに基いてもよいし、動き方向と動き強さの両方に基いてゲーム制御をおこなってもよい。
【００６１】
なお、前記ゲーム制御手段は、前記第１ハウジングおよび前記第２ハウジングの両方のハウジングの動き方向および／または動き強さに基づいてゲーム制御を行ってもよい。
【００６２】
なお、前記ゲーム制御手段は、前記第１ハウジングおよび前記第２ハウジングの両方のハウジングの動き方向および動き強さに基づいてゲーム制御を行ってもよい。
【００６３】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた少なくとも２軸方向の動き検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた少なくとも２軸方向の動きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングが動いた方向を示す第１動き方向を検出する第１動き方向検出手段（Ｓ５４２）、
前記第２センサの出力に基づいて前記第２ハウジングが動いた方向を示す第２動き方向を検出する第２動き方向検出手段（Ｓ５７０）、
前記第１動き方向検出手段によって検出された前記第１動き方向と、前記第２動き方向検出手段によって検出された前記第２動き方向とが所定の関係を満たすかどうかを判定する動き向関係判定手段（Ｓ５５０）、および
前記動き方向関係判定手段によって前記第１動き方向と前記第２動き方向が前記所定の関係を満たすと判定されたときに、ゲームオブジェクトに特定の動作を行わせるゲーム制御手段（５５４）として機能させるためのゲームプログラムである。
【００６４】
なお、動き方向関係判定手段は、例えば、第１動き方向と第２動き方向が略一致することを判定してもよいし、略反対方向であることを判定してもよいし、所定の角度をなすことなどを判定してもよい。また、動き方向関係判定手段によって第１動き方向と第２動き方向との関係が複数の候補のうちのどの関係かを判定し、当該判定に応じて複数の特定の動作のうちから１つの特定の動作を決定してもよい。
【００６５】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きを検出するための第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた動きを検出するための第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングの動きおよびその強さを検出する第１動き操作検出手段（Ｓ２３６）、
前記第２センサの出力に基づいて前記第２ハウジングの動きおよびその強さを検出する第２動き操作検出手段（Ｓ２５０）、
前記第１動き操作検出手段および前記第２動き操作検出手段の検出結果に基づいて、前記第１ハウジングの動き検出のタイミングと、前記第２ハウジングの動き検出のタイミングとが所定の関係を満たすかどうかを判定する動きタイミング関係判定手段（Ｓ２４０）、および
前記動きタイミング関係判定手段によって前記第１ハウジングの動き検出のタイミングと前記第２ハウジングの動き検出のタイミングが前記所定の関係を満たすと判定されたときに、ゲームオブジェクトに特定の動作を行わせるゲーム制御手段（Ｓ２４２）として機能させるためのゲームプログラムである。
【００６６】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた少なくとも２軸方向の動きを検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた少なくとも２軸方向の動きを検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて前記第１ハウジングが動いた方向を示す第１動き方向を検出する第１動き方向検出手段（Ｓ７４８）、
前記第２センサの出力に基づいて前記第２ハウジングが動いた方向を示す第２動き方向
を検出する第２動き方向検出手段（Ｓ７８２）、
前記第１動き方向検出手段によって検出された前記第１動き方向が第１範囲内であり、かつ前記第２動き方向検出手段によって検出された前記第２動き方向が第２範囲内であるときに、前記第１動き方向と前記第２動き方向に基づいてゲーム制御を行うゲーム制御手段（Ｓ７５２、Ｓ７８６、Ｓ７５８）として機能させるためのゲームプログラムである。
【００６７】
なお、第１範囲と第２範囲は重複しない範囲としてもよいし、一部重複する範囲としてもよいが、完全には一致しない範囲である。
【００６８】
本発明の他の実施例に係るゲームプログラムは、
第１ハウジング（７１）に設けられた動きまたは姿勢を検出可能な第１センサ（７０１）と、前記第１ハウジングとは独立した第２ハウジング（７７）に設けられた動きまたは姿勢を検出可能な第２センサ（７６１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記第１センサの出力に基づいて第１ゲーム処理を実行する第１ゲーム制御手段（Ｓ４１０）、
前記第２センサの出力に基づいて第２ゲーム処理を実行する第２ゲーム制御手段（Ｓ４１６）、および
プレイヤの指示に応じて、前記第１ゲーム制御手段が前記第１ゲーム処理のために参照するセンサを前記第１センサから前記第２センサに変更し、かつ前記第２ゲーム制御手段が前記第２ゲーム処理のために参照するセンサを前記第２センサから前記第１センサに変更する参照センサ交換手段（Ｓ４０４）として機能させるためのゲームプログラムである。
【００６９】
本発明の他の実施例に係るゲームプログラムは、
少なくとも、第１軸、第２軸の２軸方向の動きを検出可能なセンサ（７０１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記センサの前記第１軸方向の動きを検出する動き検出手段（Ｓ７４２）、および
前記動き検出手段によって前記第１軸方向の動きが検出されたときに、当該検出に関連して決定される時点または期間において出力された前記センサの前記第２軸方向の出力に基いてゲーム制御を行うゲーム制御手段（Ｓ７１８）として機能させるためのゲームプログラムである。
【００７０】
なお、「検出に関連して決定される時点または期間」とは、以下が考えられる。なお、第１軸方向の動き入力と第２軸方向の動き入力との連続性を保つために、第１軸方向の動き入力における所定時点から所定時間以上離れない時点または期間とするのが好ましい。（１）検出の対象となった第１軸方向の動き入力における所定時点を基準として決定される時点または期間（「検出の対象となった第１軸方向の動き入力における所定時点」は、当該第１軸方向の動きが検出された時点や、当該動き入力の開始点や終了点や所定の中間点など））
（２）検出の対象となった第１軸方向の動き入力における所定時点を基準として決定される期間内に第２軸方向の動きが検出されたときに当該第２軸方向の動きにおける所定時点または所定期間
【００７１】
上記（１）には以下が考えられる
（ａ）第１軸方向の動き入力における所定時点（以下第１時点）と同一の時点
（ｂ）第１時点より所定時間だけ前の時点
（ｃ）第１時点より所定時間だけ後の時点
（ｄ）［第１時点より所定時間だけ前〜第１時点］の期間
（ｅ）［第１時点〜第１時点より所定時間だけ後の時点］の期間
（ｆ）［第１時点より第１時間だけ前の時点〜第１時点より第２時間だけ前の時点］の期間（第１時間＞第２時間）
（ｇ）［第１時点より第１時間だけ後の時点〜第１時点より第２時間だけ後の時点］の期間（第１時間＜第２時間）
（ｈ）［第１時点より第１時間だけ前の時点〜第１時点より第２時間だけ後の時点］の期間
【００７２】
上記（２）について、動き検出手段が「振り動作」を検出する場合、上記（ａ）〜（ｈ）のような時点または期間において、第２軸における振りが検出されるか否かを検出して、当該検出があったときには、当該第２軸における振りの期間（振り開始から終了まで［加速度の立ち上がり→最大→０→反対方向の加速度検出→反対方向最大→０］、または、その一部［例えば、加速度の立ち上がり→最大→０の期間、または、反対方向の加速度検出→反対方向最大→０までの期間）としてもよい。
【００７３】
なお、第１時点より前の時点または期間とする場合は、第２軸方向への入力をした後、第１軸方向への入力をすることにより、当該第２軸方向への入力を有効にするという入力方法となり（第２軸方向への入力をした場合であってもその後第１軸方向への入力をしない場合には、当該第２軸方向への入力は有効な入力とならない）、第１時点より後の時点または期間とする場合は、第１軸方向への入力をした後、第２軸方向への入力を受け付けるという入力方法となる（第２軸方向への入力をした場合であってもその前に第１軸方向への入力をしていない場合には、当該第２軸方向への入力は有効な入力とならない）。また、第１時点をまたぐ期間とする場合には、第１軸方向への入力により有効入力であることを示しつつ第２軸方向の入力をおこなうという入力方法となる（第１軸方向への入力をしながら第２軸方向への入力をしない場合は、当該第２軸方向への入力は有効とならない）。
【００７４】
「出力された前記加速度センサの前記第２軸方向の出力に基いてゲーム制御を行う」について、期間による場合は、その期間内の、第２軸方向の出力の合計／平均（加重平均も可）／最大値／積分などを利用する、あるいは、その期間内の連続する出力の差分を利用するなどが考えられる。
【００７５】
本発明の他の実施例に係るゲームプログラムは、
第１軸、第２軸、第３軸の３軸方向の動きを検出可能なセンサ（７０１）の出力を利用してゲーム制御を行うためのゲームプログラムであって、ゲーム装置（３）のコンピュータ（３０）を、
前記センサの前記第１軸方向の動きを検出する動き検出手段（Ｓ７４２）、および
前記動き検出手段によって前記第１軸方向の動きが検出されたときに、当該検出された時点を基準として決定される時点または期間において出力された前記センサの前記第２軸方向の出力と前記第３軸方向の出力により示される方向を用いてゲーム制御を行うゲーム制御手段（Ｓ７１８）として機能させるためのゲームプログラムである。
【００７６】
なお、前記ゲーム制御手段は、前記動き検出手段によって前記第１軸方向の動きが検出されたときに、当該検出された時点を基準として決定される時点または期間において出力された前記センサの前記第２軸方向の出力に加えて、当該第１軸方向の動きに係る前記センサの前記第１軸方向の出力の大きさを用いてゲーム制御を行ってもよい。
【００７７】
なお、前記ゲーム制御手段は、前記動き検出手段によって前記第１軸方向の動きが検出されたときに、当該検出された時点を基準として決定される時点または期間における、第２軸方向の動きの有無を検出し（Ｓ７５０）、第２軸方向の動きが検出されたときに、当
該第２軸方向の出力を用いてゲーム制御を行ってもよい。
【００７８】
なお、「姿勢を検出可能なセンサ」とは、加速度センサ、ジャイロセンサなど、姿勢を検出可能なセンサであり、さらに言えば、自ら（自らが設けられるハウジング）の姿勢を検出可能なセンサである。また、「姿勢」とは、代表的には、傾き（重力方向に対する傾き；言い換えると、水平軸を中心とする回転角度）であるが、水平軸以外の軸を中心とする回転角度などであってもよい。
【００７９】
また、「傾きを検出可能なセンサ」とは、加速度センサなど、傾きを検出可能なセンサであり、さらに言えば、自ら（自らが設けられるハウジング）の傾きを検出可能なセンサである。
【００８０】
また、「動きを検出可能なセンサ」とは、加速度センサ、ジャイロセンサなど、動きを検出可能なセンサであり、さらに言えば、自ら（自らが設けられるハウジング）の動きを検出可能なセンサである。
【００８１】
また、「動き操作検出手段」は、ハウジングが単に動いたことを検出してもよいし、ハウジングが所定の動き（例えば振りなど）をしたことを検出してもよい。
【００８２】
ここで、加速度センサは、加速運動や重力加速度の影響を受けて、各センシング軸方向の直線成分の加速度を軸毎に検出する。一方、ジャイロスコープは、回転にともなう角速度を検出する。加速度センサは、当該加速度センサの軸心周りに回転させても、重力加速度以外の各軸ごとの加速度は検出することができない。一方、ジャイロスコープは、回転を伴わない直線的な加速を検出することができない。従って、加速度センサをジャイロスコープに、ジャイロスコープを加速度センサに単に置換しただけでは、同一の機能を実現することができない。一方、加速度センサとジャイロスコープの違いを吸収するための複雑な処理を付加することで、加速度センサをジャイロスコープ、ジャイロスコープを加速度センサに置き換えて利用することもできる。
加速度センサは、各軸に沿った直線成分の加速度を検出しており、回転や傾きを直接検出することはできない。このため、加速度センサを搭載したデバイスの姿勢の回転や傾きは、加速度センサの各軸ごとに検出される加速度に所定の演算処理を施すことによって算出している。例えば、加速度センサが静止した状態においては、常に重力加速度が加わっているので、その重力加速度に対する各軸の傾き応じた加速度が各軸ごとに検出される。具体的には、加速度センサが水平状態で静止しているとき、加速度センサのｙ軸に１Ｇの重力加速度が加わり、他の軸の重力加速度はほぼ０となる。次に、加速度センサの姿勢が水平状態より傾くと、加速度センサの各軸方向と重力方向と角度に応じて、重力加速度が加速度センサの各軸に分散される。このとき、加速度センサの各軸の加速度値が検出される。このような各軸ごとの加速度値に演算を加えることにより、重力方向に対する加速度センサの姿勢を算出することができる。また、回転の場合には、姿勢変化の連続的なものと考えられるので、ある時点の姿勢の傾きからある時点の姿勢の傾きのまでを算出することにより回転角度をソフトウェア処理によって算出することもできる。
一方、例えばジャイロスコープによって有る状態からの姿勢の傾きを算出する場合には、まずジャイロスコープの検出開始の状態において傾きの値を初期化する。そして、この時点からの当該ジャイロスコープから出力される角速度データを積分する。さらに、前記初期化された傾きの値からの傾きの変化量を算出することにより、初期化時点の姿勢に対する角度を求めることができる。つまり、有る時点を基準とする相対的な角度を求めることができる。なお、ジャイロスコープを搭載したデバイスの重力方向を基準とする姿勢が必要な場合には、当該デバイスを重力方向を基準とした状態（例えば水平に保った状態）で初期化する必要がある。一方、加速度センサを搭載したデバイスの場合には、加速度センサが重力方向を基準とするため初期化の必要がないというメリットを有する。
【発明の効果】
【００８３】
本発明によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイを許容する。また、姿勢の差分によりゲーム制御するので、直感的な動作入力を許容する。
【図面の簡単な説明】
【００８４】
【図１】本発明の一実施形態に係るゲームシステム１を説明するための外観図
【図２】ゲーム装置３の機能ブロック図
【図３】コントローラ７の外観構成を示す斜視図
【図４】コアユニット７０の上筐体を外した状態を示す斜視図
【図５】サブユニット７６の上筐体を外した状態を示す斜視図
【図６】コントローラ７の構成を示すブロック図
【図７】コントローラ７を用いてゲーム操作するときの状態を概説する図解図
【図８】第１の実施形態におけるゲーム画像例
【図９】第１の実施形態におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図１０】第１の実施形態におけるメインメモリのメモリマップ
【図１１】第１の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図１２】第１の実施形態におけるニュートラルポジション設定処理の詳細を示すフローチャート
【図１３】第１の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図１４】第１の実施形態における傾き検出の詳細を示すフローチャート
【図１５】第１の実施形態における向きベクトルの変更方法の一例を示す図
【図１６】第１の実施形態における操作ユニットの傾きと傾き検出の検出結果との対応関係を示す図
【図１７】第１の実施形態の変形例におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図１８】第１の実施形態の変形例におけるＣＰＵの処理の流れを示すフローチャート
【図１９】第２の実施形態におけるゲーム画像例
【図２０】第２の実施形態におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図２１】第２の実施形態におけるメインメモリのメモリマップ
【図２２】第２の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図２３】第２の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図２４】第２の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図２５】第２の実施形態における振り強さ検出の詳細を示すフローチャート
【図２６】第３の実施形態におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図２７】第３の実施形態におけるメインメモリのメモリマップ
【図２８】第３の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図２９】第３の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図３０】第３の実施形態における振り操作検出の詳細を示すフローチャート
【図３１】第４の実施形態におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図３２】第４の実施形態におけるメインメモリのメモリマップ
【図３３】第４の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図３４】第４の実施形態における傾き検出の詳細を示すフローチャート
【図３５】第４の実施形態における振り操作検出の詳細を示すフローチャート
【図３６】第４の実施形態における操作ユニットの傾きと傾き検出の検出結果との対応関係を示す図
【図３７】第４の実施形態における向きベクトルの変更方法の一例を示す図
【図３８】第５の実施形態におけるプレイヤの操作とキャラクタの動作との対応関係の一例を示す図
【図３９】第５の実施形態におけるメインメモリのメモリマップ
【図４０】第５の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図４１】第５の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図４２】第５の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図４３】第５の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図４４】第５の実施形態における振り方向検出の詳細を示すフローチャート
【図４５】第５の実施形態における速度ベクトルの変更方法の一例を示す図
【図４６】第５の実施形態における速度ベクトルの変更方法の一例を示す図
【図４７】第６の実施形態におけるプレイヤの操作の一例を示す図
【図４８】第６の実施形態におけるメインメモリのメモリマップ
【図４９】第６の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図５０】第６の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図５１】第６の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図５２】第６の実施形態におけるＣＰＵの処理の流れを示すフローチャートの一部
【図５３】第６の実施形態における振り強さ検出の詳細を示すフローチャート
【図５４】第６の実施形態における速度ベクトルの変更方法の一例を示す図
【図５５】第６の実施形態における速度ベクトルの変更方法の一例を示す図
【図５６】第６の実施形態におけるプレイヤの操作と加速度センサの出力との対応関係を示す図
【図５７】第６の実施形態におけるプレイヤの操作と加速度センサの出力との対応関係を示す図
【発明を実施するための形態】
【００８５】
図１を参照して、本発明の一実施形態に係るゲームシステム１について説明する。なお、図１は、当該ゲームシステム１を説明するための外観図である。以下、据置型ゲーム装置を一例にして、本発明のゲームシステム１について説明する。
【００８６】
図１において、当該ゲームシステム１は、家庭用テレビジョン受像機等のスピーカ２ａを備えたディスプレイ（以下、モニタと記載する）２に、接続コードを介して接続される据置型ゲーム装置（以下、単にゲーム装置と記載する）３および当該ゲーム装置３に操作情報を与えるコントローラ７によって構成される。ゲーム装置３は、接続端子を介して受信ユニット６が接続される。受信ユニット６は、コントローラ７から無線送信される送信データを受信し、コントローラ７とゲーム装置３とは無線通信によって接続される。また、ゲーム装置３には、当該ゲーム装置３に対して交換可能に用いられる情報記憶媒体の一例の光ディスク４が脱着される。ゲーム装置３の上部主面には、当該ゲーム装置３の電源ＯＮ／ＯＦＦスイッチ、ゲーム処理のリセットスイッチ、およびゲーム装置３上部の蓋を開くＯＰＥＮスイッチが設けられている。ここで、プレイヤがＯＰＥＮスイッチを押下することによって上記蓋が開き、光ディスク４の脱着が可能となる。
【００８７】
また、ゲーム装置３には、セーブデータ等を固定的に記憶するバックアップメモリ等を搭載する外部メモリカード５が必要に応じて着脱自在に装着される。ゲーム装置３は、光ディスク４に記憶されたゲームプログラムなどを実行することによって、その結果をゲーム画像としてモニタ２に表示する。さらに、ゲーム装置３は、外部メモリカード５に記憶されたセーブデータを用いて、過去に実行されたゲーム状態を再現して、ゲーム画像をモニタ２に表示することもできる。そして、ゲーム装置３のプレイヤは、モニタ２に表示さ
れたゲーム画像を見ながら、コントローラ７を操作することによって、ゲーム進行を楽しむことができる。
【００８８】
コントローラ７は、その内部に備える通信部７５（図６参照）から受信ユニット６が接続されたゲーム装置３へ、例えばＢｌｕｅｔｏｏｔｈ（ブルートゥース；登録商標）の技術を用いて送信データを無線送信する。コントローラ７は、２つのコントロールユニット（コアユニット７０およびサブユニット７６）が屈曲自在な接続ケーブル７９を介して互いに接続されて構成されており、主にモニタ２に表示されるゲーム空間に登場するプレイヤオブジェクトを操作するための操作手段である。コアユニット７０およびサブユニット７６は、それぞれ複数の操作ボタン、キー、およびスティック等の操作部が設けられている。また、後述により明らかとなるが、コアユニット７０は、当該コアユニット７０から見た画像を撮像するための撮像情報演算部７４（図６参照）を備えている。また、撮像情報演算部７４の撮像対象の一例として、モニタ２の表示画面近傍に２つのＬＥＤモジュール８Ｌおよび８Ｒが設置される。これらＬＥＤモジュール８Ｌおよび８Ｒは、それぞれモニタ２の前方に向かって赤外光を出力する。なお、本実施例では、コアユニット７０とサブユニット７６を屈曲自在なケーブルで接続したが、サブユニット７６に無線ユニットを搭載することで、接続ケーブル７９をなくすこともできる。例えば、無線ユニットとしてＢｌｕｅｔｏｏｔｈ（登録商標）ユニットをサブユニット７６に搭載することで、サブユニット７６からコアユニット７０へ操作データを送信することが可能になる。
【００８９】
次に、図２を参照して、ゲーム装置３の構成について説明する。なお、図２は、ゲーム装置３の機能ブロック図である。
【００９０】
図２において、ゲーム装置３は、各種プログラムを実行する例えばリスク（ＲＩＳＣ）ＣＰＵ（セントラルプロセッシングユニット）３０を備える。ＣＰＵ３０は、図示しないブートＲＯＭに記憶された起動プログラムを実行し、メインメモリ３３等のメモリの初期化等を行った後、光ディスク４に記憶されているゲームプログラムの実行し、そのゲームプログラムに応じたゲーム処理等を行うものである。ＣＰＵ３０には、メモリコントローラ３１を介して、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）３２、メインメモリ３３、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）３４、およびＡＲＡＭ（Ａｕｄｉｏ  ＲＡＭ）３５が接続される。また、メモリコントローラ３１には、所定のバスを介して、コントローラＩ／Ｆ（インターフェース）３６、ビデオＩ／Ｆ３７、外部メモリＩ／Ｆ３８、オーディオＩ／Ｆ３９、およびディスクＩ／Ｆ４１が接続され、それぞれ受信ユニット６、モニタ２、外部メモリカード５、スピーカ２ａ、およびディスクドライブ４０が接続されている。
【００９１】
ＧＰＵ３２は、ＣＰＵ３０の命令に基づいて画像処理を行うものあり、例えば、３Ｄグラフィックスの表示に必要な計算処理を行う半導体チップで構成される。ＧＰＵ３２は、図示しない画像処理専用のメモリやメインメモリ３３の一部の記憶領域を用いて画像処理を行う。ＧＰＵ３２は、これらを用いてモニタ２に表示すべきゲーム画像データやムービ映像を生成し、適宜メモリコントローラ３１およびビデオＩ／Ｆ３７を介してモニタ２に出力する。
【００９２】
メインメモリ３３は、ＣＰＵ３０で使用される記憶領域であって、ＣＰＵ３０の処理に必要なゲームプログラム等を適宜記憶する。例えば、メインメモリ３３は、ＣＰＵ３０によって光ディスク４から読み出されたゲームプログラムや各種データ等を記憶する。このメインメモリ３３に記憶されたゲームプログラムや各種データ等がＣＰＵ３０によって実行される。
【００９３】
ＤＳＰ３４は、ゲームプログラム実行時にＣＰＵ３０において生成されるサウンドデー
タ等を処理するものであり、そのサウンドデータ等を記憶するためのＡＲＡＭ３５が接続される。ＡＲＡＭ３５は、ＤＳＰ３４が所定の処理（例えば、先読みしておいたゲームプログラムやサウンドデータの記憶）を行う際に用いられる。ＤＳＰ３４は、ＡＲＡＭ３５に記憶されたサウンドデータを読み出し、メモリコントローラ３１およびオーディオＩ／Ｆ３９を介してモニタ２に備えるスピーカ２ａに出力させる。
【００９４】
メモリコントローラ３１は、データ転送を統括的に制御するものであり、上述した各種Ｉ／Ｆが接続される。コントローラＩ／Ｆ３６は、例えば４つのコントローラＩ／Ｆで構成され、それらが有するコネクタを介して嵌合可能な外部機器とゲーム装置３とを通信可能に接続する。例えば、受信ユニット６は、上記コネクタと嵌合し、コントローラＩ／Ｆ３６を介してゲーム装置３と接続される。上述したように受信ユニット６は、コントローラ７からの送信データを受信し、コントローラＩ／Ｆ３６を介して当該送信データをＣＰＵ３０へ出力する。ビデオＩ／Ｆ３７には、モニタ２が接続される。外部メモリＩ／Ｆ３８には、外部メモリカード５が接続され、その外部メモリカード５に設けられたバックアップメモリ等とアクセス可能となる。オーディオＩ／Ｆ３９にはモニタ２に内蔵されるスピーカ２ａが接続され、ＤＳＰ３４がＡＲＡＭ３５から読み出したサウンドデータやディスクドライブ４０から直接出力されるサウンドデータをスピーカ２ａから出力可能に接続される。ディスクＩ／Ｆ４１には、ディスクドライブ４０が接続される。ディスクドライブ４０は、所定の読み出し位置に配置された光ディスク４に記憶されたデータを読み出し、ゲーム装置３のバスやオーディオＩ／Ｆ３９に出力する。
【００９５】
次に、図３を参照して、コントローラ７について説明する。なお、図３は、コントローラ７の外観構成を示す斜視図である。
【００９６】
図３において、コントローラ７は、コアユニット７０とサブユニット７６とが接続ケーブル７９で接続されて構成されている。コアユニット７０は、ハウジング７１を有しており、当該ハウジング７１に複数の操作部７２が設けられている。一方、サブユニット７６は、ハウジング７７を有しており、当該ハウジング７７に複数の操作部７８が設けられている。そして、コアユニット７０とサブユニット７６とは、接続ケーブル７９によって接続されている。
【００９７】
接続ケーブル７９の一方端にはコアユニット７０のコネクタ７３（図４参照）に着脱自在なコネクタ７９１が設けられており、接続ケーブル７９の他方端は固定的にサブユニット７６と接続されている。そして、接続ケーブル７９のコネクタ７９１は、コアユニット７０の底面に設けられたコネクタ７３と嵌合し、コアユニット７０とサブユニット７６とが当該接続ケーブル７９を介して接続される。
【００９８】
コアユニット７０は、例えばプラスチック成型によって形成されたハウジング７１を有している。ハウジング７１は、略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。
【００９９】
ハウジング７１の表面の中央に、方向指示手段である十字キー７２ａが設けられる。この十字キー７２ａは、十字型の４方向プッシュスイッチであり、４つの方向（上下左右）に対応する操作部分が十字の突出片にそれぞれ９０°間隔で配置される。プレイヤが十字キー７２ａのいずれかの操作部分を押下することによって上下左右いずれかの方向が選択される。例えばプレイヤが十字キー７２ａを操作することによって、仮想ゲーム世界に登場するプレイヤキャラクタ等の移動方向を指示したり、カーソルの移動方向を指示したりすることができる。なお、十字キー７２ａの代わりに３６０°指示可能なジョイスティックを設けても良い。
【０１００】
ハウジング７１の表面の十字キー７２ａより底面側に、複数の操作ボタン７２ｂ〜７２ｇが設けられる。操作ボタン７２ｂ〜７２ｇは、プレイヤがボタン頭部を押下することによって、それぞれの操作ボタン７２ｂ〜７２ｇに割り当てられた操作信号を出力する操作部である。例えば、操作ボタン７２ｂ〜７２ｄには、１番ボタン、２番ボタン、およびＡボタン等としての機能が割り当てられる。また、操作ボタン７２ｅ〜７２ｇには、マイナスボタン、ホームボタン、およびプラスボタン等としての機能が割り当てられる。これら操作ボタン７２ｂ〜７２ｇは、ゲーム装置３が実行するゲームプログラムに応じてそれぞれの機能が割り当てられる。
【０１０１】
また、ハウジング７１の表面の十字キー７２ａより上面側に、操作ボタン７２ｈが設けられる。操作ボタン７２ｈは、遠隔からゲーム装置３本体の電源をオン／オフする電源スイッチである。
【０１０２】
また、ハウジング７１の表面の操作ボタン７２ｃより底面側に、複数のＬＥＤ７０２が設けられる。ここで、コントローラ７は、他のコントローラ７と区別するためにコントローラ種別（番号）が設けられている。例えば、ＬＥＤ７０２は、コントローラ７に現在設定されている上記コントローラ種別をプレイヤに通知するために用いられる。具体的には、コアユニット７０から受信ユニット６へ送信データを送信する際、上記コントローラ種別に応じて複数のＬＥＤ７０２のうち、種別に対応するＬＥＤが点灯する。
【０１０３】
また、ハウジング７１の表面には、操作ボタン７２ｂおよび操作ボタン７２ｅ〜７２ｇの間に後述するスピーカ７０６（図４参照）からの音を外部に放出するための音抜き孔が形成されている。
【０１０４】
一方、ハウジング７１の裏面には、プレイヤがコアユニット７０を把持したときに当該プレイヤの人差し指または中指が位置するような位置に、操作ボタン（図示せず）が設けられる。この操作ボタンは、例えばＢボタンとして機能する操作部であり、例えばシューティングゲームにおけるトリガスイッチとして用いられる。
【０１０５】
また、ハウジング７１の上面には、撮像情報演算部７４（図６参照）の一部を構成する撮像素子７４３（図６参照）が設けられる。ここで、撮像情報演算部７４は、コアユニット７０が撮像した画像データを解析してその中で輝度が高い場所を判別してその場所の重心位置やサイズなどを検出するためのシステムであり、例えば、最大２００フレーム／秒程度のサンプリング周期であるため比較的高速なコアユニット７０の動きでも追跡して解析することができる。この撮像情報演算部７４の詳細な構成については、後述する。また、ハウジング７１の底面には、コネクタ７３（図４参照）が設けられている。コネクタ７３は、例えば３２ピンのエッジコネクタであり、接続ケーブル７９のコネクタ７９１と嵌合して接続するために利用される。
【０１０６】
次に、図４を参照して、コアユニット７０の内部構造について説明する。なお、図４は、コアユニット７０の上筐体（ハウジング７１の一部）を外した状態を示す斜視図である。
【０１０７】
図４において、ハウジング７１の内部には基板７００が固設されており、当該基板７００の上主面上に操作ボタン７２ａ〜７２ｈ、加速度センサ７０１、ＬＥＤ７０２、スピーカ７０６、およびアンテナ７５４等が設けられる。そして、これらは、基板７００等に形成された配線（図示せず）によってマイクロコンピュータ（Ｍｉｃｒｏ  Ｃｏｍｐｕｔｅｒ：マイコン）７５１等（図６参照）に接続される。なお、加速度センサ７０１が基盤７００の中央部ではなく周辺部に設けられていることにより、コアユニット７０の長手方向を軸とした回転に応じて、重力加速度の方向変化に加え、遠心力による成分の含まれる加
速度を検出することができるので、所定の演算により、検出される加速度データからコアユニット７０の回転を良好な感度で判定することができる。
【０１０８】
一方、基板７００の下主面上には、撮像情報演算部７４やコネクタ７３が取り付けられる。
【０１０９】
図３および図５を参照して、サブユニット７６について説明する。なお、図５は、サブユニット７６の上筐体（ハウジング７７の一部）を外した状態を示す斜視図である。
【０１１０】
図３において、サブユニット７６は、例えばプラスチック成型によって形成されたハウジング７７を有している。ハウジング７７は、全体として大人や子供の片手で把持可能な大きさである。
【０１１１】
ハウジング７７の表面に、方向指示手段であるスティック７８ａが設けられる。スティック７８ａは、ハウジング７７の表面から突出した傾倒可能なスティックを倒すことによって、傾倒方向に応じて操作信号を出力する操作部である。例えば、プレイヤがスティック先端を３６０°任意の方向に傾倒することによって任意の方向や位置を指定することができ、仮想ゲーム世界に登場するプレイヤキャラクタ等の移動方向を指示したり、カーソルの移動方向を指示したりすることができる。なお、スティック７８ａの代わりに十字キーを設けても良い。
【０１１２】
サブユニット７６のハウジング７７の上面に、複数の操作ボタン７８ｄおよび７８ｅが設けられる（図５参照）。操作ボタン７８ｄおよび７８ｅは、プレイヤがボタン頭部を押下することによって、それぞれの操作ボタン７８ｄおよび７８ｅに割り当てられた操作信号を出力する操作部である。例えば、操作ボタン７８ｄおよび７８ｅには、ＸボタンおよびＹボタン等としての機能が割り当てられる。これら操作ボタン７８ｄおよび７８ｅは、ゲーム装置３が実行するゲームプログラムに応じてそれぞれの機能が割り当てられる。
【０１１３】
図５において、ハウジング７７の内部には基板が固設されており、当該基板の上主面上にスティック７８ａおよび加速度センサ７６１等が設けられる。そして、これらは、基板等に形成された配線（図示せず）を介して接続ケーブル７９と接続されている。
【０１１４】
次に、図６を参照して、コントローラ７の内部構成について説明する。なお、図６は、コントローラ７の構成を示すブロック図である。
【０１１５】
図６において、コアユニット７０は、上述した操作部７２、撮像情報演算部７４、加速度センサ７０１、スピーカ７０６、サウンドＩＣ７０７、およびアンプ７０８の他に、その内部に通信部７５を備えている。また、サブユニット７６は、上述した操作部７８および加速度センサ７６１を備えており、接続ケーブル７９とコネクタ７９１およびコネクタ７３とを介して、マイコン７５１と接続されている。
【０１１６】
撮像情報演算部７４は、赤外線フィルタ７４１、レンズ７４２、撮像素子７４３、および画像処理回路７４４を含んでいる。赤外線フィルタ７４１は、コアユニット７０の上面から入射する光から赤外線のみを通過させる。レンズ７４２は、赤外線フィルタ７４１を透過した赤外線を集光して撮像素子７４３へ出射する。撮像素子７４３は、例えばＣＭＯＳセンサやあるいはＣＣＤのような固体撮像素子であり、レンズ７４２が集光した赤外線を撮像する。したがって、撮像素子７４３は、赤外線フィルタ７４１を通過した赤外線だけを撮像して画像データを生成する。撮像素子７４３で生成された画像データは、画像処理回路７４４で処理される。具体的には、画像処理回路７４４は、撮像素子７４３から得られた画像データを処理して高輝度部分を検知し、それらの位置座標や面積を検出した結
果を示す処理結果データを通信部７５へ出力する。なお、これらの撮像情報演算部７４は、コアユニット７０のハウジング７１に固設されており、ハウジング７１自体の方向を変えることによってその撮像方向を変更することができる。しかしながら、ハウジング７１は、サブユニット７６とは屈曲自在な接続ケーブル７９によって接続されているため、サブユニット７６の方向や位置を変更しても撮像情報演算部７４の撮像方向が変化することはない。この撮像情報演算部７４から出力される処理結果データに基づいて、コアユニット７０の位置や動きに応じた信号を得ることができる。
【０１１７】
コアユニット７０は、本実施例では、加速度センサを備える。ここで、コアユニット７０は、３軸（図４のＸ軸、Ｙ軸、Ｚ軸）の加速度センサ７０１を備えていることが好ましい。また、サブユニット７６は、３軸（図５のＸ軸、Ｙ軸、Ｚ軸）の加速度センサ７６１を備えていることが好ましい。この３軸の加速度センサ７０１および７６１は、それぞれ３方向、すなわち、Ｘ軸方向（左側面→右側面方向）、Ｙ軸方向（上面→底面方向）、Ｚ軸方向（表面→裏面方向）で直線加速度を検知する。また、他の実施形態においては、ゲーム処理に用いる制御信号の種類によっては、Ｘ軸方向およびＹ軸方向（または他の対になった方向）のそれぞれに沿った直線加速度のみを検知する２軸の加速度検出手段を使用してもよい。さらにはＸ軸方向（または他の方向）に沿った直線加速度のみを検知する１軸の加速度検出手段を使用してもよい。例えば、この３軸または２軸または１軸の加速度センサ７０１および７６１は、アナログ・デバイセズ株式会社（Ａｎａｌｏｇ  Ｄｅｖｉｃｅｓ，  Ｉｎｃ．）またはＳＴマイクロエレクトロニクス社（ＳＴＭｉｃｒｏｅｌｅｃｔｒｏｎｉｃｓ  Ｎ．Ｖ．）から入手可能であるタイプのものでもよい。加速度センサ７０１および７６１は、シリコン微細加工されたＭＥＭＳ（Ｍｉｃｒｏ  Ｅｌｅｃｔｒｏ  Ｍｅｃｈａｎｉｃａｌ  Ｓｙｓｔｅｍｓ：微小電子機械システム）の技術に基づいた静電容量式（静電容量結合式）であってもよい。また、既存の加速度検出手段の技術（例えば、圧電方式や圧電抵抗方式）あるいは将来開発される他の適切な技術を用いて３軸または２軸または１軸の加速度センサ７０１および７６１が提供されてもよい。
【０１１８】
当業者には公知であるように、加速度センサ７０１および７６１に用いられるような加速度検出手段は、加速度センサの持つ各軸に対応する直線に沿った加速度（直線加速度）のみを検知することができる。つまり、加速度センサ７０１および７６１からの直接の出力は、その各軸に沿った直線加速度（静的または動的）を示す信号である。このため、加速度センサ７０１および７６１は、非直線状（例えば、円弧状）の経路に沿った動き、回転、回転運動、角変位、傾斜、位置、または姿勢等の物理特性を直接検知することはできない。
【０１１９】
しかしながら、加速度センサ７０１および７６１からそれぞれ出力される加速度の信号に対して追加の処理を行うことによって、コアユニット７０およびサブユニット７６に関するさらなる情報をそれぞれ推測または算出することができることは、当業者であれば本明細書の説明から容易に理解できるであろう。例えば、静的な加速度（重力加速度）が検知されると、加速度センサ７０１および７６１からの出力を用いて、傾斜角度と検知された加速度とを用いた演算によって重力ベクトルに対する対象（コアユニット７０またはサブユニット７６）の傾きをそれぞれ推測することができる。このように、加速度センサ７０１および７６１をマイコン７５１（または他のプロセッサ）と組み合わせて用いることによって、コアユニット７０およびサブユニット７６の傾き、姿勢または位置を決定することができる。同様に、加速度センサ７０１を備えるコアユニット７０または加速度センサ７６１を備えるサブユニット７６が、ここで説明されているように、例えばユーザの手で動的に加速されてそれぞれ動かされる場合に、加速度センサ７０１および７６１によって生成される加速度信号をそれぞれ処理することによって、コアユニット７０およびサブユニット７６のさまざまな動きおよび／または位置をそれぞれ算出または推測することができる。他の実施例では、加速度センサ７０１および７６１は、信号をマイコン７５１に
出力する前に内蔵の加速度検出手段から出力される加速度信号に対して所望の処理を行うための、組込み式の信号処理装置または他の種類の専用の処理装置をそれぞれ備えていてもよい。例えば、組込み式または専用の処理装置は、加速度センサが静的な加速度（例えば、重力加速度）を検出するためのものである場合、検知された加速度信号をそれに相当する傾斜角に変換するものであってもよい。加速度センサ７０１および７６１でそれぞれ検知された加速度を示すデータは通信部７５に出力される。
【０１２０】
通信部７５は、マイコン７５１、メモリ７５２、無線モジュール７５３、およびアンテナ７５４を含んでいる。マイコン７５１は、処理の際にメモリ７５２を記憶領域として用いながら、送信データを無線送信する無線モジュール７５３を制御する。また、マイコン７５１は、アンテナ７５４を介して無線モジュール７５３が受信したゲーム装置３からのデータに応じて、サウンドＩＣ７０７の動作を制御する。サウンドＩＣ７０７は、通信部７５を介してゲーム装置３から送信されたサウンドデータ等を処理する。
【０１２１】
コアユニット７０に設けられた操作部７２からの操作信号（コアキーデータ）、加速度センサ７０１からの加速度信号（コア加速度データ）、および撮像情報演算部７４からの処理結果データは、マイコン７５１に出力される。また、接続ケーブル７９を介して、サブユニット７６に設けられた操作部７８からの操作信号（サブキーデータ）および加速度センサ７６１からの加速度信号（サブ加速度データ）は、マイコン７５１に出力される。マイコン７５１は、入力した各データ（コアキーデータ、サブキーデータ、コア加速度データ、サブ加速度データ、処理結果データ）を受信ユニット６へ送信する送信データとして一時的にメモリ７５２に格納する。ここで、通信部７５から受信ユニット６への無線送信は、所定の周期毎に行われるが、ゲームの処理は１／６０秒を単位として行われることが一般的であるので、それよりも短い周期でデータを収集して送信を行うことが必要となる。具体的には、ゲームの処理単位は１６．７ｍｓ（１／６０秒）であり、ブルートゥース（Ｂｌｕｅｔｏｏｔｈ；登録商標）で構成される通信部７５の送信間隔は５ｍｓである。マイコン７５１は、受信ユニット６への送信タイミングが到来すると、メモリ７５２に格納されている送信データを一連の操作情報として出力し、無線モジュール７５３へ出力する。そして、無線モジュール７５３は、例えばブルートゥース（登録商標）の技術に基づいて、所定周波数の搬送波を用いて操作情報で変調し、その微弱電波信号をアンテナ７５４から放射する。つまり、コアユニット７０に設けられた操作部７２からのコアキーデータ、サブユニット７６に設けられた操作部７８からのサブキーデータ、コアユニット７０に設けられた加速度センサ７０１からのコア加速度データ、サブユニット７６に設けられた加速度センサ７６１からのサブ加速度データ、および撮像情報演算部７４からの処理結果データは、無線モジュール７５３で微弱電波信号に変調されてコアユニット７０から放射される。そして、ゲーム装置３の受信ユニット６でその微弱電波信号を受信し、ゲーム装置３で当該微弱電波信号を復調や復号することによって、一連の操作情報（コアキーデータ、サブキーデータ、コア加速度データ、サブ加速度データ、および処理結果データ）を取得することができる。そして、ゲーム装置３のＣＰＵ３０は、取得した操作情報とゲームプログラムとに基づいて、ゲーム処理を行う。なお、Ｂｌｕｅｔｏｏｔｈ（登録商標）の技術を用いて通信部７５を構成する場合、通信部７５は、他のデバイスから無線送信された送信データを受信する機能も備えることができる。
【０１２２】
図７に示すように、ゲームシステム１でコントローラ７を用いてゲームをプレイするためには、プレイヤは、一方の手（例えば右手）でコアユニット７０を把持し、他方の手（例えば左手）でサブユニット７６を把持する。
【０１２３】
上述したように、コアユニット７０に設けられた加速度センサ７０１からの出力（コア加速度データ）を用いることによって、コアユニット７０の傾き、姿勢、位置、または、動き（移動や振りなど）を決定することができる。つまり、プレイヤがコアユニット７０
を把持した手を上下左右等に動かすことによって、コアユニット７０は、プレイヤの手の運動や向きに応じた操作入力手段として機能する。また、上述したようにサブユニット７６に設けられた加速度センサ７６１からの出力（サブ加速度データ）を用いることによって、サブユニット７６の傾き、姿勢、位置、または、動き（移動や振りなど）を決定することができる。つまり、プレイヤがサブユニット７６を把持した手を上下左右等に動かすことによって、サブユニット７６は、プレイヤの手の運動や向きに応じた操作入力手段として機能する。これによって、プレイヤが両方の手に別々のユニットを把持してそれぞれの手自体を動かして操作するような入力を行うことができる。したがって、コアユニット７０およびサブユニット７６は、従来のゲーム機用コントローラを単に左右に分離できるように構成しただけでなく、プレイヤの左右の手が自由になると同時に、従来のゲーム機用コントローラでは不可能であった新たな操作が可能となっている。また、コントローラ自体の操作の自由度が著しく向上しているため、臨場感のあるゲーム操作を実現できる。
【０１２４】
なお、上述した説明では、コントローラ７とゲーム装置３とが無線通信によって接続された態様を用いたが、コントローラ７とゲーム装置３とがケーブルを介して電気的に接続されてもかまわない。この場合、コアユニット７０に接続されたケーブルをゲーム装置３の接続端子に接続する。
【０１２５】
また、コントローラ７を構成するコアユニット７０およびサブユニット７６のうち、コアユニット７０のみに通信部７５を設けたが、サブユニット７６に受信ユニット６へ送信データを無線送信（または有線通信）する通信部を設けてもかまわない。また、コアユニット７０およびサブユニット７６それぞれに上記通信部を設けてもかまわない。例えば、コアユニット７０およびサブユニット７６に設けられた通信部がそれぞれ受信ユニット６へ送信データを無線送信してもいいし、サブユニット７６の通信部からコアユニット７０へ送信データを無線送信してコアユニット７０の通信部７５で受信した後、コアユニット７０の通信部７５がサブユニット７６の送信データと共にコアユニット７０の送信データを受信ユニット６へ無線送信してもいい。これらの場合、コアユニット７０とサブユニット７６とを電気的に接続する接続ケーブル７９が不要となる。
【０１２６】
また、コントローラ７から無線送信される送信データを受信する受信手段として、ゲーム装置３の接続端子に接続された受信ユニット６を用いて説明したが、ゲーム装置３の本体内部に設けられた受信モジュールによって当該受信手段を構成してもかまわない。この場合、受信モジュールが受信した送信データは、所定のバスを介してＣＰＵ３０に出力される。
【０１２７】
以下、上記のようなゲームシステム１を用いて実現される本発明の種々の実施形態について説明する。なお、以下では説明を分かり易くするために、コアユニット７０およびサブユニット７６を、それぞれ第１ユニット、第２ユニットと称し、コアユニット７０に設けられた加速度センサ７０１およびサブユニット７６に設けられた加速度センサ７６１を、それぞれ第１加速度センサ、第２加速度センサと称す。
【０１２８】
（第１の実施形態）
図８は、第１の実施形態における表示画像の一例である。モニタ２の画面には、プレイヤによって操作されるキャラクタ（ゲームオブジェクト）を含む３次元の仮想ゲーム世界の様子が表示される。本実施形態ではキャラクタは戦車に乗っている。プレイヤは、第１ユニットまたは第２ユニットを傾ける（すなわち、水平軸を中心として回転させる）ことによって、キャラクタの動作を制御することができる。なお、以下の説明では、加速度センサのＸ軸正方向が水平方向かつプレイヤの右方向であり、Ｙ軸正方向が鉛直下方向であり、Ｚ軸正方向が水平方向かつプレイヤの前方向であるという前提で説明するが、加速度センサの軸方向と現実世界の方向との関係はこの前提に限られるものではない。
【０１２９】
図９に、第１の実施形態におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。第１ユニットが第２ユニットよりも相対的に向こう側（図１６参照）に傾けられた場合にはキャラクタは左旋回し、第２ユニットが第１ユニットよりも相対的に向こう側に傾けられた場合にはキャラクタは右旋回する。また、第１ユニットと第２ユニットが平均的に向こう側に傾けられた場合にはキャラクタは前進し、平均的に手前側（図１６参照）に傾けられた場合にはキャラクタは後退する。なお、図９において、紙面の奥側がキャラクタの進行方向（前方）であり、紙面の手前側がキャラクタの後方である。
【０１３０】
図１０は、第１の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム１００、ゲーム画像データ１０２、キャラクタ制御データ１０４、第１傾き値１０６、第２傾き値１０８、第１基準値１１０、および第２基準値１１２が格納される。なお、ゲームプログラム１００、ゲーム画像データ１０２は光ディスク４に記憶されており、適宜メインメモリ３３にコピーされて使用される。また、必要に応じて第１基準値１１０や第２基準値１１２も同様に光ディスク４に記憶してメインメモリにコピーして使用しても良い。
【０１３１】
ゲーム画像データ１０２は、ゲーム画像を生成するためのデータ（ポリゴンデータやテクスチャデータなど）であり、キャラクタ画像を生成するためのデータおよび背景画像を生成するためのデータを含んでいる。
【０１３２】
キャラクタ制御データ１０４は、キャラクタを制御するためのデータであって、ゲーム世界（仮想的な３次元空間）におけるキャラクタの現在位置を示す現在位置データと、キャラクタの移動速度の大きさを示す速度データと、キャラクタの進行方向を示す向きベクトルとを含んでいる。現在位置データは３次元座標値で表されるデータであり、速度データはスカラー値で表されるデータであり、向きベクトルは３次元の単位ベクトルで表されるデータである。なお、速度データの代わりに速度ベクトルを用いても良い。
【０１３３】
第１傾き値１０６は、第１加速度センサの出力値に基づいて検出される第１ユニットの傾きを表す値である。第２傾き値１０８は、第２加速度センサの出力値に基づいて検出される第２ユニットの傾きを表す値である。第１基準値１１０は、第１ユニットの傾きの基準値である。第２基準値１１２は、第２ユニットの傾きの基準値である。
【０１３４】
次に、図１１〜図１４のフローチャートを参照して、ゲームプログラム１００に基づくＣＰＵ３０の処理の流れを説明する。
【０１３５】
図１１において、ゲームプログラム１００の実行が開始されると、ＣＰＵ３０は、まずステップＳ１００でニュートラルポジション設定処理を実行する。ニュートラルポジション設定処理とは、第１ユニットの傾きの基準値（第１基準値１１０）と第２ユニットの傾きの基準値（第２基準値１１２）を決定するための処理である。以下、図１２を参照して、ニュートラルポジション設定処理の詳細を説明する。
【０１３６】
図１２のステップＳ１３４で、ＣＰＵ３０は、コントローラ７から送信される操作情報に基づいて、プレイヤによって設定ボタン（ニュートラルポジションの設定をプレイヤが指示するためのボタン）が押されたかどうかを判断する。この設定ボタンは、第１ユニットのみに設けられていてもよいし、第２ユニットのみに設けられていてもよいし、第１ユニットと第２ユニットの両方に設けられていてもよい。さらには、設定ボタンを押す替わりに、プレイヤがマイクロフォンに向かって音声を発することによってニュートラルポジションの設定を指示できるようにしてもよい。なお、ここでは設定ボタンが第１ユニットのみに設けられているものとして説明する。プレイヤによって設定ボタンが押されたこと
が検出された場合には処理はステップＳ１３６に進み、プレイヤによって設定ボタンが押されたことが検出されない場合にはステップＳ１３４の処理を繰り返す（すなわちプレイヤによって設定ボタンが押されるまで待機する）。
【０１３７】
ステップＳ１３６では、一定時間（例えば１０フレーム期間）だけ待機する。これは、プレイヤが設定ボタンから指を離した直後は設定ボタンが設けられているユニット（ここでは第１ユニット）が揺れている可能性があり、そのために第１基準値が正しく設定されない可能性があるからである。
【０１３８】
ステップＳ１３８では、第１加速度センサの出力値（出力ベクトル）を取得する。ここでは、第１加速度センサのＸ軸方向の出力値をＡｘ１とし、Ｙ軸方向の出力値をＡｙ１とし、Ｚ軸方向の出力値をＡｚ１とする。なお、所定期間分（例えば３秒程度）の加速度センサの出力値を常に記憶しておき、プレイヤが設定ボタンを押したときにそれより所定時間だけ前に出力された出力値を利用してもよいし、設定ボタンを押す前または後のある期間の出力値の平均を採用しても良い。（第２加速度センサについても同様）
【０１３９】
ステップＳ１４０では、ステップＳ１３８で取得した第１加速度センサの出力ベクトル（Ａｘ１，Ａｙ１，Ａｚ１）の大きさ（すなわち、√（Ａｘ１2＋Ａｙ１2＋Ａｚ１2））
が０．８〜１．２の範囲内かどうか、すなわち第１ユニットが静止しているかどうかを判断する。第１加速度センサおよび第２加速度センサの出力ベクトルは、静止状態（すなわち重力加速度の影響のみを受けている状態）において１．０の大きさとなるように設定されている。したがって、第１加速度センサの出力ベクトルの大きさが１．０または１．０に近い値である場合には、第１ユニットがほぼ静止していると判断することができる。逆に、第１加速度センサの出力ベクトルの大きさが１．０から大きく離れた値である場合には、第１ユニットが移動していると判断することができる。第１加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内であった場合には、処理はステップＳ１４２に進む。第１加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内でなかった場合には、第１ユニットが移動していると第１基準値が正しく設定できないので、処理はステップＳ１３４に戻る。なお、０．８〜１．２という値は例であり、本質的には、１．０の近傍の値であることが判断される。なお、本実施例では、加速度センサのＸ方向成分（Ａｘ）は使用しないので、プレイヤは基本的にコントローラ７をＸ方向に傾けずにプレイするものであり、ステップＳ１３８で取得した第１加速度センサの出力のＸ方向成分が一定値より大きいときには、適切なニュートラルポジションが設定されていないとして、ステップＳ１３４に戻るようにしても良い。（第２加速度センサについても同様）
【０１４０】
ステップＳ１４２では、第２加速度センサの出力値（出力ベクトル）を取得する。ここでは、第２加速度センサのＸ軸方向の出力値をＡｘ２とし、Ｙ軸方向の出力値をＡｙ２とし、Ｚ軸方向の出力値をＡｚ２とする。
【０１４１】
ステップＳ１４４では、ステップＳ１４２で取得した第２加速度センサの出力ベクトル（Ａｘ２，Ａｙ２，Ａｚ２）の大きさ（すなわち、√（Ａｘ２2＋Ａｙ２2＋Ａｚ２2））
が０．８〜１．２の範囲内かどうか、すなわち第２ユニットが静止しているかどうかを判断する。第２加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内であった場合には、処理はステップＳ１４６に進む。第２加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内でなかった場合には、第２ユニットが移動していると第２基準値が正しく設定できないので、処理はステップＳ１３４に戻る。
【０１４２】
ステップＳ１４６では、ａｒｃｔａｎ（Ａｚ１／Ａｙ１）（これは第１ユニットのＸ軸（水平軸）周りの傾きを表している；図１６における角度Θ）を算出し、算出された値を第１基準値１１０として設定する。同様に、ａｒｃｔａｎ（Ａｚ２／Ａｙ２）（これは第
２ユニットのＸ軸周りの傾きを表している；図１６における角度Θ）を算出し、算出された値を第２基準値１１２として設定する。なお、（Ａｙ１，Ａｚ１）を基準値として設定してもよい。
【０１４３】
なお、ここではステップＳ１３８で取得した第１加速度センサの値のみに基づいて第１基準値１１０を設定しているが、第１加速度センサの値を時間をずらして複数回取得し、それらの平均に基づいて第１基準値１１０を設定してもよい。これにより、ニュートラルポジション設定時の第１ユニットの揺れの影響を抑えることができる。第２基準値１１２についても同様である。
【０１４４】
ステップＳ１４８では、第１基準値１１０と第２基準値１１２の差が所定値以内かどうかを判断する。第１基準値１１０と第２基準値１１２の差が所定値以内であった場合には、ニュートラルポジション設定処理を終了し、処理は図１１のステップＳ１０２に進む。第１基準値１１０と第２基準値１１２の差が所定値を超えていた場合には、処理はステップＳ１３４に戻り、第１基準値１１０および第２基準値１１２の再設定を行う。
【０１４５】
なお、ステップＳ１４８において、第１基準値１１０と第２基準値１１２の差が所定値を超えていた場合に第１基準値１１０および第２基準値１１２の再設定を行うようにしている理由は、そのような第１基準値１１０および第２基準値１１２をそのまま利用してゲームをプレイすると良好な操作性が得られないことが予想されるためである。すなわち、本実施形態では図９で示したように、第１ユニットが第２ユニットよりも相対的に向こう側に傾けられたときにキャラクタが左旋回し、第２ユニットが第１ユニットよりも相対的に向こう側に傾けられたときにキャラクタが右旋回するが、第１基準値１１０と第２基準値１１２がずれている場合には、プレイヤが第１ユニットと第２ユニットを平行に揃えて構えた場合でもキャラクタが右旋回または左旋回してしまうことになり、プレイヤに違和感を与えてしまうからである。
【０１４６】
なお、ゲームの種類によっては、第１基準値１１０と第２基準値１１２のずれが特に問題にならないので、その場合にはステップＳ１４８の判断を省略しても構わない。
【０１４７】
また、本実施形態では、プレイヤが第１ユニットに設けられた設定ボタンを押すと、第１基準値１１０の設定と第２基準値１１２の設定が一度に行われる例について説明したが、本発明はこれに限定されない。例えば、第１ユニットと第２ユニットのそれぞれに設定ボタンが設けられており、プレイヤが第１ユニットに設けられた設定ボタンを押したときには第１基準値１１０が設定され、その後、プレイヤが第２ユニットに設けられた設定ボタンを押したときには第２基準値１１２が設定されるようにしてもよい。ただし、この場合には第１基準値１１０と第２基準値１１２がずれやすくなるため、本実施形態のように第１基準値１１０の設定と第２基準値１１２の設定がほぼ同じタイミングで行われるのが好ましい。
【０１４８】
なお、本実施形態では第１基準値１１０と第２基準値１１２をそれぞれ個別に設定する例を説明したが、上述した違和感を完全になくすために、第１基準値１１０と第２基準値１１２に共通の値を設定するようにしてもよい。例えば、ステップＳ１４６におけるａｒｃｔａｎ（Ａｚ１／Ａｙ１）とａｒｃｔａｎ（Ａｚ２／Ａｙ２）の平均値を、第１基準値１１０と第２基準値１１２に共通に設定してもよい。また、ａｒｃｔａｎ（Ａｚ１／Ａｙ１）またはａｒｃｔａｎ（Ａｚ２／Ａｙ２）のいずれか一方のみを算出し、この算出結果を第１基準値１１０と第２基準値１１２に共通に設定してもよい。この場合、プレイヤが設定ボタンを押したときの操作ユニットのぶれの影響を避けるために、第１ユニットおよび第２ユニットのうち、プレイヤが押した設定ボタンが設けられていない方の操作ユニットの加速度センサの出力値に基づいて、第１基準値１１０と第２基準値１１２を共通に設
定するのが好ましい。
【０１４９】
図１１において、ニュートラルポジション設定処理が終わると、ＣＰＵ３０はステップＳ１０２で、ゲーム処理に利用する各種データ（キャラクタ制御データ１０４や第１傾き値１０６など）の初期化を行い、キャラクタを含むゲーム画像を生成してモニタ２の画面に表示する。
【０１５０】
ステップＳ１０４では、第１ユニットに関する傾き検出を行う。以下、この傾き検出の詳細を図１４を参照して説明する。
【０１５１】
図１４のステップＳ１５４では、加速度センサ（ここでは第１加速度センサ）の出力値（出力ベクトル）を取得する。ここでは、加速度センサのＸ軸方向の出力値をＡｘ１とし、Ｙ軸方向の出力値をＡｙ１とし、Ｚ軸方向の出力値をＡｚ１とする。
【０１５２】
ステップＳ１５６では、ステップＳ１５４で取得した第１加速度センサの出力ベクトル（Ａｘ１，Ａｙ１，Ａｚ１）の大きさ（すなわち、√（Ａｘ１2＋Ａｙ１2＋Ａｚ１2））
が０．８〜１．２の範囲内かどうか、すなわち第１ユニットが静止しているかどうかを判断する。第１加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内であった場合には、処理はステップＳ１５８に進む。第１加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内でなかった場合には、処理はステップＳ１６０に進む。
【０１５３】
ステップＳ１５８では、ａｒｃｔａｎ（Ａｚ１／Ａｙ１）（これは第１ユニットのＸ軸周りの傾きを表している；図１６における角度Θ）を算出し、算出された値を傾き検出の戻り値として返す。この戻り値は、メインメモリ３３に第１傾き値１０６として格納される。その後、処理は図１１のステップＳ１０６に進む。
【０１５４】
ステップＳ１６０では、第１ユニットが移動していると第１ユニットの傾きが正しく検出できないので、傾き検出結果としてエラーを返し、傾き検出を終了し、処理は図１１のステップＳ１０６に進む。
【０１５５】
ステップＳ１０６では、ステップＳ１０６の傾き検出結果がエラーかどうかを判断し、エラーであった場合には処理は図１３のステップＳ１５０に進み、エラーでなかった場合には処理はステップＳ１０８に進む。
【０１５６】
ステップＳ１０８では、第２ユニットに関して、ステップＳ１０４と同様に傾き検出を行う。すなわち、第２加速度センサの出力ベクトル（Ａｘ２，Ａｙ２，Ａｚ２）の大きさが０．８〜１．２の範囲内であった場合には、ａｒｃｔａｎ（Ａｚ２／Ａｙ２）（これは第２ユニットのＸ軸周りの傾きを表している；図１６における角度Θ）の値が、メインメモリ３３に第２傾き値１０８として格納される。
【０１５７】
ステップＳ１１０では、ステップＳ１０８の傾き検出結果がエラーかどうかを判断し、エラーであった場合には処理は図１３のステップＳ１５０に進み、エラーでなかった場合には処理はステップＳ１１２に進む。
【０１５８】
ステップＳ１１２では、第１傾き値１０６を第１基準値１１０に基づいて補正する。具体的には、第１傾き値１０６と第１基準値１１０との差分を算出し、この算出結果を新たな第１傾き値１０６としてメインメモリ３３に上書きする。
【０１５９】
ステップＳ１１４では、第２傾き値１０８を第２基準値１１２に基づいて補正する。具体的には、第２傾き値１０８と第２基準値１１２との差分を算出し、この算出結果を新た
な第２傾き値１０８としてメインメモリ３３に上書きする。
【０１６０】
ステップＳ１１６では、第１傾き値１０６から第２傾き値１０８を引いた結果の値がＳ１（正の閾値）よりも大きいかどうかを判断する。第１傾き値１０６から第２傾き値１０８を引いた結果の値がＳ１よりも大きい場合（すなわち第１ユニットが第２ユニットよりも相対的に向こう側に傾けられた場合）には、処理はステップＳ１１８に進み、Ｓ１よりも大きくない場合には処理はステップＳ１２０に進む。
【０１６１】
ステップＳ１１８では、キャラクタが左旋回するように向きベクトルを変更する。向きベクトルの変更方法としては種々の方法が考えられる。本実施形態では、一例として、図１５に示すように、キャラクタの現在位置における地面の法線ベクトルおよび現在の向きベクトルの両方に対して垂直かつ所定の大きさを有する左旋回ベクトルと、現在の向きベクトルとを合成することによって合成ベクトルを求め、この合成ベクトルと同じ方向を有する単位ベクトルを新しい向きベクトルとして決定する。
【０１６２】
ステップＳ１２０では、第１傾き値１０６から第２傾き値１０８を引いた結果の値が−Ｓ１よりも小さいかどうかを判断する。第１傾き値１０６から第２傾き値１０８を引いた結果の値が−Ｓ１よりも小さい場合（すなわち第２ユニットが第１ユニットよりも相対的に向こう側に傾けられた場合）には、処理はステップＳ１２２に進み、−Ｓ１よりも小さくない場合には処理はステップＳ１２４に進む。
【０１６３】
ステップＳ１２２では、キャラクタが右旋回するように向きベクトルを変更する。
【０１６４】
ステップＳ１２４では、第１傾き値１０６と第２傾き値１０８の平均値がＳ２（正の閾値）よりも大きいかどうかを判断する。第１傾き値１０６と第２傾き値１０８の平均値がＳ２よりも大きい場合（すなわち第１ユニットと第２ユニットが平均的に向こう側に傾けられた場合）には、処理はステップＳ１２６に進み、Ｓ２よりも大きくない場合には処理はステップＳ１２８に進む。
【０１６５】
ステップＳ１２６では、第１傾き値１０６と第２傾き値１０８の平均値に応じて正の速度データを設定する。例えば、平均値に比例した絶対値を有する正の速度データを設定する。その後、処理は図１３のステップＳ１５０に進む。
【０１６６】
ステップＳ１２８では、第１傾き値１０６と第２傾き値１０８の平均値が−Ｓ２よりも小さいかどうかを判断する。第１傾き値１０６と第２傾き値１０８の平均値が−Ｓ２よりも小さい場合（すなわち第１ユニットと第２ユニットが平均的に手前側に傾けられた場合）には、処理はステップＳ１３０に進み、−Ｓ２よりも小さくない場合には処理はステップＳ１３２に進む。
【０１６７】
ステップＳ１３０では、第１傾き値１０６と第２傾き値１０８の平均値に応じて負の速度データを設定する。例えば、平均値に比例した絶対値を有する負の速度データを設定する。その後、処理は図１３のステップＳ１５０に進む。
【０１６８】
ステップＳ１３２では、速度データを０に設定し、処理は図１３のステップＳ１５０に進む。
【０１６９】
図１３のステップＳ１５０では、速度データと向きベクトルに基づいて、現在位置データを更新する。これにより、ゲーム世界のキャラクタは、向きベクトルが示す方向に向かって速度データが示す距離だけ移動する。
【０１７０】
ステップＳ１５２では、モニタ２に表示されているゲーム画像を、現在位置データに基づいて更新し、処理は図１１のステップＳ１０４に戻る。その後、以上のような処理が繰り返されることにより、プレイヤの操作に応じてゲーム画像が随時変化する。
【０１７１】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、２つの操作ユニットの傾きの差分によりキャラクタを制御することができるので、直感的な操作が可能となり、良好な操作性が得られる。
【０１７２】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、１軸の加速度センサを用いても操作ユニットの傾きを検出することができる（例えば、図１６におけるＺ軸の出力値だけを参照しても、操作ユニットの傾きを検出することができる）ため、本実施形態と同様の効果を得ることができる。
【０１７３】
なお、本実施形態では、第１ユニットの傾きと第２ユニットの傾きの差分と、第１ユニットの傾きと第２ユニットの傾きの平均値とを利用してキャラクタの動作を制御する例を説明したが、例えば、第１ユニットの傾きと第２ユニットの傾きの平均値を用いずに差分だけを利用するようなゲームを実現することも可能である。以下、このような第１ユニットの傾きと第２ユニットの傾きの差分だけを利用する例を、本実施形態の変形例として説明する。
【０１７４】
図１７に、第１の実施形態の変形例におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。第１ユニットが第２ユニットよりも相対的に向こう側に傾けられた場合にはキャラクタは左旋回し、第２ユニットが第１ユニットよりも相対的に向こう側に傾けられた場合にはキャラクタは右旋回する。また、加速ボタンが押された場合にはその時点での進行方向にキャラクタが加速する。
【０１７５】
図１８を参照して、第１の実施形態の変形例におけるＣＰＵ３０の処理の流れを説明する。ただし、図１８において、図１１と同じ処理については同じ参照符号を付し、説明を省略する。
【０１７６】
ステップＳ１６２よりも前の処理においては、第１ユニットの傾きと第２ユニットの傾きの差分に応じてキャラクタを左旋回または右旋回させる処理が行われる。
【０１７７】
ステップＳ１６２で、ＣＰＵ３０は、プレイヤによって加速ボタンが押されたかどうかを判断する。加速ボタンは第１ユニットにのみ設けられていてもよいし、第２ユニットのみに設けられていてもよいし、第１ユニットと第２ユニットの両方にそれぞれ設けられていてもよい。加速ボタンが押された場合には、処理はステップＳ１６４に進み、加速ボタンが押されていない場合には、処理はステップＳ１６６に進む。
【０１７８】
ステップＳ１６４では、速度データを所定量だけ増加させる。
【０１７９】
ステップＳ１６６では、速度データを所定量だけ減少させる。
【０１８０】
ステップＳ１６４またはステップＳ１６６よりも後の処理については図１３の処理と同じである。
【０１８１】
以上のように、この変形例においては、第１ユニットの傾きと第２ユニットの傾きの絶対値を用いずに差分だけを利用してゲームをプレイすることができるため、例えば床に仰向けで寝転がってもゲームを問題無くプレイすることが可能となり、ゲームプレイ中のプ
レイヤの姿勢の自由度が増す。
【０１８２】
（第２の実施形態）
図１９は、第２の実施形態における表示画像の一例である。モニタ２の画面には、プレイヤによって操作されるキャラクタ（ゲームオブジェクト）を含む３次元の仮想ゲーム世界の様子が表示される。本実施形態ではキャラクタはそりに乗っており、そりは５匹の恐竜（恐竜Ａ〜恐竜Ｅ）によって引っ張られている。プレイヤは、第１ユニットまたは第２ユニットを振ることによって、キャラクタの動作を制御することができる。なお、本実施形態では、プレイヤが、第１ユニットを左手で把持し、第２ユニットを右手で把持するとして説明する（ただし、逆の対応関係でもかまわない）。
【０１８３】
図２０に、第２の実施形態におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。第１ユニットのみが振られた場合にはキャラクタは右旋回（進行方向を右に変更）し、第２ユニットのみが振られた場合にはキャラクタは左旋回（進行方向を左に変更）する。また、第１ユニットと第２ユニットが同時に振られた場合にはキャラクタはその時点での進行方向に加速する。
なお、第１ユニットのみが振られた場合にキャラクタが左方向に進み、第２ユニットのみが振られた場合に右方向に進み、同時に振られた場合に前方に進むようにしてもよい。
【０１８４】
図２１は、第２の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム２００、ゲーム画像データ２０２、キャラクタ制御データ２０４、第１振り強さ値２０６、第２振り強さ値２０８、第１入力フラグ２１０、第２入力フラグ２１２、同時入力フラグ２１４、第１タイマ２１６、第２タイマ２１８、および同時入力タイマ２２０が格納される。
【０１８５】
ゲーム画像データ２０２およびキャラクタ制御データ１０４については、第１の実施形態と同様のため、説明を省略する。
【０１８６】
第１振り強さ値２０６は、第１加速度センサの出力値に基づいて検出される第１ユニットの振りの強さを表す値である。第２振り強さ値２０８は、第２加速度センサの出力値に基づいて検出される第２ユニットの振りの強さを表す値である。
【０１８７】
第１入力フラグ２１０は、第１ユニットが振られたことを示すフラグであり、第１ユニットが振られたことが検出されたときにオンされる。第２入力フラグ２１２は、第２ユニットが振られたことを示すフラグであり、第２ユニットが振られたことが検出されたときにオンされる。同時入力フラグ２１４は、第１ユニットと第２ユニットが同時に振られたことを示すフラグであり、第１ユニットと第２ユニットが同時に振られたことが検出されたときにオンされる。
【０１８８】
第１タイマ２１６は、第１ユニットが振られたことが検出されてからの経過時間（経過フレーム数）を示す値である。第２タイマ２１８は、第２ユニットが振られたことが検出されてからの経過時間（経過フレーム数）を示す値である。同時入力タイマ２２０は、第１ユニットと第２ユニットが同時に振られたことが検出されてからの経過時間（経過フレーム数）を示す値である。
【０１８９】
次に、図２２〜図２５のフローチャートを参照して、ゲームプログラム２００に基づくＣＰＵ３０の処理の流れを説明する。なお、ステップＳ２０２からＳ２６６までの処理が１フレームごとに繰り返される。
【０１９０】
図２２において、ゲームプログラム２００の実行が開始されると、ＣＰＵ３０は、まず
ステップＳ２００で、ゲーム処理に利用する各種データ（キャラクタ制御データ２０４や第１振り強さ値２０６や第１入力フラグ２１０や第１タイマ２１６など）の初期化を行い、キャラクタを含むゲーム画像を生成してモニタ２の画面に表示する。
【０１９１】
ステップＳ２０２では、同時入力フラグ２１４がオンであるかどうかを判断し、同時入力フラグ２１４がオンである場合には処理はステップＳ２０４に進み、オンでない場合には処理はステップＳ２１０に進む。
【０１９２】
ステップＳ２０４では、同時入力タイマ２２０に１を加算する。
【０１９３】
ステップＳ２０６では、同時入力タイマ２２０が２０以上であるかどうかを判断し、同時入力タイマ２２０が２０以上である場合には処理はステップＳ２０８に進み、２０以上でない場合には処理は図２４のステップＳ２６２に進む。
【０１９４】
ステップＳ２０８では、同時入力フラグ２１４をオフにし、処理は図２４のステップＳ２６２に進む。
【０１９５】
以上のように、同時入力フラグ２１４がオンになってから（すなわち、第１ユニットと第２ユニットが同時に振られたことが検出されてから）２０フレーム期間が経過するまでの間は、第１ユニットの振り強さ検出（後述のステップＳ２３６）も第２ユニットの振り強さ検出（後述のステップＳ２５０）も行われず、すなわちプレイヤによる第１ユニットの振り操作も第２ユニットの振り操作も受け付けられない状態となる。これにより、プレイヤが行った一回の同時振り操作が、複数フレームにわたって連続して検出されてしまうことを防止することができる。
【０１９６】
ステップＳ２１０では、第１入力フラグ２１０がオンであるかどうかを判断し、第１入力フラグ２１０がオンである場合には処理はステップＳ２１２に進み、オンでない場合には処理はステップＳ２２２に進む。
【０１９７】
ステップＳ２１２では、第１タイマ２１６に１を加算する。
【０１９８】
ステップＳ２１４では、第１タイマ２１６が５であるかどうかを判断し、第１タイマ２１６が５である場合（すなわち、第１ユニットの振りが検出された後、第２ユニットの振りが検出されないまま５フレーム経過したとき＝第１ユニットのみが振られた場合）には処理はステップＳ２１６に進み、５でない場合には処理はステップＳ２１８に進む。
【０１９９】
ステップＳ２１６では、キャラクタが右旋回するように向きベクトルを変更する。向きベクトルの変更方法については第１の実施形態と同様である。
【０２００】
ステップＳ２１８では、第１タイマ２１６が１０より大きいかどうかを判断し、第１タイマ２１６が１０より大きい場合には処理はステップＳ２２０に進み、１０より大きくない場合には処理はステップＳ２２２に進む。
【０２０１】
ステップＳ２２０では、第１入力フラグ２１０をオフにする。
【０２０２】
以上のように、第１入力フラグ２１０がオンになってから（すなわち、第１ユニットが振られたことが検出されてから）１０フレーム期間が経過するまでの間は、第１ユニットの振り強さ検出（後述のステップＳ２３６）が行われず、すなわちプレイヤによる第１ユニットの振り操作が受け付けられない状態となる。これにより、プレイヤが行った一回の振り操作が、複数フレームにわたって連続して検出されてしまうことを防止することがで
きる。
【０２０３】
なお、後述の説明により明らかとなるが、第１入力フラグ２１０がオンになってから５フレーム期間が経過するまでの間に第２ユニットが振られたことが検出された場合には、その時点で同時入力フラグ２１４がオンになるので、その時点からさらに２０フレーム期間が経過するまでの間は、プレイヤによる第１ユニットの振り操作が受け付けられない状態となる。なお、同時入力フラグ２１４がオフになると、第１ユニットの振り強さ検出（後述のステップＳ２３６）と第２ユニットの振り強さ検出（後述のステップＳ２５０）が同時に再開されるので、第１ユニットの振り操作の受け付け再開タイミングと第２ユニットの振り操作の受け付け再開タイミングが一致することになる。
【０２０４】
ステップＳ２２２では、第２入力フラグ２１２がオンであるかどうかを判断し、第２入力フラグ２１２がオンである場合には処理はステップＳ２２４に進み、オンでない場合には処理は図２３のステップＳ２３４に進む。
【０２０５】
ステップＳ２２４では、第２タイマ２１８に１を加算する。
【０２０６】
ステップＳ２２６では、第２タイマ２１８が５であるかどうかを判断し、第２タイマ２１８が５である場合（すなわち、第２ユニットのみが振られた場合）には処理はステップＳ２２８に進み、５でない場合には処理はステップＳ２３０に進む。
【０２０７】
ステップＳ２２８では、キャラクタが左旋回するように向きベクトルを変更する。
【０２０８】
ステップＳ２３０では、第２タイマ２１８が１０より大きいかどうかを判断し、第２タイマ２１８が１０より大きい場合には処理はステップＳ２３２に進み、１０より大きくない場合には処理は図２３のステップＳ２３４に進む。
【０２０９】
ステップＳ２３２では、第２入力フラグ２１２をオフにする。
【０２１０】
以上のように、第２入力フラグ２１２がオンになってから（すなわち、第２ユニットが振られたことが検出されてから）１０フレーム期間が経過するまでの間は、第２ユニットの振り強さ検出（後述のステップＳ２５０）が行われず、すなわちプレイヤによる第２ユニットの振り操作が受け付けられない状態となる。これにより、プレイヤが行った一回の振り操作が、複数フレームにわたって連続して検出されてしまうことを防止することができる。
【０２１１】
なお、後述の説明により明らかとなるが、第２入力フラグ２１２がオンになってから５フレーム期間が経過するまでの間に第１ユニットが振られたことが検出された場合には、その時点で同時入力フラグ２１４がオンになるので、その時点からさらに２０フレーム期間が経過するまでの間は、プレイヤによる第２ユニットの振り操作が受け付けられない状態となる。なお、同時入力フラグ２１４がオフになると、第１ユニットの振り強さ検出（後述のステップＳ２３６）と第２ユニットの振り強さ検出（後述のステップＳ２５０）が同時に再開されるので、第１ユニットの振り操作の受け付け再開タイミングと第２ユニットの振り操作の受け付け再開タイミングが一致することになる。すなわち、後述の通り、本実施例では、第１ユニットの振り検出のタイミングと第２ユニットの振り検出のタイミングが多少ずれていても同時振りと認識するが、この場合でも、第１ユニットの受付再開タイミングと第２ユニットの受付再開タイミングが同時となるので、同時振り操作後に再度同時振り操作をした場合に、後の同時振り操作において片方の振り検出だけがされるような問題を解決できる。なお、同時入力フラグがオンになった後の受け付け禁止期間を、１０フレーム（すなわち、第１ユニットや第２ユニットのみが振られた後の受け付け禁止
期間と同じ期間）としてもよい。また、同時入力フラグがオンになった場合の受け付け禁止期間は、本実施例では、２つの振り検出タイミングのうち、後の振りタイミングを始期としたが、先の振りタイミングを始期としてそこから２０フレームなどとしてもよく、また、中間のタイミング（先の振りタイミングと後の振りタイミングの間のタイミング（例えば、ちょうど真ん中Ｎタイミングなど）としてもよい。
【０２１２】
図２３のステップＳ２３４では、第１入力フラグ２１０がオンであるかどうかを判断し、第１入力フラグ２１０がオンである場合には処理はステップＳ２４８に進み、オンでない場合には処理はステップＳ２３６に進む。
【０２１３】
ステップＳ２３６では、第１ユニットに関する振り強さ検出を行う。以下、この振り強さ検出の詳細を図２５を参照して説明する。
【０２１４】
図２５のステップＳ２６８では、加速度センサ（ここでは第１加速度センサ）の出力値（出力ベクトル）を取得する。ここでは、加速度センサのＸ軸方向の出力値をＡｘとし、Ｙ軸方向の出力値をＡｙとし、Ｚ軸方向の出力値をＡｚとする。
【０２１５】
ステップＳ２７０では、ステップＳ２６８で取得した第１加速度センサの出力ベクトル（Ａｘ，Ａｙ，Ａｚ）の大きさ（すなわち、√（Ａｘ2＋Ａｙ2＋Ａｚ2））がＫ（Ｋは所
定値）よりも大きいかどうかを判断する。第１加速度センサの出力ベクトルの大きさがＫよりも大きい場合（振り操作があったと判断される）には、処理はステップＳ２７２に進み、第１加速度センサの出力ベクトルの大きさがＫよりも大きくない場合（振り操作がなかったと判断される）には、処理はステップＳ２７４に進む。
【０２１６】
ステップＳ２７２では、第１加速度センサの出力ベクトルの大きさを、振り強さ検出の戻り値Ｘとして返す。通常、第１ユニットを勢いよく振るほど第１加速度センサの出力ベクトルの大きさはより大きくなるので、この戻り値Ｘは、第１ユニットの振りの強さを反映する値となる。その後、処理は図２３のステップＳ２３８に進む。なお、このフローチャートでは、出力ベクトルの大きさがＫより大きくなったときに、すぐにそのときの出力ベクトルの大きさを戻り値Ｘとして返すようになっているが、変形例として、出力ベクトルの大きさがＫより大きくなった後、そのことを示す状態フラグを保持しておいて、その後出力ベクトルが最大となったとき（出力ベクトルの大きさが増加した後減少する地点）の出力ベクトル値を返すようにしてもよい。
【０２１７】
なお、本実施例では、単に、出力ベクトルの大きさが所定以上であることを振り操作の判定条件としたが、より正確に振りの判定をしてもよい。すなわち、振り操作があったとき、一般的には、加速度センサの出力は以下のように変化する。
（ａ）０→（ｂ）出力増加→（ｃ）最大→（ｄ）出力減少→（ｅ）０→（ｆ）反対方向への出力増加→（ｇ）反対方向への出力最大→（ｈ）反対方向への出力減少→（ｉ）０
そこで、現在から所定期間前までにおける加速度センサの出力値の履歴を常に保存しておいて、当該履歴が上記のような出力遷移になっているかを検出するようにしてもよい。また、処理を簡略化して、当該履歴が上記のような出力遷移の一部と一致しているかを検出するようにしてもよい。また、この場合、（ａ）から（ｉ）のうちどの時点の出力値を利用するかは任意に決めて良い（（ａ）から（ｊ）以外の点、例えば、出力増加中の所定閾値になった時点などでも良い）。
【０２１８】
また、振り操作の検出に代えて、所定動作（所定パターンの動き操作）を検出するようにしてもよい。例えば、所定方向に動かす動作などが考えられる。この場合も、加速度センサの出力値の履歴を保存しておいて、当該履歴が所定パターンと一致するかどうかを検出するようにしてもよい。
【０２１９】
上述の変形例は、本実施形態以外の実施形態についても同様に当てはまる。
【０２２０】
ステップＳ２７４では、振り強さ検出の検出結果として、「振り操作なし」を示す値を返す。その後、処理は図２３のステップＳ２３８に進む。
【０２２１】
ステップＳ２３８では、ステップＳ２３６の振り強さ検出の検出結果に基づいて、第１ユニットの振り操作があったかどうかを判断し、第１ユニットの振り操作があった場合には処理はステップＳ２４０に進み、第１ユニットの振り操作がなかった場合には処理はステップＳ２４８に進む。
【０２２２】
ステップＳ２４０では、第２入力フラグ２１２がオンでありかつ第２タイマ２１８が４以下であるかどうかを判断する。第２入力フラグ２１２がオンであり、なおかつ第２タイマ２１８が４以下である場合（すなわち第１ユニットと第２ユニットがほぼ同時に振られた場合）には、処理はステップＳ２４２に進み、第２入力フラグ２１２がオンでない、もしくは第２タイマ２１８が４以下でない場合には、処理はステップＳ２４６に進む。なお、第２ユニットが振られてから４フレーム期間の間に第１ユニットが振られた場合に「第１ユニットと第２ユニットが同時に振られた」と判断しているのは、プレイヤが第１ユニットと第２ユニットを同時に振ったつもりでも、それらの振り操作が必ずしも厳密に同時とは限らないからである。つまり、第１ユニットが振られたことが検出されたタイミングと第２ユニットが振られたことが検出されたタイミングとの間に数フレーム期間の間隔があった場合でも「第１ユニットと第２ユニットが同時に振られた」と判断することで、より良好な操作性が得られる。
【０２２３】
ステップＳ２４２では、ステップＳ２３６の第１ユニットに関する振り強さ検出の戻り値Ｘ（第１ユニットの振りの強さを反映する値）と、後述するステップＳ２６０で設定された第２振り強さ値２０８（第２ユニットの振りの強さを反映する値）とに応じて、キャラクタの速度データを増加させる。例えば、現在の速度データに戻り値Ｘに比例した数値と第２振り強さ値２０８に比例した数値を乗算することによって、新たな速度データを決定してもよい。または、戻り値Ｘに第１係数を掛けた数値と、第２振り強さ値に第２係数を掛けた数値を現在の速度データに加算してもよい（第１係数と第２係数は同じであってもよいし、異なっても良い）。または、戻り値Ｘと第２振り強さ値の平均値に所定係数を掛けた数値を現在の速度データに加算してもよい。
なお、振りの強さ検出の戻り値として、加速度センサの出力値のうち所定方向の成分の大きさのみを利用しても良い。
【０２２４】
ステップＳ２４４では、同時入力フラグ２１４をオンにし、同時入力タイマ２２０を０にリセットしてスタートさせ、第２入力フラグ２１２をオフにする。
【０２２５】
ステップＳ２４６では、第１入力フラグ２１０をオンにし、第１タイマ２１６を０にリセットしてスタートさせ、第１振り強さ値２０６にステップＳ２３６の第１ユニットの振り強さ検出の戻り値Ｘを設定する。
【０２２６】
ステップＳ２４８では、第２入力フラグ２１２がオンであるかどうかを判断し、第２入力フラグ２１２がオンである場合には処理はステップＳ２５０に進み、オンでない場合には処理は図２４のステップＳ２６２に進む。
【０２２７】
ステップＳ２５０では、第２ユニットに関して、ステップＳ２３６と同様に振り強さ検出を行う。すなわち、第２加速度センサの出力ベクトルの大きさがＫより大きい場合には、振り強さ検出の戻り値Ｘとして、第２加速度センサの出力ベクトルの大きさ（第２ユニ
ットの振りの強さを反映する値）が返される。
【０２２８】
ステップＳ２５２では、ステップＳ２５０の振り強さ検出の検出結果に基づいて、第２ユニットの振り操作があったかどうかを判断し、第２ユニットの振り操作があった場合には処理はステップＳ２５４に進み、第２ユニットの振り操作がなかった場合には処理は図２４のステップＳ２６２に進む。
【０２２９】
ステップＳ２５４では、第１入力フラグ２１０がオンでありかつ第１タイマ２１６が４以下であるかどうかを判断する。第１入力フラグ２１０がオンであり、なおかつ第１タイマ２１６が４以下である場合（すなわち第１ユニットと第２ユニットがほぼ同時に振られた場合）には、処理はステップＳ２５６に進み、第１入力フラグ２１０がオンでない、もしくは第１タイマ２１６が４以下でない場合には、処理はステップＳ２６０に進む。
【０２３０】
ステップＳ２５６では、ステップＳ２５０の第２ユニットに関する振り強さ検出の戻り値Ｘ（第２ユニットの振りの強さを反映する値）と、ステップＳ２４６で設定された第１振り強さ値２０６（第１ユニットの振りの強さを反映する値）とに応じて、速度データを増加させる。例えば、現在の速度データに戻り値Ｘに比例した数値と第１振り強さ値２０６に比例した数値を乗算することによって、新たな速度データを決定してもよい。
【０２３１】
ステップＳ２５８では、同時入力フラグ２１４をオンにし、同時入力タイマ２２０を０にリセットし、第１入力フラグ２１０をオフにする。
【０２３２】
ステップＳ２６０では、第２入力フラグ２１２をオンにし、第２タイマ２１８を０にリセットし、第２振り強さ値２０８にステップＳ２５０の第２ユニットの振り強さ検出の戻り値Ｘを設定する。
【０２３３】
図２４のステップＳ２６２では、速度データと向きベクトルに基づいて、現在位置データを更新する。これにより、ゲーム世界のキャラクタは、向きベクトルが示す方向に向かって速度データが示す距離だけ移動する。
【０２３４】
ステップＳ２６４では、モニタ２に表示されているゲーム画像を、現在位置データに基づいて更新する。
【０２３５】
ステップＳ２６６では、速度データを所定量だけ減少する。これは、ソリと地面の摩擦の影響をキャラクタの速度に反映させるための処理である。
【０２３６】
その後、以上のような処理が繰り返されることにより、プレイヤの操作に応じてゲーム画像が随時変化する。
【０２３７】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、操作ユニットを振ることによってキャラクタを制御することができるので、直感的な操作が可能となり、良好な操作性が得られる。また、操作ユニットを強く振るほどキャラクタの加速度が大きくなるので、より直感的な操作が可能となる。
【０２３８】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、１軸の加速度センサを用いても操作ユニットの振り操作および振り強さを検出することができる（例えば、図１６におけるＺ軸の出力値だけを参照しても、操作ユニットが振られたことと、その強さを検出することができる）ため、本実施形態と同様の効果を得ることができる。
【０２３９】
（第３の実施形態）
第３の実施形態における表示画像は、例えば図１９と同様である。本実施形態では、プレイヤは、第１ユニットまたは第２ユニットを振ることによって、キャラクタの動作を制御することができる。
【０２４０】
図２６に、第３の実施形態におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。第１ユニットが連続して振られた場合にはキャラクタは右旋回し、第２ユニットが連続して振られた場合にはキャラクタは左旋回する。また、第１ユニットと第２ユニットが交互に振られた場合にはキャラクタはその時点での進行方向に加速する。
【０２４１】
図２７は、第３の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム３００、ゲーム画像データ３０２、キャラクタ制御データ３０４、操作履歴情報３０６、および振り間隔タイマ３０８が格納される。
【０２４２】
ゲーム画像データ３０２およびキャラクタ制御データ３０４については、第１の実施形態と同様のため、説明を省略する。
【０２４３】
操作履歴情報３０６は、プレイヤによって振られた操作ユニットの種類（第１ユニットまたは第２ユニット）を過去２回分について示す情報である。
【０２４４】
振り間隔タイマ３０８は、プレイヤが第１ユニットまたは第２ユニットを直前に振ってからの経過時間（経過フレーム数）を示す値である。
【０２４５】
次に、図２８〜図３０のフローチャートを参照して、ゲームプログラム３００に基づくＣＰＵ３０の処理の流れを説明する。
【０２４６】
図２８において、ゲームプログラム３００の実行が開始されると、ＣＰＵ３０は、まずステップＳ３００で、ゲーム処理に利用する各種データ（キャラクタ制御データ２０４や操作履歴情報３０６や振り間隔タイマ３０８など）の初期化を行い、キャラクタを含むゲーム画像を生成してモニタ２の画面に表示する。
【０２４７】
ステップＳ３０２では、第１ユニットに関する振り操作検出を行う。以下、この振り操作検出の詳細を図３０を参照して説明する。
【０２４８】
図３０のステップＳ３４６では、加速度センサ（ここでは第１加速度センサ）の出力値（出力ベクトル）を取得する。ここでは、加速度センサのＸ軸方向の出力値をＡｘとし、Ｙ軸方向の出力値をＡｙとし、Ｚ軸方向の出力値をＡｚとする。
【０２４９】
ステップＳ３４８では、ステップＳ３４６で取得した第１加速度センサの出力ベクトル（Ａｘ，Ａｙ，Ａｚ）の大きさがＫ（Ｋは所定値）よりも大きいかどうかを判断する。第１加速度センサの出力ベクトルの大きさがＫよりも大きい場合には、処理はステップＳ３５０に進み、第１加速度センサの出力ベクトルの大きさがＫよりも大きくない場合には、処理はステップＳ３５２に進む。
【０２５０】
ステップＳ３５０では、振り操作検出の検出結果として、「振り操作あり」を示す値を返す。その後、処理は図２８のステップＳ３０４に進む。
【０２５１】
ステップＳ３５２では、振り操作検出の検出結果として、「振り操作なし」を示す値を返す。その後、処理は図２８のステップＳ３０４に進む。
【０２５２】
ステップＳ３０４では、ステップＳ３０２の振り操作検出の検出結果に基づいて、第１ユニットの振り操作があったかどうかを判断し、第１ユニットの振り操作があった場合には処理はステップＳ３０６に進み、第１ユニットの振り操作がなかった場合には処理は図２９のステップＳ３１８に進む。
【０２５３】
ステップＳ３０６では、操作履歴情報３０６を更新する。具体的には、「前回振られた操作ユニット」に更新前の「今回振られた操作ユニット」の値を設定した後、「今回振られた操作ユニット」に第１ユニットを示す値を設定する。
【０２５４】
ステップＳ３０８では、振り間隔タイマ３０８を０にリセットする。
【０２５５】
ステップＳ３１０では、今回検出された振り操作が「連続振りの一振り目」かどうかを判断する。より具体的には、操作履歴情報３０６を参照し、「前回振られた操作ユニット」に第１ユニットおよび第２ユニットのいずれの操作ユニットを示す値も格納されていない場合に、今回検出された振り操作が「連続振りの一振り目」であると判断する。なお、本実施形態では、前回の振り操作と今回の振り操作の時間間隔が６０フレーム期間を超えている場合に、今回の振り操作を「連続振りの一振り目」とみなしている。今回検出された振り操作が「連続振りの一振り目」である場合には処理は図２９のステップＳ３１８に進み、今回検出された振り操作が「連続振りの一振り目」でない場合には処理はステップＳ３１２に進む。
【０２５６】
ステップＳ３１２では、操作履歴情報３０６を参照して、前回振られた操作ユニットが第１ユニットかどうかを判断する。前回振られた操作ユニットが第１ユニットである場合（すなわち第１ユニットが連続して振られた場合）には処理はステップＳ３１６に進み、前回振られた操作ユニットが第１ユニットでない場合（すなわち、前回振られた操作ユニットが第２ユニットの場合＝第１ユニットと第２ユニットが交互に振られた場合）には処理はステップＳ３１４に進む。
【０２５７】
ステップＳ３１４では、速度データを所定量だけ増加させる。なお、変形例として、ステップＳ３０２で第１ユニットの振り操作を検出するときに、第２の実施形態と同様に振り強さを検出し、第１ユニットの振り強さが大きいほど速度データをより大きく増加させてもよい。また、前回ユニットが振られたときの振り強さを記憶しておいて、当該振り強さと、今回の第１ユニットの振り強さの両方に基いて速度データを増加させてもよい（例えば、２つの振り強さの合計や平均（加重平均も可、過去の振り強さほど小さい係数にするなど）などに基いて速度データの増加量を決定するなど）。また、第１ユニットと第２ユニットの交互振り操作が続く限り、各回の振りの強さを合計したり平均したりして、当該合計値や平均値などに基いて速度データを増加する量を決定してもよい。
【０２５８】
ステップＳ３１６では、キャラクタが右旋回するように向きベクトルを変更する。ここでも、第１ユニットの振り強さが大きいほどキャラクタをより大きく旋回させてもよい。また、前回ユニットが振られたときの振り強さを記憶しておいて、当該振り強さと、今回の第１ユニットの振り強さの両方に基いて旋回の大きさを決定してもよい。また、第１ユニットの連続入力が続く限り、各回の振りの強さを合計したり平均したりして、当該合計値や平均値などに基いて旋回の大きさを決定してもよい。
【０２５９】
図２９のステップＳ３１８では、第２ユニットに関して、ステップＳ３０２と同様に振り操作検出を行う。
【０２６０】
ステップＳ３２０では、ステップＳ３１８の振り操作検出の検出結果に基づいて、第２ユニットの振り操作があったかどうかを判断し、第２ユニットの振り操作があった場合に
は処理はステップＳ３２２に進み、第２ユニットの振り操作がなかった場合には処理はステップＳ３３４に進む。
【０２６１】
ステップＳ３２２では、操作履歴情報３０６を更新する。具体的には、「前回振られた操作ユニット」に更新前の「今回振られた操作ユニット」の値を設定した後、「今回振られた操作ユニット」に第２ユニットを示す値を設定する。
【０２６２】
ステップＳ３２４では、振り間隔タイマ３０８を０にリセットする。
【０２６３】
ステップＳ３２６では、今回検出された振り操作が「連続振りの一振り目」かどうかを判断する。今回検出された振り操作が「連続振りの一振り目」である場合には処理はステップＳ３３４に進み、今回検出された振り操作が「連続振りの一振り目」でない場合には処理はステップＳ３２８に進む。
【０２６４】
ステップＳ３２８では、操作履歴情報３０６を参照して、前回振られた操作ユニットが第２ユニットかどうかを判断する。前回振られた操作ユニットが第２ユニットである場合（すなわち第２ユニットが連続して振られた場合）には処理はステップＳ３３２に進み、前回振られた操作ユニットが第２ユニットでない場合（すなわち、前回振られた操作ユニットが第１ユニットである場合＝第１ユニットと第２ユニットが交互に振られた場合）には処理はステップＳ３３０に進む。
【０２６５】
ステップＳ３３０では、速度データを所定量だけ増加させる。なお、変形例として、ステップＳ３１８で第２ユニットの振り操作を検出するときに、第２の実施形態と同様に振り強さも検出し、第２ユニットの振り強さが大きいほど速度データをより大きく増加させてもよい。
【０２６６】
ステップＳ３３２では、キャラクタが左旋回するように向きベクトルを変更する。ここでも、第２ユニットの振り強さが大きいほどキャラクタをより大きく旋回させてもよい。
【０２６７】
ステップＳ３３４では、振り間隔タイマ３０８に１を加算する。
【０２６８】
ステップＳ３３６では、振り間隔タイマ３０８が６０を超えたかどうかを判断する。振り間隔タイマ３０８が６０を超えた場合には処理はステップＳ３３８に進み、振り間隔タイマ３０８が６０を超えていない場合には処理はステップＳ３４０に進む。
【０２６９】
ステップＳ３３８では、操作履歴情報３０６をクリアする。
【０２７０】
ステップＳ３４０では、速度データと向きベクトルに基づいて、現在位置データを更新する。これにより、ゲーム世界のキャラクタは、向きベクトルが示す方向に向かって速度データが示す距離だけ移動する。
【０２７１】
ステップＳ３４２では、モニタ２に表示されているゲーム画像を、現在位置データに基づいて更新する。
【０２７２】
ステップＳ３４４では、速度データを所定量だけ減少する。その後、処理は図２８のステップＳ３０２に戻る。
【０２７３】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、操作ユニットを振ることによってキャラクタを制御することができるので、直感
的な操作が可能となり、良好な操作性が得られる。
【０２７４】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、第２の実施形態と同様に、１軸の加速度センサを用いても本実施形態と同様の効果を得ることができる。
【０２７５】
なお、本実施形態では、第１ユニットの連続振り、第２ユニットの連続振り、第１ユニットと第２ユニットの交互振りを検出して、それぞれの検出に応じたゲーム制御をおこなったが、変形例として、連続する振りパターンが所定パターンであることを検出するようにしてもよい。例えば、第１ユニット振り→第２ユニット振り→第２ユニット振り→第１ユニット振りというパターン（このパターンに限らず、適宜パターンが設定されてよい）になったことを検出して、所定のゲーム処理（例えば、キャラクタに攻撃動作をさせるなど）をしてもよい。
【０２７６】
また、本実施例では、各回の振りの間隔が所定時間以内（６０フレーム以内）であるときに連続した振りまたは交互の振りであると判断したが、これに限らず、一回目の振りから所定時間以内の振りを連続した振りまたは交互の振りであると判断してもよいし、振りが連続するほど、許容する間隔を長くする（または短くする）ようにしてもよい。
【０２７７】
（第４の実施形態）
第４の実施形態における表示画像は、例えば図１９と同様である。本実施形態では、第１ユニットおよび第２ユニットのうちの一方を傾け操作用ユニットとして利用し、他方を振り操作用ユニットとして利用する。プレイヤは、傾け操作用ユニットを傾けたり、振り操作用ユニットを振ったりすることによって、キャラクタの動作を制御することができる。
【０２７８】
図３１に、第４の実施形態におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。傾け操作用ユニットが右側に傾けられた場合にはキャラクタは右旋回し、傾け操作用ユニットが左側に傾けられた場合にはキャラクタは左旋回する。また、振り操作用ユニットが振られた場合にはキャラクタはその時点での進行方向に加速する。
【０２７９】
図３２は、第４の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム４００、ゲーム画像データ４０２、キャラクタ制御データ４０４、傾け操作用ユニット指定データ４０６、および振り操作用ユニット指定データ４０８が格納される。
【０２８０】
ゲーム画像データ４０２およびキャラクタ制御データ４０４については、第１の実施形態と同様のため、説明を省略する。
【０２８１】
傾け操作用ユニット指定データ４０６は、第１ユニットおよび第２ユニットのいずれの操作ユニットを傾け操作用ユニットとして利用するかを示すデータである。また、振り操作用ユニット指定データ４０８は、第１ユニットおよび第２ユニットのいずれの操作ユニットを振り操作用ユニットとして利用するかを示すデータである。
【０２８２】
次に、図３３〜図３５のフローチャートを参照して、ゲームプログラム４００に基づくＣＰＵ３０の処理の流れを説明する。
【０２８３】
図３３において、ゲームプログラム４００の実行が開始されると、ＣＰＵ３０は、まずステップＳ４００で、ゲーム処理に利用する各種データ（キャラクタ制御データ２０４など）の初期化を行い、傾け操作用ユニット指定データ４０６に第１ユニットを示す１を初期値として格納し、振り操作用ユニット指定データ４０８に第２ユニットを示す２を初期
値として格納する。さらに、キャラクタを含むゲーム画像を生成してモニタ２の画面に表示する。
【０２８４】
ステップＳ４０２では、プレイヤによって操作ボタン等を用いてユニット役割交換指示が入力されたかどうかを判断し、ユニット役割交換指示があった場合には処理はステップＳ４０４に進み、ユニット役割交換指示がなかった場合には処理はステップＳ４０６に進む。
【０２８５】
ステップＳ４０４では、傾け操作用ユニット指定データ４０６の値と、振り操作用ユニット指定データ４０８の値を入れ替える。
【０２８６】
上記のような処理により、プレイヤは、好みまたは状況に応じて、第１ユニットの役割と第２ユニットの役割を適宜に変更することができる。なお、このような第１ユニットの役割と第２ユニットの役割の変更は、他の実施形態においても同様の方法で実現可能である。
【０２８７】
ステップＳ４０６では、傾け操作用ユニットに関する傾き検出を行う。以下、この傾き検出の詳細を図３４を参照して説明する。
【０２８８】
図３４のステップＳ４２４では、傾け操作用ユニットに設けられている加速度センサの出力値（出力ベクトル）を取得する。ここでは、加速度センサのＸ軸方向の出力値をＡｘとし、Ｙ軸方向の出力値をＡｙとし、Ｚ軸方向の出力値をＡｚとする。
【０２８９】
ステップＳ４２６では、ステップＳ４２４で取得した加速度センサの出力ベクトル（Ａｘ，Ａｙ，Ａｚ）の大きさが０．８〜１．２の範囲内かどうかを判断する。加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内であった場合には、処理はステップＳ４２８に進む。加速度センサの出力ベクトルの大きさが０．８〜１．２の範囲内でなかった場合には、処理はステップＳ４３０に進む。
【０２９０】
ステップＳ４２８では、ａｒｃｔａｎ（Ａｘ／Ａｙ）（これは傾け操作用ユニットのＺ軸周りの傾きを表している；図３６における角度Θ）を算出し、算出された値を傾き検出の戻り値Θとして返す。その後、処理は図３３のステップＳ４０８に進む。
【０２９１】
ステップＳ４３０では、傾き検出結果としてエラーを返し、傾き検出を終了し、処理は図３３のステップＳ４０８に進む。
【０２９２】
ステップＳ４０８では、ステップＳ４０６の傾き検出結果がエラーかどうかを判断し、エラーであった場合には処理はステップＳ４１２に進み、エラーでなかった場合には処理はステップＳ４１０に進む。
【０２９３】
ステップＳ４１０では、ステップＳ４０６の傾き検出結果の戻り値Θに応じて向きベクトルを回転させる。向きベクトルの変更方法としては種々の方法が考えられる。本実施形態では、一例として、図３７に示すように、キャラクタの現在位置における地面の法線ベクトルを回転軸として現在の向きベクトルを戻り値Θだけ回転させることによって得られるベクトルを、新しい向きベクトルとして決定する。
【０２９４】
ステップＳ４１２では、振り操作用ユニットに関する振り操作検出を行う。以下、この振り操作検出の詳細を図３５を参照して説明する。
【０２９５】
図３５のステップＳ４３２では、振り操作用ユニットに設けられた加速度センサの出力
値（出力ベクトル）を取得する。ここでは、加速度センサのＸ軸方向の出力値をＡｘとし、Ｙ軸方向の出力値をＡｙとし、Ｚ軸方向の出力値をＡｚとする。
【０２９６】
ステップＳ４３４では、ステップＳ４３２で取得した加速度センサの出力ベクトル（Ａｘ，Ａｙ，Ａｚ）の大きさがＫ（Ｋは所定値）よりも大きいかどうかを判断する。加速度センサの出力ベクトルの大きさがＫよりも大きい場合には、処理はステップＳ４３６に進み、加速度センサの出力ベクトルの大きさがＫよりも大きくない場合には、処理はステップＳ４３８に進む。
【０２９７】
ステップＳ４３６では、振り操作検出の検出結果として、「振り操作あり」を示す値を返す。その後、処理は図３３のステップＳ４１４に進む。
【０２９８】
ステップＳ４３８では、振り操作検出の検出結果として、「振り操作なし」を示す値を返す。その後、処理は図３３のステップＳ４１４に進む。
【０２９９】
ステップＳ４１４では、ステップＳ４１２の振り操作検出の検出結果に基づいて、振り操作用ユニットの振り操作があったかどうかを判断し、振り操作用の振り操作があった場合には処理はステップＳ４１６に進み、振り操作用ユニットの振り操作がなかった場合には処理はステップＳ４１８に進む。
【０３００】
ステップＳ４１６では、速度データを所定量だけ増加させる。なお、変形例として、ステップＳ４１２で振り操作用ユニットの振り操作を検出するときに、第２の実施形態と同様に振り強さも検出し、振り操作用ユニットの振り強さが大きいほど速度データをより大きく増加させてもよい。
【０３０１】
ステップＳ４１８では、速度データと向きベクトルに基づいて、現在位置データを更新する。これにより、ゲーム世界のキャラクタは、向きベクトルが示す方向に向かって速度データが示す距離だけ移動する。
【０３０２】
ステップＳ４２０では、モニタ２に表示されているゲーム画像を、現在位置データに基づいて更新する。
【０３０３】
ステップＳ４２２では、速度データを所定量だけ減少する。その後、処理はステップＳ４０２に戻る。
【０３０４】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、傾け操作用ユニットを傾けることによってキャラクタを旋回させ、振り操作用ユニットを振ることによってキャラクタを加速させることができるので、直感的な操作が可能となり、良好な操作性が得られる。
【０３０５】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、第１の実施形態および第２の実施形態と同様に、１軸の加速度センサを用いても本実施形態と同様の効果を得ることができる。
【０３０６】
また、後述する実施形態のように、振り操作用ユニットが振られたときの振り操作の方向を検出し、検出された方向に応じてキャラクタの加速方向やその大きさを変化させてもよい。
【０３０７】
（第５の実施形態）
第５の実施形態における表示画像は、例えば図１９と同様である。本実施形態では、第１ユニットおよび第２ユニットが振られた方向（動いた方向）に基づいてキャラクタの動作が制御される。
【０３０８】
図３８に、第５の実施形態におけるプレイヤの操作とキャラクタの動作の対応関係の一例を示す。第１ユニットまたは第２ユニットのいずれか一方の操作ユニットのみが斜め右向こう側（右斜め前方；なお、前方とはプレイヤが向いている方向）に振られた場合には、キャラクタは右前方に向かって少しだけ加速する。第１ユニットまたは第２ユニットのいずれか一方の操作ユニットのみが斜め左手前側（左斜め後方：なお、後方とはプレイヤが向いている方向と逆方向）に振られた場合には、キャラクタは左後方に向かって少しだけ加速する。このように本実施形態では、基本的には操作ユニットが振られた方向（現実世界におけるプレイヤ前方を基準とする方向）に対応する方向（仮想空間におけるキャラクタ前方を基準とする方向）にキャラクタが加速する。
【０３０９】
また、第１ユニットと第２ユニットが同時に斜め右向こう側に振られた場合には、キャラクタは右前方に向かって大きく加速する。このように本実施形態では、第１ユニットと第２ユニットが同時に振られ、かつそれらの振られた方向が一致している場合には、キャラクタが大きく加速する。
【０３１０】
また、第１ユニットまたは第２ユニットのいずれか一方の操作ユニットが右側に振られ、他方のユニットが向こう側に振られた場合には、キャラクタは右前方に少しだけ加速する。このように本実施形態では、第１ユニットと第２ユニットが同時に振られ、かつそれらの方向が一致していない場合には、第１ユニットが振られた方向と第２ユニットが振られた方向とを合成した方向に基づいて、キャラクタの加速方向が決定される。
【０３１１】
また、第１ユニットと第２ユニットが同時にかつ互いに逆側に振られた場合には、キャラクタは停止する。
【０３１２】
図３９は、第５の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム５００、ゲーム画像データ５０２、キャラクタ制御データ５０４、第１振り方向ベクトル５０６、第２振り方向ベクトル５０８、第１入力フラグ５１０、第２入力フラグ５１２、同時入力フラグ５１４、第１タイマ５１６、第２タイマ５１８、同時入力タイマ５２０、第１サンプリングデータ５２２、および第２サンプリングデータ５２４が格納される。
【０３１３】
ゲーム画像データ５０２については、第１の実施形態と同様のため、説明を省略する。
【０３１４】
キャラクタ制御データ５０４は、現在位置データと、キャラクタの移動速度の大きさと方向を示す速度ベクトルと、キャラクタの姿勢を示す姿勢マトリクスとを含んでいる。現在位置データは３次元座標値で表されるデータであり、速度ベクトルは３次元のベクトルで表されるデータである。姿勢マトリクスは、キャラクタの前方を示す３次元の単位ベクトルである前方ベクトルと、キャラクタの右手方向を示す３次元の単位ベクトルである右方ベクトルと、キャラクタの上方を示す３次元の単位ベクトルである上方ベクトルの３つの単位ベクトルの集合である。
【０３１５】
第１振り方向ベクトル５０６は、ユーザによって第１ユニットが振られた方向を示すベクトルである。第２振り方向ベクトル５０８は、ユーザによって第２ユニットが振られた方向を示すベクトルである。
【０３１６】
第１入力フラグ５１０、第２入力フラグ５１２、同時入力フラグ５１４、第１タイマ５
１６、第２タイマ５１８、および同時入力タイマ５２０については、第２の実施形態と同様であるので説明を省略する。
【０３１７】
第１サンプリングデータ５２２は、第１ユニットに設けられた第１加速度センサの出力値の直近の６０フレーム分のサンプリングデータである。第２サンプリングデータ５２４は、第２ユニットに設けられた第２加速度センサの出力値の直近の６０フレーム分のサンプリングデータである。
【０３１８】
次に、図４０〜図４４のフローチャートを参照して、ゲームプログラム５００に基づくＣＰＵ３０の処理の流れを説明する。
【０３１９】
図４０において、ゲームプログラム５００の実行が開始されると、ＣＰＵ３０は、まずステップＳ５００で、ゲーム処理に利用する各種データ（キャラクタ制御データ２０４や第１振り方向ベクトル５０６や第１入力フラグ５１０や第１タイマ５１６や第１サンプリングデータ５２２など）の初期化を行い、キャラクタを含むゲーム画像を生成してモニタ２の画面に表示する。
【０３２０】
ステップＳ５０２では、第１加速度センサの出力値と第２加速度センサの出力値を取得し、第１サンプリングデータ５２２および第２サンプリングデータ５２４を更新する。
【０３２１】
ステップＳ５０４では、同時入力フラグ５１４がオンであるかどうかを判断し、同時入力フラグ５１４がオンである場合には処理はステップＳ５０６に進み、オンでない場合には処理はステップＳ５１２に進む。
【０３２２】
ステップＳ５０６では、同時入力タイマ５２０に１を加算する。
【０３２３】
ステップＳ５０８では、同時入力タイマ５２０が２０以上であるかどうかを判断し、同時入力タイマ５２０が２０以上である場合には処理はステップＳ５１０に進み、２０以上でない場合には処理は図４３のステップＳ５９６に進む。
【０３２４】
ステップＳ５１０では、同時入力フラグ５１４をオフにし、処理は図４３のステップＳ５９６に進む。
【０３２５】
ステップＳ５１２では、第１入力フラグ５１０がオンであるかどうかを判断し、第１入力フラグ５１０がオンである場合には処理はステップＳ５１４に進み、オンでない場合には処理はステップＳ５２６に進む。
【０３２６】
ステップＳ５１４では、第１タイマ５１６に１を加算する。
【０３２７】
ステップＳ５１６では、第１タイマ５１６が５であるかどうかを判断し、第１タイマ５１６が５である場合（すなわち、第１ユニットのみが振られた場合）には処理はステップＳ５１８に進み、５でない場合には処理はステップＳ５２２に進む。
【０３２８】
ステップＳ５１８では、第１ユニットの振り方向検出（後述のステップＳ５４２）によって検出された第１振り方向ベクトル５０６に基づいて速度ベクトルを変更する。速度ベクトルの変更方法としては種々の方法が考えられる。本実施形態では、一例として、図４５に示すように、第１振り方向ベクトル５０６のＸ軸値をａ１、Ｚ軸値をｂ１とすると、現在のベクトルと、（右方ベクトル×ａ１＋前方ベクトル×ｂ１）で表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。したがって、第１振り方向ベクトル５０６のＸ軸値が大きいほど、キャラクタは右方ベクトルの方向に大きく加速し、
第１振り方向ベクトル５０６のＺ軸値が大きいほど、キャラクタは前方ベクトルの方向に大きく加速する。
【０３２９】
ステップＳ５２０では、前方ベクトルの方向が、ステップＳ５１８で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３３０】
ステップＳ５２２では、第１タイマ５１６が１０より大きいかどうかを判断し、第１タイマ５１６が１０より大きい場合には処理はステップＳ５２４に進み、１０より大きくない場合には処理はステップＳ５２６に進む。
【０３３１】
ステップＳ５２４では、第１入力フラグ５１０をオフにする。
【０３３２】
ステップＳ５２６では、第２入力フラグ５１２がオンであるかどうかを判断し、第２入力フラグ５１２がオンである場合には処理はステップＳ５２８に進み、オンでない場合には処理は図４１のステップＳ５４０に進む。
【０３３３】
ステップＳ５２８では、第２タイマ５１８に１を加算する。
【０３３４】
ステップＳ５３０では、第２タイマ５１８が５であるかどうかを判断し、第２タイマ５１８が５である場合（すなわち、第２ユニットのみが振られた場合）には処理はステップＳ５３２に進み、５でない場合には処理はステップＳ５３６に進む。
【０３３５】
ステップＳ５３２では、第２ユニットの振り方向検出（後述のステップＳ５７０）によって検出された第２振り方向ベクトル５０８に基づいて速度ベクトルを変更する。速度ベクトルの変更方法は、前述のステップＳ５１８と同様である。
【０３３６】
ステップＳ５３４では、前方ベクトルの方向が、ステップＳ５３２で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３３７】
ステップＳ５３６では、第２タイマ５１８が１０より大きいかどうかを判断し、第２タイマ５１８が１０より大きい場合には処理はステップＳ５３８に進み、１０より大きくない場合には処理は図４１のステップＳ５４０に進む。
【０３３８】
ステップＳ５３８では、第２入力フラグ５１２をオフにする。
【０３３９】
図４１のステップＳ５４０では、第１入力フラグ５１０がオンであるかどうかを判断し、第１入力フラグ５１０がオンである場合には処理は図４２のステップＳ５６８に進み、オンでない場合には処理はステップＳ５４２に進む。
【０３４０】
ステップＳ５４２では、第１ユニットに関する振り方向検出を行う。以下、この振り方向検出の詳細を図４４を参照して説明する。
【０３４１】
図４４のステップＳ６０４では、第１サンプリングデータ５２２を参照し、２番目に新しい第１加速度センサの検出値（Ａｘ，Ａｙ，Ａｚ）のＸ軸値とＺ軸値で示されるベクトル（以下、ＸＺベクトルと称す）の大きさ（すなわち、√（Ａｘ2＋Ａｚ2））がＬ（Ｌは所定値）よりも大きいかどうかを判断する。２番目に新しい第１加速度センサの検出値のＸＺベクトルの大きさがＬよりも大きい場合（振り操作があったと判断される）には、処理はステップＳ６０６に進み、Ｌよりも大きくない場合（振り操作がなかったと判断される）には、処理はステップＳ６１０に進む。
【０３４２】
ステップＳ６０６では、第１サンプリングデータ５２２を参照し、２番目に新しい第１加速度センサの検出値のＸＺベクトルの大きさが、最新の第１加速度センサの検出値のＸＺベクトルの大きさよりも大きいかどうかを判断する。これは、第１加速度センサに対して、ＸＺ平面と平行な方向に最も大きい力が加わったタイミングを検出するための処理である。プレイヤが第１ユニットをＸＺ平面と平行な方向に振ると、振り始め直後と振り終わり間際において第１ユニット（第１加速度センサ）にプレイヤによって大きな力が加えられるので、第１加速度センサの検出値のＸＺベクトルの大きさは、振り始め直後と振り終わり間際において極大となる。２番目に新しい第１加速度センサの検出値のＸＺベクトルの大きさが、最新の第１加速度センサの検出値のＸＺベクトルの大きさよりも大きい場合（すなわち第１加速度センサの検出値のＸＺベクトルの大きさが極大値となった直後）には、処理はステップＳ６０８に進み、２番目に新しい第１加速度センサの検出値のＸＺベクトルの大きさが、最新の第１加速度センサの検出値のＸＺベクトルの大きさよりも大きくない場合には、処理はステップＳ６１０に進む。
【０３４３】
ステップＳ６０８では、振り方向検出の戻り値として、２番目に新しい第１加速度センサの検出値のＸＺベクトル（Ａｘ，Ａｚ）を返す。このＸＺベクトル（Ａｘ，Ａｚ）は、プレイヤが第１ユニットを振ったときに、第１ユニットに加えられた力の方向（すなわち第１ユニットが振られた方向）を示している。その後、処理は図４１のステップＳ５４４に進む。
なお、ＸＺベクトルがＬ以上である期間のＸＺベクトルを平均することなどにより振り方向を求めても良い。
【０３４４】
なお、振り方向検出によって検出されるＸＺベクトルは、振り方向の検出方法によっては実際に操作ユニットが振られたときの移動方向とは逆方向を示す場合がある。このような場合には、振り方向検出の戻り値として、検出されたＸＺベクトルに−１を乗算した結果の値を返せばよい。
【０３４５】
ステップＳ６１０では、振り方向検出の戻り値として、「振り操作なし」を示す値を返す。その後、処理は図４１のステップＳ５４４に進む。
【０３４６】
ステップＳ５４４では、ステップＳ５４２の振り方向検出の検出結果に基づいて、第１ユニットの振り操作があったかどうかを判断し、第１ユニットの振り操作があった場合には処理はステップＳ５４６に進み、第１ユニットの振り操作がなかった場合には処理は図４２のステップＳ５６８に進む。
【０３４７】
ステップＳ５４６では、第１振り方向ベクトル５０６に、ステップＳ５４２の振り方向検出の戻り値（すなわち第１ユニットが振られた方向を示すベクトル）を設定する。
【０３４８】
ステップＳ５４８では、第２入力フラグ５１２がオンでありかつ第２タイマ５１８が４以下であるかどうかを判断する。第２入力フラグ５１２がオンであり、なおかつ第２タイマ５１８が４以下である場合（すなわち第１ユニットと第２ユニットがほぼ同時に振られた場合）には、処理はステップＳ５５０に進み、第２入力フラグ５１２がオンでない、もしくは第２タイマ５１８が４以下でない場合には、処理はステップＳ５６６に進む。
【０３４９】
ステップＳ５５０では、第１振り方向ベクトル５０６と、後述のステップＳ５７４で設定された第２振り方向ベクトル５０８（第２ユニットが振られた方向を示すベクトル）のなす角度が−３０°〜３０°の範囲内であるかどうかを判断する。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が−３０°〜３０°の範囲内であった場合（すなわち第１ユニットと第２ユニットがほぼ同じ方向に振られた場合）には、処理はステップＳ５５２に進み、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８の
なす角度が−３０°〜３０°の範囲内でなかった場合には、処理はステップＳ５５８に進む。なお、−３０°〜３０°という値は一例であり、これより狭い範囲であってもよいし、広い範囲であってもよく、ほぼ同じ方向であるとみなされる範囲であれば良い。
【０３５０】
ステップＳ５５２では、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８に基づいて速度ベクトルを変更する。速度ベクトルの変更方法としては種々の方法が考えられる。本実施形態では、一例として、図４６に示すように、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８を合成して合成振り方向ベクトルを求める。そして、この合成振り方向ベクトルのＸ軸値をａ３、Ｚ軸値をｂ３とすると、現在のベクトルと、（右方ベクトル×ａ３＋前方ベクトル×ｂ３）×α（所定の定数）で表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。αは定数であって、ステップＳ５５２ではα＝２となる。つまり、ステップＳ５５２では、現在のベクトルと大きさを２倍にした合成ベクトルとを合成することによって、新しい速度ベクトルが決定される。なお、ステップＳ５５２において、第１振り方向ベクトルまたは第２振り方向ベクトルを２倍したベクトルを合成ベクトルとみなしてもよい。
【０３５１】
ステップＳ５５４では、前方ベクトルの方向が、ステップＳ５５２で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３５２】
ステップＳ５５６では、同時入力フラグ５１４をオンにし、同時入力タイマ５２０を０にリセットし、第２入力フラグ５１２をオフにする。
【０３５３】
ステップＳ５５８では、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内または−１５０°〜−１８０°の範囲内であるかどうかを判断する。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内または−１５０°〜−１８０°の範囲内であった場合（すなわち第１ユニットと第２ユニットがほぼ逆方向に振られた場合）には、処理はステップＳ５６０に進む。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内でなく、かつ−１５０°〜−１８０°の範囲内でもなかった場合には、処理はステップＳ５６２に進む。なお、１５０°〜１８０°、−１５０°〜−１８０°という値は一例であり、これより狭い範囲であってもよいし、広い範囲であってもよく、ほぼ逆方向であるとみなされる範囲であれば良い。
【０３５４】
ステップＳ５６０では、速度ベクトルを０に変更し、処理はステップＳ５５６に進む。
【０３５５】
ステップＳ５６２では、ステップＳ５５２と同様に、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８を合成して合成振り方向ベクトルを求め、そして、この合成振り方向ベクトルのＸ軸値をａ３、Ｚ軸値をｂ３とすると、現在のベクトルと、（右方ベクトル×ａ３＋前方ベクトル×ｂ３）×α（所定の定数）で表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。ステップＳ５６２ではα＝１．５となる。つまり、ステップＳ５６２では、現在のベクトルと大きさを１．５倍にした合成ベクトルとを合成することによって、新しい速度ベクトルが決定される。
【０３５６】
ステップＳ５６４では、前方ベクトルの方向が、ステップＳ５６２で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３５７】
ステップＳ５６６では、第１入力フラグ５１０をオンにし、第１タイマ５１６を０にリセットする。
【０３５８】
図４２のステップＳ５６８では、第２入力フラグ５１２がオンであるかどうかを判断し
、第２入力フラグ５１２がオンである場合には処理は図４３のステップＳ５９６に進み、オンでない場合には処理はステップＳ５７０に進む。
【０３５９】
ステップＳ５７０では、第２ユニットに関する振り方向検出を行う。以下、この振り方向検出の詳細を図４４を参照して説明する。
【０３６０】
図４４のステップＳ６０４では、第２サンプリングデータ５２４を参照し、２番目に新しい第２加速度センサの検出値のＸＺベクトルの大きさがＬよりも大きいかどうかを判断する。２番目に新しい第２加速度センサの検出値のＸＺベクトルの大きさがＬよりも大きい場合（振り操作があったと判断される）には、処理はステップＳ６０６に進み、Ｌよりも大きくない場合（振り操作がなかったと判断される）には、処理はステップＳ６１０に進む。
【０３６１】
ステップＳ６０６では、第２サンプリングデータ５２４を参照し、２番目に新しい第２加速度センサの検出値のＸＺベクトルの大きさが、最新の第２加速度センサの検出値のＸＺベクトルの大きさよりも大きいかどうかを判断する。２番目に新しい第２加速度センサの検出値のＸＺベクトルの大きさが、最新の第２加速度センサの検出値のＸＺベクトルの大きさよりも大きい場合（すなわち第２加速度センサの検出値のＸＺベクトルの大きさが極大値となった直後）には、処理はステップＳ６０８に進み、２番目に新しい第２加速度センサの検出値のＸＺベクトルの大きさが、最新の第２加速度センサの検出値のＸＺベクトルの大きさよりも大きくない場合には、処理はステップＳ６１０に進む。
【０３６２】
ステップＳ６０８では、振り方向検出の戻り値として、２番目に新しい第２加速度センサの検出値のＸＺベクトル（Ａｘ，Ａｚ）を返す。このＸＺベクトル（Ａｘ，Ａｚ）は、プレイヤが第２ユニットを振ったときに、第２ユニットに加えられた力の方向（すなわち第２ユニットが振られた方向）を示している。その後、処理は図４２のステップＳ５７２に進む。
【０３６３】
ステップＳ６１０では、振り方向検出の戻り値として、「振り操作なし」を示す値を返す。その後、処理は図４２のステップＳ５７２に進む。
【０３６４】
ステップＳ５７２では、ステップＳ５７０の振り方向検出の検出結果に基づいて、第２ユニットの振り操作があったかどうかを判断し、第２ユニットの振り操作があった場合には処理はステップＳ５７４に進み、第２ユニットの振り操作がなかった場合には処理は図４３のステップＳ５９６に進む。
【０３６５】
ステップＳ５７４では、第２振り方向ベクトル５０８に、ステップＳ５７０の振り方向検出の戻り値（すなわち第２ユニットが振られた方向を示すベクトル）を設定する。
【０３６６】
ステップＳ５７６では、第１入力フラグ５１０がオンでありかつ第１タイマ５１６が４以下であるかどうかを判断する。第１入力フラグ５１０がオンであり、なおかつ第１タイマ５１６が４以下である場合（すなわち第１ユニットと第２ユニットがほぼ同時に振られた場合）には、処理はステップＳ５７８に進み、第２入力フラグ５１２がオンでない、もしくは第２タイマ５１８が４以下でない場合には、処理はステップＳ５９４に進む。
【０３６７】
ステップＳ５７８では、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が−３０°〜３０°の範囲内であるかどうかを判断する。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が−３０°〜３０°の範囲内であった場合（すなわち第１ユニットと第２ユニットがほぼ同じ方向に振られた場合）には、処理はステップＳ５８０に進み、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８の
なす角度が−３０°〜３０°の範囲内でなかった場合には、処理はステップＳ５８６に進む。
【０３６８】
ステップＳ５８０では、前述のステップＳ５５２と同様に、現在のベクトルと大きさを２倍にした合成ベクトルとを合成することによって、新しい速度ベクトルを決定する。
【０３６９】
ステップＳ５８２では、前方ベクトルの方向が、ステップＳ５８０で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３７０】
ステップＳ５８４では、同時入力フラグ５１４をオンにし、同時入力タイマ５２０を０にリセットし、第１入力フラグ５１０をオフにする。
【０３７１】
ステップＳ５８６では、第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内または−１５０°〜−１８０°の範囲内であるかどうかを判断する。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内または−１５０°〜−１８０°の範囲内であった場合（すなわち第１ユニットと第２ユニットがほぼ逆方向に振られた場合）には、処理はステップＳ５８８に進む。第１振り方向ベクトル５０６と第２振り方向ベクトル５０８のなす角度が１５０°〜１８０°の範囲内でなく、かつ−１５０°〜−１８０°の範囲内でもなかった場合には、処理はステップＳ５９０に進む。
【０３７２】
ステップＳ５８８では、速度ベクトルを０に変更し、処理はステップＳ５８４に進む。
【０３７３】
ステップＳ５９０では、ステップＳ５６２と同様に、現在のベクトルと大きさを１．５倍にした合成ベクトルとを合成することによって、新しい速度ベクトルを決定する。
【０３７４】
ステップＳ５９２では、前方ベクトルの方向が、ステップＳ５９０で更新された速度ベクトルの方向に一致するように、姿勢マトリクスを更新する。
【０３７５】
ステップＳ５９４では、第２入力フラグ５１２をオンにし、第２タイマ５１８を０にリセットする。
【０３７６】
図４３のステップＳ５９６では、速度ベクトルに基づいて、現在位置データを更新する。
【０３７７】
ステップＳ５９８では、モニタ２に表示されているゲーム画像を、現在位置データと姿勢マトリクスに基づいて更新する。
【０３７８】
ステップＳ６００では、地形の影響を反映して姿勢マトリクスおよび速度ベクトルを更新する。これは、例えばキャラクタが急な坂を上るときにキャラクタの姿勢をやや仰向けに傾けるとともに、キャラクタの進行方向を坂に沿わせるための処理である。
【０３７９】
ステップＳ６０２では、速度データを所定量だけ減少する。その後、処理は図４０のステップＳ５０２に戻る。
【０３８０】
その後、以上のような処理が繰り返されることにより、プレイヤの操作に応じてゲーム画像が随時変化する。
【０３８１】
本実施形態の処理をまとめると、以下の通りとなる。
（１）第１ユニットと第２ユニットが異なるタイミングで振られたとき→それぞれの振り
方向ベクトルに基いて速度ベクトルが更新される。
（２）第１ユニットと第２ユニットがほぼ同時にほぼ同じ方向に振られたとき→合成ベクトルを２倍したベクトルに基いて速度ベクトルが更新される。
（３）第１ユニットと第２ユニットがほぼ同時に異なる方向（ほぼ逆方向を除く）に振られたとき→合成ベクトルを１．５倍したベクトルに基いて速度ベクトルが更新される。
（４）第１ユニットと第２ユニットがほぼ同時にほぼ逆方向に振られたとき→速度ベクトルが０になる（停止する）。
このように、第１ユニットの振りと第２ユニットの振りのタイミングや相対的方向に基いて、異なるゲーム処理をおこなうため、プレイヤに多様な入力を可能にする。
【０３８２】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、操作ユニットを振ることによってキャラクタを制御することができるので、直感的な操作が可能となり、良好な操作性が得られる。また、２つの操作ユニットを同時に振る際の振る方向が近いほどキャラクタの加速度が大きくなるので、より直感的な操作が可能となる。
【０３８３】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、２軸の加速度センサを用いても操作ユニットの振り方向を検出することができる（例えば、図４４ではＸ軸とＺ軸の２軸の出力値を参照して、操作ユニットが振られたことと、その方向を検出している）ため、本実施形態と同様の効果を得ることができる。
【０３８４】
また、本実施形態では、第１ユニットと第２ユニットのいずれか一方だけが振られたときに、その振られた方向に応じてキャラクタを加速させる例を説明したが、これに替えて、第１ユニットと第２ユニットのいずれか一方だけが振られたときにはキャラクタを加速させず、第１ユニットと第２ユニットの両方がほぼ同時に振られたときにだけキャラクタを加速させるようにしてもよい。
【０３８５】
なお、本実施形態では、振り方向検出において、加速度センサの出力（本実施形態では特にＸＺベクトル）の大きさが極大値となったことが検出されたときに、その時点近傍の加速度センサの出力に基づいて操作ユニットの振り方向を検出したが、本発明はこれに限らず、他の任意の方法で操作ユニットの振り方向を検出してもよい。例えば、加速度センサのＸＺベクトルの大きさが一旦所定値を超えてから０に戻ったときに、その期間内のサンプリングデータを参照して、その期間内の加速度センサのＸＹベクトルのうちで大きさが最大のものを振り方向ベクトルとして設定してもよいし、その期間内の加速度センサのＸＹベクトルを平均したものを振り方向ベクトルとして設定してもよいし、その期間内の加速度センサのＸＹベクトルを合成したものを振り方向ベクトルとして設定してもよい。また、加速度センサの出力を積分することによって操作ユニットの移動速度を算出し、こうして算出された移動速度が一定以上である期間の加速度センサの出力に基づいて操作ユニットの振り方向を検出してもよい。
【０３８６】
また、本実施形態では振りを検出したが、これに限らず、操作ユニットの動きを検出し、その動きの方向とタイミングに基いておこなってもよい。
【０３８７】
（第６の実施形態）
第６の実施形態における表示画像は、例えば図１９と同様である。本実施形態では、第１ユニットおよび第２ユニットが振られた方向に基づいてキャラクタの動作が制御される。
【０３８８】
図４７に、第６の実施形態におけるプレイヤの操作方法の一例を示す。本実施形態では
、プレイヤは、方向指示操作（操作ユニットを水平方向に動かす操作）によって方向を指示し、その後、トリガ操作（操作ユニットを鉛直下方に動かす操作）を行うことによって、方向指示操作によって指示した方向の入力を確定させることができる。方向指示操作における第１ユニットおよび第２ユニットの操作方向と、キャラクタの動作との対応関係は、いくつかの点を除けば図３８と同じである。なお、以下では、操作ユニットを動かす操作の一例として振る操作を採用する場合について説明するが、本発明は振り操作に限られず、操作ユニットの動きを検出し、その動きの方向と大きさによっておこなえば十分である。
【０３８９】
図４８は、第６の実施形態におけるメインメモリ３３のメモリマップの一例である。メインメモリ３３には、ゲームプログラム７０３、ゲーム画像データ７０４、キャラクタ制御データ７０５、第１振り方向ベクトル７０９、第２振り方向ベクトル７１０、第１入力フラグ７１１、第２入力フラグ７１２、同時入力フラグ７１４、第１タイマ７１６、第２タイマ７１８、同時入力タイマ７２０、第１サンプリングデータ７２２、第２サンプリングデータ７２４、第１トリガ操作強さ値７２６、および第２トリガ操作強さ値７２８が格納される。
【０３９０】
ゲーム画像データ７０４、キャラクタ制御データ７０５、第１振り方向ベクトル７０９、第２振り方向ベクトル７１０、第１入力フラグ７１１、第２入力フラグ７１２、同時入力フラグ７１４、第１タイマ７１６、第２タイマ７１８、同時入力タイマ７２０、第１サンプリングデータ７２２、および第２サンプリングデータ７２４については、第５の実施形態と同様のため、説明を省略する。
【０３９１】
第１トリガ操作強さ値７２６は、第１ユニットによるトリガ操作時の振りの強さを示す値である。第２トリガ操作強さ値７２８は、第２ユニットによるトリガ操作時の振りの強さを示す値である。
【０３９２】
次に、図４９〜図５３のフローチャートを参照して、ゲームプログラム７０３に基づくＣＰＵ３０の処理の流れを説明する。
【０３９３】
図４９において、ステップＳ７００、Ｓ７０２、Ｓ７０４、Ｓ７０６、Ｓ７０８、Ｓ７１０、Ｓ７１２、Ｓ７１４、Ｓ７１６については前述した第５の実施形態と同様なので説明を省略する。
【０３９４】
ステップＳ７１８では、ＣＰＵ３０は、後述するステップＳ７４８で第１サンプリングデータ７２２に基づいて算出される第１振り方向ベクトル７０９（すなわち、第１ユニットによる方向指示操作時に、第１ユニットがプレイヤによって振られた方向を示すベクトル）と、後述するステップＳ７４２の第１ユニットに関する振り強さ検出の検出結果に応じて設定される第１トリガ操作強さ値７２６（すなわち、第１ユニットによるトリガ操作時に、第１ユニットがプレイヤによって振られた強さを示すベクトル）とに基づいて、速度ベクトルを変更する。速度ベクトルの変更方法としては種々の方法が考えられる。本実施形態では、一例として、図５４に示すように、第１振り方向ベクトル７０９のＸ軸値をａ１、Ｚ軸値をｂ１とし、第１トリガ操作強さ値７２６をβ１とすると、現在のベクトルと、（右方ベクトル×ａ１＋前方ベクトル×ｂ１）×βで表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。したがって、第１トリガ操作強さ値７２６が大きいほどキャラクタの加速度が大きくなる。
【０３９５】
ステップＳ７２０、Ｓ７２２、Ｓ７２４、Ｓ７２６、Ｓ７２８、Ｓ７３０については前述した第５の実施形態と同様なので説明を省略する。
【０３９６】
ステップＳ７３２では、後述するステップＳ７８２で第２サンプリングデータ７２４に基づいて算出される第２振り方向ベクトル７１０（すなわち、第２ユニットによる方向指示操作時に、第２ユニットがプレイヤによって振られた方向を示すベクトル）と、後述するステップＳ７７６の第２ユニットに関する振り強さ検出の検出結果に応じて設定される第２トリガ操作強さ値７２８（すなわち、第２ユニットによるトリガ操作時に、第２ユニットがプレイヤによって振られた強さを示すベクトル）とに基づいて、速度ベクトルを変更する。例えば、第２振り方向ベクトル７１０のＸ軸値をａ２、Ｚ軸値をｂ２とし、第２トリガ操作強さ値７２８をβとすると、現在のベクトルと、（右方ベクトル×ａ２＋前方ベクトル×ｂ２）×βで表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。したがって、第２トリガ操作強さ値７２８が大きいほどキャラクタの加速度が大きくなる。
【０３９７】
ステップＳ７３４、Ｓ７３６、Ｓ７３８、および図５０のステップＳ７４０については前述した第５の実施形態と同様なので説明を省略する。
【０３９８】
図５０のステップＳ７４２では、第１ユニットに関する振り強さ検出を行う。以下、この振り強さ検出の詳細を図５３を参照して説明する。
【０３９９】
図５３のステップＳ８１６では、第１サンプリングデータ７２２を参照し、２番目に新しい第１加速度センサの検出値（Ａｘ，Ａｙ，Ａｚ）のＹ軸値ＡｙがＭ（Ｍは所定値であり、１より大きな値）よりも大きいかどうかを判断する。２番目に新しい第１加速度センサの検出値のＹ軸値がＭよりも大きい場合（振り操作があったと判断される）には、処理はステップＳ８１８に進み、Ｍよりも大きくない場合（振り操作がなかったと判断される）には、処理はステップＳ８２２に進む。
【０４００】
ステップＳ８１８では、第１サンプリングデータ７２２を参照し、２番目に新しい第１加速度センサの検出値のＹ軸値が、最新の第１加速度センサの検出値のＹ軸値よりも大きいかどうかを判断する。これは、第１加速度センサに対して、Ｙ軸方向に最も大きい力が加わったタイミングを検出するための処理である。プレイヤが第１ユニットをＹ軸方向に振ると、図５４に示すように、第１加速度センサの検出値のＹ軸値は、振り始め直後に極小となり、振り終わり間際において極大となる。したがって、ステップＳ８１８の判断結果が肯定となるのは、図５６のＴ１のタイミングである。２番目に新しい第１加速度センサの検出値のＹ軸値が、最新の第１加速度センサの検出値のＹ軸値よりも大きい場合（すなわち第１加速度センサの検出値のＹ軸値の大きさが極大値となった直後）には、処理はステップＳ８２０に進み、２番目に新しい第１加速度センサの検出値のＹ軸値が、最新の第１加速度センサの検出値のＹ軸値よりも大きくない場合には、処理はステップＳ８２２に進む。
【０４０１】
ステップＳ８２０では、振り強さ検出の戻り値として、２番目に新しい第１加速度センサの検出値のＹ軸値Ａｙを返す。このＹ軸値Ａｙは、プレイヤが第１ユニットによるトリガ操作を行ったときに、第１ユニットに加えられた力の大きさ（すなわち第１ユニットが振られた強さ）を示している。その後、処理は図５０のステップＳ７４４に進む。
【０４０２】
ステップＳ８２２では、振り強さ検出の戻り値として、「トリガ操作なし」を示す値を返す。その後、処理は図５０のステップＳ７４４に進む。
【０４０３】
ステップＳ７４４では、ステップＳ７４２の振り強さ検出の検出結果に基づいて、第１ユニットによるトリガ操作があったかどうかを判断し、第１ユニットによるトリガ操作があった場合には処理はステップＳ７４６に進み、第１ユニットによるトリガ操作がなかった場合には処理は図５１のステップＳ７７４に進む。
【０４０４】
ステップＳ７４６では、第１トリガ操作強さ値の戻り値（すなわち第１ユニットによるトリガ操作時に第１ユニットが振られた強さを示す値）を設定する。
【０４０５】
ステップＳ７４８では、第１サンプリングデータ７２２に基づいて、第１ユニットによる方向指示操作時に第１ユニットが振られた方向を検出し、その算出結果を第１振り方向ベクトル７０９に設定する。方向指示操作時に第１ユニットが振られた方向を検出する方法としては種々の方法が考えられる。図５６は、方向指示操作時において、プレイヤが操作ユニットを斜め左前方に振ったときの加速度センサのＸ軸方向およびＺ軸方向の出力値の遷移を示している。
【０４０６】
本実施形態では、一例として、トリガ操作が検出された時点（図中のＴ１）で、直近の６０フレーム期間のサンプリングデータを参照して操作ユニットが振られた方向を検出する。具体的には、サンプリングデータを参照して、Ｘ軸値およびＺ軸値の符号が反転した時点（図中のＴ２）を検出し、Ｔ２以降の各フレームで検出されたＸ軸値およびＺ軸値で示されるＸＺベクトルを平均することで、操作ユニットが振られた方向を検出する。図５６の例では、Ｔ２以降のＸ軸値の平均値が負であり（これは操作ユニットがＸ軸の負方向に振られたことを意味する）、Ｔ２以降のＺ軸値の平均値が正であり（これは操作ユニットがＺ軸の正方向に振られたことを意味する）、さらにこれらの平均値の絶対値がほぼ等しいことから、プレイヤの前方から左に４５°ずれた方向に向かって操作ユニットが振られたことが分かる。なお、Ｔ２を検出するために、サンプリングデータが直近の６０フレームでは不十分な場合には、より長い期間のサンプリングデータを記憶するようにしてもよい。しかしながら、サンプリングデータを十分長い期間とった場合であっても、トリガ操作が検出された時点（Ｔ１）より前の所定期間内（許容期間）に、方向指示操作を示すＡｘ、Ａｚの出力が無い場合（例えば、図６示すような遷移の出力が無い場合、または、単にＡｘ、Ａｚの出力が０である場合など）には、方向指示操作とトリガ操作が連続しておこなわれていないとして、その操作を無効とするのが好ましい。なお、トリガ操作が検出された時点の代わりに、振り動作開始時点や振り動作終了時点やその中間の時点などを上記許容期間の基点としてもよい。
【０４０７】
なお、方向指示操作時に操作ユニットが振られた方向を検出する他の方法として、図５６における振り動作の開始から符号が反転するタイミングＴ２までの期間のＸ軸、Ｚ軸の各軸の平均値を求めてもよい。この場合、最終的に得られるＸＺベクトルが示す方向は、操作ユニットが振られたときの移動方向とは逆の方向となる。
【０４０８】
また、方向指示操作時に操作ユニットが振られた方向を検出するさらに他の方法として、加速度センサのＸ軸およびＺ軸の値をそのまま利用するのではなく、各フレーム間での加速度センサのＸＺベクトルの差分ベクトル（この差分ベクトルの方向は操作ユニットの移動方向を反映している）をそれぞれ算出し、大きさが最も大きい差分ベクトルを、方向指示操作時に操作ユニットが振られた方向として検出してもよい。
【０４０９】
なお、操作ユニットが振られたときには、図５６に示すように、各軸の値は０→正→０→負→０、もしくは０→負→０→正→０というように遷移する。したがって、サンプリングデータを参照して、過去６０フレームの間にこのようなパターンが見られたときに、トリガ操作の前に方向指示操作が行われていたと判定し、それからその方向指示操作時の操作ユニットの振り方向を検出するようにすれば、より正確な検出が可能となる。
【０４１０】
なお、ステップＳ７４８の変形例として、第１ユニットによる方向指示操作時に第１ユニットが振られた方向を検出するときに、第１ユニットによる方向指示操作時に第２ユニットも同時に振られていたかどうかを第２サンプリングデータ７２４に基づいて判断し、
第１ユニットによる方向指示操作時に第２ユニットも同時に振られていた場合には第１振り方向ベクトル７０９の設定をキャンセルするようにしてもよい。これにより、「方向指示操作時に第１ユニットと第２ユニットの両方を一緒に振ってはいけない」という新たな操作要件をプレイヤに課すことができる。
【０４１１】
ステップＳ７５０では、ステップＳ７４８で設定された第１振り方向ベクトル７０９の大きさが所定値よりも大きいかどうかを判断し、所定値よりも大きい場合は、処理はステップＳ７５２に進み、所定値よりも大きくない場合は、処理は図５１のステップＳ７７４に進む。
【０４１２】
ステップＳ７５２では、第１振り方向ベクトル７０９の方向が０°〜９０°の範囲内または−９０°〜０°の範囲内かどうかを判断する。なお、第１振り方向ベクトル７０９のＸ軸値をＡｘ、Ｚ軸値をＡｚとすると、第１振り方向ベクトル７０９の方向はａｒｃｔａｎ（Ａｘ／Ａｚ）で表される。第１振り方向ベクトル７０９の方向が０°〜９０°の範囲内または−９０°〜０°の範囲内である場合には、処理はステップＳ７５４に進み、第１振り方向ベクトル７０９の方向が０°〜９０°の範囲内でなく、かつ−９０°〜０°の範囲内でもない場合には、処理は図５１のステップＳ７７４に進む。これにより、第１ユニットによる方向指示操作でプレイヤが指示可能な方向の範囲を、０°〜９０°の範囲内（すなわちＸ軸の正の方向とＺ軸の正の方向の間の範囲内）または−９０°〜０°の範囲内（すなわちＸ軸の正の方向とＺ軸の負の方向の間の範囲内）に制限することができる。すなわち、第１ユニットを右手で把持し、第２ユニットを左手で把持するとして、第１ユニットの振りの範囲を右領域に限定することができる。一方、後述の通り、第２ユニットは振りの範囲を左領域に限定するので、第１ユニットと第２ユニットの役割を分担し、また、第１ユニットと第２ユニットが衝突することを回避することができる。
【０４１３】
ステップＳ７５４、Ｓ７５６については前述した第５の実施形態と同様なので説明を省略する。
【０４１４】
ステップＳ７５８では、第１振り方向ベクトル７０９、第２振り方向ベクトル７１０、第１トリガ操作強さ値７２６、および第２トリガ操作強さ値７２８に基づいて、速度ベクトルを変更する。具体的には、図５７に示すように、第１振り方向ベクトル７０９と第２振り方向ベクトル７１０を合成して合成振り方向ベクトルを求め、そして、この合成振り方向ベクトルのＸ軸値をａ３、Ｚ軸値をｂ３とすると、現在のベクトルと、（右方ベクトル×ａ３＋前方ベクトル×ｂ３）×α（所定の定数）×β（所定の定数）で表されるベクトルとを合成することによって、新しい速度ベクトルを決定する。αは定数であって、ステップＳ７５８ではα＝２となる。βは、第１トリガ操作強さ値７２６と第２トリガ操作強さ値７２８の和に比例した値である。したがって、第１トリガ操作強さ値７２６と第２トリガ操作強さ値７２８の和が大きいほどキャラクタの加速度が大きくなる。
【０４１５】
なお、ステップＳ７５８において、第１振り方向ベクトルまたは第２振り方向ベクトルを２倍したベクトルを合成ベクトルとみなしてもよい。また、第１トリガ操作強さ値と第２トリガ操作強さ値のいずれか一方のみを利用するようにしてもよい。
【０４１６】
ステップＳ７６０、Ｓ７６２、Ｓ７６４については前述した第５の実施形態と同様なので説明を省略する。
【０４１７】
ステップＳ７６６では、ステップＳ７５８と同様にして速度ベクトルを変更する。ただし、ステップＳ７６０ではα＝１．５となる。
【０４１８】
ステップＳ７６８、Ｓ７７０、Ｓ７７２については前述した第５の実施形態と同様なの
で説明を省略する。
【０４１９】
図５１および図５２の処理については、図５０のフローチャートの説明や、第５の実施形態の説明から、当業者には明らかだと思われるので、説明を省略する。
【０４２０】
以上のように、本実施形態によれば、プレイヤはプレイ中にそれぞれの手を自由に動かすことができるので、プレイ中の動きの自由度が高くダイナミックなプレイが可能となる。また、操作ユニットを振ることによってキャラクタを制御することができるので、直感的な操作が可能となり、良好な操作性が得られる。また、２つの操作ユニットを同時に振る際の振る方向が近いほどキャラクタの加速度が大きくなるので、より直感的な操作が可能となる。
【０４２１】
なお、本実施形態では３軸の加速度センサを用いる例を説明したが、２軸の加速度センサを用いても、そのうちの１軸の加速度センサによって方向指示操作を検出し、残りの１軸の加速度センサによってトリガ操作を検出することができるため、本実施形態と同様の効果を得ることができる。
【０４２２】
また、本実施形態では、第１ユニットと第２ユニットの２つの操作ユニットを使ってキャラクタの動作を制御する例を説明したが、これに替えて、１つの操作ユニットだけを利用して方向指示操作およびトリガ操作を行ってキャラクタの動作を制御するようにしてもよい。
【０４２３】
さらに、本実施形態では、方向指示操作の後トリガ操作をおこなうものとしたが、トリガ操作の後方向指示操作をおこなうようにしてもよい。この場合、方向指示操作が検出されたときに（すなわち、Ａｘ、Ａｚの出力が方向指示操作を示すものであるときに）、サンプリングデータを参照して、その時点より過去の所定期間内にトリガ操作を示すＡｙがあるか否かを判断し、肯定判断の場合に、当該方向指示操作に係る振り方向ベクトルを利用してゲーム処理をおこなってもよい。また、方向指示操作とトリガ操作を同時におこなうようにしてもよい。この場合、トリガ操作または方向指示操作のいずれか一方が検出されたときに、サンプリングデータを参照して、その時点の前後所定期間内に他方を示す出力があるか否かを判断して、肯定判断の場合に、方向指示操作に係る振り方向ベクトルを利用してゲーム処理をおこなってもよい。
【０４２４】
さらに、本実施形態では、トリガ操作が検出されたときに、サンプリングデータを参照することにより、過去の所定期間内に方向指示操作があったか否かを判断するようにしたが、方向指示操作があったときに、その後所定期間内にトリガ操作があるか否かを監視するようにしてもよい。
【０４２５】
なお、以上の実施形態では、プレイヤがゲームオブジェクトを制御する例を説明したが、本発明はこれに限定されない。例えば、第１加速度センサの出力（傾きなど）に応じて仮想ゲーム世界に設定された仮想カメラの傾きを変化させると同時に、第２加速度センサの出力（振り強さ、振り方向など）に応じてゲームオブジェクトの動作を変化させるようにしてもよい。
【符号の説明】
【０４２６】
１    ゲームシステム
２    モニタ
２ａ    スピーカ
３    ゲーム装置
３０    ＣＰＵ
３１    メモリコントローラ
３２    ＧＰＵ
３３    メインメモリ
３４    ＤＳＰ
３５    ＡＲＡＭ
３６    コントローラＩ／Ｆ
３７    ビデオＩ／Ｆ
３８    外部メモリＩ／Ｆ
３９    オーディオＩ／Ｆ
４    光ディスク
４０    ディスクドライブ
４１    ディスクＩ／Ｆ
５    外部メモリカード
６    受信ユニット
７    コントローラ
７０    コアユニット
７００    基板
７０１    加速度センサ
７０２    ＬＥＤ
７０６    スピーカ
７０７    サウンドＩＣ
７０８    アンプ
７１    ハウジング
７２    操作部
７３    コネクタ
７４    撮像情報演算部
７４１    赤外線フィルタ
７４２    レンズ
７４３    撮像素子
７４４    画像処理回路
７５    通信部
７５１    マイコン
７５２    メモリ
７５３    無線モジュール
７５４    アンテナ
７６    サブユニット
７６１    加速度センサ
７７    ハウジング
７８    操作部
７９    接続ケーブル
７９１    コネクタ
８    ＬＥＤモジュール
【図１】
0005548762.tif 000002
【図２】
0005548762.tif 000003
【図３】
0005548762.tif 000004
【図４】
0005548762.tif 000005
【図５】
0005548762.tif 000006
【図６】
0005548762.tif 000007
【図７】
0005548762.tif 000008
【図８】
0005548762.tif 000009
【図９】
0005548762.tif 000010
【図１０】
0005548762.tif 000011
【図１１】
0005548762.tif 000012
【図１２】
0005548762.tif 000013
【図１３】
0005548762.tif 000014
【図１４】
0005548762.tif 000015
【図１５】
0005548762.tif 000016
【図１６】
0005548762.tif 000017
【図１７】
0005548762.tif 000018
【図１８】
0005548762.tif 000019
【図１９】
0005548762.tif 000020
【図２０】
0005548762.tif 000021
【図２１】
0005548762.tif 000022
【図２２】
0005548762.tif 000023
【図２３】
0005548762.tif 000024
【図２４】
0005548762.tif 000025
【図２５】
0005548762.tif 000026
【図２６】
0005548762.tif 000027
【図２７】
0005548762.tif 000028
【図２８】
0005548762.tif 000029
【図２９】
0005548762.tif 000030
【図３０】
0005548762.tif 000031
【図３１】
0005548762.tif 000032
【図３２】
0005548762.tif 000033
【図３３】
0005548762.tif 000034
【図３４】
0005548762.tif 000035
【図３５】
0005548762.tif 000036
【図３６】
0005548762.tif 000037
【図３７】
0005548762.tif 000038
【図３８】
0005548762.tif 000039
【図３９】
0005548762.tif 000040
【図４０】
0005548762.tif 000041
【図４１】
0005548762.tif 000042
【図４２】
0005548762.tif 000043
【図４３】
0005548762.tif 000044
【図４４】
0005548762.tif 000045
【図４５】
0005548762.tif 000046
【図４６】
0005548762.tif 000047
【図４７】
0005548762.tif 000048
【図４８】
0005548762.tif 000049
【図４９】
0005548762.tif 000050
【図５０】
0005548762.tif 000051
【図５１】
0005548762.tif 000052
【図５２】
0005548762.tif 000053
【図５３】
0005548762.tif 000054
【図５４】
0005548762.tif 000055
【図５５】
0005548762.tif 000056
【図５６】
0005548762.tif 000057
【図５７】
0005548762.tif 000058