以下、本発明の実施の形態について、図面を参照しながら説明する。なお、図中、同一または相当部分については同一の参照符号を付してその説明を援用する。
図1は、本発明の実施の形態におけるゲームシステムの全体構成を示す図である。図1に示すように、このゲームシステムは、ゲーム装置1、操作物150、及び、テレビジョンモニタ90、を含む。
ゲーム装置1のハウジング19には、撮像ユニット13が組み込まれる。撮像ユニット13は、4つの赤外発光ダイオード15及び赤外フィルタ17を含む。赤外発光ダイオード15の発光部は、赤外フィルタ17から露出している。
ゲーム装置1には、ACアダプタ92により、直流電源電圧が与えられる。ただし、ACアダプタ92に代えて、電池(図示せず)により、直流電源電圧を与えることもできる。
テレビジョンモニタ90には、その前面にスクリーン91が設けられる。テレビジョンモニタ90とゲーム装置1とは、AVケーブル93により接続される。なお、ゲーム装置1は、例えば、図1に示すように、テレビジョンモニタ90の上面に載置される。
プレイヤ94が、ゲーム装置1の背面に設けられた電源スイッチ(図示せず)をオンにすると、スクリーン91に、ゲーム画面が表示される。プレイヤ94は、操作物150を操作して、ゲーム画面上のカーソル及び追従オブジェクト(後述)を動かして、ゲームを実行する。ここで、操作物150の操作とは、操作物自体を動かすこと(例えば、移動させること)を意味し、スイッチを押下したり、アナログスティックを動かしたり、等は含まない。
撮像ユニット13の赤外発光ダイオード15は、間欠的に赤外光を発光する。赤外発光ダイオード15からの赤外光は、この操作物150に取り付けられた反射シート(後述)により反射され、赤外フィルタ17の内部に設けられた撮像素子(後述)に入力される。このようにして、操作物150が間欠的に撮影される。従って、ゲーム装置1は、プレイヤ94により動かされた操作物150の間欠的な画像信号を取得できる。ゲーム装置1は、この画像信号を解析して、その解析結果をゲームに反映する。
本実施の形態で使用する反射シートは、例えば、再帰反射シートである。
図2は、図1の操作物150の斜視図である。図2に示すように、操作物150は、スティック152の先端に反射ボール151を固定して構成される。この反射ボール151により、赤外発光ダイオード15からの赤外光が反射される。反射ボール151の詳細を説明する。
図3(a)は、図2の反射ボール151の上面図、図3(b)は、図3(a)の矢印A方向からの反射ボール151の側面図、図3(c)は、図3(a)の矢印B方向からの反射ボール151の側面図、である。
図3(a)〜図3(c)に示すように、反射ボール151は、透明色(半透明、有色透明、及び、無色透明、を含む。)の球状外殻153の内部に球状内殻154を固定してなる。球状内殻154には、反射シート155が取り付けられる。この反射シート155が、赤外発光ダイオード15からの赤外光を反射する。
図4は、図2の反射ボール151の縦断面図である。図4に示すように、球状外殻153は、2つの半球状外殻をボス156及びビス(図示せず)により固定してなる。球状内殻154は、球状外殻153の内部に、2つの半球状内殻をボス157により固定してなる。また、反射ボール151には、スティック152が、挿入して固定される。具体的には、球状外殻153を構成する2つの半球状外殻と、球状内殻154を構成する2つの半球状内殻と、によりスティック152を挟み、2つの半球状外殻をボス156及びビスで固定するとともに、2つの半球状内殻をボス157で固定することで、スティック152を反射ボール151に取り付ける。
図5は、図1の撮像ユニット13の一例を示す図解図である。図5に示すように、この撮像ユニット13は、たとえばプラスチック成型によって形成されるユニットベース35を含み、このユニットベース35内には支持筒36が取り付けられる。支持筒36の上面には内面が逆円錐形状であるラッパ状の開口41が形成され、その開口41の下方の筒状部内部には、いずれもがたとえば透明プラスチックの成型によって形成された凹レンズ39および凸レンズ37を含む光学系が設けられ、凸レンズ37の下方において、撮像素子としてのイメージセンサ43が固着される。したがって、イメージセンサ43は、開口41からレンズ39および37を通して入射する光に応じた画像を撮影することができる。
イメージセンサ43は、低解像度のCMOSイメージセンサ(たとえば32ピクセル×32ピクセル:グレースケール)である。ただし、このイメージセンサ43は、画素数のもっと多いものでもよいし、CCD等の他の素子からなるものであってよい。以下では、イメージセンサ43が、32ピクセル×32ピクセルからなるものとして説明を行う。
また、ユニットベース35には、光出射方向がいずれも上方向とされた複数(実施の形態では4つ)の赤外発光ダイオード15が取り付けられる。この赤外発光ダイオード15によって、撮像ユニット13の上方に赤外光が照射される。また、ユニットベース35の上方には、赤外フィルタ(赤外光のみを透過するフィルタ)17が上記開口41を覆うように、取り付けられる。そして、赤外発光ダイオード15は後述のように、点灯/消灯(非点灯)が連続的に繰り返されるので、ストロボスコープとして機能する。ただし、「ストロボスコープ」とは、運動体を間欠的に照らす装置の総称である。したがって、上記イメージセンサ43は、その撮影範囲内で移動する物体、つまり、操作物150を撮影することになる。なお、後述する図8に示すように、ストロボスコープは、主に、赤外発光ダイオード15、LED駆動回路75、及び、高速プロセッサ200、により構成される。
ここで、撮像ユニット13は、イメージセンサ43の受光面が、水平面から所定角度(例えば、90度)だけ傾くように、ハウジング19に組み込まれる。また、凹レンズ39および凸レンズ37により、イメージセンサ43の撮影範囲は、例えば、60度の範囲である。
図6は、図1のゲーム装置1の電気的な構成を示す図である。図6に示すように、ゲーム装置1は、イメージセンサ43、赤外発光ダイオード15、映像信号出力端子47、音声信号出力端子49、高速プロセッサ200、ROM(read only memory)51、及び、バス53、を含む。
高速プロセッサ200には、バス53が接続される。さらに、バス53には、ROM51が接続される。従って、高速プロセッサ200は、バス53を介して、ROM51にアクセスすることができるので、ROM51に格納されたゲームプログラムをリードして実行でき、また、ROM51に格納された画像データ及び楽音データをリードして処理し、映像信号及び音声信号を生成して、映像信号出力端子47及び音声信号出力端子49に出力することができる。
操作物150は、赤外発光ダイオード15が発光する赤外光に照射され、その赤外光を反射シート155で反射する。この反射シート155からの反射光がイメージセンサ43によって検知され、したがって、イメージセンサ43からは反射シート155の画像信号が出力される。イメージセンサ43からのこのアナログ画像信号は高速プロセッサ200に内蔵されたA/Dコンバータ(後述)によってデジタルデータに変換される。赤外光消灯時も同様の処理が行われる。高速プロセッサ200は、このデジタルデータを解析して、その解析結果をゲーム処理に反映する。
図7は、図6の高速プロセッサ200のブロック図である。図7に示すように、この高速プロセッサ200は、中央演算処理装置(CPU:central processing unit)201、グラフィックプロセッサ202、サウンドプロセッサ203、DMA(direct memory access)コントローラ204、第1バス調停回路205、第2バス調停回路206、内部メモリ207、A/Dコンバータ(ADC:analog to digital converter)208、入出力制御回路209、タイマ回路210、DRAM(dynamic random access memory)リフレッシュ制御回路211、外部メモリインタフェース回路212、クロックドライバ213、PLL(phase−locked loop)回路214、低電圧検出回路215、第1バス218、及び、第2バス219、を含む。
CPU201は、メモリ(内部メモリ207、又は、ROM51)に格納されたプログラムに従い、各種演算やシステム全体の制御を行う。CPU201は、第1バス218及び第2バス219のバスマスタであり、それぞれのバスに接続された資源にアクセスが可能である。
グラフィックプロセッサ202は、第1バス218及び第2バス219のバスマスタであり、内部メモリ207、又は、ROM51に格納されたデータを基に、映像信号を生成して、映像信号出力端子47へ出力する。グラフィックプロセッサ202は、第1バス218を通じて、CPU201により制御される。また、グラフィックプロセッサ202は、CPU201に対して、割込み要求信号220を発生する機能を有する。
サウンドプロセッサ203は、第1バス218及び第2バス219のバスマスタであり、内部メモリ207、又は、ROM51に格納されたデータを基に、音声信号を生成して、音声信号出力端子49へ出力する。サウンドプロセッサ203は、第1バス218を通じて、CPU201により制御される。また、サウンドプロセッサ203は、CPU201に対して、割込み要求信号220を発生する機能を有する。
DMAコントローラ204は、ROM51から、内部メモリ207へのデータ転送を司る。また、DMAコントローラ204は、データ転送の完了を通知するために、CPU201に対する割込み要求信号220を発生する機能を有する。DMAコントローラ204は、第1バス218及び第2バス219のバスマスタである。DMAコントローラ204は、第1バス218を通じてCPU201により制御される。
内部メモリ207は、マスクROM、SRAM(static random access memory)、及び、DRAMのうち、必要なものを備える。バッテリによるSRAMのデータ保持が必要とされる場合、バッテリ217が必要となる。DRAMが搭載される場合、定期的にリフレッシュと呼ばれる記憶内容保持のための動作が必要とされる。
第1バス調停回路205は、第1バス218の各バスマスタからの第1バス使用要求信号を受け付け、調停を行い、各バスマスタへの第1バス使用許可信号を発行する。各バスマスタは、第1バス使用許可信号を受領することによって第1バス218に対するアクセスが許可される。ここで、第1バス使用要求信号及び第1バス使用許可信号は、図7では、第1バス調停信号222として示されている。
第2バス調停回路206は、第2バス219の各バスマスタからの第2バス使用要求信号を受け付け、調停を行い、各バスマスタへの第2バス使用許可信号を発行する。各バスマスタは、第2バス使用許可信号を受領することによって第2バス219に対するアクセスが許可される。ここで、第2バス使用要求信号及び第2バス使用許可信号は、図7では、第2バス調停信号223として示されている。
入出力制御回路209は、外部入出力装置や外部の半導体素子との通信等を入出力信号を介して行う。入出力信号は、第1バス218を介して、CPU201からリード/ライトされる。また、入出力制御回路209は、CPU201に対して、割込み要求信号220を発生する機能を有する。
この入出力制御回路209から、赤外発光ダイオード15を制御するLEDコントロール信号LEDCが出力される。
タイマ回路210は、設定された時間間隔に基づき、CPU201に対する割込み要求信号220を発生する機能を有する。時間間隔等の設定は、第1バス218を介してCPU201によって行われる。
ADC208は、アナログ入力信号をデジタル信号に変換する。このデジタル信号は、第1バス218を介してCPU201によってリードされる。また、ADC208は、CPU201に対して、割込み要求信号220を発生する機能を有する。
このADC208が、イメージセンサ43からのピクセルデータ(アナログ)を受けて、デジタルデータに変換する。
PLL回路214は、水晶振動子216より得られる正弦波信号を逓倍した高周波クロック信号を生成する。
クロックドライバ213は、PLL回路214より受け取った高周波クロック信号を、各ブロックへクロック信号225を供給するのに十分な信号強度へ増幅する。
低電圧検出回路215は、電源電圧Vccを監視し、電源電圧Vccが一定電圧以下のときに、PLL回路214のリセット信号226、その他のシステム全体のリセット信号227を発行する。また、内部メモリ207がSRAMで構成されており、かつ、SRAMのバッテリ217によるデータ保持が要求される場合、電源電圧Vccが一定電圧以下のときに、バッテリバックアップ制御信号224を発行する機能を有する。
外部メモリインタフェース回路212は、第2バス219を外部バス53に接続するための機能、及び、第2バス219のサイクル終了信号228を発行することにより、第2バスのバスサイクル長を制御する機能、を有する。
DRAMリフレッシュ制御回路211は、一定期間毎に第1バス218の使用権を無条件に獲得し、DRAMのリフレッシュ動作を行う。なお、DRAMリフレッシュ制御回路211は、内部メモリ207がDRAMを含む場合に設けられる。
ここで、図8〜図10を参照して、イメージセンサ43から高速プロセッサ200へピクセルデータを取り込むための構成を詳細に説明する。
図8は、図6のイメージセンサ43から高速プロセッサ200へピクセルデータを取り込む構成及びLED駆動回路を示す回路図である。図9は、図6のイメージセンサ43から高速プロセッサ200へピクセルデータを取り込む際の動作を示すタイミング図である。図10は、図9の一部を拡大して示すタイミング図である。
図8に示すように、イメージセンサ43は、ピクセルデータD(X,Y)をアナログ信号として出力するタイプのものであるため、このピクセルデータD(X,Y)は高速プロセッサ200のアナログ入力ポートに入力される。アナログ入力ポートは、この高速プロセッサ200においてADC208に接続され、したがって、高速プロセッサ200は、ADC208からデジタルデータに変換されたピクセルデータをその内部に取得する。
上述のアナログピクセルデータD(X,Y)の中点は、イメージセンサ43の基準電圧端子Vrefに与えられる基準電圧によって決定される。そのため、イメージセンサ43に関連して例えば抵抗分圧回路からなる基準電圧発生回路59が設けられ、この回路59から基準電圧端子Vrefに常に一定の大きさの基準電圧が与えられる。
イメージセンサ43を制御するための各デジタル信号は、高速プロセッサ200のI/Oポートに与えられ、またはそこから出力される。このI/Oポートは各々入力/出力の制御が可能なデジタルポートであり、この高速プロセッサ200で入出力制御回路209に接続されている。
詳しく言うと、高速プロセッサ200の出力ポートからはイメージセンサ43をリセットするためのリセット信号resetが出力され、イメージセンサ43に与えられる。また、イメージセンサ43からは、ピクセルデータストローブ信号PDSおよびフレームステータスフラグ信号FSFが出力され、それらの信号が高速プロセッサ200の入力ポートに与えられる。
ピクセルデータストローブ信号PDSは上述の各ピクセル信号D(X,Y)を読み込むための図9(b)に示すようなストローブ信号である。フレームステータスフラグ信号FSFはイメージセンサ43の状態を示すフラグ信号で、図9(a)に示すように、このイメージセンサ43の露光期間を規定する。つまり、フレームステータスフラグ信号FSFの図9(a)に示すローレベルが露光期間を示し、図9(a)に示すハイレベルが非露光期間を示す。
また、高速プロセッサ200は、イメージセンサ43の制御レジスタ(図示せず)に設定するコマンド(またはコマンド+データ)をレジスタデータとしてI/Oポートから出力するとともに、たとえばハイレベルおよびローレベルを繰り返すレジスタ設定クロックCLKを出力し、それらをイメージセンサ43に与える。
なお、赤外発光ダイオード15として、図8に示すように互いに並列接続された4つの赤外発光ダイオード15a,15b,15cおよび15dを用いる。この4つの赤外発光ダイオード15a〜15dは、上で説明したように、操作物150を照らすように、イメージセンサ43の視点方向と同一方向に赤外光を照射するようにかつイメージセンサ43を囲むように配置される。ただし、これら個別の赤外発光ダイオード15a〜15dは、特に区別する必要がある場合を除いて、単に赤外発光ダイオード15と呼ばれる。
この赤外発光ダイオード15はLED駆動回路75によって、点灯されまたは消灯(非点灯)される。LED駆動回路75は、イメージセンサ43から上述のフレームステータスフラグ信号FSFを受け、このフラグ信号FSFは、抵抗69およびコンデンサ71からなる微分回路67を通してPNPトランジスタ77のベースに与えられる。このPNPトランジスタ77にはさらにプルアップ抵抗79が接続されていて、このPNPトランジスタ77のベースは、通常は、ハイレベルにプルアップされている。そして、フレームステータス信号FSFがローレベルになると、そのローレベルが微分回路67を経てベースに入力されるため、PNPトランジスタ77は、フラグ信号FSFがローレベル期間にのみオンする。
PNPトランジスタ77のエミッタは抵抗73および65を介して接地される。そして、エミッタ抵抗73および65の接続点がNPNトランジスタ81のベースに接続される。このNPNトランジスタ81のコレクタが各赤外発光ダイオード15a〜15dのアノードに共通に接続される。NPNトランジスタ81のエミッタが別のNPNトランジスタ61のベースに直接接続される。NPNトランジスタ61のコレクタが各赤外発光ダイオード15a〜15dのカソードに共通接続され、エミッタが接地される。
このLED駆動回路75では、高速プロセッサ200のI/Oポートから出力されるLEDコントロール信号LEDCがアクティブ(ハイレベル)でありかつイメージセンサ43からのフレームステータスフラグ信号FSFがローレベルである期間にのみ赤外発光ダイオード15が点灯される。
図9(a)に示すようにフレームステータスフラグ信号FSFがローレベルになると、そのローレベル期間中(実際には微分回路67の時定数での遅れがあるが)、PNPトランジスタ77がオンする。したがって、図9(d)に示すLEDコントロール信号LEDCが高速プロセッサ200からハイレベルで出力されると、NPNトランジスタ81のベースがハイベルとなり、このトランジスタ81がオンとなる。トランジスタ81がオンするとトランジスタ61はオンとなる。したがって、電源(図8では小さい白丸で示す)から各赤外発光ダイオード15a〜15dおよびトランジスタ61を経て電流が流れ、応じて図9(e)に示すように各赤外発光ダイオード15a〜15dが点灯される。
LED駆動回路75では、このように、図9(d)のLEDコントロール信号LEDCがアクティブでありかつ図9(a)のフレームステータスフラグ信号FSFがローレベルである期間にのみ赤外発光ダイオード15が点灯されるので、イメージセンサ43の露光期間(図9(f)参照)にのみ赤外発光ダイオード15が点灯されることになる。
したがって、無駄な電力消費を抑制することができる。さらに、フレームステータスフラグ信号FSFはコンデンサ71によってカップリングされているので、万一イメージセンサ43の暴走等によりそのフラグ信号FSFがローレベルのまま停止した場合でも、一定時間後にはトランジスタ77は必ずオフされ、赤外発光ダイオード15も一定時間後には必ずオフされる。
このように、フレームステータス信号FSFの持続期間を変更することによって、イメージセンサ43の露光時間を任意にかつ自在に設定または変更することができる。
さらに、フレームステータス信号FSFおよびLEDコントロール信号LEDCの持続時間や周期を変更することによって、赤外発光ダイオード15すなわちストロボスコープの発光期間、非発光期間、発光/非発光周期などを任意にかつ自在に変更または設定できる。
先に説明したように、赤外発光ダイオード15からの赤外光によって操作物150が照射されると、操作物150からの反射光によってイメージセンサ43が露光される。応じて、イメージセンサ43から上述のピクセルデータD(X,Y)が出力される。詳しく説明すると、イメージセンサ43は、上述の図9(a)のフレームステータスフラグ信号FSFがハイレベルの期間(赤外発光ダイオード15の非点灯期間)に図9(b)に示すピクセルデータストローブPDSに同期して、図9(c)に示すようにアナログのピクセルデータD(X,Y)を出力する。
高速プロセッサ200では、そのフレームステータスフラグ信号FSFとピクセルデータストローブPDSとを監視しながら、ADC208を通じて、デジタルのピクセルデータを取得する。
ただし、ピクセルデータは、図10(c)に示すように、第0行,第1行,…第31行と行順次に出力される。ただし、後に説明するように、各行の先頭の1ピクセルはダミーデータとなる。
次に、ゲーム装置1によるゲーム内容について、具体例を挙げながら説明する。
図11は、図1のテレビジョンモニタ90のスクリーン91に表示される第1ステージのゲーム画面の例示図である。図11に示すように、このゲーム画面は、背景120、カーソル111、追従オブジェクト112、障害オブジェクト104〜106、体力ゲージ131、及び、マスク101,102を含む。背景120は、障害画像113〜115を含む。体力ゲージ131は、バー103を含む。ここで、追従オブジェクト112は、人魚を模した図形であるため、以下、単に「人魚112」と呼ぶ。また、障害オブジェクト104〜106及び後述の障害オブジェクトを包括して表現する場合は、障害オブジェクトPと呼ぶことがある。障害画像113〜115及び後述の障害画像を包括して表現するときは、障害画像Qと呼ぶことがある。
体力ゲージ131は、人魚112の体力を表現する。ゲーム開始時では、このバー103は最長であり、十分な体力がある。そして、時間の経過とともに、このバー103は短くなっていき(体力が少なくなっていき)、バー103の長さが「0」になったとき(体力がなくなったとき)にゲームオーバーとなる。なお、バー103は、原則として、最長時から消滅時まで、一定速度で短くなる。つまり、人魚112の体力は、原則として、一定速度で減少する。
背景120は、スクリーン91に向かって、左方向にスクロールされる。当然、背景120の一部である障害画像113〜115も、左方向にスクロールされる。一方、障害オブジェクト104〜105の各々は、単数又は複数のスプライトにより構成され、スクリーン91の右側(マスク102側)から出現し、左方向に移動して、スクリーン91の左側(マスク101側)に消えていく。スプライトについては後述する。
カーソル111は、操作物150のスクリーン91上での位置を表しており、操作物150の動きに連動してスクリーン91上を移動する。従って、プレイヤ94から見れば、操作物150の操作とカーソル111の操作とは同義である。人魚112は、カーソル111の動き(間接的には操作物150の動き)に追従する。プレイヤ94は、操作物150により人魚112を操作して、障害オブジェクト104〜106及び障害画像113〜115を回避しながら、体力が残っている間に(バー103の長さが「0」になる前に)ゴールに到達しなければならない。
なお、人魚112が、障害オブジェクト104〜106あるいは障害画像113〜115に衝突すると、体力ゲージ131のバー103が、上記の一定速度に関係なく、所定長だけ短くなり、体力が急激に減少する。人魚112が、障害オブジェクト104〜106あるいは障害画像113〜115に衝突した後一定時間だけ、その後の衝突によっては、人魚104の体力を急激に減少させる処理を行わないようにすることもできる。
図12は、図1のテレビジョンモニタ90のスクリーン91に表示される第1ステージのゲーム画面の他の例示図である。図12に示すように、このゲーム画面は、背景120、カーソル111、人魚112、障害オブジェクト107〜109、体力ゲージ131、アイテム110、及び、マスク101,102を含む。背景120は、障害画像116,117含む。
プレイヤ94が操作物150を操作して、人魚112を、アイテム110が表示されている所定領域に移動させると、体力ゲージ131のバー103が所定長だけ長くなる。つまり、この場合、人魚112の体力が増加して、プレイヤ94に有利となる。なお、障害オブジェクト107〜109及び障害画像116,117は、それぞれ、障害オブジェクト104〜106及び障害画像113〜115と同様のものである。
図13は、図1のテレビジョンモニタ90のスクリーン91に表示される第2ステージのゲーム画面の例示図である。図13に示すように、このゲーム画面は、背景120、カーソル111、人魚112、障害オブジェクト121〜125、体力ゲージ131、及び、アイテム126を含む。
障害オブジェクト121〜125の各々及びアイテム126は、単数又は複数のスプライトにより構成され、スクリーン91の上側に出現し、下降して、スクリーン91の下側に消えていく。なお、第2ステージでは、背景120のスクロールはない。
プレイヤ94は、操作物150により人魚112を操作して、障害オブジェクト121〜125を回避なければならない。人魚112が、障害オブジェクト121〜125に衝突すると、体力ゲージ131のバー103が所定長だけ短くなる。つまり、人魚112の体力が減少する。アイテム126は、図12のアイテム110と同様のものである。
ここで、障害オブジェクト104〜109の各々及び人魚112は、アニメーションの、あるコマの画像である。従って、人魚112のアニメーションのために、一連の人魚112の画像が用意されている。また、障害オブジェクト104〜109の各々のアニメーションのために、障害オブジェクト104〜109ごとに、一連の障害オブジェクト104〜109の画像が用意されている。
上記したように、人魚112、障害オブジェクト104〜109,121〜125の各々、アイテム110,126の各々、及び、体力ゲージ131、は単数あるいは複数のスプライトからなる。スプライトは、矩形の画素集合であり、スクリーン91の任意の位置に配置できる。なお、人魚112、障害オブジェクト104〜109,121〜125の各々、アイテム110,126の各々、及び、体力ゲージ131、を総称してオブジェクト(あるいはオブジェクト画像)と呼ぶこともある。
図14は、スクリーン91に表示されるオブジェクトを構成するスプライトの説明図である。図14に示すように、図11の人魚112は、例えば、6個のスプライトSP0〜SP5により構成される。スプライトSP0〜SP5の各々は、例えば、16画素×16画素からなる。人魚112をスクリーン91上に配置するときは、例えば、左上の角のスプライトSP0の中心を、スクリーン91上のどの座標に配置するかが指定される。そして、指定された座標及びスプライトSP0〜SP5のサイズをもとに、各スプライトSP1〜SP5の中心を配置する座標が算出される。
次に、背景120のスクロールについて説明する。まず、バックグラウンドスクリーンについて説明する。
図15は、図1のテレビジョンモニタ90のスクリーン91に表示されるバックグラウンドスクリーンの説明図である。図15に示すように、バックグラウンドスクリーン140は、例えば、32個×32個のブロック「0」〜ブロック「1023」により構成される。ブロック「0」〜ブロック「1023」の各々は、例えば、8画素×8画素からなる矩形要素である。ブロック「0」〜ブロック「1023」に対応して、配列PA[0]〜PA[1023]及び配列CA[0]〜CA[1023]が用意される。ここで、ブロック「0」〜ブロック「1023」を包括して表現するときは、単に「ブロック」と表記し、配列PA[0]〜PA[1023]を包括して表現するときは、「配列PA」と表記し、配列CA[0]〜CA[1023]を包括して表現するときは、「配列CA」と表記する。
配列PAには、対応するブロックの画素パターンを指定するデータ(画素パターンデータ)の格納位置情報が代入される。画素パターンデータは、ブロックを構成する8画素×8画素の各画素の色情報からなる。また、配列CAには、対応するブロックに使用するカラーパレットを指定する情報(カラーパレット情報)及びデプス値が代入される。カラーパレットは、所定数の色情報からなる。デプス値は、画素の奥行きを表す情報であり、同じ位置に、複数の画素が存在することとなる場合、最も大きなデプス値を持つ画素だけが表示されることになる。
図16(a)は、バックグラウンドスクリーン140をスクロールする前の説明図、図16(b)は、バックグラウンドスクリーン140をスクロールした後の説明図、である。図16(a)に示すように、テレビジョンモニタ90のスクリーン91のサイズは、224画素×256画素であるため、バックグラウンドスクリーン140のうち、224画素×256画素の範囲がスクリーン91に表示される。ここで、バックグラウンドスクリーン140の中心位置をk画素だけ左にスクロールすることを考える。そうすると、バックグラウンドスクリーン140の横方向(水平方向)の幅が、スクリーン91の横方向の幅と同じであるため、図16(b)に示すように、スクリーン91の範囲外となった部分(斜線部分)が、スクリーン91の右端に表示される。つまり、概念的には、横方向にスクロールをする場合は、同じ複数のバックグラウンドスクリーン140が横方向に連なっていると考えることができる。
例えば、スクリーン91の範囲外となった部分(斜線部分)が、図15のブロック「64」,ブロック「96」,…,ブロック「896」,ブロック「928」とすると、これらのブロックに対応する配列PA[64],PA「96」,…,PA「896」,PA[928]及び配列CA[64],CA「96」,…,CA「896」,CA[928]によって定まる画像が、スクリーン91の右端に表示される。従って、バックグラウンドスクリーン140の左スクロールにより、背景が連続的に連なるようにするには、スクリーン91の範囲外となった部分(斜線部分)に含まれるブロックに対応する配列PA及び配列CAに代入されたデータを更新する必要がある。そうすれば、更新された配列PA及び配列CAによって定まる画像が、スクリーン91の右端に表示される。
背景を滑らかに連続するように見せるためには、スクリーン91の右端に表示される前に、該当する配列PA及び配列CAのデータを更新する必要がある。そうすると、スクリーン91の左端に表示中のときに、該当する配列PA及び配列CAのデータを更新する必要が生じ、スクリーン91の左端の表示が不連続なものとなる。従って、このような不都合を回避するため、図11及び図12に示すように、スクリーン91の左端にマスク101をする。なお、本実施形態では、右方向へのスクロールは行わないが、バランスをとるため、右端にもマスク102をしている。
以上のようにして、バックグラウンドスクリーン140をスクロールさせることで、背景120をスクロールさせる。
図17は、図6のROM51に格納されたプログラム及びデータを示す概念図である。図17に示すように、ROM51には、ゲームプログラム300、画像データ301、及び、楽音データ304、が格納される。画像データ301は、オブジェクト画像データ302(人魚112、障害オブジェクト104〜109,121〜125、アイテム110,126、及び、体力ゲージ131、等の画像データを含む。)及び背景画像データ303を含む。楽音データ304は、楽譜データ305、及び、波形データ(音源データ)306、を含む。高速プロセッサ200は、ROM51に格納されたゲームプログラム300を実行し、画像データ301及び楽音データ304を利用する。
高速プロセッサ200が実行する主な処理について説明する。
[ピクセルデータ群取得処理]CPU201は、イメージセンサ43が出力したアナログのピクセルデータを変換したデジタルのピクセルデータを取得して、配列P[X][Y]に代入する。なお、イメージセンサ43の水平方向(横方向、行方向)をX軸、垂直方向(縦方向、列方向)をY軸とする。
[差分データ算出処理]CPU201は、赤外発光ダイオード15の点灯時のピクセルデータP[X][Y]と、消灯時のピクセルデータP[X][Y]と、の差分を算出して、差分データを配列Dif[X][Y]に代入する。ここで、図面を用いて、差分を求める効果を説明する。ここで、ピクセルデータは輝度を表す。よって、差分データも輝度を表す。
図18(a)は、一般的なイメージセンサにより撮影された、特別な処理を施さない画像の例示図、図18(b)は、図18(a)の画像信号を或る閾値でレベル弁別したときの画像信号の例示図、図18(c)は、赤外フィルタ17を介したイメージセンサ43の点灯時の画像信号を或る閾値でレベル弁別したときの画像信号の例示図、図18(d)は、赤外フィルタ17を介したイメージセンサ43の消灯時の画像信号を或る閾値でレベル弁別したときの画像信号の例示図、図18(e)は、点灯時の画像信号と消灯時の画像信号との差分信号の例示図、である。
上記のように、操作物150に赤外光を照射し、赤外フィルタ17を介してイメージセンサ43に入射した反射赤外光による画像を撮影している。一般的な室内環境で一般的な光源を用いて操作物150をストロボスコープ撮影した場合には、一般的なイメージセンサ(図5のイメージセンサ43に相当する。)には、図18(a)に示すように、操作物150による画像以外に、蛍光灯光源、白熱灯光源、太陽光(窓)のような光源だけでなく、室内のすべてのものの画像がすべて写り込む。したがって、この図18(a)の画像を処理して操作物150の画像のみを抽出するのは、かなり高速のコンピュータまたはプロセサが必要である。しかしながら、安価が条件の装置ではそのような高性能コンピュータを使えない。そこで種々の処理を行って負担を軽減することが考えられる。
なお、図18(a)の画像は、本来ならば、白黒の階調により表される画像であるが、その図示を省略している。また、図18(a)〜図18(e)では、操作物150の反射シート155が撮影されている。
図18(b)は、図18(a)の画像信号を或る閾値でレベル弁別したときの画像信号である。このようなレベル弁別処理は専用のハードウェア回路でも、ソフトウェア的にでも、実行することができるが、いずれの方法によっても、一定以下の光量のピクセルデータをカットするレベル弁別を実行すると、操作物150や光源以外の低輝度画像を除去することができる。この図18(b)の画像では操作物150および室内の光源以外の画像の処理を省略でき、したがって、コンピュータの負担を軽減できるが、それでも、光源画像を含む高輝度画像が依然として写り込んでいるので、操作物150と他の光源を分別することは難しい。
そこで、図5に示したように赤外フィルタ17を利用して、イメージセンサ43に赤外光による画像以外の画像が写らないようにした。それによって、図18(c)に示すように、赤外光を殆ど含まない蛍光灯光源の画像は除去できる。しかしながら、それでもなお太陽光や白熱灯が画像信号中に含まれてしまう。したがって、更なる負担軽減のために、赤外ストロボスコープの点灯時のピクセルデータと消灯時のピクセルデータとの差分を計算することとした。
そのため、図18(c)の点灯時の画像信号のピクセルデータと、図18(d)の消灯時の画像信号のピクセルデータとの差分を計算した。すると、図18(e)に示すように、その差分だけの画像が取得できる。この差分データによる画像は、図18(a)と対比すれば明らかなように、操作物150によって得られる画像のみを含むことになる。したがって、処理の軽減を図りながらも、操作物150の状態情報を取得できる。
ここで、状態情報とは、例えば、速さ情報、移動方向情報、移動距離情報、速度ベクトル情報、加速度情報、移動軌跡情報、面積情報、若しくは、位置情報、のいずれか、又は、それらの2以上の組み合わせ、等である。
以上のような理由で、CPU201は、赤外発光ダイオード15の点灯時のピクセルデータと、消灯時のピクセルデータと、の差分を算出して、差分データを得る。
[注目点抽出処理]CPU201は、算出した差分データDif[X][Y]を基に、操作物150の注目点の座標を求める。この点を詳細に説明する。
図19は、操作物150の注目点の座標算出の説明図である。なお、図19に示したイメージセンサ43は、32ピクセル×32ピクセルのものとする。
図19に示すように、CPU201は、X方向(水平方向、横方向、行方向)に32ピクセル分の差分データをスキャンし、そして、Y座標をインクリメントし、X方向に32ピクセル分の差分データをスキャンし、そして、Y座標をインクリメントし、というように、Y座標をインクリメントしながら、X方向に32ピクセル分の差分データをスキャンしていく。
この場合、CPU201は、スキャンした32ピクセル×32ピクセル分の差分データから、最大輝度値の差分データを求め、その最大輝度値と所定の閾値Thとを比較する。そして、CPU201は、その最大輝度値が所定の閾値Thより大きい場合は、その最大輝度値を持つピクセルの座標を基に、操作物150の注目点の座標を算出する。この点を詳しく説明する。
図20(a)は、最大輝度値を持つピクセルの座標を基に、操作物150の注目点座標を算出する際のX方向スキャンの説明図、図20(b)は、最大輝度値を持つピクセルの座標を基に、操作物150の注目点座標を算出する際のY方向スキャンのスタート時の説明図、図20(c)は、最大輝度値を持つピクセルの座標を基に、操作物150の注目点座標を算出する際のY方向スキャンの説明図、図20(d)は、最大輝度値を持つピクセルの座標を基に、操作物150の注目点座標を算出する際の結果の説明図、である。
図20(a)に示すように、CPU201は、最大輝度値のピクセルの座標を中心に、X方向に、差分データのスキャンを実行して、所定の閾値Thより大きい輝度値のピクセルを検出する。図20(a)の例では、X=11〜15までが、所定の閾値Thを超えたピクセルである。
次に、図20(b)に示すように、CPU201は、X=11〜15の中心を求める。すると、中心のX座標は、Xc=13である。
次に、図20(c)に示すように、図20(b)で求めたX座標(=13)を中心に、Y方向に、差分データのスキャンを実行して、所定の閾値Thより大きい輝度値のピクセルを検出する。図20(c)の例では、Y=5〜10までが、所定の閾値Thを超えたピクセルである。
次に、図20(d)に示すように、CPU201は、Y=5〜10の中心を求める。すると、中心のY座標は、Yc=7である。
CPU201は、以上のようにして算出した注目点の座標Xc(=13)をPX[M]に代入し、座標Yc(=7)をPY[M]に代入する。そして、CPU201は、注目点(Xc,Yc)の移動平均(AX,AY)を算出する。さらに、CPU201は、イメージセンサ43上の注目点の平均座標(AX,AY)を、スクリーン91上の座標(xc,yc)に変換する。そして、CPU201は、座標xcを配列Ax[M]に代入し、座標ycを配列Ay[M]に代入する。CPU201は、以上のような注目点の座標(Ax[M],Ay[M])を求める処理を、フレームが更新されるたびに実行する。ここで、例えば、スクリーン91における座標原点は、スクリーン91の中心位置とする。
CPU201は、例えば、次式により、(n+1)フレーム分の移動平均を算出する。「n」は自然数(例えば、「3」)である。
AX=(PX[M]+PX[M−1]+…+PX[M−n])/(n+1) …(1)
AY=(PY[M]+PY[M−1]+…+PY[M−n])/(n+1) …(2)
「M」は整数であり、スクリーン91に表示するフレームが更新されるたびに1つインクリメントされる。
[背景制御処理]CPU201は、ゲームの第1ステージでは(図11及び図12参照)、バックグラウンドスクリーン140の中心位置の配置を、一定速度で変更して(図16(a)及び図16(b)参照)、中心位置の変更後の配置座標を登録する。この場合、CPU201は、該当する配列PA及び配列CAのデータを変更する。以上のようにして、CPU201は、背景120のスクロール制御を行う。また、CPU201は、ゲームの第2ステージでは(図13参照)、ゲームプログラム300に従って、配列PA及び配列CAのデータを変更して、背景120の内容の一部あるいは全部を変化させる。
[自動オブジェクト制御処理]CPU201は、障害オブジェクトP及びアイテム110,126の座標を計算して登録する。例えば、障害オブジェクトP及びアイテム110が一定速度で移動するように、座標計算を行い、その結果を登録する(内部メモリ207に格納する)。また、CPU201は、表示すべき障害オブジェクトP及びアイテム110,126のアニメーションテーブルの格納位置情報を登録する。このアニメーションテーブルは、後述する人魚112のアニメーションテーブルと同様のものである。
[カーソル制御処理]CPU201は、操作物150の注目点の座標(Ax[M],Ay[M])を、次のフレームで表示するカーソル105の座標として登録する(内部メモリ207に格納する)。また、CPU201は、カーソル111のアニメーションテーブルの格納位置情報を登録する。このアニメーションテーブルは、後述する人魚112のアニメーションテーブルと同様のものである。
[追従オブジェクト制御処理]CPU201は、人魚112を、カーソル111の動きに追従させる。この場合、人魚112に第1の加速度を持たせて移動させる。この第1の加速度には、カーソル111と人魚112との間の距離が大きいほど大きな値を、小さいほど小さい値を設定する。なお、第1の加速度の向きは正方向である。正方向とは、人魚の進行方向である。また、人魚112には、第2の加速度をも持たせて移動させる。この第2の加速度には、人魚の速度が大きいほど大きな値を、小さいほど小さい値を設定する。この第2の加速度の向きは負方向とする。負方向とは、人魚の進行方向と逆の方向である。以上により、人魚112が、あたかも水中を運動しているかのような効果を得ることができる。以上の点を具体例を挙げながら説明する。
図21は、CPU201による追従オブジェクト制御処理の説明図である。CPU201は、人魚112の今回の座標(xm[M],ym[M])を算出するため、例えば、次式を用いる。
xm[M]=xm[M−1]+Vxm[M−1]×(1−k)+Bx[M] …(3)
ym[M]=ym[M−1]+Vym[M−1]×(1−k)+By[M] …(4)
Vxm[M−1]=xm[M−1]−xm[M−2] …(5)
Vym[M−1]=ym[M−1]−ym[M−2] …(6)
Bx[M]=Lx[M]×B0 …(7)
By[M]=Ly[M]×B0 …(8)
Lx[M]=Ax[M]−xm[M−1] …(9)
Ly[M]=Ay[M]−ym[M−1] …(10)
図21に示すように、式(3)〜式(10)では、人魚112の前回の座標(xm[M−1],ym[M−1])、人魚112の前回の速度ベクトル(Vxm[M−1],Vym[M−1])、人魚112の今回の加速度ベクトル(Bx[M],By[M])、人魚112の前前回の座標(xm[M−2],ym[M−2])、水の抵抗を表す定数k(k<1)、及び、人魚112の加速度を調整する定数B0、を使用する。ここで、水の抵抗を大きくしたいときには、定数kを大きい値に設定し、小さくしたいときは小さい値に設定する。また、人魚の加速度Bx[M],By[M]は、今回のカーソル111と前回の人魚112との間の距離Lx[M],Ly[M]に比例する。なお、定数kの値及び定数B0の値は、任意の値とすることができ、例えば、経験により定めることができる。
また、CPU201は、次式により、人魚112の今回の速度ベクトル(Vxm[M],Vym[M])を算出する。
Vxm[M]=xm[M]−xm[M−1] …(11)
Vym[M]=ym[M]−ym[M−1] …(12)
さらに、CPU201は、人魚112のx方向の移動距離mxおよびy方向の移動距離myを算出する。x方向の移動距離mxは、x成分Vxm[M]の絶対値であり、y方向の移動距離myは、y成分Vym[M]の絶対値である。
CPU201は、上記のようにして、人魚112の位置を制御するだけでなく、人魚112のアニメーションを制御する。この点を詳細に説明する。
CPU201は、人魚112のx方向の移動距離mxと所定値xrとの間で大小を判断する。また、CPU201は、人魚112のy方向の移動距離myと所定値yrとの間で大小を判断する。その判断の結果、CPU201は、移動距離mxが所定値xrより大きく、移動距離myが所定値yrより小さい場合は、人魚112を横方向(水平方向)に移動させるべく、角度フラグを対応する値にセットする。
また、判断の結果、CPU201は、移動距離mxが所定値xrより小さく、移動距離myが所定値yrより大きい場合は、人魚112を縦方向(垂直方向)に移動させるべく、角度フラグを対応する値にセットする。また、判断の結果、CPU201は、移動距離mxが所定値xrより大きく、移動距離myが所定値yrより大きい場合は、人魚112を斜め方向に移動させるべく、角度フラグを対応する値にセットする。
さらに、CPU201は、人魚112の速度ベクトル(Vxm[M],Vym[M])の符号を判断して、x方向フラグ及びy方向フラグを対応する値にセットする。なお、x方向フラグ及びy方向フラグを包括して表現するときは、単に方向フラグと呼ぶ。
そして、CPU201は、角度フラグ、x方向フラグ、及び、y方向フラグ、にセットされている値に従って、人魚112の移動方向情報を決定する。人魚112の移動方向情報は、人魚112の移動態様を表す情報である。この移動方向情報により、人魚112の向きが決定される。この点の詳細を説明する。
図22(a)は、角度フラグの値と角度との関係図、図22(b)は、方向フラグの値と方向を表す符号との関係図、図22(c)は、角度フラグ及び方向フラグと、移動方向情報と、の関係図、である。上記のように、CPU201は、人魚112の移動距離mx及びmyと、所定値xr及びyrと、の間で大小を判断して、図22(a)に示すように、角度フラグをセットする。
また、上記のように、CPU201は、人魚112の速度ベクトル(Vxm[M],Vym[M])の符号を判断して、図22(b)に示すように、x方向フラグ及びy方向フラグをセットする。
さらに、図22(c)に示すように、CPU201は、角度フラグ、x方向フラグ、及び、y方向フラグ、にセットされている値から、人魚112の移動方向情報を決定する。
図23は、図22(c)の移動方向情報と、人魚112の移動方向と、の関係図である。図22及び図23に示すように、移動方向情報A0は、人魚112を、横方向に、かつ、x軸の正方向(右方向)に移動させることを意味する。移動方向情報A1は、人魚112を、横方向に、かつ、x軸の負方向(左方向)に移動させることを意味する。移動方向情報A2は、人魚112を、縦方向に、かつ、y軸の正方向(上方向)に移動させることを意味する。移動方向情報A3は、人魚112を、縦方向に、かつ、y軸の負方向(下方向)に移動させることを意味する。移動方向情報A4は、人魚112を、右上斜め方向に移動させることを意味する。移動方向情報A5は、人魚112を、右下斜め方向に移動させることを意味する。移動方向情報A6は、人魚112を、左上斜め方向に移動させることを意味する。移動方向情報A7は、人魚112を、左下斜め方向に移動させることを意味する。
CPU201は、上記のようにして取得した移動方向情報A0〜A7に関連付けられたアニメーションテーブル格納位置情報を登録する(人魚アニメーション登録)。アニメーションテーブル格納位置情報は、アニメーションテーブルの格納位置を示す情報である。また、この場合のアニメーションテーブルには、人魚112をアニメーションするための様々な情報が含まれている。
図24は、移動方向情報A0〜A7とアニメーションテーブル格納位置情報との関係図である。図24では、例えば、移動方向情報A0とアニメーションテーブル格納位置情報address0とが関連付けられている。ここで、アニメーションテーブル格納位置情報は、アニメーションテーブルが格納されている領域の先頭アドレス情報である。
図25は、図24のアニメーションテーブル格納位置情報により示される、人魚112をアニメーションするためのアニメーションテーブルの例示図である。図25に示すように、アニメーションテーブルは、アニメーション画像データの格納位置情報、アニメーションを行うオブジェクト(人魚112)の番号を時系列に配置したもの、持続フレーム数情報、次オブジェクト情報、オブジェクト(人魚112)のサイズ情報、カラーパレット情報、デプス値の情報、及び、スプライトサイズ情報、を関連付けたテーブルである。
アニメーション画像データは、複数のオブジェクト(人魚112)画像を時系列に配置したデータである。持続フレーム数情報は、何フレーム連続して各オブジェクト(人魚112)を表示するかを示す情報である。次オブジェクト情報は、持続フレーム数情報に従ってオブジェクト(人魚112)を表示した後に、何番のオブジェクト(人魚112)を表示するかを指示する情報である。例えば、次オブジェクト情報「next」は、番号「1」のオブジェクトを1フレーム(持続フレーム数)表示した後は、次の番号「2」のオブジェクトを表示することを意味する。また、例えば、次オブジェクト情報「top」は、番号「15」のオブジェクトを1フレーム(持続フレーム数)表示した後は、先頭の番号「1」のオブジェクトを表示することを意味する。
なお、アニメーション画像データは、画素パターンデータである。ここで、画素パターンデータ、及び、デプス値は、オブジェクト(人魚112)を構成するスプライトに関するものであり、その意味は、図15で説明したブロックに関するものと同様である。
ここで、図25のアニメーションテーブルは、人魚112のアニメーションを行うためのものである。従って、例えば、図24の移動方向情報A0は、人魚112を横方向かつ正方向に移動させることを示す情報であるため、移動方向情報A0に対応したアニメーションテーブル格納位置情報address0が示すアニメーションテーブルの格納位置情報ad0は、横方向かつ正方向に向いた人魚112のアニメーション画像データの格納位置を示す。
以上のように、人魚112の移動方向情報A0〜A7に応じたアニメーションテーブル格納位置情報address0〜address7が登録され、しかも、人魚112の移動方向情報A0〜A7は、操作物150の注目点(カーソル111)の座標(Ax[M],Ay[M])に基づいているため(式(9)及び式(10)参照)、操作物150(カーソル111)の移動方向に向いた人魚112のアニメーションが実行される。
さらに、CPU201は、人魚112が、障害オブジェクトPあるいは障害画像Qに衝突したか否かを判定して、衝突したときに、人魚112の動きを制限し、かつ、衝突フラグをオンにする。この点を詳細に説明する。
図26は、CPU201による衝突判定処理の説明図である。図26に示すように、人魚112、障害オブジェクトP、及び、障害画像Q、を矩形あるいは矩形の集合によりモデル化する。そして、CPU201は、人魚112と、表示されている全ての障害オブジェクトPおよび表示されている全ての障害画像Qと、の衝突を判定する。ここで、人魚112を構成する矩形を、「人魚矩形」と呼び、障害オブジェクトP、あるいは、障害画像Q、を構成する矩形を、「障害矩形」と呼ぶ。衝突判定について詳しく説明する。
CPU201は、人魚矩形の各々の各頂点座標、及び、障害矩形の各々の各頂点座標、を用いて、人魚矩形と障害矩形との重複を判断する。そして、CPU201は、いずれかの人魚矩形といずれかの障害矩形とが重複していれば、人魚112と、重複した障害矩形を持つ障害オブジェクトPと、が衝突し、あるいは、人魚112と、重複した障害矩形を持つ障害画像Qと、が衝突したと判断して、衝突フラグをオンにする。
図27は、CPU201による追従オブジェクト制御処理で判断される重複パターンの説明図である。図27(a)〜図27(n)に示すように、人魚矩形rcmと障害矩形rcoとの重複パターンは、14通りある。CPU201は、いずれかの重複パターンが存在すれば、人魚112と、重複した障害矩形rcoを持つ障害オブジェクトPと、が衝突し、あるいは、人魚112と、重複した障害矩形rcoを持つ障害画像Qと、が衝突したと判断する。
以上のような処理を、人魚112と、表示されている全ての障害オブジェクトPおよび表示されている全ての障害画像Qと、の間で行う。
[体力ゲージ制御処理]CPU201は、体力ゲージ131を制御する。この点を図面を用いて説明する。
図28(a)は、図11〜図13の体力ゲージ131を構成する枠の例示図、図28(b)は、体力ゲージ131のバー103を構成する要素の例示図、である。図28(a)に示すように、体力ゲージ131の枠は、8×56画素の大きさであり、8×8画素のスプライトを7つ表示して構成する。
図28(b)に示すように、バー103を表示するために、8×8画素からなるスプライトP0〜P7が8つ用意される。図28(b)において、例えば、破線部は赤色であり、それ以外は白色である。CPU201は、一定速度でバー103が短くなるように、スプライトP0〜P7の中から、単数あるいは複数のスプライトを選択して、体力ゲージ131の枠内に表示する。
例えば、CPU201は、ゲーム開始時に、7個のスプライトP7を枠内に表示して、バー103を最長とする。そして、ゲーム開始から一定時間tが経過したら、一番右側のスプライトP7に代えて、スプライトP6を枠内に表示し、さらに一定時間t経過したら、スプライトP6に代えて、スプライトP5を枠内に表示し、…、というように、一定時間tの経過とともに、赤色のバー103を短くしていく。つまり、一定時間tが経過するたびに、バー103が1画素づつ短くなる。
さらに、CPU201は、衝突フラグがオンになっている場合は、つまり、人魚112が、障害オブジェクトあるいは障害画像に衝突した場合は、赤色のバー103が所定長(例えば、4画素分)だけ短くなるように、スプライトP0〜P7を選択して表示する。CPU201は、例えば、体力ゲージ131において、6個のスプライトがスプライトP7であり、一番右側が、スプライトP0であるときに、衝突フラグがオンになっている場合は、そのスプライトP0を外し、かつ、そのスプライトP0の左隣のスプライトP7に代えて、スプライトP4を表示する。これにより、バー103が4画素分短くなる。
[画像表示処理]CPU201は、背景制御処理、自動オブジェクト制御処理、カーソル制御処理、追従オブジェクト制御処理、及び、体力ゲージ制御処理、により登録された情報をもとに、描画に必要な情報を垂直ブランキング期間に、図7のグラフィックプロセッサ202に与える。すると、グラフィックプロセッサ202は、与えられた情報をもとに映像信号を生成して、映像信号出力端子47に出力する。これにより、テレビジョンモニタ90のスクリーン91に、人魚112等を含むゲーム画面が表示される。より具体的には、次の通りである。
CPU201は、障害オブジェクトPのアニメーションテーブルおよび自動オブジェクト制御処理で登録した座標情報をもとに、障害オブジェクトPを構成する各スプライトの表示座標を算出する。そして、CPU201は、障害オブジェクトPのアニメーションテーブルを参照して、障害オブジェクトPを構成する各スプライトの、表示座標情報、カラーパレット情報、デプス値、サイズ情報、及び、画素パターンデータ格納位置情報、をグラフィックプロセッサ202に与える。
また、CPU201は、カーソル111のアニメーションテーブルおよびカーソル制御処理で登録した座標情報(操作物150の注目点の座標情報)をもとに、カーソル111を構成する各スプライトの表示座標を算出する。そして、CPU201は、カーソル111のアニメーションテーブルを参照して、カーソル111を構成する各スプライトの、表示座標情報、カラーパレット情報、デプス値、サイズ情報、及び、画素パターンデータ格納位置情報、をグラフィックプロセッサ202に与える。
また、CPU201は、追従オブジェクト制御処理で登録したアニメーションテーブル格納位置情報にもとづいて、アニメーションテーブルを参照し、人魚112(オブジェクト)のサイズ情報、及び、人魚112を構成するスプライトのサイズ情報、を取得する。そして、CPU201は、これらの情報と、追従オブジェクト制御処理で算出した座標(xm[M],ym[M])と、をもとに、人魚112を構成する各スプライトの表示座標を算出する。また、CPU201は、これから表示する人魚112のオブジェクト番号、人魚112のサイズ情報、人魚112を構成するスプライトのサイズ情報、及び、アニメーション画像データの格納位置情報、をもとに、人魚112を構成する各スプライトの画素パターンデータ格納位置情報を算出する。
そして、さらに、CPU201は、アニメーションテーブルを参照して、人魚112を構成する各スプライトの、カラーパレット情報、デプス値、及び、サイズ情報を、各スプライトの画素パターンデータ格納位置情報及び表示座標情報とともに、グラフィックプロセッサ202に与える。この場合、CPU201は、アニメーションテーブルの持続フレーム数情報および次オブジェクト情報に従って、上記の情報をグラフィックプロセッサ202に与える。
また、CPU201は、体力ゲージ131の枠を構成する各スプライトの、カラーパレット情報、デプス値、サイズ情報、画素パターンデータ格納位置情報、及び、表示座標情報を、グラフィックプロセッサ202に与える。さらに、CPU201は、体力ゲージ制御処理で登録した、バー103を構成する各スプライトの、カラーパレット情報、デプス値、サイズ情報、画素パターンデータ格納位置情報、及び、表示座標情報を、グラフィックプロセッサ202に与える。
また、CPU201は、背景制御処理で登録したバックグラウンドスクリーン140の中心位置の配置座標、並びに、背景制御処理で設定した配列PA[0]〜配列PA[1023]の先頭アドレスおよび配列CA[0]〜配列CA[1023]の先頭アドレスを、グラフィックプロセッサ202に与える。グラフィックプロセッサ202は、与えられた先頭アドレスをもとに、配列PA[0]〜配列PA[1023]の情報を読み出して、それをもとに、ブロック[0]〜ブロック[1023]の画素パターンデータ格納位置情報を読み出す。また、グラフィックプロセッサ202は、与えられた先頭アドレスをもとに、配列CA[0]〜配列CA[1023]の情報を読み出す。
グラフィックプロセッサ202は、CPU201から与えられた情報および読みさした情報をもとに、障害オブジェクトP、カーソル111、人魚112、体力ゲージ131、及び背景120を表す映像信号を生成して、映像信号出力端子47に出力する。
[楽音再生]楽音の再生は、割込み処理により行われる。CPU201は、楽譜データポインタをインクリメントしながら、楽譜データ305を読み出して解釈する。なお、楽譜データポインタは、楽譜データ305の読み出し位置を示すポインタである。
そして、CPU201は、読み出した楽譜データ305に含まれるコマンドが、ノートオンであれば、その楽譜データ305に含まれるノートナンバが示す音の高さ(ピッチ)及び楽器指定情報が示す楽器(音色)に応じた波形データ(音源データ)306が格納されている先頭アドレスを、サウンドプロセッサ203に与える。さらに、CPU201は、読み出した楽譜データ305に含まれるコマンドが、ノートオンであれば、必要なエンベロープデータが格納されている先頭アドレスを、サウンドプロセッサ203に与える。さらに、CPU201は、読み出した楽譜データ305に含まれるコマンドが、ノートオンであれば、その楽譜データ305に含まれるノートナンバが示す音の高さ(ピッチ)に応じたピッチ制御情報、及び、その楽譜データ305に含まれるボリューム情報、をサウンドプロセッサ203に与える。
ここで、ピッチ制御情報について説明しておく。ピッチ制御情報は、波形データ(音源データ)306を読み出す周期を変えることによって行われるピッチ変換に用いられる。つまり、サウンドプロセッサ203は、ピッチ制御情報を一定期間毎に読み出して累算する。そして、サウンドプロセッサ203は、この累算結果を加工して、波形データ(音源データ)306のアドレスポインタとする。よって、ピッチ制御情報に大きな値が設定されれば、アドレスポインタのインクリメントは早く行われ、波形データ(音源データ)306の周波数が高くなり、ピッチ制御情報に小さな値が設定されれば、アドレスポインタのインクリメントは遅く行われ、波形データ(音源データ)306の周波数が低くなる。このようにして、サウンドプロセッサ203は、波形データ(音源データ)306のピッチ変換を行う。
サウンドプロセッサ203は、与えられたピッチ制御情報に基づいて、アドレスポインタをインクリメントしながら、与えられた先頭アドレスが示す位置に格納されている波形データ(音源データ)306をROM51から読み出す。そして、サウンドプロセッサ203は、順次読み出される波形データ(音源データ)306に、エンベロープデータ及びボリューム情報を乗算して、音声信号を生成する。このようにして、楽譜データ305が指示する楽器の音色、音の高さ(ピッチ)、及び、音量、の音声信号が生成され、音声信号出力端子49に出力される。
一方、CPU201は、読み出した楽譜データ305に含まれるゲートタイムを管理している。従って、CPU201は、ゲートタイムが経過した時に、該当する楽音の発音を終了するように、サウンドプロセッサ203に指示を出す。これを受けて、サウンドプロセッサ203は、指示された楽音の発音を終了する。
以上のようにして、楽譜データ305に基づいて楽曲が再生され、テレビジョンモニタ90のスピーカ(図示せず)から発音される。
次に、図1のゲーム装置1の全体の処理の流れの1例を、フローチャートを用いて説明する。
図29は、図1のゲーム装置1の全体の処理の流れの1例を示すフローチャートである。図29に示すように、ステップS1にて、CPU201は、システムの初期設定を実行する。
ステップS2にて、CPU201は、人魚112の体力を確認して、体力が「0」(体力ゲージ131のバー103の長さが「0」)ならば、所定の失敗画面を表示して、ゲームを終了し、体力が残っているならば、ステップS3に進む。ステップS3にて、CPU201は、人魚112がゴールに到着したか否かを判断して、到着したならば、所定の成功画面を表示して、ゲームを終了し、到着していない場合は、ステップS4へ進む。
ステップS4にて、CPU201は、操作物150の状態情報を算出する。ステップS5にて、CPU201は、背景120の表示を制御する。ステップS6にて、CPU201は、障害オブジェクトPの表示を制御する。ステップS7にて、CPU201は、操作物150の状態情報に基づいて、カーソル111の表示を制御する。
ステップS8にて、CPU201は、カーソル111の座標情報に基づいて、人魚112の表示を制御する(式(3)〜式(12)参照)。ステップS9にて、CPU201は、体力ゲージ131の表示を制御する。
ステップS10にて、CPU201は、「M」が所定値「K」より小さいかどうかを判断する。CPU201は、「M」が所定値「K」以上である場合、ステップS11に進み、「M」に「0」を代入して、ステップS12に進む。一方、CPU201は、「M」が所定値「K」より小さい場合、ステップS10からステップS12に進む。この「M」については、後述の説明の中で明らかになる。
ステップS12では、CPU201は、ビデオ同期の割込み待ちかどうかを判断する。CPU201は、テレビジョンモニタ90の表示画面を更新するための画像情報を、垂直ブランキング期間の開始後にグラフィックプロセッサ202に与える。従って、表示画面を更新するための演算処理が完了したら、ビデオ同期割込みがあるまで処理を進めないようにしている。ステップS12で「YES」であれば、即ち、ビデオ同期の割込み待ちであれば(ビデオ同期信号による割り込みがなければ)、同じステップS12に戻る。一方、ステップS12で「NO」であれば、即ち、ビデオ同期の割込み待ちでなければ(ビデオ同期信号による割り込みがあれば)、ステップS13に進む。
ステップS13にて、CPU201は、ステップS5〜ステップS9の結果に基づいて、ゲーム画面(図11〜図13参照)の生成に必要な画像情報を、グラフィックプロセッサ202に与える(画像表示処理)。そして、処理は、ステップS2に進む。
図30は、図29のステップS1の初期設定処理の流れの1例を示すフローチャートである。図30に示すように、ステップS20にて、CPU201は、イメージセンサ43の初期設定処理を実行する。ステップS21にて、CPU201は、各種フラグ及び各種カウンタを初期化する。ステップS22にて、CPU201は、タイマ回路210を発音のための割込み源としてセットする。なお、割込み処理により、サウンドプロセッサ203による処理が実行されて、テレビジョンモニタ90のスピーカから楽曲が出力される。
図31は、図30のステップS20のセンサ初期設定処理の流れの1例を示すフローチャートである。図31に示すように、最初のステップS30では、高速プロセッサ200は、設定データとして、コマンド“CONF”を設定する。ただし、このコマンド“CONF”は、イメージセンサ43に、高速プロセッサ200からコマンドを送信する設定モードに入ることを知らせるためのコマンドである。そして、次のステップS31にて、コマンド送信処理を実行する。
図32は、図31のステップS31のコマンド送信処理の流れの1例を示すフローチャートである。図32に示すように、最初のステップS40では、高速プロセッサ200は、設定データ(ステップS31の場合はコマンド“CONF”)をレジスタデータ(I/Oポート)に設定し、次のステップS41でレジスタ設定クロックCLK(I/Oポート)をローレベルに設定する。その後、ステップS42で規定時間待機した後、ステップS43で、レジスタ設定クロックCLKをハイレベルに設定する。そして、さらにステップS44での規定時間の待機の後、ステップS45でレジスタ設定クロックCLKを再びローレベルに設定する。
このようにして、図33に示すように、規定時間の待機を行いながら、レジスタ設定クロックCLKをローレベル,ハイレベルそしてローレベルとすることによって、コマンド(コマンドまたはコマンド+データ)の送信処理が行われる。
図31の説明に戻る。ステップS32では、ピクセルモードを設定するとともに、露光時間の設定を行う。この実施の形態の場合、イメージセンサ43は先に述べたようにたとえば32ピクセル×32ピクセルのCMOSイメージセンサであるため、設定アドレス“0”のピクセルモードレジスタに32ピクセル×32ピクセルであることを示す“0h”を設定する。次のステップS33において、高速プロセッサ200は、レジスタ設定処理を実行する。
図34は、図31のステップS33のレジスタ設定処理の流れの1例を示すフローチャートである。図34に示すように、最初のステップS50では、高速プロセッサ200は、設定データとして、コマンド“MOV”+アドレスを設定し、次のステップS51で、図32で先に説明したコマンド送信処理を実行して、それを送信する。次にステップS52において、高速プロセッサ200は、設定データとして、コマンド“LD”+データを設定し、次のステップS53でコマンド送信処理を実行して、それを送信する。そして、ステップS54で、高速プロセッサ200は、設定データとして、コマンド“SET”を設定し、次のステップS55でそれを送信する。なお、コマンド“MOV”は制御レジスタのアドレスを送信することを示すコマンドで、コマンド“LD”はデータを送信することを示すコマンドで、コマンド“SET”はデータをそのアドレスに実際に設定させるためのコマンドである。なお、この処理は、設定する制御レジスタが複数ある場合には、繰り返し実行される。
図31の説明に戻る。ステップS34では、設定アドレスを“1”(露光時間設定レジスタのローニブルのアドレスを示す)とし、最大露光時間を示す“FFh”のローニブルデータ“Fh”を設定すべきデータとして設定する。そして、ステップS35で図34のレジスタ設定処理を実行する。同様にして、ステップS36において、設定アドレスを“2”(露光時間設定レジスタのハイニブルのアドレスを示す)とし、最大露光時間を示す“FFh”のハイニブルデータ“Fh”を設定すべきデータとして設定し、ステップS37でレジスタ設定処理を実行する。
その後、ステップS38で設定終了を示しかつイメージセンサ43にデータの出力を開始させるためのコマンド“RUN”を設定し、ステップS39で送信する。このようにして、図30に示すステップS20でのセンサ初期設定処理が実行される。ただし、図31〜図34に示す具体例は、使用されるイメージセンサ43の仕様に応じて、適宜変更され得るものである。
図35は、図29のステップS4の状態情報算出処理の流れの1例を示すフローチャートである。図35に示すように、ステップS60にて、CPU201は、ADC208からデジタルのピクセルデータを取得する。このデジタルのピクセルデータは、イメージセンサ43からのアナログのピクセルデータが、ADC208により、デジタルに変換されたものである。
ステップS61にて、注目点抽出処理が実行される。具体的には、CPU201が、赤外発光ダイオード15の発光時のピクセルデータと消灯時のピクセルデータとの差分を算出して、差分データを得る。そして、CPU201が、その差分データの最大値を検出して、所定の閾値Thと比較する。さらに、CPU201は、差分データの最大値が所定の閾値Thを超えている場合は、その最大値の差分データを持つピクセルの座標を算出する。そして、さらに、CPU201は、以上のようにして算出した座標の移動平均を求め、これをテレビジョンモニタ90のスクリーン91上の座標に変換し、操作物150の注目点の座標(Ax[M],Ay[M])とする。
図36は、図35のステップS60のピクセルデータ群取得処理の流れの1例を示すフローチャートである。図36に示すように、最初のステップS70で、CPU201は、ピクセルデータ配列の要素番号としてXに「−1」、Yに「0」を設定する。本実施の形態におけるピクセルデータ配列は、X=0〜31、Y=0〜31の2次元配列であるが、前述のように各行の先頭ピクセルのデータとしてダミーデータが出力されるので、Xの初期値として「−1」が設定される。続くステップS71では、ピクセルデータの取得処理を実行する。
図37は、図36のステップS71のピクセルデータ取得処理の流れの1例を示すフローチャートである。図37に示すように、最初のステップS80で、CPU201は、イメージセンサ43からのフレームステータスフラグ信号FSFをチェックし、ステップS81でそのアップエッジ(ローレベルからハイレベルへの)が発生したかどうか判断する。そして、ステップS81でフラグ信号FSFのアップエッジを検出すると、次のステップS82において、CPU201は、ADC208に入力されてきたアナログのピクセルデータのデジタルデータへの変換の開始を指示する。その後、ステップS83でイメージセンサ43からのピクセルストローブPDSをチェックし、ステップS84でそのストローブ信号PDSのローレベルからハイレベルへのアップエッジが発生したかどうか判断する。
ステップS84で“YES”が判断されると、CPU201は、ステップS85において、X=−1かどうか、すなわち先頭ピクセルかどうか判断する。先に述べたように、各行の先頭ピクセルはダミーピクセルとして設定されているので、このステップS85で“YES”が判断されると、次のステップS87でそのときのピクセルデータを取得しないで、要素番号Xをインクリメントする。
ステップS85で“NO”が判断されると、行の第2番目以降のピクセルデータであるので、ステップS86およびS88において、そのときのピクセルデータを取得し、テンポラリレジスタ(図示せず)にそのピクセルデータを格納する。その後、図36のステップS72に進む。
図36のステップS72では、テンポラリレジスタに格納されたピクセルデータをピクセルデータ配列P[Y][X]に代入する。
続くステップS73でXをインクリメントする。Xが32に満たない場合、前述のS71からS73の処理を繰り返し実行する。Xが32の場合、すなわちピクセルデータの取得が行の終端に到達した場合には、続くステップS75でXに「−1」を設定し、ステップS76でYをインクリメントし、次の行の先頭からピクセルデータの取得処理を繰り返す。
ステップS77でYが32の場合、すなわちピクセルデータの取得がピクセルデータ配列P[Y][X]の終端に到達した場合、図35のステップS61に進む。
図38は、図35のステップS61の注目点抽出処理の流れの1例を示すフローチャートである。図38に示すように、ステップS90にて、CPU201は、イメージセンサ43からの、赤外発光ダイオード15の点灯時のピクセルデータと、赤外発光ダイオード15の消灯時のピクセルデータと、の差分を算出して、差分データを得る。ステップS91にて、CPU201は、配列Dif[X][Y]に、算出した差分データを代入する。ここで、実施の形態では、32ピクセル×32ピクセルのイメージセンサ43を用いているため、X=0〜31、Y=0〜31、である。
ステップS92にて、CPU201は、配列Dif[X][Y]の全要素をスキャンして、その最大値を検出する。CPU201は、最大値が所定の閾値Thより大きい場合は、ステップS94に進み、所定の閾値Th以下の場合は、図29のステップS10に進む(ステップS93)。
ステップS94にて、CPU201は、その最大値の座標を基に、操作物150の注目点の座標(Xc,Yc)を算出する。ステップS95にて、CPU201は、回数Mの値を1つインクリメントする(M=M+1)。
ステップS96にて、CPU201は、座標Xc及びYcをそれぞれ、配列PX[M]及びPY[M]に代入する。ステップS97にて、CPU201は、操作物150の注目点(Xc,Yc)の移動平均(AX[M],AY[M])を算出する。ステップS98にて、CPU201は、イメージセンサ43上の注目点の平均座標(AX[M],AY[M])を、テレビジョンモニタ90のスクリーン91上の座標(xc,yc)に変換する。
図39は、図38のステップS94の注目点座標算出処理の流れの1例を示すフローチャートである。図39に示すように、ステップS100にて、CPU201は、「m」及び「n」にそれぞれ、ステップS92で求めた最大値のX座標及びY座標を代入する。ステップS101にて、CPU201は、「m」を1つインクリメントする(m=m+1)。CPU201は、差分データDif[m][n]が、所定の閾値Thより大きい場合は、ステップS103に進み、そうでない場合は、ステップS104に進む(ステップS102)。ステップS103にて、CPU201は、「mr」にそのときの「m」を代入する。このように、ステップS101〜S103を繰り返しながら、最大値からX軸の正方向にスキャンを実行して、値が所定の閾値Thを超える一番端の差分データのX座標を求める。
ステップS104にて、CPU201は、「m」に、ステップS92で求めた最大値のX座標を代入する。ステップS105にて、CPU201は、「m」を1つデクリメントする。CPU201は、差分データDif[m][n]が、所定の閾値Thより大きい場合は、ステップS107に進み、そうでない場合は、ステップS108に進む(ステップS106)。ステップS107にて、CPU201は、「ml」にそのときの「m」を代入する。このように、ステップS105〜S107を繰り返しながら、最大値からX軸の負方向にスキャンを実行して、値が所定の閾値Thを超える一番端の差分データのX座標を求める。
ステップS108にて、CPU201は、X座標mrとX座標mlとの中心座標を算出して、それを、注目点のX座標(Xc)とする。ステップS109にて、CPU201は、「m」及び「n」にそれぞれ、ステップS108で求めた「Xc」およびステップS92で求めた最大値のY座標を代入する。ステップS110にて、CPU201は、「n」を1つインクリメントする(n=n+1)。CPU201は、差分データDif[m][n]が、所定の閾値Thより大きい場合は、ステップS112に進み、そうでない場合は、ステップS113に進む(ステップS111)。ステップS112にて、CPU201は、「nd」にそのときの「n」を代入する。このように、ステップS110〜S112を繰り返しながら、最大値からY軸の正方向にスキャンを実行して、値が所定の閾値Thを超える一番端の差分データのY座標を求める。
ステップS113にて、CPU201は、「n」に、ステップS92で求めた最大値のY座標を代入する。ステップS114にて、CPU201は、「n」を1つデクリメントする。CPU201は、差分データDif[m][n]が、所定の閾値Thより大きい場合は、ステップS116に進み、そうでない場合は、ステップS117に進む(ステップS115)。ステップS116にて、CPU201は、「nu」にそのときの「n」を代入する。このように、ステップS114〜S116を繰り返しながら、最大値からY軸の負方向にスキャンを実行して、値が所定の閾値Thを超える一番端の差分データのY座標を求める。
ステップS117にて、CPU201は、Y座標ndとY座標nuとの中心座標を算出して、それを、注目点のY座標(Yc)とする。以上のようにして、操作物150の注目点の座標(Xc,Yc)が算出される。
図40は、図29のステップS8の追従オブジェクト制御処理の流れの1例を示すフローチャートである。図40に示すように、ステップS140にて、CPU201は、式(3)及び式(4)により、人魚112の表示座標(xm[M],ym[M])を算出して登録する。
ステップS141にて、CPU201は、衝突フラグを参照して、現在表示中のフレームにおいて、人魚112が、障害画像Qあるいは障害オブジェクトPに衝突したか否かを確認する。その結果、CPU201は、衝突フラグがオンの場合は、ステップS151に進み、オフの場合は、ステップS142に進む(ステップS141)。
ステップS142にて、CPU201は、人魚112のx方向の移動距離mxと所定値xrとを比較する。また、CPU201は、人魚112のy方向の移動距離myと所定値yrとを比較する。ステップS143にて、CPU201は、ステップS142の比較結果に基づいて、角度フラグをセットする(図22(a)参照)。
ステップS144にて、CPU201は、人魚112の速度ベクトル(Vxm[M],Vym[M])の符号を判定する。ステップS145にて、CPU201は、ステップS144の結果に基づいて、方向フラグをセットする(図22(b)参照)。
ステップS146にて、CPU201は、角度フラグ及び方向フラグを参照して、移動方向情報を決定する(図22(c)参照)。ステップS147にて、CPU201は、決定した移動方向情報に従って、アニメーションテーブル格納位置情報を登録する(図24参照)。
さて、一方、ステップS151にて、CPU201は、人魚112が衝突したものが、障害画像Qが否かを判定する。判定の結果、CPU201は、障害画像Qに衝突した場合は、ステップS152に進み、そうでない場合、即ち、障害オブジェクトPに衝突した場合は、ステップS153に進む。
ステップS152にて、CPU201は、背景120のスクロール速度を基に、再び人魚112の表示座標を算出し、そして、再登録する。より具体的は、CPU201は、人魚112のx座標に、スクロール速度のx成分を加えたものを、人魚112の新たなx座標とする。なお、人魚のy座標は、前回のy座標を維持する。一方、ステップS153にて、CPU201は、現在表示中の人魚112の座標を再登録する。
ステップS154にて、CPU201は、人魚112が衝突した際に使用するアニメーションテーブルの格納位置情報を登録する。ステップS155にて、CPU201は、衝突フラグをオフにする。
ステップS148にて、CPU201は、ステップS140で算出した人魚112の座標をもとに、人魚112と、障害画像Q及び障害オブジェクトPと、の間での衝突判定を行う(図26及び図27参照)。そして、CPU201は、衝突したと判定したときは、衝突フラグをオンにする。
さて、以上のように本実施の形態では、操作物150自体の動きに連動して、カーソル111(連動オブジェクト)が移動するため、カーソル111の直感的な操作が可能となって、容易な操作によりゲームを行うことができる。
また、カーソル111は操作物150のスクリーン91上の位置を表すものであるため、カーソル111の動きは操作物150に同期あるいはほぼ同期している必要がある。このため、カーソル111の制御は、操作物150の動きに拘束される。一方、人魚112(追従オブジェクト)はカーソル111の動きに追従するものであるため、どのような態様でカーソル111に追従させるかは任意に決定できる。従って、人魚112の動きに趣向をこらすことができ、視覚的効果を大きくすることができる。本実施の形態では、人魚112の動きに、カーソル111との位置関係で決定される加速度、および、人魚112の速度に応じた抵抗、を加味して、人魚112があたかも水中を移動しているかのような視覚的効果を与えている(式(3)及び式(4)参照)。
また、本実施の形態では、CPU201は、体力ゲージ131(プレイヤ94がゲームを継続できる指標となる情報)を管理して、体力ゲージ131に基づいて、ゲームを終了させる。つまり、本実施の形態では、体力ゲージ131のバー103の長さが「0」になったら、ゲームオーバーとなる。このようにすれば、プレイヤ94は、無制限にゲームを実行できなくなるので、緊張感が増して、より面白みを増すことができる。
さらに、本実施の形態では、人魚112が制限画像(障害オブジェクトPあるいは障害画像Q)が表示される領域に接触あるいは侵入したときに、体力ゲージ131を、第1の規則(原則的な規則)ではない第2の規則(プレイヤ94に不利な例外的な規則)に従って変更する。つまり、本実施の形態では、このような場合、体力ゲージ131のバー103が急激に短くなる。このようにすれば、プレイヤ94は、その制限画像を回避するように、カーソル111を介して人魚112を操作する必要があり、より一層面白みが増す。
さらに、本実施の形態では、人魚112が、アイテム110,126が表示される領域に接触あるいは侵入したときに、体力ゲージ131を、第1の規則(原則的な規則)ではない第3の規則(プレイヤ94に有利な例外的な規則)に従って変更する。つまり、本実施の形態では、このような場合、体力ゲージ131のバー103を所定長だけ長くする。このようにすれば、プレイヤ94は、そのアイテム110,126を取得するように、カーソル111を介して人魚112を操作する必要があり、より一層面白みが増す。
さらに、本実施の形態では、背景120に障害画像Qが含まれため、背景120のスクロール制御と障害画像Qの制御とが同義である。このため、障害画像Qの表示制御が容易になる。
さらに、本実施の形態では、障害オブジェクトPを、単数又は複数のスプライトにより構成しているため、障害オブジェクトPの詳細な表示制御が可能となって、ゲーム内容の設計の自由度が大きくなる。
さらに、本実施の形態では、操作物150の状態情報として、速さ情報、移動方向情報、移動距離情報、速度ベクトル情報、加速度情報、移動軌跡情報、面積情報、若しくは、位置情報、のいずれか、又は、それらの2以上の組み合わせ、を利用できる。このため、操作物150の様々な情報を利用して、カーソル111及び人魚112を制御できるため、ゲーム内容の設計の自由度が大きくなる。
さらに、本実施の形態では、操作物150に間欠的に光を照射して、これを撮影することにより、操作物150の状態情報を求める。このため、操作物150の状態情報を求めるために、操作物150に電源により駆動する回路を内蔵する必要がない。よって、操作物150の操作性及び信頼性の向上を図ることができ、また、コストの低減を図ることができる。
さて、次に、本実施の形態の変形例を説明する。図41は、本実施の形態の変形例におけるゲーム画面の例示図である。なお、図41において、図11と同様の部分については、同一の参照符号を付している。図41に示すように、テレビジョンモニタ90のスクリーン91に表示されるゲーム画面は、迷路であり、この迷路は、通路133及び壁134を含む。プレイヤ94は、操作物150を操作して、ゲーム画面のカーソル135を操作する。このカーソル135は、図11〜図13のカーソル111と同様のものであり、操作物150に連動する。なお、カーソル135の制御は、カーソル111の制御と同様である。
プレイヤ94は、操作物150によりカーソル135を操作して通路133を進んでいく。スクリーン91の右端あるいは左端までカーソル135が移動したら、ゲーム画面がスクロールされる。なお、スクロール制御については、上記の実施の形態と同様である。従って、このゲーム画面は、バックグラウンドスクリーン140として構成される(図15参照)。
図42は、図41のゲーム画面における衝突判定の説明図である。図42に示すように、バックグラウンドスクリーン140のうち、スクリーン91に表示された領域(28×32ブロック)を考える。そして、この28×32ブロックに対応した配列JA[0]〜JA[895]を用意する。なお、配列JA[0]〜JA[895]を包括して表現するときは、配列JAと表記する。ここで、通路133を構成するブロックに対応する配列JAには、「0」を代入し、壁134を構成するブロックに対応する配列JAには、「1」を代入する。
CPU201は、操作物150の注目点が位置するブロックに対応する配列JAの要素をチェックする。そして、CPU201は、該当する配列JAの要素が「1」ならば、以下のようにして、カーソル135を壁134まで移動させる。つまり、カーソル135は、壁134を越えて移動することはできない。
図43は、図41のカーソル135が壁134に衝突した場合の座標算出の説明図である。図43に示すように、例えば、要素が「1」の配列JA[10]に対応するブロック149を考える。そして、注目点の前回の位置が点Aであり、注目点の今回の位置が点Bであるとする。この場合は、まず、CPU201は、直線ABが、直線ab、直線bc、直線cdおよび直線daのいずれと交わるかを算出する。つまり、2つのベクトル外積が「0」であれば、その2つのベクトルの交点は存在しない。
次に、CPU201は、直線ABが交差する直線acと直線ABとの交点Iを算出する。そして、CPU201は、この交点Iの座標を、カーソル135の今回の表示座標とする。こうすれば、カーソル135が、壁134に進入することはない。
この変形例によれば、実施の形態と同様に、操作物150自体の動きに連動して、カーソル135が移動するため、カーソル135の直感的な操作が可能となって、容易な操作により迷路ゲームを行うことができる。
なお、カーソル135を中心とした所定範囲だけを、スポットを当てたように視認できるようにして、他の領域を暗くするようにすることもできる。こうすれば、迷路が単純だったとしても、難易度が高くなり、より面白みが増す。
また、上記の例では、カーソル135を操作物150により操作して、迷路を移動させたが、図11等に示したように、カーソル135とは別に、追従オブジェクトを表示して、この追従オブジェクトをカーソル135を介して操作し、迷路を移動するようにすることもできる。この場合、例えば、カーソル135の制御は実施の形態と同様とし、追従オブジェクトの制御は、人魚112の制御と同様とすることができる。
さて、上記では、操作物150の注目点が、要素が「1」の配列JAに対応するブロックに進入した場合は、カーソル135を、通路133と壁134との境界まで移動させることとして、カーソル135の動きを通路133内に規制した。しかし、他の例として、操作物150の注目点の位置が、要素が「1」の配列JAに対応するブロック149にある場合は、ゲームオーバーとすることもできる。従って、この場合、プレイヤ94は、壁134に接触しないように、カーソル135を操作しなければならない。なお、この場合も、図11等に示したように、カーソル135とは別に、追従オブジェクトを表示して、この追従オブジェクトをカーソル135を介して操作し、迷路を移動するようにすることもできる。
この変形例によれば、実施の形態と同様に、操作物150自体を動かして、カーソル135を操作できるため、障害物に相当する壁134がスクリーン91上に存在するにもかかわらず、あたかも、実空間に存在する障害物を回避しながら、操作物150を動かしているような印象をプレイヤ94に与えることができる。また、実空間に存在する障害物を回避する内容のゲーム装置と比較して、コストの低減、および、省スペース化、を図ることができる。
なお、本発明は、上記の実施の形態に限られるものではなく、その要旨を逸脱しない範囲で種々の態様において実施することが可能であり、例えば、以下のような変形も可能である。
(1)実施の形態では、追従オブジェクトとしての人魚112をカーソル111(連動オブジェクト)に追従させた。しかし、追従オブジェクトとしての人魚112を表示せず、カーソル111として、人魚112を表示することもできる。この場合は、プレイヤ94は、操作物150を操作して、カーソル111としての人魚112を移動させることになる。このように、この例では、プレイヤ94は、操作物150により直接的に人魚112を操作することになる。なお、実施の形態では、プレイヤ94は、操作物150によりカーソル111を介して間接的に人魚112を操作する。
(2)実施の形態では、操作物として、スティック152および反射ボール151からなる操作物150を採用したが、反射体(例えば、再帰反射シート)を具備するのもであれば、操作物の形態はこれに限定されない。
(3)実施の形態では、図20(a)〜図20(d)に示すようにして、操作物150の注目点の座標を算出したが、所定の閾値Thを超える最大輝度値を持つピクセルの座標を、スクリーン91上の座標に変換して、これを注目点の座標とすることもできる。
(4)図6の高速プロセッサ200として、任意の種類のプロセッサを使用できるが、本件出願人が既に特許出願している高速プロセッサを用いることが好ましい。この高速プロセッサは、例えば、特開平10−307790号公報およびこれに対応するアメリカ特許第6,070,205号に詳細に開示されている。