図1を参照して、この発明の一実施例であるゲームシステム10は、ビデオゲーム装置(以下、単に「ゲーム装置」という)12、コントローラ22および荷重コントローラ36を含む。なお、図示は省略するが、この実施例のゲーム装置12は、最大4つのコントローラ(22,36)と通信可能に設計されている。また、ゲーム装置12と各コントローラ(22,36)とは、無線によって接続される。たとえば、無線通信は、Bluetooth(登録商標)規格に従って実行されるが、赤外線や無線LANなど他の規格に従って実行されてもよい。
ゲーム装置12は、略直方体のハウジング14を含み、ハウジング14の前面にはディスクスロット16が設けられる。ディスクスロット16から、情報処理プログラムの一例としてのゲームプログラム等を記憶した情報記憶媒体の一例である光ディスク18が挿入されて、ハウジング14内のディスクドライブ54(図2参照)に装着される。ディスクスロット16の周囲には、LEDと導光板が配置され、さまざまな処理に応答させて点灯させることが可能である。
また、ゲーム装置12のハウジング14の前面であり、その上部には、電源ボタン20aおよびリセットボタン20bが設けられ、その下部には、イジェクトボタン20cが設けられる。さらに、リセットボタン20bとイジェクトボタン20cとの間であり、ディスクスロット16の近傍には、外部メモリカード用コネクタカバー28が設けられる。この外部メモリカード用コネクタカバー28の内側には、外部メモリカード用コネクタ62(図2参照)が設けられ、図示しない外部メモリカード(以下、単に「メモリカード」という)が挿入される。メモリカードは、光ディスク18から読み出したゲームプログラム等をローディングして一時的に記憶したり、このゲームシステム10を利用してプレイしたゲームのゲームデータ(ゲームの結果データまたは途中データ)を保存(セーブ)しておいたりするために利用される。ただし、上記のゲームデータの保存は、メモリカードに対して行うことに代えて、たとえばゲーム装置12の内部に設けられるフラッシュメモリ44(図2参照)のような内部メモリに対して行うようにしてもよい。また、メモリカードは、内部メモリのバックアップメモリとして用いるようにしてもよい。
なお、メモリカードとしては、汎用のSDカードを用いることができるが、メモリスティックやマルチメディアカード(登録商標)のような他の汎用のメモリカードを用いることもできる。
ゲーム装置12のハウジング14の後面には、AVコネクタ58(図2参照)が設けられ、そのAVコネクタ58を用いて、AVケーブル32aを通してゲーム装置12にモニタ34およびスピーカ34aを接続する。このモニタ34およびスピーカ34aは典型的にはカラーテレビジョン受像機であり、AVケーブル32aは、ゲーム装置12からの映像信号をカラーテレビのビデオ入力端子に入力し、音声信号を音声入力端子に入力する。したがって、カラーテレビ(モニタ)34の画面上にたとえば3次元(3D)ビデオゲームのゲーム画像が表示され、左右のスピーカ34aからゲーム音楽や効果音などのステレオゲーム音声が出力される。また、モニタ34の周辺(この実施例では、モニタ34の上側)には、2つの赤外LED(マーカ)340m,340nを備えるマーカ部34bが設けられる。このマーカ部34bは、電源ケーブル32bを通してゲーム装置12に接続される。したがって、マーカ部34bには、ゲーム装置12から電源が供給される。これによって、マーカ340m,340nは発光し、それぞれモニタ34の前方に向けて赤外光を出力する。
なお、ゲーム装置12の電源は、一般的なACアダプタ(図示せず)によって与えられる。ACアダプタは家庭用の標準的な壁ソケットに差し込まれ、ゲーム装置12は、家庭用電源(商用電源)を、駆動に適した低いDC電圧信号に変換する。他の実施例では、電源としてバッテリが用いられてもよい。
このゲームシステム10において、ユーザまたはプレイヤがゲーム(またはゲームに限らず、他のアプリケーション)をプレイするために、ユーザはまずゲーム装置12の電源をオンし、次いで、ユーザはビデオゲーム(もしくはプレイしたいと思う他のアプリケーション)のプログラムを記録している適宜の光ディスク18を選択し、その光ディスク18をゲーム装置12のディスクドライブ54にローディングする。応じて、ゲーム装置12がその光ディスク18に記録されているプログラムに基づいてビデオゲームもしくは他のアプリケーションを実行し始めるようにする。ユーザはゲーム装置12に入力を与えるためにコントローラ22を操作する。たとえば、入力手段26のどれかを操作することによってゲームもしくは他のアプリケーションをスタートさせる。また、入力手段26に対する操作以外にも、コントローラ22自体を動かすことによって、動画オブジェクト(プレイヤオブジェクト)を異なる方向に移動させ、または3Dのゲーム世界におけるユーザの視点(カメラ位置)を変化させることができる。
図2は図1実施例のビデオゲームシステム10の電気的な構成を示すブロック図である。図示は省略するが、ハウジング14内の各コンポーネントは、プリント基板に実装される。図2に示すように、ゲーム装置12には、CPU40が設けられる。このCPU40は、ゲームプロセッサとして機能する。このCPU40には、システムLSI42が接続される。このシステムLSI42には、外部メインメモリ46、ROM/RTC48、ディスクドライブ54およびAV IC56が接続される。
外部メインメモリ46は、ゲームプログラム等のプログラムを記憶したり、各種データを記憶したりし、CPU40のワーク領域やバッファ領域として用いられる。ROM/RTC48は、いわゆるブートROMであり、ゲーム装置12の起動用のプログラムが組み込まれるとともに、時間をカウントする時計回路が設けられる。ディスクドライブ54は、光ディスク18からプログラムデータやテクスチャデータ等を読み出し、CPU40の制御の下で、後述する内部メインメモリ42eまたは外部メインメモリ46に書き込む。
システムLSI42には、入出力プロセッサ42a、GPU(Graphics Processor Unit)42b,DSP(Digital Signal Processor)42c,VRAM42dおよび内部メインメモリ42eが設けられ、図示は省略するが、これらは内部バスによって互いに接続される。
入出力プロセッサ(I/Oプロセッサ)42aは、データの送受信を実行したり、データのダウンロードを実行したりする。データの送受信やダウンロードについては後で詳細に説明する。
GPU42bは、描画手段の一部を形成し、CPU40からのグラフィクスコマンド(作画命令)を受け、そのコマンドに従ってゲーム画像データを生成する。ただし、CPU40は、グラフィクスコマンドに加えて、ゲーム画像データの生成に必要な画像生成プログラムをGPU42bに与える。
図示は省略するが、上述したように、GPU42bにはVRAM42dが接続される。GPU42bが作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンデータやテクスチャデータなどのデータ)は、GPU42bがVRAM42dにアクセスして取得する。なお、CPU40は、描画に必要な画像データを、GPU42bを介してVRAM42dに書き込む。GPU42bは、VRAM42dにアクセスして描画のためのゲーム画像データを作成する。
なお、この実施例では、GPU42bがゲーム画像データを生成する場合について説明するが、ゲームアプリケーション以外の任意のアプリケーションを実行する場合には、GPU42bは当該任意のアプリケーションについての画像データを生成する。
また、DSP42cは、オーディオプロセッサとして機能し、内部メインメモリ42eや外部メインメモリ46に記憶されるサウンドデータや音波形(音色)データを用いて、スピーカ34aから出力する音、音声或いは音楽に対応するオーディオデータを生成する。
上述のように生成されたゲーム画像データおよびオーディオデータは、AV IC56によって読み出され、AVコネクタ58を介してモニタ34およびスピーカ34aに出力される。したがって、ゲーム画面がモニタ34に表示され、ゲームに必要な音(音楽)がスピーカ34aから出力される。
また、入出力プロセッサ42aには、フラッシュメモリ44、無線通信モジュール50および無線コントローラモジュール52が接続されるとともに、拡張コネクタ60およびメモリカード用コネクタ62が接続される。また、無線通信モジュール50にはアンテナ50aが接続され、無線コントローラモジュール52にはアンテナ52aが接続される。
入出力プロセッサ42aは、無線通信モジュール50を介して、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。ただし、ネットワークを介さずに、直接的に他のゲーム装置と通信することもできる。入出力プロセッサ42aは、定期的にフラッシュメモリ44にアクセスし、ネットワークへ送信する必要があるデータ(送信データとする)の有無を検出し、当該送信データが有る場合には、無線通信モジュール50およびアンテナ50aを介してネットワークに送信する。また、入出力プロセッサ42aは、他のゲーム装置から送信されるデータ(受信データとする)を、ネットワーク、アンテナ50aおよび無線通信モジュール50を介して受信し、受信データをフラッシュメモリ44に記憶する。ただし、一定の場合には、受信データをそのまま破棄する。さらに、入出力プロセッサ42aは、ダウンロードサーバからダウンロードしたデータ(ダウンロードデータとする)をネットワーク、アンテナ50aおよび無線通信モジュール50を介して受信し、ダウンロードデータをフラッシュメモリ44に記憶する。
また、入出力プロセッサ42aは、コントローラ22や荷重コントローラ36から送信される入力データをアンテナ52aおよび無線コントローラモジュール52を介して受信し、内部メインメモリ42eまたは外部メインメモリ46のバッファ領域に記憶(一時記憶)する。入力データは、CPU40のゲーム処理によって利用された後、バッファ領域から消去される。
なお、この実施例では、上述したように、無線コントローラモジュール52は、Bluetooth規格にしたがってコントローラ22や荷重コントローラ36との間で通信を行う。
また、図面の都合上、図2では、コントローラ22と荷重コントローラ36とをまとめて記載してある。
さらに、入出力プロセッサ42aには、拡張コネクタ60およびメモリカード用コネクタ62が接続される。拡張コネクタ60は、USBやSCSIのようなインターフェイスのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したりすることができる。また、拡張コネクタ60に有線LANアダプタを接続し、無線通信モジュール50に代えて当該有線LANを利用することもできる。メモリカード用コネクタ62には、メモリカードのような外部記憶媒体を接続することができる。したがって、たとえば、入出力プロセッサ42aは、拡張コネクタ60やメモリカード用コネクタ62を介して、外部記憶媒体にアクセスし、データを保存したり、データを読み出したりすることができる。
詳細な説明は省略するが、図1にも示したように、ゲーム装置12(ハウジング14)には、電源ボタン20a、リセットボタン20bおよびイジェクトボタン20cが設けられる。電源ボタン20aは、システムLSI42に接続される。この電源ボタン20aがオンされると、システムLSI42は、ゲーム装置12の各コンポーネントに図示しないACアダプタを経て電源が供給され、通常の通電状態となるモード(通常モードと呼ぶこととする)を設定する。一方、電源ボタン20aがオフされると、システムLSI42は、ゲーム装置12の一部のコンポーネントのみに電源が供給され、消費電力を必要最低限に抑えるモード(以下、「スタンバイモード」という)を設定する。この実施例では、スタンバイモードが設定された場合には、システムLSI42は、入出力プロセッサ42a、フラッシュメモリ44、外部メインメモリ46、ROM/RTC48および無線通信モジュール50、無線コントローラモジュール52以外のコンポーネントに対して、電源供給を停止する指示を行う。したがって、このスタンバイモードは、CPU40によってアプリケーションの実行が行われないモードである。
なお、システムLSI42には、スタンバイモードにおいても電源が供給されるが、GPU42b、DSP42cおよびVRAM42dへのクロックの供給を停止することにより、これらを駆動させないようにして、消費電力を低減するようにしてある。
また、図示は省略するが、ゲーム装置12のハウジング14内部には、CPU40やシステムLSI42などのICの熱を外部に排出するためのファンが設けられる。スタンバイモードでは、このファンも停止される。
ただし、スタンバイモードを利用したくない場合には、スタンバイモードを利用しない設定にしておくことにより、電源ボタン20aがオフされたときに、すべての回路コンポーネントへの電源供給が完全に停止される。
また、通常モードとスタンバイモードの切り替えは、コントローラ22の電源スイッチ26hのオン/オフの切り替えによっても遠隔操作によって行うことが可能である。当該遠隔操作を行わない場合には、スタンバイモードにおいて無線コントローラモジュール52aへの電源供給を行わない設定にしてもよい。
リセットボタン20bもまた、システムLSI42に接続される。リセットボタン20bが押されると、システムLSI42は、ゲーム装置12の起動プログラムを再起動する。イジェクトボタン20cは、ディスクドライブ54に接続される。イジェクトボタン20cが押されると、ディスクドライブ54から光ディスク18が排出される。
図3(A)ないし図3(E)は、コントローラ22の外観の一例を示す。図3(A)はコントローラ22の先端面を示し、図3(B)はコントローラ22の上面を示し、図3(C)はコントローラ22の右側面を示し、図3(D)はコントローラ22の下面を示し、そして、図3(E)はコントローラ22の後端面を示す。
図3(A)ないし図3(E)を参照して、コントローラ22は、たとえばプラスチック成型によって形成されたハウジング22aを有している。ハウジング22aは、略直方体形状であり、ユーザが片手で把持可能な大きさである。ハウジング22a(コントローラ22)には、入力手段(複数のボタンないしスイッチ)26が設けられる。具体的には、図3(B)に示すように、ハウジング22aの上面には、十字キー26a、1ボタン26b、2ボタン26c、Aボタン26d、−ボタン26e、HOMEボタン26f、+ボタン26gおよび電源スイッチ26hが設けられる。また、図3(C)および図3(D)に示すように、ハウジング22aの下面に傾斜面が形成されており、この傾斜面に、Bトリガースイッチ26iが設けられる。
十字キー26aは、4方向プッシュスイッチであり、矢印で示す4つの方向、前(または上)、後ろ(または下)、右および左の操作部を含む。この操作部のいずれか1つを操作することによって、プレイヤによって操作可能なキャラクタまたはオブジェクト(プレイヤキャラクタまたはプレイヤオブジェクト)の移動方向を指示したり、カーソルの移動方向を指示したりすることができる。
1ボタン26bおよび2ボタン26cは、それぞれ、押しボタンスイッチである。たとえば3次元ゲーム画像を表示する際の視点位置や視点方向、すなわち仮想カメラの位置や画角を調整する等のゲームの操作に使用される。または、1ボタン26bおよび2ボタン26cは、Aボタン26dおよびBトリガースイッチ26iと同じ操作或いは補助的な操作をする場合に用いるようにしてもよい。
Aボタンスイッチ26dは、押しボタンスイッチであり、プレイヤキャラクタまたはプレイヤオブジェクトに、方向指示以外の動作、すなわち、打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせるために使用される。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かすなどを指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。
−ボタン26e、HOMEボタン26f、+ボタン26gおよび電源スイッチ26hもまた、押しボタンスイッチである。−ボタン26eは、ゲームモードを選択するために使用される。HOMEボタン26fは、ゲームメニュー(メニュー画面)を表示するために使用される。+ボタン26gは、ゲームを開始(再開)したり、一時停止したりするなどのために使用される。電源スイッチ26hは、ゲーム装置12の電源を遠隔操作によってオン/オフするために使用される。
なお、この実施例では、コントローラ22自体をオン/オフするための電源スイッチは設けておらず、コントローラ22の入力手段26のいずれかを操作することによってコントローラ22はオンとなり、一定時間(たとえば、30秒)以上操作しなければ自動的にオフとなるようにしてある。
Bトリガースイッチ26iもまた、押しボタンスイッチであり、主として、弾を撃つなどのトリガを模した入力を行ったり、コントローラ22で選択した位置を指定したりするために使用される。また、Bトリガースイッチ26iを押し続けると、プレイヤオブジェクトの動作やパラメータを一定の状態に維持することもできる。また、一定の場合には、Bトリガースイッチ26iは、通常のBボタンと同様に機能し、Aボタン26dによって決定したアクションを取り消すなどのために使用される。
また、図3(E)に示すように、ハウジング22aの後端面に外部拡張コネクタ22bが設けられ、また、図3(B)に示すように、ハウジング22aの上面であり、後端面側にはインジケータ22cが設けられる。外部拡張コネクタ22bは、図示しない別の拡張コントローラを接続するためなどに使用される。インジケータ22cは、たとえば、4つのLEDで構成され、4つのうちのいずれか1つを点灯することにより、点灯LEDに対応するコントローラ22の識別情報(コントローラ番号)を示したり、点灯させるLEDの個数によってコントローラ22の電源残量を示したりすることができる。
さらに、コントローラ22は、撮像情報演算部80(図4参照)を有しており、図3(A)に示すように、ハウジング22aの先端面には撮像情報演算部80の光入射口22dが設けられる。また、コントローラ22は、スピーカ86(図4参照)を有しており、このスピーカ86は、図3(B)に示すように、ハウジング22aの上面であり、1ボタン26bとHOMEボタン26fとの間に設けられる音抜き孔22eに対応して、ハウジング22a内部に設けられる。
なお、図3(A)ないし図3(E)に示したコントローラ22の形状や、各入力手段26の形状、数および設置位置等は単なる一例に過ぎず、それらが適宜改変された場合であっても、本発明を実現できることは言うまでもない。
図4はコントローラ22の電気的な構成を示すブロック図である。この図4を参照して、コントローラ22はプロセッサ70を含み、このプロセッサ70には、内部バス(図示せず)によって、外部拡張コネクタ22b、入力手段26、メモリ72、加速度センサ74、無線モジュール76、撮像情報演算部80、LED82(インジケータ22c)、バイブレータ84、スピーカ86および電源回路88が接続される。また、無線モジュール76には、アンテナ78が接続される。
プロセッサ70は、コントローラ22の全体制御を司り、入力手段26、加速度センサ74および撮像情報演算部80によって入力された情報(入力情報)を、入力データとして無線モジュール76およびアンテナ78を介してゲーム装置12に送信(入力)する。このとき、プロセッサ70は、メモリ72を作業領域ないしバッファ領域として用いる。
上述した入力手段26(26a−26i)からの操作信号(操作データ)は、プロセッサ70に入力され、プロセッサ70は操作データを一旦メモリ72に記憶する。
また、加速度センサ74は、コントローラ22の縦方向(y軸方向)、横方向(x軸方向)および前後方向(z軸方向)の3軸で各々の加速度を検出する。この加速度センサ74は、典型的には、静電容量式の加速度センサであるが、他の方式のものを用いるようにしてもよい。
たとえば、加速度センサ74は、第1所定時間毎に、x軸,y軸,z軸の各々についての加速度(ax,ay,az)を検出し、検出した加速度のデータ(加速度データ)をプロセッサ70に入力する。たとえば、加速度センサ74は、各軸方向の加速度を、−2.0g〜2.0g(gは重力加速度である。以下、同じ。)の範囲で検出する。プロセッサ70は、加速度センサ74から与えられる加速度データを、第2所定時間毎に検出し、一旦メモリ72に記憶する。プロセッサ70は、操作データ、加速度データおよび後述するマーカ座標データの少なくとも1つを含む入力データを作成し、作成した入力データを、第3所定時間(たとえば、5msec)毎にゲーム装置12に送信する。
なお、図3(A)−図3(E)では省略したが、この実施例では、加速度センサ74は、ハウジング22a内部の基板上の十字キー26aが配置される付近に設けられる。
無線モジュール76は、たとえばBluetoothの技術を用いて、所定周波数の搬送波を入力データで変調し、その微弱電波信号をアンテナ78から放射する。つまり、入力データは、無線モジュール76によって微弱電波信号に変調されてアンテナ78(コントローラ22)から送信される。この微弱電波信号が上述したゲーム装置12に設けられた無線コントローラモジュール52によって受信される。受信された微弱電波は、復調および復号の処理を施され、したがって、ゲーム装置12(CPU40)は、コントローラ22からの入力データを取得することができる。そして、CPU40は、取得した入力データとプログラム(ゲームプログラム)とに従ってゲーム処理を行う。
さらに、上述したように、コントローラ22には、撮像情報演算部80が設けられる。この撮像情報演算部80は、赤外線フィルタ80a、レンズ80b、撮像素子80cおよび画像処理回路80dによって構成される。赤外線フィルタ80aは、コントローラ22の前方から入射する光から赤外線のみを通過させる。上述したように、モニタ34の表示画面近傍(周辺)に配置されるマーカ340mおよび340nは、モニタ34の前方に向かって赤外光を出力する赤外LEDである。したがって、赤外線フィルタ80aを設けることによってマーカ340mおよび340nの画像をより正確に撮像することができる。レンズ84は、赤外線フィル82を透過した赤外線を集光して撮像素子80cへ出射する。撮像素子80cは、たとえばCMOSセンサあるいはCCDのような固体撮像素子であり、レンズ80bによって集光された赤外線を撮像する。したがって、撮像素子80cは、赤外線フィルタ80aを通過した赤外線だけを撮像して画像データを生成する。以下では、撮像素子80cによって撮像された画像を撮像画像と呼ぶ。撮像素子80cによって生成された画像データは、画像処理回路80dで処理される。画像処理回路80dは、撮像画像内における撮像対象(マーカ340mおよび340n)の位置を算出し、第4所定時間毎に、当該位置を示す各座標値を撮像データとしてプロセッサ70に出力する。なお、画像処理回路80dにおける処理については後述する。
図5は図1に示した荷重コントローラ36の外観を示す斜視図である。図5に示すように、荷重コントローラ36は、プレイヤがその上に乗る(プレイヤの足を乗せる)台36a、および台36aにかかる荷重を検出するための少なくとも4つの荷重センサ36bを備える。なお、各荷重センサ36bは台36aに内包されており(図6,図7参照)、図5においてはその配置が点線で示されている。
台36aは、略直方体に形成されており、上面視で略長方形状である。たとえば長方形の短辺が30cm程度に設定され、その長辺が50cm程度に設定される。プレイヤが乗る台36aの上面は平坦にされる。台36aの4隅の側面は、部分的に円柱状に張り出すように形成されている。
この台36aにおいて、4つの荷重センサ36bは、所定の間隔を置いて配置される。この実施例では、4つの荷重センサ36bは、台36aの周縁部に、具体的には4隅にそれぞれ配置される。荷重センサ36bの間隔は、台36aに対するプレイヤの荷重のかけ方によるゲーム操作の意図をより精度良く検出できるように適宜な値に設定される。
図6は、図5に示した荷重コントローラ36のVI−VI断面図を示すとともに、荷重センサ36bの配置された隅の部分が拡大表示されている。この図6から分かるように、台36aは、プレイヤが乗るための支持板360と脚362を含む。脚362は、荷重センサ36bが配置される箇所に設けられる。この実施例では4つの荷重センサ36bが4隅に配置されるので、4つの脚362が4隅に設けられる。脚362は、たとえばプラスチック成型によって略有底円筒状に形成されており、荷重センサ36bは、脚362内の底面に設けられた球面部品362a上に配置される。支持板360は、この荷重センサ36bを介して脚362に支持される。
支持板360は、上面と側面上部とを形成する上層板360a、下面と側面下部とを形成する下層板360b、および上層板360aと下層板360bとの間に設けられる中層板360cを含む。上層板360aと下層板360bとは、たとえばプラスチック成型により形成されており、接着等により一体化される。中層板360cは、たとえば1枚の金属板のプレス成型により形成されている。この中層板360cが、4つの荷重センサ36bの上に固定される。上層板360aは、その下面に格子状のリブ(図示しない)を有しており、当該リブを介して中層板360cに支持されている。
したがって、台36aにプレイヤが乗ったときには、その荷重は、支持板360、荷重センサ36bおよび脚362を伝達する。図6に矢印で示したように、入力される荷重によって生じた床からの反作用は、脚362から、球面部品362a、荷重センサ36b、中層板360cを介して、上層板360aに伝達する。
荷重センサ36bは、たとえば歪ゲージ(歪センサ)式ロードセルであり、入力された荷重を電気信号に変換する荷重変換器である。荷重センサ36bでは、荷重入力に応じて、起歪体370aが変形して歪が生じる。この歪が、起歪体に貼り付けられた歪センサ370bによって、電気抵抗の変化に変換され、さらに電圧変化に変換される。したがって、荷重センサ36bは、入力荷重を示す電圧信号を出力端子から出力する。
なお、荷重センサ36bは、音叉振動式、弦振動式、静電容量式、圧電式、磁歪式、またはジャイロ式のような他の方式の荷重センサであってもよい。
図5に戻って、荷重コントローラ36には、さらに、電源ボタン36cが設けられる。この電源ボタン36cがオンされると、荷重コントローラ36の各回路コンポーネント(図7参照)に電源が供給される。ただし、荷重コントローラ36は、ゲーム装置12からの指示に従ってオンされる場合もある。また、荷重コントローラ36は、プレイヤが乗っていない状態が一定時間(たとえば、30秒)以上継続すると、電源がオフされる。ただし、荷重コントローラ36が起動されている状態で、電源ボタン36cをオンしたときに、電源がオフされてもよい。
図7のブロック図には、荷重コントローラ36の電気的な構成の一例が示される。なお、この図7では、信号および通信の流れは実線矢印で示される。破線矢印は、電源の供給を示している。
荷重コントローラ36は、その動作を制御するためのマイクロコンピュータ(マイコン)100を含む。マイコン100は図示しないCPU、ROMおよびRAM等を含み、CPUはROMに記憶されたプログラムに従って荷重コントローラ36の動作を制御する。
マイコン100には、電源ボタン36c、ADコンバータ102、DC−DCコンバータ104および無線モジュール106が接続される。さらに、無線モジュール106には、アンテナ106aが接続される。また、4つの荷重センサ36bは、図3ではロードセル36bとして示される。4つの荷重センサ36bは、それぞれ、増幅器108を介してADコンバータ102に接続される。
また、荷重コントローラ36には電源供給のために電池100が収容されている。他の実施例では、電池に代えてACアダプタを接続し、商用電源を供給するようにしてもよい。かかる場合には、DC−DCコンバータに代えて、交流を直流に変換し、直流電圧を降圧および整流する電源回路を設ける必要がある。この実施例では、マイコン100および無線モジュール106への電源の供給は、電池から直接的に行われる。つまり、マイコン100内部の一部のコンポーネント(CPU)と無線モジュール106とには、常に電源が供給されており、電源ボタン36cがオンされたか否か、ゲーム装置12から電源オン(荷重検出)のコマンドが送信されたか否かを検出する。一方、荷重センサ36b、ADコンバータ102および増幅器108には、電池110からの電源がDC−DCコンバータ104を介して供給される。DC−DCコンバータ104は、電池110からの直流電流の電圧値を異なる電圧値に変換して、荷重センサ36b、ADコンバータ102および増幅器108に与える。
これら荷重センサ36b、ADコンバータ102および増幅器108への電源供給は、マイコン100によるDC−DCコンバータ104の制御によって、必要に応じて行われるようにしてよい。つまり、マイコン100は、荷重センサ36bを動作させて荷重を検出する必要があると判断されるときに、DC−DCコンバータ104を制御して、各荷重センサ36b、ADコンバータ102および各増幅器108に電源を供給するようにしてよい。
電源が供給されると、各荷重センサ36bは、入力された荷重を示す信号を出力する。当該信号は各増幅器108で増幅され、ADコンバータ102でアナログ信号からディジタルデータに変換されて、マイコン100に入力される。各荷重センサ36bの検出値には各荷重センサ36bの識別情報が付与されて、いずれの荷重センサ36bの検出値であるかが識別可能にされる。このようにして、マイコン100は、同一時刻における4つの荷重センサ36bのそれぞれの荷重検出値を示すデータを取得することができる。
一方、マイコン100は、荷重センサ36bを動作させる必要がないと判断されるとき、つまり、荷重検出タイミングでないとき、DC−DCコンバータ104を制御して、荷重センサ36b、ADコンバータ102および増幅器108への電源の供給を停止する。このように、荷重コントローラ36では、必要なときにだけ、荷重センサ36bを動作させて荷重の検出を行うことができるので、荷重検出のための電力消費を抑制することができる。
荷重検出の必要なときとは、典型的には、ゲーム装置12(図1)が荷重データを取得したいときである。たとえば、ゲーム装置12が荷重情報を必要とするとき、ゲーム装置12は荷重コントローラ36に対して荷重取得命令を送信する。マイコン100は、ゲーム装置12から荷重取得命令を受信したときに、DC−DCコンバータ104を制御して、荷重センサ36b等に電源を供給し、荷重を検出する。一方、マイコン100は、ゲーム装置12から荷重取得命令を受信していないときには、DC−DCコンバータ104を制御して、電源供給を停止する。あるいは、マイコン100は、一定時間ごとに荷重検出タイミングであると判断して、DC−DCコンバータ104を制御するようにしてもよい。このような周期的な荷重取得を行う場合、周期情報は、たとえば、初めにゲーム装置12からマイコン100に与えられ、または、予めマイコン100に記憶されてよい。
荷重センサ36bからの検出値を示すデータは、荷重コントローラ36の操作データ(入力データ)として、マイコン100から無線モジュール106およびアンテナ106bを介してゲーム装置12(図1)に送信される。たとえば、ゲーム装置12からの命令を受けて荷重検出を行った場合、マイコン100は、ADコンバータ102から荷重センサ36bの検出値データを受信したときに、当該検出値データをゲーム装置12に送信する。あるいは、マイコン100は、一定時間ごとに検出値データをゲーム装置12に送信するようにしてもよい。
なお、無線モジュール106は、ゲーム装置12の無線コントローラモジュール52と同じ無線規格(Bluetooth、無線LANなど)で通信可能にされる。したがって、ゲーム装置12のCPU40は、無線コントローラモジュール52等を介して荷重取得命令を荷重コントローラ36に送信することができる。荷重コントローラ36のマイコン100は、無線モジュール106およびアンテナ106aを介して、ゲーム装置12からの命令を受信し、また、各荷重センサ36bの荷重検出値(または荷重算出値)を含む入力データをゲーム装置12に送信することができる。
図8は、コントローラ22および荷重コントローラ36を用いて仮想ゲームをプレイするときの状態を概説する図解図である。図8に示すように、ビデオゲームシステム10でコントローラ22および荷重コントローラ36を用いて仮想ゲームをプレイする際、プレイヤは、荷重コントローラ36の上に乗り、一方の手でコントローラ22を把持する。厳密に言うと、プレイヤは、コントローラ22の先端面(撮像情報演算部80が撮像する光の入射口22d側)がマーカ340mおよび340nの方を向く状態で、荷重コントローラ36に乗り、コントローラ22を把持する。ただし、図1からも分かるように、マーカ340mおよび340nは、モニタ34の画面の横方向と平行に配置されている。この状態で、プレイヤは、コントローラ22が指示する画面上の位置を変更したり、コントローラ22と各マーカ340mおよび340nとの距離を変更したりすることによってゲーム操作を行う。
なお、図8では、プレイヤがモニタ34の画面に対して横を向くように荷重コントローラ36を縦置きにしてあるが、ゲームによっては、プレイヤがモニタ34の画面に対して正面を向くように荷重コントローラ36を横置きにしてよい。
図9は、マーカ340mおよび340nと、コントローラ22との視野角を説明するための図である。図9に示すように、マーカ340mおよび340nは、それぞれ、視野角θ1の範囲で赤外光を放射する。また、撮像情報演算部80の撮像素子80cは、コントローラ22の視線方向を中心とした視野角θ2の範囲で入射する光を受光することができる。たとえば、マーカ340mおよび340nの視野角θ1は、共に34°(半値角)であり、一方、撮像素子80cの視野角θ2は41°である。プレイヤは、撮像素子80cが2つのマーカ340mおよび340nからの赤外光を受光することが可能な位置および向きとなるように、コントローラ22を把持する。具体的には、撮像素子80cの視野角θ2の中に少なくとも一方のマーカ340mおよび340nが存在し、かつ、マーカ340mまたは340nの少なくとも一方の視野角θ1の中にコントローラ22が存在する状態となるように、プレイヤはコントローラ22を把持する。この状態にあるとき、コントローラ22は、マーカ340mおよび340nの少なくとも一方を検知することができる。プレイヤは、この状態を満たす範囲でコントローラ22の位置および向きを変化させることによってゲーム操作を行うことができる。
なお、コントローラ22の位置および向きがこの範囲外となった場合、コントローラ22の位置および向きに基づいたゲーム操作を行うことができなくなる。以下では、上記範囲を「操作可能範囲」と呼ぶ。
操作可能範囲内でコントローラ22が把持される場合、撮像情報演算部80によって各マーカ340mおよび340nの画像が撮像される。すなわち、撮像素子80cによって得られる撮像画像には、撮像対象である各マーカ340mおよび340nの画像(対象画像)が含まれる。図10は、対象画像を含む撮像画像の一例を示す図である。対象画像を含む撮像画像の画像データを用いて、画像処理回路80dは、各マーカ340mおよび340nの撮像画像における位置を表す座標(マーカ座標)を算出する。
撮像画像の画像データにおいて対象画像は高輝度部分として現れるため、画像処理回路80dは、まず、この高輝度部分を対象画像の候補として検出する。次に、画像処理回路80dは、検出された高輝度部分の大きさに基づいて、その高輝度部分が対象画像であるか否かを判定する。撮像画像には、対象画像である2つのマーカ340mおよび340nの画像340m’および340n’のみならず、窓からの太陽光や部屋の蛍光灯の光によって対象画像以外の画像が含まれていることがある。高輝度部分が対象画像であるか否かの判定処理は、対象画像であるマーカ340mおよび340nの画像340m’および340n’と、それ以外の画像とを区別し、対象画像を正確に検出するために実行される。具体的には、当該判定処理においては、検出された高輝度部分が、予め定められた所定範囲内の大きさであるか否かが判定される。そして、高輝度部分が所定範囲内の大きさである場合には、当該高輝度部分は対象画像を表すと判定される。逆に、高輝度部分が所定範囲内の大きさでない場合には、当該高輝度部分は対象画像以外の画像を表すと判定される。
さらに、上記の判定処理の結果、対象画像を表すと判定された高輝度部分について、画像処理回路80dは当該高輝度部分の位置を算出する。具体的には、当該高輝度部分の重心位置を算出する。ここでは、当該重心位置の座標をマーカ座標と呼ぶ。また、重心位置は撮像素子80cの解像度よりも詳細なスケールで算出することが可能である。ここでは、撮像素子80cによって撮像された撮像画像の解像度が126×96であるとし、重心位置は1024×768のスケールで算出されるものとする。つまり、マーカ座標は、(0,0)から(1024,768)までの整数値で表現される。
なお、撮像画像における位置は、撮像画像の左上を原点とし、下向きをY軸正方向とし、右向きをX軸正方向とする座標系(XY座標系)で表現されるものとする。
また、対象画像が正しく検出される場合には、判定処理によって2つの高輝度部分が対象画像として判定されるので、2箇所のマーカ座標が算出される。画像処理回路80dは、算出された2箇所のマーカ座標を示すデータを出力する。出力されたマーカ座標のデータ(マーカ座標データ)は、上述したように、プロセッサ70によって入力データに含まれ、ゲーム装置12に送信される。
ゲーム装置12(CPU40)は、受信した入力データからマーカ座標データを検出すると、このマーカ座標データに基づいて、モニタ34の画面上におけるコントローラ22の指示位置(指示座標)と、コントローラ22からマーカ340mおよび340nまでの各距離とを算出することができる。具体的には、2つのマーカ座標の中点の位置から、コントローラ22の向いている位置すなわち指示位置が算出される。また、撮像画像における対象画像間の距離が、コントローラ22と、マーカ340mおよび340nとの距離に応じて変化するので、2つのマーカ座標間の距離を算出することによって、ゲーム装置12はコントローラ22とマーカ340mおよび340nとの間の距離を把握できる。
上述したように、コントローラ22および荷重コントローラ36を用いて仮想ゲームをプレイする場合、荷重コントローラ36で検出される荷重値に基づいてゲーム処理を実行することができる。この実施例では、仮想ゲームが開始されると、本編の開始に先立って、プレイヤが静止した状態において荷重コントローラ36によって荷重値が検出され、すなわちプレイヤの体重値が測定され、測定された体重値が基準値として設定(メインメモリ42eまたは46に記憶)される。そして、たとえば、設定された基準値と仮想ゲームの実行中に検出される荷重値とに基づいて、または仮想ゲームの実行中に検出される荷重値に基づいて算出したプレイヤの重心位置に基づいて、ゲーム処理が実行される。
図11−図13は、モニタ34に表示されるゲーム画面200の例である。この実施例の仮想ゲームでは、人間を模したプレイヤオブジェクト202がスケートボード204に乗り、ゲームフィールド内を移動する。図示は省略するが、ゲームフィールド内には、所定のコースが設けられ、スケートボード204に乗ったプレイヤオブジェクト202が、コース内に設けられた通過ポイントのうち、決められた数の通過ポイントを制限時間内に通過するとゲームクリアとなる。しかし、スケートボード204に乗ったプレイヤオブジェクトが、決められた数の通過ポイントを通過する前に、制限時間が経過するとゲームオーバとなる。
この実施例では、スケートボード204に乗ったプレイヤオブジェクト202は、プレイヤの指示に従って、図11(A)に示すように、地面を片足でキックしたり、図11(B)に示すように、通常の走行を行ったり、図12(A)および図12(B)に示すように、チクタク(または旋回)したり、図13(A)に示すように、ウィリーしたり、図13(B)に示すように、ジャンプしたりする。ただし、図12(A)には、プレイヤオブジェクト202が正面(つま先)側に体重を掛けている場合(チクタク+)を示し、図12(B)には、プレイヤオブジェクト202が背面(踵)側に体重を掛けている場合(チクタク−)を示してある。
プレイヤは、実際のスケートボードに乗るように、荷重コントローラ36に乗り、キックしたり、チクタクしたり、ウィリーしたり、ジャンプしたりするように動作する。ただし、この実施例では、荷重コントローラ36で検出される荷重値の変化(加重,抜重)および重心位置の変化に応じて、キック、チクタク(または旋回)、ウィリー、ジャンプの動作すなわちプレイヤの指示(入力)を判定するようにしてある。
なお、プレイヤがウィリーやジャンプの動作を行ったとしても、実際のスケートボードとは異なり、荷重コントローラ36が斜めになったり、床面から浮いたりすることはない。
ここで、図14(A)に示す荷重コントローラ36に対応して、図14(B)に示すような重心位置の検出範囲が設定されている。図14(A)では省略するが、図8に示したように、プレイヤは荷重コントローラ36上に乗り、仮想ゲームをプレイする。この実施例では、プレイヤは、図14(A)に示す状態で配置された荷重コントローラ36に対して、点線で示すように、右足をそのつま先を荷重コントローラ36の正面方向に向けて乗せ、左足をそのつま先を正面方向から左側に少し開く方向に向けて乗せる。ただし、荷重コントローラ36の正面方向は、電源ボタン36cが設けられる側と反対方向である。また、図8にも示したように、荷重コントローラ36の正面方向からほぼ90度左方向にモニタ34が配置される。さらに、図示は省略するが、プレイ中では、プレイヤは首を左方向に捻ってモニタ34を見ている状態となる。
なお、これ以降では、方向を説明する必要がある場合には、荷重コントローラ36に乗っているプレイヤの正面方向、背面方向、左方向および右方向を用いることにする。
たとえば、プレイヤは、プレイヤオブジェクト202にキックの動作をさせたい場合には、図14(A)に示すように両足を荷重コントローラ36に乗せた状態から、右足を荷重コントローラ36から離して、荷重コントローラ36の正面側の床面を蹴るように動作し、その後、右足を荷重コントローラ36上に戻す。つまり、プレイヤは、実際のスケートボードに乗っているように、キックの動作を行うのである。ただし、プレイヤオブジェクト202に連続してキックの動作をさせたい場合には、プレイヤは、そのキックの動作の回数に応じた回数だけ、上述した一連の動作において、荷重コントローラ36の正面側の床面を蹴る動作を繰り返す。
また、プレイヤは、プレイヤオブジェクト202にチクタクの動作をさせたい場合には、図14(A)に示すように両足を荷重コントローラ36に乗せた状態で、体重を正面(つま先)側と背面(踵)側とに交互に掛けるように、膝を使って体(特に上体)を前後方向に移動させる。ただし、プレイヤの体重移動が遅い(体重移動の周期が長い)場合には、プレイヤオブジェクト202は、右方向または左方向に旋回する(曲がる)ように移動される。
さらに、プレイヤは、プレイヤオブジェクト202にウィリーの動作をさせたい場合には、図14(A)に示すように両足を荷重コントローラ36に乗せた状態で、一方の足(この実施例では、右足)に体重を掛けるように、膝を使って体(特に上体)を右方向に傾ける。ただし、プレイヤが右足に体重を掛けて、体を右方向に傾け続けている場合には、ウィリー状態への姿勢補間を完了した後に、プレイヤオブジェクト202はブレーキの動作を行う。
さらにまた、プレイヤは、プレイヤオブジェクト202にジャンプの動作をさせたい場合には、図14(A)に示すように両足を荷重コントローラ36に乗せた状態で、両足の膝を曲げた後に、一気に(素早く)両足の膝を伸ばすように、体を上下方向に移動させる。
このようなプレイヤの動作が、荷重コントローラ36で検出される荷重値または/および荷重値から算出される重心位置に基づいて判別されるのである。
上述したように、図14(B)に示すように、荷重コントローラ36に対応して、重心位置の検出範囲が設定されている。荷重コントローラ36の長手方向が検出範囲のX軸方向であり、短手方向が検出範囲のY軸方向である。また、図14(B)に示すように、右方向がX軸のプラス方向であり、上方向がY軸のプラス方向である。さらに、検出範囲すなわち荷重コントローラ36の中心位置が原点O(0,0)である。
また、重心位置の重心座標(XG,YG)は、数1に従って算出される。ただし、図14(A)に示す状態において、左上の荷重センサ36bで検出される荷重値をR1とし、左下の荷重センサ36bで検出される荷重値をR2とし、右上の荷重センサ36bで検出される荷重値をR3とし、そして、右下の荷重センサ36bで検出される荷重値をR4とする。ただし、−1≦XG≦1,−1≦YG≦1であり、C1,C2は、XG,YGをその範囲にするための定数である。
[数1]
XG={(R3+R4)−(R1+R2)}×C1
YG={(R1+R3)−(R2+R4)}×C2
たとえば、プレイヤオブジェクト202にキックの動作をさせる指示であるか否かは、荷重コントローラ36で検出される荷重値に基づいて判定される。上述したように、プレイヤオブジェクト202にキックの動作をさせる場合には、プレイヤは右足を荷重コントローラ36から離して、床面を蹴るため、床面を蹴るときに、荷重コントローラ36にかかる荷重が体重値(基準値)よりも小さくなる(抜重)。プレイヤが床面を蹴った後に、その右足を荷重コントローラ36上に戻すと、荷重コントローラ36にかかる荷重が体重値に戻る(加重)。
この実施例では、後述するように、加重の有無のみに基づいてジャンプの動作をさせる指示の有無を判定するため、キックの動作をさせる指示であるかどうかを判定する場合には、抜重の有無のみを判断するようにして、入力の誤判定を無くすようにしてある。
ただし、キックの動作をさせる指示であるか否か(抜重が有るか否か)を判定する場合には、プレイヤオブジェクト202が移動している場合と移動していない場合とで、判定のための閾値(この実施例では、基準値に対する荷重値の倍率)が異なる。この実施例では、プレイヤオブジェクト202が移動している場合よりも、移動していない(停止している)場合の方が、キックの動作をさせる指示であることが判定され易いように、閾値が設定されている。これは、プレイヤオブジェクト202が停止している状態において、抜重があった場合には、プレイヤオブジェクト202の移動を開始するために、キックの指示が入力されたと判定するのが自然だからである。
また、プレイヤオブジェクト202にチクタクの動作をさせる指示であるか否かは、荷重コントローラ36で検出される重心位置のY座標(YG)に基づいて判断される。これは、上述したように、プレイヤオブジェクト202にチクタクの動作をさせる場合には、プレイヤは、荷重コントローラ36上で前後方向に上体を移動させるためである。
さらに、プレイヤオブジェクト202にウィリーの動作をさせる指示であるか否かは、荷重コントローラ36で検出される4つの荷重値から数1に従って算出された重心位置のX座標およびY座標のそれぞれが所定の範囲A内であるかどうかで判断される。これは、チクタク(旋回)の動作をさせる指示と区別して、正確に判断するためである。
さらにまた、プレイヤオブジェクト202にジャンプの動作をさせる指示であるか否かは、荷重コントローラ36で検出される荷重値に基づいて判定される。上述したように、プレイヤオブジェクト202にジャンプの動作をさせる場合には、プレイヤは荷重コントローラ36上で膝を曲げた状態から素早く膝を伸ばすように体を上下方向に移動させるため、素早く膝を伸ばすときに、荷重コントローラ36にかかる荷重が体重値(基準値)よりも大きくなる(加重)。したがって、プレイヤオブジェクト202にジャンプの動作をさせるための指示であるか否かは、荷重コントローラ36で検出される荷重値が異なる一定の閾値(この実施例では、体重値に対する荷重値の倍率)を超えているか否かで判断される。
なお、プレイヤがプレイヤオブジェクト202にジャンプの動作をさせる場合には、まず、プレイヤは膝を曲げるため、荷重コントローラ36にかかる荷重が体重値よりも小さくなることがある。つまり、加重が検出される前に、抜重が検出されることがある。しかし、プレイヤが膝を曲げる速度が遅い場合には、そのような抜重は検出されないため、プレイヤが素早く膝を伸ばすときの加重を検出して、プレイヤオブジェクト202にジャンプの動作をさせるための指示があるか否かを正確に判断するようにしてある。また、プレイヤが素早く膝を伸ばした後に、少し膝を曲げた状態(通常の姿勢)に戻る際に、抜重が検出されるが、これはジャンプの指示の判定には使用しないようにしてある。たとえば、加重が検出された後の一定時間は、検出された抜重をジャンプの指示の判定に使用しないようにする。これは、上述したように、キックの指示かどうかを抜重のみによって判別しているためである。
たとえば、キックしたり、チクタクしたりすると、プレイヤオブジェクト202は進行方向に加速される。この実施例では、キックした場合には、プレイヤオブジェクト202は、一定の加速度(この実施例では、1.6)で進行方向に加速される。また、チクタクした場合には、プレイヤオブジェクト202は、異なる一定の加速度(この実施例では、0.5)で進行方向に加速される。
ただし、この実施例では、現実世界における10cmが3次元仮想空間における距離1.0に相当する。
また、ウィリーの状態が一定時間以上続くと、プレイヤオブジェクト202は、減速する。この実施例では、1ゲームフレーム毎に一定値(0.015)で減速される。さらに、ジャンプすると、プレイヤオブジェクト202は、進行方向に、移動速度に応じた距離だけ空中を移動し、たとえば障害物(図示せず)を飛び越えたり、段上に乗ったり、段上から下りたりする。
また、図11−図13に示したように、プレイヤオブジェクト202は、プレイヤからの指示に応じたモーションでゲーム画面200に表示される。つまり、プレイヤの指示に応じたアニメーションが再生される。たとえば、キックのアニメーションは、前半(キックA)と後半(キックB)との2つに分かれている。キックAのモーションは、プレイヤオブジェクト202がその両足をスケートボード204に乗せた状態から蹴り足(この実施例では、右足)で地面を蹴る動作である。また、キックBのモーションは、蹴り上げた足をスケートボード204上に下ろす動作である。たとえば、キックAが0〜30フレーム(31コマに相当する)のアニメーションであり、キックBが0〜20フレーム(21コマに相当する)のアニメーションである。
このように、キックAとキックBとにアニメーションを分けているのは、プレイヤが連続してキックの指示を入力する場合に、その入力にプレイヤオブジェクト202のモーションを対応させるためである。たとえば、キックBのモーションに対応するアニメーションの再生中に、再度キックの指示が入力されると、そのときの再生フレームから10フレームかけてプレイヤオブジェクト202の姿勢を補間し、キックAのアニメーションフレームの10フレーム目に戻される。そして、キックAのアニメーションが最終フレーム(30フレーム)まで再生され、続けて、キックBのアニメーションの最初から再生が開始される。キックBのアニメーションが最終フレームまで再生されると、キックの動作は終了される。補間処理等が実行され、キックBのアニメーションを再生中に再度キックの指示がある場合には、さらに同様の補間処理等が実行され、モニタ34に表示されたプレイヤオブジェクト202が連続してキックの動作を行っているように見える。
また、チクタクのアニメーションは、0〜120フレーム(121コマに相当する)である。たとえば、0フレーム目は、スケートボード204上のプレイヤオブジェクト202が背面側に体重を掛けた状態である。60フレーム目は、プレイヤオブジェクト202がスケートボード204上で少し膝を曲げて真っ直ぐ立っている状態である。120フレーム目は、スケートボード204上のプレイヤオブジェクト202が正面側に体重を掛けた状態である。このチクタクのアニメーションは、プレイヤの重心位置のY座標(YG)に応じて0〜120フレームの間で順再生または逆再生される。たとえば、プレイヤの重心位置のY座標が0→+1→−1→0と変化した場合には、アニメーションは、60フレーム→120フレーム→0フレーム→60フレームと再生される。ただし、プレイヤの体重移動に従ってY座標が線形的に変化し、これに応じて、アニメーションフレームも順次変化される。たとえば、Y座標が0→+1に変化する場合には、Y座標が0.1増えるに従って、アニメーションフレームは、60フレーム目から6フレームずつ進められる。一方、Y座標が0→−1に変化する場合には、Y座標が0.1減少するに従って、アニメーションフレームは、60フレーム目から6フレームずつ戻される。
さらに、ウィリーの状態のアニメーションは、0〜120フレーム(121コマに相当する)である。0フレーム目は、スケートボード204の前輪(この実施例では、プレイヤオブジェクト202の左足側の車輪)が浮いており、プレイヤオブジェクト202が背面側に傾いている状態である。また、60フレーム目は、スケートボード204の前輪が浮いており、プレイヤオブジェクト202はスケートボード204の中央に位置している状態である。さらに、120フレーム目は、スケートボード204の前輪が浮いており、プレイヤオブジェクト202が正面側に傾いている状態である。たとえば、プレイヤの重心位置のY座標(YG)が−1→0→+1と変化すると、ウィリー状態のアニメーションは、0フレーム→60フレーム→120フレームと変化する。詳細な説明は省略するが、チクタクの場合と同様に、プレイヤの体重移動に従ってY座標が線形的に変化し、これに応じて、アニメーションフレームも順次変化される。
なお、詳細な説明は省略するが、スケートボード204の全車輪が地面に着いた状態からウィリーの状態へのモーションは、10ゲームフレームかけてプレイヤオブジェクト202およびスケートボード204の姿勢を補間して表現するようにしてある。同様に、ウィリーの状態からスケートボード204の全車輪が地面に着いた状態へのモーションは、10ゲームフレームかけてプレイヤオブジェクト202およびスケートボード204の姿勢を補間して表現するようにしてある。
また、ジャンプのアニメーションは、ジャンプA(ジャンプ前)、ジャンプB(ジャンプ中)、ジャンプC(ジャンプ後)の3つに分かれている。ジャンプAのモーションでは、スケートボード204の全車輪が地面に着いた状態から、プレイヤオブジェクト202が右足(後輪)側に傾いた姿勢(以下、「後方傾き姿勢」という)で飛び上がる。ジャンプBのモーションでは、プレイヤオブジェクト202が後方傾き姿勢でスケートボード204とともに上昇した後、最高点で姿勢を水平にし、落下しつつ左足(前輪)側に傾いた姿勢(以下、「前方傾き姿勢」という)になる。ジャンプCのモーションでは、プイレヤオブジェクト202は、落下中の前方傾き姿勢から、膝を曲げた状態で着地する。
なお、ジャンプ終了後、すなわちジャンプCのモーションの終了後では、プレイヤオブジェクト202が膝を曲げた状態から通常の走行中の状態(図11(B)参照)に戻るモーションは、10ゲームフレームかけて補間される。
ジャンプA、B、Cのアニメーションは、それぞれ、0〜11フレーム(12コマに相当する)である。後述するように、ジャンプの飛距離は可変であるため、ジャンプAのアニメーションが再生され、飛距離に応じたアニメーションフレームの間隔でジャンプBのアニメーションが再生され、そして、ジャンプCのアニメーションが再生される。
また、3次元仮想空間におけるプレイヤオブジェクト202の位置は、数2および数3に従う積分シミュレーションによって算出される。ただし、数2は並進によるプレイヤオブジェクト202の水平方向の位置を算出するための数式であり、数3はプレイヤオブジェクトがジャンプした場合のその高さを算出するための数式である。
また、数2において、v0は現在のゲームフレーム(現フレーム)におけるプレイヤオブジェクト202の水平方向の速度であり、v1は次のゲームフレーム(次フレーム)におけるプレイヤオブジェクト202の水平方向の速度であり、aはプレイヤオブジェクト202のキックやチクタクによる水平方向の加速度であり、そして、k1は摩擦抵抗や空気抵抗などの抵抗である。なお、tは、時間(単位:ゲームフレーム)である。ただし、時間tを算出する場合以外は、1ゲームフレーム毎の速度や距離を算出するため、通常、時間tの値は「1」である。また、x0は現フレームにおけるプレイヤオブジェクト202の位置であり、x1は次フレームにおけるプレイヤオブジェクト202の位置である。
なお、現フレームの速度v0は、プレイヤオブジェクト202がジャンプするときには、一定の係数(この実施例では、0.8)によって補正される。これは、後述するように、ジャンプ時に、プレイヤオブジェクト202に対して、上方向に一定の速度を与えるためである。
また、数3においては、vh0は現フレームにおけるプレイヤオブジェクト202の高さ方向の速度であり、vh1は次フレームにおけるプレイヤオブジェクト202の高さ方向の速度であり、gは重力加速度であり、そして、k2は空気抵抗である。ただし、この実施例では、重力加速度は、(0,−0.07,0)に設定されている。また、hはプレイヤオブジェクト202の高さである。ただし、プレイヤオブジェクト202がバンクやジャンプ台などの段上を滑っている場合には、その地形の高さ情報で、プレイヤオブジェクト202の高さは算出される。なお、これらすべての変数ないし定数は、3次元のベクトルで表わされる。
[数2]
v1=v0+at−k1
x1=x0+v1
[数3]
vh1=vh0+gt−k2
h=vh0t−gt2/2
また、プレイヤオブジェクト202は、数4に従って、3次元仮想空間に配置される位置および向きが決定される。ただし、数4に示す行列式Pの各要素は次の意味を持つ。要素(Xx,Xy,Xz)はプレイヤオブジェクト202のローカル座標のX軸を当てはめる方向であり、要素(Yx,Yy,Yz)はプレイヤオブジェクト202のローカル座標のY軸を当てはめる方向であり、要素(Zx,Zy,Zz)はプレイヤオブジェクト202のローカル座標のZ軸を当てはめる方向であり、要素(Px,Py,Pz)はプレイヤオブジェクト202のローカル座標の中心(重心)を置くワールド座標(3次元座標)である。この要素(Px,Py,Pz)が上述の数2に示した位置x1の3次元座標(3次元ベクトル)に相当する。ただし、プレイヤオブジェクト202がジャンプした場合には、上述の数3に従って求められたhがPyの値となる。
詳細な説明は省略するが、プレイヤオブジェクト202のローカル座標のX軸の正方向はプレイヤオブジェクト202の正面(腹)の方向に対して90度左方向であり、その正面方向がローカル座標のZ軸の正方向であり、X軸とZ軸とに直交し、プレイヤオブジェクト202の真上方向がローカル座標のY軸の正方向である。
ただし、3次元仮想空間におけるプレイヤオブジェクト202の向きは、プレイヤの重心位置の重心座標(XG,YG)に応じて決定される。具体的には、まず、重心座標(XG,YG)に基づいて、3次元仮想空間において、プレイヤオブジェクト202のローカル座標のZ軸を当てはめる方向(Zベクトル(Xz,Yz,Zz))が決定される。次に、このZベクトルに直交し、プレイヤオブジェクト202の左手方向に延びるローカル座標のX軸を当てはめる方向(Xベクトル(Xx,Yx,Zx))が決定される。さらに、ZベクトルとXベクトルとの外積を求めて、3次元仮想空間において、プレイヤオブジェクト202のローカル座標のY軸を当てはめる方向(Yベクトル(Xy,Yy,Zy))が決定される。ただし、Xベクトル、YベクトルおよびZベクトルは、大きさ「1」の単位ベクトルである。
図15は、図2に示したメインメモリ(42e,46)のメモリマップ400を示す図解図である。図15に示すように、メインメモリ(42e,46)は、プログラム記憶領域402およびデータ記憶領域404を含む。プログラム記憶領域402には、情報処理プログラムとしてのゲームプログラムが記憶され、ゲームプログラムは、メイン処理プログラム402a、画像生成プログラム402b、画像表示プログラム402c、荷重取得プログラム402d、重心算出プログラム402e、キック判定プログラム402f、チクタク判定プログラム402g、ウィリー判定プログラム402h、ジャンプ判定プログラム402iおよびプレイヤオブジェクト配置プログラム402jなどによって構成される。
メイン処理プログラム402aは、この実施例の仮想ゲームのメインルーチンを処理するためのプログラムである。画像生成プログラム402bは、後述する画像データ404aやアニメーションデータ404b−404eなどを用いてゲーム画像データを生成するためのプログラムである。画像表示プログラム404cは、画像生成プログラム402bに従って生成されたゲーム画像データをゲーム画面(200など)として、モニタ34に表示するためのプログラムである。
荷重取得プログラム402dは、荷重コントローラ36の4つの荷重センサ36bで検出された荷重値に対応する荷重値データを取得するためのプログラムである。たとえば、仮想ゲームの本編の開始に先立って、荷重取得プログラム402dに従って取得された4つの荷重値の合計値のデータが基準値データ404f(図16参照)として記憶される。また、ゲーム中では、1ゲームフレーム毎に荷重取得プログラム402dに従って取得された4つの荷重値の合計値のデータが現荷重値データ404g(図16参照)としてデータ記憶領域404に記憶される。
重心算出プログラム402eは、荷重取得プログラム402dに従って取得された4つの荷重値を用いて、数1に従って、プレイヤの重心位置の重心座標(XG,YG)を算出するためのプログラムである。
キック判定プログラム402fは、上述したように、荷重取得プログラム402dに従って取得された基準値と現荷重値とに基づいて、プレイヤがプレイヤオブジェクト202にキックの動作をさせる指示が有るか否かを判定するためのプログラムである。
チクタク判定プログラム402gは、上述したように、重心算出プログラム402eに従って算出されたプレイヤの重心位置のY座標(YG)に基づいて、プレイヤオブジェクト202にチクタクの動作をさせる指示が有るか否かを判定するためのプログラムである。
ウィリー判定プログラム402hは、上述したように、重心算出プログラム402eに従って算出されたプレイヤの重心位置の重心座標(XG,YG)に基づいて、プレイヤオブジェクト202にウィリーの動作をさせる指示が有るか否かおよびウィリー状態を維持するか否かを判定するためのプログラムである。
ジャンプ判定プログラム402iは、上述したように、荷重取得プログラム402dに従って取得された基準値と現荷重値とに基づいて、プレイヤがプレイヤオブジェクト202にジャンプの動作をさせる指示が有るか否かを判定するためのプログラムである。
プレイヤオブジェクト配置プログラム402jは、3次元仮想空間にプレイヤオブジェクト202を配置するためのプログラムである。上述したように、プレイヤオブジェクト202は、プレイヤの指示に従って、3次元仮想空間内を移動される。つまり、プレイヤオブジェクト202の位置および向きが制御され、数4に従って、プレイヤオブジェクト202は3次元仮想空間に配置される。
図示は省略するが、プログラム記憶領域402には、音出力プログラムやバックアッププログラムなども記憶される。音出力プログラムは、プレイヤオブジェクトの音声ないし擬声音、効果音、ゲーム音楽(BGM)のような仮想ゲームに必要な音を生成および出力するためのプログラムである。バックアッププログラムは、仮想ゲームのゲームデータ(途中データ,結果データ)をフラッシュメモリ44やメモリカードに記憶(セーブ)するためのプログラムである。
図16は、図15に示したデータ記憶領域404の具体的な内容を示す。図16に示すように、データ記憶領域404は、画像データ404a、キックアニメーションデータ404b、チクタクアニメーションデータ404c、ウィリーアニメーションデータ404d、ジャンプアニメーションデータ404e、基準値データ404f、現荷重値データ404gおよび重心位置データ404hが記憶される。また、データ記憶領域404には、ポイント通過フラグ404i、ゲームクリアフラグ404j、ゲームオーバフラグ404k、キック入力不可フラグ404m、チクタク+フラグ404nおよびチクタク−フラグ404pが設けられる。さらに、データ記憶領域404には、第1フレームカウンタ404qおよび第2フレームカウンタ404rが設けられる。
画像データ404aは、ゲーム画像データを生成するためのポリゴンデータやテクスチャデータなどのデータである。キックアニメーションデータ404bは、プレイヤオブジェクト202にキックの動作をさせるためのアニメーションのデータであり、前半のキックAについての0〜30フレームと、後半のキックBについての0〜20フレームとで構成される。
チクタクアニメーションデータ404cは、プレイヤオブジェクト202にチクタクの動作をさせるためのアニメーションのデータであり、0〜120フレームで構成される。ウィリーアニメーションデータ404dは、プレイヤオブジェクト202にウィリー状態の動作をさせるためのアニメーションのデータであり、0〜120フレームで構成される。
ジャンプアニメーションデータ404eは、プレイヤオブジェクト202にジャンプの動作をさせるためのアニメーションのデータであり、ジャンプAについての0〜11フレーム、ジャンプBについての0〜11フレームおよびジャンプCについての0〜11フレームで構成される。
基準値データ404fは、仮想ゲームの本編開始前に、荷重取得プログラム402dに従って取得した4つの荷重値の合計値(体重値)についてのデータである。現荷重値データ404gは、ゲーム中に、1ゲームフレーム毎に、荷重取得プログラム402dに従って取得した4つの荷重値の合計値についてのデータである。つまり、現荷重値データ404gは、1ゲームフレーム毎に更新される。重心位置データ404hは、重心算出プログラム402eに従って算出されたプレイヤの重心位置の重心座標(XG,YG)に対応する座標データである。
ポイント通過フラグ404iは、3次元仮想空間内に設けられた所定の通過ポイントを通過したかどうかを判定するためのフラグであり、1ビットのレジスタで更新される。プレイヤオブジェクト202が未だ通過していない通過ポイントを通過した際に、ポイント通過フラグ404iはオンされ、レジスタにデータ値「1」が設定される。また、プレイヤオブジェクト202が未だ通過していない通過ポイントを通過したことがゲーム画面などによって表現されると、ポイント通過フラグ404iはオフされ、レジスタにデータ値「0」が設定される。ただし、プレイヤオブジェクト202が何ら通過ポイントを通過していない場合や既に通過した通過ポイントを再度通過した場合には、ポイント通過フラグ404iはオフのままである。
ゲームクリアフラグ404jは、ゲームクリアかどうかを判定するためのフラグであり、1ビットのレジスタで構成される。仮想ゲームがクリアされると、ゲームクリアフラグ404jはオンされ、レジスタにデータ値「1」が設定される。一方、仮想ゲームがクリアされていなければ、ゲームクリアフラグ404jはオフされ、レジスタにデータ値「0」が設定される。
ゲームオーバフラグ404kは、ゲームオーバかどうかを判定するためのフラグであり、1ビットのレジスタで構成される。仮想ゲームがゲームオーバになると、ゲームオーバフラグ404kはオンされ、レジスタにデータ値「1」が設定される。一方、仮想ゲームがゲームオーバにならなければ、ゲームオーバフラグ404kはオフされ、レジスタにデータ値「0」が設定される。
キック入力不可フラグ404mは、キック入力を受け付けるか否かを判定するためのフラグであり、1ビットのレジスタで構成される。キック入力を受け付ける場合には、キック入力不可フラグ404mはオンされ、レジスタにデータ値「1」が設定される。一方、キック入力を受け付けた後に、現荷重値が所定の条件を満たすと、キック入力不可フラグ404はオフされ、レジスタにデータ値「0」が設定される。つまり、キック入力不可フラグ404mを設けることにより、連続してキックの指示が入力される場合に、プレイヤが正しく動作(入力操作)を行っているか否かを判定しているのである。
チクタク+フラグ404nは、チクタクの動作のうち、プレイヤが正面側に体重を掛けているか否かを判定するためのフラグであり、1ビットのレジスタで構成される。プレイヤが正面側に体重を掛けている場合には、チクタク+フラグ404nはオンされ、レジスタにデータ値「1」が設定される。一方、プレイヤが正面側に体重を掛けていない場合には、チクタク+フラグ404nはオフされ、レジスタにデータ値「0」が設定される。また、後述するチクタク−フラグ404pがオンされた場合にも、チクタク+フラグ404nはオフされる。
チクタク−フラグ404pは、チクタクの動作のうち、プレイヤが背面側に体重を掛けているか否かを判定するためのフラグであり、1ビットのレジスタで構成される。プレイヤが背面側に体重を掛けている場合には、チクタク−フラグ404pはオンされ、レジスタにデータ値「1」が設定される。一方、プレイヤが背面側に体重を掛けていない場合には、チクタク−フラグ404pはオフされ、レジスタにデータ値「0」が設定される。また、上述したチクタク+フラグ404nがオンされた場合にも、チクタク−フラグ404pはオフされる。
第1フレームカウンタ404qは、ウィリーの状態へアニメーションの補間が終了してからの一定時間(この実施例では、5ゲームフレーム)やジャンプのアニメーションの再生が終了してからの異なる一定時間(この実施例では、10ゲームフレーム)をカウントするためのカウンタである。第2フレームカウンタ404rは、チクタク+フラグ404nまたはチクタク−フラグ404pがオンされている一定時間(この実施例では、60ゲームフレーム)をカウントするためのカウンタである。
図示は省略するが、データ記憶領域404には、音データなども記憶され、また、仮想ゲームの実行に必要な他のフラグやカウンタ(タイマ)も設けられる。
図17および図18は、図2に示したCPU40のゲーム全体処理を示すフロー図である。図17に示すように、CPU40は、ゲーム全体処理を開始すると、ステップS1で、初期設定を実行する。ここでは、画像データ404aおよびアニメーションデータ404b−404eをデータ記憶領域404にロードしたり、基準値データ404f、現荷重値データ404gおよび重心位置データ404hをクリアしたり、フラグ404i−404pをオフしたり、カウンタ404qおよび404rをリセットしたりする。
次のステップS3では、プレイヤの体重値を検出し、基準値として記憶する。つまり、CPU40は、仮想ゲームの本編の開始に先立って、4つの荷重センサ36bで検出された荷重値の合計値を体重値として取得し、その数値データを基準値データ404fとしてデータ記憶領域404に記憶する。そして、ステップS5で、仮想ゲームの本編を開始する。
続いて、ステップS7では、現在(現フレーム)の荷重値を取得し、取得した荷重値を記憶する。つまり、CPU40は、4つの荷重センサ36bで検出された荷重値の合計値を現在の荷重値として取得し、その数値データを現荷重値データ404gとしてデータ記憶領域404に記憶する。
なお、ステップS7−S27の処理のスキャンタイムは、1ゲームフレーム(1/60(秒))であるため、ゲーム中では、1ゲームフレーム毎に、現在の荷重値が検出される。つまり、現荷重値データ404gは、1ゲームフレーム毎に更新される。このことは、次の重心位置データ404hも同様である。
次のステップS9では、現在の重心位置を算出し、算出した重心位置を記憶する。つまり、CPU40は、4つの荷重センサ36bから取得した荷重値を用いて、数1に従って、現フレームの重心位置の座標(XG,YG)を算出し、算出した重心位置の座標(XG,YG)についての座標データを重心位置データ404hとしてデータ記憶領域404に記憶する。
続いて、図18に示すステップS11では、所定の通過ポイントを通過したかどうかを判断する。ここでは、CPU40は、未だ通過していない通過ポイントを通過したかどうかを判断するのである。詳細な説明は省略するが、通過ポイントは、予め設定されていたり、仮想ゲームの進行に応じて可変的に設定されたりする。ただし、CPU40は、プレイヤオブジェクト202が未だ通過していない通過ポイントの設定された位置(3次元位置)ないし領域を通過したかどうかを判断しているのである。
ステップS11で“NO”であれば、つまりプレイヤオブジェクト202が所定の通過ポイントを通過していなければ、そのままステップS19に進む。一方、ステップS11で“YES”であれば、つまりプレイヤオブジェクト202が所定の通過ポイントを通過したと判断すると、ステップS13で、ポイント通過フラグ404iをオンし、ステップS15で、ゲームクリアであるかどうかを判断する。つまり、CPU40は、プレイヤオブジェクト202が決められた数の通過ポイントを制限時間内に通過したかどうかを判断するのである。図示は省略するが、仮想ゲームの本編が開始されてからの時間は、ゲーム装置10に設けられたカウンタ(タイマ)によってカウントされている。
ステップS15で“NO”であれば、つまりゲームクリアでなければ、そのままステップS19に進む。一方、ステップS15で“YES”であれば、つまりゲームクリアであれば、ステップS17で、ゲームクリアフラグ404jをオンして、ステップS23に進む。
また、ステップS19では、ゲームオーバであるかどうかを判断する。ここでは、CPU40は、プレイヤオブジェクト202が決められた数の通過ポイントを通過する前に、制限時間を超えてしまったかどうかを判断する。ステップS19で“NO”であれば、つまりゲームオーバでなければ、そのままステップS23に進む。一方、ステップS19で“YES”であれば、つまりゲームオーバであれば、ステップS21で、ゲームオーバフラグ404kをオンして、ステップS23に進む。
ステップS23では、ゲーム画像を生成する。ここでは、CPU40は、数2および数3に従って移動後のプレイヤオブジェクト202の位置を算出し、数4で示す行列式Pに従ってプレイヤオブジェクト202を3次元仮想空間に配置するとともに、後述する入力判定処理(図19−図23)に従って再生されたアニメーションをアニメーションデータ404b,404d,404eから読み出したりして描画(更新)する。アニメーションの再生方法は上述したとおりである。ただし、CPU40は、チクタクの動作の場合すなわちチクタク+フラグ404nまたはチクタク−フラグ404pがオンの場合には、入力判定処理ではアニメーションの再生指示は行われず、このステップS23において、プレイヤの重心位置のY座標(YG)の値に応じたアニメーションフレームをチクタクアニメーションデータ404cから読み出して描画(更新)する。また、通常の走行や単なる旋回の場合には、アニメーションデータ(404b−404eなど)を読み出さずに、プレイヤオブジェクト202はポリゴンデータやテクスチャデータを用いて描画される。
また、通過ポイントなどを含む背景画像を描画(更新)する。さらに、ポイント通過フラグ404i、ゲームクリアフラグ404jまたはゲームオーバフラグ404kがオンであれば、通過ポイントの通過、ゲームクリアまたはゲームオーバを表現する画像を生成する。たとえば、通過ポイントの通過、ゲームクリアまたはゲームオーバを示す旨のテキストがゲーム画像に上書きされる。このとき、図示は省略するが、通過ポイントの通過、ゲームクリアまたはゲームオーバに応じた効果音ないし音楽が出力される。
次のステップS25では、ゲーム画像を表示する。つまり、CPU40は、ステップS23で生成(更新)したゲーム画像をゲーム画面(200など)としてモニタ34に表示する。そして、ステップS27では、ゲーム終了かどうかを判断する。ここでは、CPU40は、プレイヤによって、ゲーム終了が指示されたかどうかを判断する。ステップS27で“NO”であれば、つまりゲーム終了でなければ、図17に示したステップS7に戻る。ただし、ゲームオーバになった場合には、仮想ゲームが最初から開始される。一方、ステップS27で“YES”であれば、つまりゲーム終了であれば、そのままゲーム全体処理を終了する。
なお、図示は省略するが、ポイント通過フラグ404iは、ステップS23よりも後であり、ステップS27で“NO”となり、ステップS7に戻るまでの間に、オフされる。
図19−図23は、図2に示すCPU40の入力判定処理を示すフロー図である。詳細な説明は省略するが、この入力判定処理は、仮想ゲームの本編が開始されると(S5)、別のタスクによって上述したゲーム全体処理と並列的に実行される。
図19に示すように、CPU40は、入力判定処理を開始すると、ステップS51で、重心位置が所定の範囲A内であるかどうかを判断する。具体的には、CPU40は、重心位置のX座標(XG)が0.9以上であり、かつY座標(YG)が±0.6以内であるかどうかを判断する。ステップS51で“NO”であれば、つまり重心位置が所定の範囲A内でなければ、ウィリーの指示でないと判断して、ジャンプの指示であるかどうかを判定するべく、そのまま図21に示すステップS77に進む。
一方、ステップS51で“YES”であれば、つまり重心位置が所定の範囲A内であれば、ウィリーの指示であると判断して、ステップS53で、ウィリーのアニメーションへの姿勢補間を開始する。ここでは、CPU40は、まず、10ゲームフレームかけて補間処理を実行し、スケートボード204の全車輪が接地されている状態から前輪が最高位置(ウィリーの状態)になるまでプレイヤオブジェクト202およびスケートボード204が傾けられる。プレイヤオブジェクト202がウィリー状態になると、ウィリーアニメーションデータ404dに従ってアニメーションがプレイヤの重心位置のY座標に応じて0−120フレームの間で順再生または逆再生される。
次のステップS55では、重心位置が所定の範囲Aから外れたかどうかを判断する。つまり、CPU40は、重心位置のX座標(XG)が0.9未満になったり、Y座標(YG)が±0.6を超えたりしたかどうかを判断する。ステップS55で“YES”であれば、つまり重心位置が所定の範囲Aから外れた場合には、ステップS57で、ウィリー状態から通常の走行状態へ姿勢補間を行う。
そして、ステップS59では、重心位置が所定の範囲A内であるかどうかを判断する。つまり、再びウィリーの指示が入力されたかどうかを判断する。ステップS59で“NO”であれば、つまり重心位置が所定の範囲A内でなければ、そのままステップS77に進む。一方、ステップS59で“YES”であれば、つまり重心位置が所定の範囲A内であれば、ステップS61で、ウィリー状態への姿勢補間を再開して、ステップS55に戻る。つまり、ステップS61では、CPU40は、ウィリー状態から通常の走行状態への姿勢補間を、通常の走行状態からウィリー状態への姿勢補間に切り替える。
また、ステップS55で“NO”であれば、つまり重心位置が所定の範囲A内であれば、ステップS63で、ウィリー状態への姿勢補間を完了したかどうかを判断する。ステップS63で“NO”であれば、つまりウィリー状態への姿勢補間を完了していなければ、そのままステップS55に戻る。
一方、ステップS63で“YES”であれば、つまりウィリー状態への姿勢補間を完了すれば、図20に示すステップS65で、第1フレームカウンタ404qをリセットおよびスタートする。そして、次のステップS67で、5ゲームフレーム経過したかどうかを判断する。つまり、第1フレームカウンタ404qのカウント値が5を超えたかどうかを判断する。ステップS67で“NO”であれば、つまり5ゲームフレーム経過していなければ、そのまま同じステップS67に戻る。一方、ステップS67で“YES”であれば、つまり5ゲームフレーム経過すれば、ステップS69で、重心位置が所定の範囲Aから外れたかどうかを判断する。
ステップS69で“YES”であれば、つまり重心位置が所定の範囲Aから外れた場合には、ステップS75で、ウィリー状態から通常の走行状態へ姿勢補間をして、図19に示したステップS59に戻る。一方、ステップS69で“NO”であれば、つまり重心位置が所定の範囲Aから外れていない場合には、ステップS71で、プレイヤオブジェクト202を減速させる。この実施例では、プレイヤオブジェクト202は一定値(0.015)で減速される。つまり、ブレーキの動作が実行される。
次のステップS73では、重心位置のX座標(XG)が0.7以下であるかどうかを判断する。ここでは、CPU40は、重心位置のX座標(XG)のみに基づいて、ウィリー状態(ブレーキの状態)が解除されたかどうかを判断しているのである。ステップS73で“NO”であれば、つまり重心位置のX座標(XG)が0.7を超えている場合には、そのままステップS71に戻って、ブレーキの動作を継続する。一方、ステップS73で“YES”であれば、つまり重心位置のX座標(XG)が0.7以下である場合には、ステップS75に進む。
なお、この実施例では、ステップS63で“NO”と判断された場合には、ステップS55に戻るようにしたが、ステップS77に進むようにしてもよい。つまり、かかる場合には、ステップS63で“NO”と判断されると、ウィリーの指示であるかどうかの判定を終了して、ジャンプの指示であるかどうかの判定を開始する。
上述したように、ジャンプの指示であるかどうかの判定を開始すると、ステップS77で、荷重値が基準値の1.4倍以上であるかどうかを判断する。つまり、CPU40は、一定以上の加重があるかどうかを判断する。このように、倍率によって、加重があるかどうかを判断するのは、プレイヤの体重値に拘わらず同じ処理を実行するためである。以下、倍率によって判定する場合について同様である。
ステップS77で“NO”であれば、つまり荷重値が基準値の1.4倍未満であれば、キックの指示であるかどうかの判定を開始するべく、図22に示すステップS89に進む。一方、ステップS77で“YES”であれば、つまり荷重値が基準値の1.4倍以上であれば、ジャンプの指示が入力されたと判断して、ステップS79で、ジャンプのアニメーションを再生開始する。つまり、CPU40は、ジャンプアニメーションデータ404eのアニメーションフレームを最初から再生する。
次のステップS81では、プレイヤオブジェクト202を垂直方向に加速する。この実施例では、プレイヤオブジェクト202は、一定値(1.55)の初速度で上方に移動される。また、上述したように、水平方向の初速度は、ジャンプ直前のプレイヤオブジェクト202の速度を0.8倍した値に設定される。続いて、ステップS83では、プレイヤオブジェクト202が着地したかどうかを判断する。この実施例では、プレイヤオブジェクト202は、一定値の初速度で上方に移動されるため、ジャンプ開始から着地までの時間は一定時間である。したがって、一定時間が経過したかどうかを判断すればよい。
ステップS83で“NO”であれば、つまりプレイヤオブジェクト202が着地していなければ、同じステップS83に戻る。一方、ステップS83で“YES”であれば、つまりプレイヤオブジェクト202が着地すれば、ステップS85で、第1フレームカウンタ404qをリセットおよびスタートする。そして、ステップS87で、10ゲームフレーム経過したかどうかを判断する。つまり、プレイヤオブジェクト202が着地してから膝を伸ばして、通常の走行状態に戻ったかどうかを判断するのである。
ステップS87で“NO”であれば、つまり10ゲームフレーム経過していなければ、そのまま同じステップS87に戻る。一方、ステップS87で“YES”であれば、つまり10ゲームフレーム経過すれば、プレイヤオブジェクト202が通常の走行状態に戻ったと判断して、図19に示したステップS51に戻る。
上述したように、キックの指示であるかどうかの判定を開始すると、図22に示すステップS89で、キック入力不可フラグ404mがオンであるかどうかを判断する。ステップS89で“YES”であれば、つまりキック入力不可フラグ404mがオンでれば、キックの指示を受け付けないと判断して、ステップS91で、荷重値が基準値の0.6倍以上かどうかを判断する。ステップS91で“NO”であれば、つまり荷重値が基準値の0.6倍未満であれば、チクタクの指示であるかどうかの判定を開始するべく、図23に示すステップS107に進む。一方、ステップS91で“YES”であれば、つまり荷重値が基準値の0.6倍以上であれば、ステップS93で、キック入力不可フラグ404mをオフして、ステップS107に進む。
また、ステップS89で“NO”であれば、つまりキック入力不可フラグ404mがオフであれば、キックの指示を受け付けると判断して、ステップS95で、プレイヤオブジェクト202の速度(現フレームの速度v0)が0.1未満かどうかを判断する。つまり、CPU40は、プレイヤオブジェクト202が停止ないしほぼ停止しているかどうかを判断しているのである。ステップS95で“YES”であれば、つまりプレイヤオブジェクト202の速度が0.1未満であれば、プレイヤオブジェクト202が停止ないしほぼ停止していると判断して、ステップS97で、荷重値が基準値の0.6倍未満かどうかを判断する。つまり、CPU40は、一定以上の抜重があるかどうかを判断するのである。
ステップS97で“NO”であれば、つまり荷重値が基準値の0.6倍以上であれば、キックの指示ではないと判断して、ステップS107に進む。一方、ステップS97で“YES”であれば、つまり荷重値が基準値の0.6倍未満であれば、キックの指示であると判断して、ステップS101に進む。
また、ステップS95で“NO”であれば、つまりプレイヤオブジェクト202の速度が0.1以上であれば、プレイヤオブジェクト202が移動していると判断して、ステップS99で、荷重値が基準値の0.4倍未満かどうかを判断する。つまり、ステップS97と同様に、CPU40は、一定以上の抜重があるかどうかを判断するのである。上述したように、この実施例では、プレイヤオブジェクト202が停止ないしほぼ停止している場合と移動している場合とでキックの指示か否かの閾値(倍率)を異なる値に設定しているのである。ステップS99で“NO”であれば、つまり荷重値が基準値の0.4倍以上であれば、キックの指示ではないと判断して、ステップS107に進む。一方、ステップS99で“YES”であれば、つまり荷重値が基準値の0.4倍未満であれば、キックの指示であると判断して、ステップS101に進む。
ステップS101では、キックのアニメーションを再生開始する。つまり、CPU40は、キックアニメーションデータ404dのアニメーションフレームを最初から再生する。ただし、上述したように、キックの指示が連続して入力される場合、つまりキックBのアニメーションの再生中に、キックの指示が入力された場合には、CPU40は、補間処理を実行することにより、再生中のアニメーションフレームからキックAのアニメーションフレームの10フレーム目に戻し、キックAのアニメーションフレームの10フレーム目から再生を再開する。
次のステップS103では、プレイヤオブジェクト202を進行方向に加速させる。この実施例では、CPU40は、キックによる一定の加速度(1.6)をプレイヤオブジェクトに与える。そして、ステップS105で、キック入力不可フラグ404mをオンして、ステップS51に戻る。
また、上述したように、チクタクの指示であるかどうかの判定を開始する場合には、図23に示すステップS107で、重心位置のY座標(YG)が0.4以上であるかどうかを判断する。つまり、プレイヤが正面(つま先)側に或る程度体重を掛けているかどうかを判断するのである。ステップS107で“NO”であれば、つまり重心位置のY座標(YG)が0.4未満であれば、プレイヤが正面側に或る程度体重を掛けていないと判断して、ステップS119に進む。
一方、ステップS107で“YES”であれば、重心位置のY座標(YG)が0.4以上であれば、プレイヤが正面側に或る程度体重を掛けていると判断して、ステップS109で、チクタク−フラグ404pがオンであれるかどうかを判断する。つまり、プレイヤが背面(踵)側に体重を掛けていた状態から正面側に体重を移動したかどうかを判断しているのである。ステップS109で“NO”であれば、つまりチクタク−フラグ404pがオフであれば、そのままステップS113に進む。一方、ステップS109で“YES”であれば、つまりチクタク−フラグ404pがオンであれば、ステップS111で、プレイヤオブジェクト202を進行方向に加速させて、ステップS113に進む。CPU40は、ステップS111で、チクタクによる一定の加速度(0.5)を、プレイヤオブジェクト202に与える。後述するステップS123も同じである。
ステップS113では、チクタク+フラグ404nをオンする。次のステップS115で、第2フレームカウンタ404rをリセットおよびスタートし、ステップS117で、チクタク−フラグ404pをオフして、ステップS51に戻る。
また、ステップS119では、重心位置のY座標(YG)が−0.4以下であるかどうかを判断する。つまり、プレイヤが背面側に或る程度体重を掛けているかどうかを判断するのである。ステップS119で“NO”であれば、つまり重心位置のY座標(YG)が−0.4よりも大きければ、プレイヤが背面側に或る程度体重を掛けていないと判断して、そのままステップS51に戻る。
一方、ステップS119で“YES”であれば、重心位置のY座標(YG)が−0.4以下であれば、プレイヤが背面側に或る程度体重を掛けていると判断して、ステップS121で、チクタク+フラグ404nがオンであれるかどうかを判断する。つまり、プレイヤが正面側に体重を掛けていた状態から背面側に体重を移動したかどうかを判断しているのである。ステップS121で“NO”であれば、つまりチクタク+フラグ404nがオフであれば、そのままステップS125に進む。一方、ステップS121で“YES”であれば、つまりチクタク+フラグ404nがオンであれば、ステップS123で、プレイヤオブジェクト202を進行方向に加速させて、ステップS125に進む。
ステップS125では、チクタク−フラグ404pをオンする。次のステップS127で、第2フレームカウンタ404rをリセットおよびスタートし、ステップS129で、チクタク+フラグ404nをオフして、ステップS51に戻る。
図24は、チクタクフラグ管理処理のフロー図である。このチクタクフラグ管理処理もまた、仮想ゲームの本編が開始されると、別のタスクでゲーム全体処理や入力判定処理と並列的に実行される。図24に示すように、CPU40は、チクタクフラグ管理処理を開始すると、ステップS151で、チクタク+フラグ404nがオンであるかどうかを判断する。ステップS151で“NO”であれば、つまりチクタク+フラグ404nがオフであれば、そのままステップS157に進む。一方、ステップS151で“YES”であれば、つまりチクタク+フラグ404nがオンであれば、ステップS153で、チクタク+フラグ404nがオンになってから60ゲームフレーム経過したかどうかを判断する。つまり、CPU40は、第2フレームカウンタ404rのカウント値が60を超えたかどうかを判断するのである。後述するステップS159において同じである。
ステップS153で“NO”であれば、つまりチクタク+フラグ404nがオンになってから60ゲームフレーム経過していなければ、そのままステップS157に進む。一方、ステップS153で“YES”であれば、つまりチクタク+フラグ404nがオンになってから60ゲームフレーム経過すれば、ステップS155で、チクタク+フラグ404nをオフして、ステップS157に進む。
ステップS157では、チクタク−フラグ404pがオンであるかどうかを判断する。ステップS157で“NO”であれば、つまりチクタク−フラグ404pがオフであれば、そのままステップS151に戻る。一方、ステップS157で“YES”であれば、つまりチクタク−フラグ404pがオンであれば、ステップS159で、チクタク−フラグ404pがオンにあってから60ゲームフレームが経過したかどうかを判断する。
ステップS159で“NO”であれば、つまりチクタク−フラグ404pがオンになってから60ゲームフレーム経過していなければ、そのままステップS151に戻る。一方、ステップS159で“YES”であれば、つまりチクタク−フラグ404pがオンになってから60ゲームフレームが経過すれば、ステップS161で、チクタク−フラグ404pをオフして、ステップS151に戻る。
このように、チクタクフラグ(404n,404p)を管理するのは、単なる右方向または左方向への旋回動作をチクタクの動作と誤って判定することにより、プレイヤオブジェクト202を加速させないようにするためである。
この実施例によれば、プレイヤの荷重変化による加重または抜重を検出し、検出した加重または抜重に基づいて異なる情報処理を実行するので、荷重値による入力操作のバリエーションに応じた多彩な処理を実行することができる。
さらに、加重が検出された後には、抜重の検出結果に応じた所定の情報処理が行われないようにするため、加重が検出された後にプレイヤの意図しない抜重が検出された場合であっても、加重の検出結果に応じた所定の情報処理のみ行わせることができる。すなわち、プレイヤの意図した通りに所定の情報処理を行わせることができる。
また、この実施例では、重心位置の変化に応じて情報処理を実行することもできるため、さらに入力操作のバリエーションを増加させて、多彩な処理を実行することができる。
なお、この実施例では、スケートボードに乗ったプレイヤオブジェクトの動作および移動を制御するようにしたが、これに限定される必要はない。モニタに表示される任意のオブジェクトの動作や移動を制御することができる。