図1を参照して、この発明の一実施例であるゲーム機10はケース12を含む。このゲーム機10としては、ゲームボーイアドバンス(GAMEBOY ADVANCE :商品名)のような携帯型のゲーム機などを適用することができる。ケース12の表面には、その略中央にカラーの液晶表示器(以下、「LCD」という。)14が設けられる。このLCD14には、ゲーム空間およびそのゲーム空間内に存在するプレイヤオブジェクト等のゲームキャラクタが表示されるとともに、必要に応じてメッセージが表示される。また、ケース12の表面には、操作ボタン16,18,20,22,24,26,28が設けられる。操作ボタン16,18および20はLCD14の左方に配置され、操作ボタン22および24はLCD14の右方に配置される。さらに、操作ボタン26および28は、ケース12の上側(LCD14の上方)の端面(天面)に配置される。
操作ボタン16は、ディジタルジョイスティックとして機能する十字ボタンであり、4つの押圧部の1つを操作することによって、LCD14上に表示されたゲームキャラクタの移動方向を指示したり、カーソルを移動させたりすることができる。操作ボタン18は、プッシュボタンで構成されたスタートボタンであり、ゲーム開始を指示するため等に利用される。操作ボタン20は、プッシュボタンで構成されたセレクトボタンであり、ゲームモードの選択等に利用される。
操作ボタン22は、プッシュボタンで構成されたAボタンであり、LCD14上に表示されたゲームキャラクタ(プレイヤオブジェクト)に打つ、投げる、つかむ、ジャンプする、飛び乗る、剣で斬る、話かけるなどの任意のアクションをさせることができる。操作ボタン24は、プッシュボタンで構成されたBボタンであり、セレクトボタン20で選択したゲームモードの変更やAボタン22で決定したアクションの取り消し等のために利用される。操作ボタン26は、プッシュボタンで構成された左押しボタン(Lボタン)であり、操作ボタン28は、プッシュボタンで構成された右押しボタン(Rボタン)である。操作ボタン26および操作ボタン28は、Aボタン22およびBボタン24と同様の操作をすることができ、また、Aボタン22およびBボタン24の補助的な操作をすることができる。
また、ケース12の裏面上端部には、挿入口30が形成される。この挿入口30には、ゲームカートリッジ32が挿入される。図示は省略するが、挿入口30の奥部とゲームカートリッジ32の挿入方向先端部とには、それぞれコネクタが設けられており、ゲームカートリッジ32が挿入口30に挿入されたとき、2つのコネクタが互いに接続される。このため、ゲームカットリッジ32がゲーム機10のCPU40(図2参照)でアクセス可能となる。
さらに、ケース12の表面でありAボタン22およびBボタン24の下方には、ゲーム中にBGMやゲームキャラクタの音声或いは擬声音などを出力するためのスピーカ34が設けられる。
なお、図示は省略するが、ケース12の天面側にはさらに、外部拡張コネクタが設けられ、ケース12の裏面側には、電池収容ボックスが設けられ、そして、ケース12の底面側には電源スイッチ、音量ボリュームおよびイヤフォンジャックなどが設けられる。
ゲーム機10の電気的な構成は図2のように示される。この図2を参照して、ゲーム機10には、上述したようにCPU40が設けられ、このCPU40は、コンピュータまたはプロセサなどとも呼ばれ、ゲーム機10の全体制御を司る。CPU40またはコンピュータには、内部バスを介して上述したLCD14,操作部42およびワークメモリ44が接続されるとともに、コネクタ46および送受信バッファ48等も接続される。
LCD14にはCPU40から表示データが与えられて、ゲーム画像が表示される。なお、図示は省略しているが、CPU40にはたとえばVRAMおよびLCDコントローラ等が接続されていて、CPU40の指示の下、VRAMに背景画像データ,プレイヤオブジェクト等のオブジェクト画像データやゲーム画像データが描画される。そして、LCDコントローラは、CPU40の指示に従ってVRAMに描画されたゲーム画像データ(表示データ)を読み出し、LCD14にオブジェクトやゲーム画面(表示画面)等を表示する。
操作部42は上述した各操作ボタン16,18,20,22,24,26,28を含み、これら各操作ボタンの操作に応じた操作入力信号がCPU40に与えられる。したがって、CPU40は操作部42を通して与えられたプレイヤ(ユーザ)の指示に従った処理を実行する。
ワークメモリ44は書込み読出し可能なメモリであって、CPU40の作業領域またはバッファ領域として用いられる。送受信バッファ48は、たとえば、多人数用ゲームの通信プレイ等の際の送受信データを一時的に蓄積しておくためのものであり、外部拡張コネクタ50に接続される。このコネクタ50に、図示しない通信ケーブルを用いて他のゲーム機10と接続することによって、複数のゲーム機10の間でデータ通信が可能になる。
また、図示は省略してあるが、CPU40にはサウンド回路を介して図1に示したスピーカ34が接続されていて、CPU40からサウンド回路に音声データが与えられてスピーカ34からゲーム音楽や効果音などのゲームに必要な音が出力される。
ゲームカートリッジ32にはROM52およびRAM54が内蔵されており、ROM52とRAM54とは互いにバスで接続されるとともに、コネクタ56に接続される。したがって、上述したように、ゲームカートリッジ32がゲーム機10に装着されて、コネクタ46とコネクタ56とが接続されると、CPU40はROM52およびRAM54に電気的に接続される。したがって、CPU40は、たとえばROM52の所定の領域から所定のプログラムデータを読み出してワークメモリ44に展開したり、RAM54から所定のバックアップデータを読み出してワークメモリ44に書き込んだり、ゲームの進行状況に応じてワークメモリ44に生成したゲームデータ等をRAM54の所定の領域に書き込んで保存したりすることができる。
なお、RAM54としては、不揮発性メモリであるフラッシュメモリを適用することができるが、他の不揮発性メモリとして、たとえば強誘電体メモリ(FeRAM)やEEPROM等を適用することもできる。また、電池を電源とするSRAMやDRAM等を用いることもできる。
図3は、ROM52のメモリマップの一例を示す図解図である。この図3を参照して、ROM52は、ゲームプログラム記憶領域52aおよびゲームデータ記憶領域52bを含む。ゲームプログラム記憶領域52aには、コントローラ入力検出プログラム60,オブジェクト制御プログラム62,背景制御プログラム64,オブジェクト表示プログラム66,背景表示プログラム68,通信制御プログラム70,サウンド制御プログラム72,ゲーム進行制御プログラム74およびその他のゲームプログラム76のようなゲームプログラムが予め格納される。
コントローラ入力検出プログラム60は、操作部42に設けられるコントロールバッファ(図示せず)に保持されたプレイヤの各ボタン操作に従う操作入力信号を検出するプログラムである。オブジェクト制御プログラム62は、ゲーム空間内に存在するオブジェクトを発生したり、配置したり、移動を制御したりするプログラムである。たとえば、プレイヤの操作等に従って、プレイヤオブジェクトを発生したり、配置したり、ゲーム空間内を自由に移動させたりする。また、プレイヤの操作等に従って、敵オブジェクト、ブロック(床や階段を含む。)オブジェクト或いはアイテムのようなノンプレイヤオブジェクトを発生したり、配置したり、回転させるなどの動作(移動)をさせたりする。背景制御プログラム64は、後述する背景表示プログラム68によって表示される背景画像を、背景画像データ82やマップデータ84等に基づいて発生させるためのプログラムである。
オブジェクト表示プログラム66は、オブジェクト画像データ80に基づいて、プレイヤオブジェクトやノンプレイヤオブジェクトをLCD14に表示するためのプログラムである。背景表示プログラム68は、上述したように、背景制御プログラム64によって発生された背景画像をLCD14に表示するためのプログラムである。通信制御プログラム70は、他のゲーム機10との間におけるデータ通信を制御するためのプログラムである。
サウンド制御プログラム72は、ゲーム音楽(BGM)、効果音のようなうゲームに必要な音を生成および出力するためのプログラムである。ゲーム進行制御プログラム74は、プログラマ等の開発者が作成したシナリオもしくはストーリまたはコース(ステージ)に従ってゲームを進行させるためのプログラムである。その他のゲームプログラム76としては、バックアップ制御プログラムなどが該当する。このバックアップ制御プログラムは、ゲームの進行に従って生成され、ワークメモリ44に一時記憶されるゲームデータを、プレイヤの指示に従って、或いは所定のイベントに応じて自動で、バックアップメモリとしてのRAM54に保存(セーブ)するプログラムである。
また、ゲームデータ記憶領域52bには、オブジェクト画像データ80,背景画像データ82,マップデータ84,サウンドデータ86およびその他のデータ90が予め格納される。オブジェクト画像データ80は、プレイヤオブジェクト、ノンプレイヤオブジェクトなどのオブジェクトについてのポリゴンデータやテクスチャデータのような画像データ(以下、同様である。)である。背景画像データ82は、ゲーム空間の背景についての画像データである。マップデータ84は、ゲームプログラマ等の開発者が意図するゲーム空間(マップ)を構成するためのデータであり、マス目で切ったマップにおいてその1マスないしユニットにどんな背景(足場(床、階段、ブロック)、壁等の地形や移動可能領域等)が配置されているかを示すものである。この実施例のゲーム空間は、たとえば、いくつかのコースないしステージを含み、背景画像は、たとえば1つのコースないしステージ全体に相当するものであり、LCD14の表示領域よりも大きい。サウンドデータ86は、ゲームに必要な音(音楽)を生成するためのデータである。オブジェクト配置データ88は、プレイヤオブジェクトやノンプレイヤオブジェクトなどのオブジェクトをゲーム世界に配置するための位置データである。その他のデータ90としては、ゲームの進行に従って発生され、または更新されるゲームデータ(バックアップデータ)などが該当する。
図4は、ワークメモリ44のメモリマップの一例を示す図解図である。この図4を参照して、ワークメモリ44は、プログラム記憶領域44aおよびデータ記憶領域44bを含む。プログラム記憶領域44aには、ゲームカートリッジ32のROM52から読み出したゲームプログラムが、一度に全部または部分的かつ順次的に記憶される。具体的には、プログラム記憶領域44aには、コントローラ入力検出プログラム60およびオブジェクト制御プログラム62、そして、図示は省略するが、その他のプログラム(64,66,68,70,72,74,76)が記憶される。CPU40はこのゲームプログラムに従ってゲーム処理を実行する。
オブジェクト制御プログラム62は、さらに、オブジェクト配置プログラム620、プレイヤオブジェクトプログラム622および回転オブジェクトプログラム624によって構成される。オブジェクト配置プログラム620は、プレイヤオブジェクトやノンプレイヤオブジェクトなどのオブジェクトを発生し、そのようなオブジェクトを、オブジェクト配置データ88に従ってゲーム空間に配置するプログラムである。プレイヤオブジェクトプログラム622は、プレイヤオブジェクト位置検出プログラム622a、プレイヤオブジェクト動作プログラム622bおよび位置補正プログラム622cを含む。プレイヤオブジェクト位置検出プログラム622aは、ゲーム空間におけるプレイヤオブジェクトの位置を検出するプログラムである。この実施例では、2次元のゲーム空間が展開されるため、プレイヤオブジェクトのX座標およびY座標が検出される。プレイヤオブジェクト動作プログラム622bは、コントローラ入力検出プログラム60によって検出された操作入力信号に基づいて、プレイヤオブジェクトをジャンプさせたり、移動させたりするなどのアクションをさせるためのプログラムである。位置補正プログラム622cは、後述する回転オブジェクトなど、プレイヤオブジェクトが乗ることができるオブジェクト(床や階段のようなオブジェクトを含む。)に対するプレイヤオブジェクトの位置を補正(調整)するためのプログラムである。
また、回転オブジェクトプログラム624は、回転角検出プログラム624a,チェック三角形判別プログラム624b,三角形位置計算プログラム624cおよび当り判定プログラム624dを含む。回転角検出プログラム624aは、注目(着目)すべき回転オブジェクトの回転角を検出するプログラムである。ここで、注目すべき回転オブジェクトは、プレイヤオブジェクトの位置に基づいて、当りを判定される回転オブジェクトを意味する。チェック三角形判別プログラム624bは、回転オブジェクトを複数の三角形を用いて分解した場合に、プレイヤオブジェクトの位置に基づいて、当該プレイヤオブジェクトと回転オブジェクトとの当りを判定する(チェックする)三角形を判別(決定)するプログラムである。三角形位置計算プログラム624cは、チェック三角形判別プログラム624bによって決定された三角形の位置(頂点座標)を計算するプログラムである。当り判定プログラム624dは、チェック三角形決定プログラム624bによって決定された三角形とプレイヤオブジェクトとの当りを判定するプログラムである。
データ記憶領域44bには、ゲームカートリッジ32のROM52から読み出したゲームデータおよびゲーム中に生成されたゲームデータが記憶される。具体的には、プレイヤオブジェクト位置データ92、プレイヤオブジェクト向きデータ94、プレイヤオブジェクト画像データ96、回転オブジェクト位置データ98、回転オブジェクト回転角度データ100、チェック三角形フラグ102、当り判定座標データ104および位置補正量データ106が、データ記憶領域44bに記憶される。
プレイヤオブジェクト位置データ92は、プレイヤオブジェクト検出プログラム622aによって検出されたプレイヤオブジェクトの位置(座標)を示すデータである。プレイヤオブジェクト向きデータ94は、2次元のゲーム空間内におけるプレイヤオブジェクトの移動方向(上、下、右、左)を示すデータである。プレイヤオブジェクト画像データ96は、上述したように、プレイヤオブジェクトをLCD14に表示するための画像データである。
回転オブジェクト位置データ98は、2次元のゲーム空間に配置される回転オブジェクトの位置すなわちX座標およびY座標を示すデータである。ただし、複数の回転オブジェクトが存在する場合には、各々のX座標およびY座標を示すデータが記述される。この回転オブジェクト位置データ98は、ROM52のデータ記憶領域52bからロードされたオブジェクト配置データ88から取得される。回転オブジェクト回転角度データ100は、回転角検出プログラム624aによって検出された回転オブジェクトの回転角度についてのデータである。
チェック三角形フラグ102は、回転オブジェクトを分解した複数の(この実施例では、後述するように、4つの)三角形についてのフラグであり、当該複数に相当するビット数のレジスタで構成される。各ビットは、分解した複数の三角形のそれぞれに対応し、チェック三角形決定プログラム624bによって決定された三角形についてのフラグがオンされ、それ以外の三角形についてのフラグはオフされる。フラグがオンされると、対応するレジスタのデータ値が“1”にされ、フラグがオフされると、対応するレジスタのデータ値が“0”にされる。
当り判定座標データ104は、当りを判定する三角形が決定された場合に、その基準となる点(基準点)のX座標およびY座標を示すデータである。位置補正量データ106は、プレイヤオブジェクトと回転オブジェクトとの当りを判定した場合に、プレイヤオブジェクトの位置を上下方向(Y軸方向)或いは左右方向(X軸方向)に補正する補正量のデータである。
なお、図示は省略するが、その他のデータとして、上述したようなプレイヤオブジェクト以外のオブジェクトについてのオブジェクト画像データ80,背景画像データ82、マップデータ84およびサウンドデータ92が記憶され、さらに、ゲーム進行に必要なその他のゲームデータやフラグデータ等も記憶される。
たとえば、図1に示したゲーム機10では、プレイヤオブジェクトが敵オブジェクトを倒したり、所定のアイテムを獲得したりしながら、各コースないしはステージのゴールを目指し、最終的な目標を達成するようなゲームが実行される。各コースないしはステージは、デザイナやプログラマのような開発者によって設計され、様々な背景オブジェクトやアイテム、さらには、敵オブジェクト等が配置される。
図5(A)および図5(B)は、コースに配置される背景オブジェクトとしての回転オブジェクト200とプレイヤオブジェクト202との関係を示す図解図である。この実施例では、回転オブジェクト200は正方形であり、1または複数の回転オブジェクト200が各コースの所定の位置であり、空中に浮いて配置される。ただし、一部のコースのみに配置するようにしてもよい。図5(A)に示すように、回転オブジェクト200が回転していない状態では、プレイヤオブジェクト202は、当該回転オブジェクト200の上に乗ることができ、さらに、その上を歩くことができる。また、プレイヤオブジェクト202は、回転オブジェクト200の横或いは下から当該回転オブジェクト200の方向へ移動すると、プレイヤオブジェクト202の体或いは頭部が回転オブジェクト200の側面或いは下面に当たる。
また、図5(B)に示すように、回転オブジェクト200が任意の角度だけ回転した状態では、プレイヤオブジェクト202は、当該回転オブジェクト200の上に乗ることができるが、回転オブジェクト200が回転することにより形成された斜面を下に向いている方向に滑る。また、プレイヤオブジェクト202は、回転オブジェクト200の横或いは下から当該回転オブジェクト200の方向へ移動すると、プレイヤオブジェクト202の頭部が回転オブジェクト200の下方斜面に当たる。ただし、斜面が急な場合には、プレイヤオブジェクト202の体が回転オブジェクト200の斜面に当たる場合もある。
このような回転オブジェクト200とプレイヤオブジェクト202との当りを正確に判断しない場合には、LCD14に表示されるゲーム画像では、プレイヤオブジェクト202が回転オブジェクト200をすり抜けてしまったり、回転オブジェクト200に埋もれてしまったり、さらには、回転オブジェクト200との間に隙間ができてしまったりしてしまう。これでは、プレイヤは違和感を感じてしまい、ゲームへの興味を減退させてしまうことになる。
このため、プレイヤオブジェクト202と回転オブジェクト200との当りを正確に判断して、プレイヤオブジェクト202の位置を補正する必要がある。このような補正をする場合には、たとえば、所定フレーム(この実施例では、1フレーム)毎のプレイヤオブジェクト202の位置を検出して、回転オブジェクト200との当りを判定し、当たっていると判定した場合には、次の1フレームにおけるプレイヤオブジェクト202の位置を補正する。
たとえば、図6(A)に示すように、プレイヤオブジェクト202が回転オブジェクト200の上側右斜面に乗る場合には、当りを判定する上側右斜面を決定した後に、図6(B)に示すように、プレイヤオブジェクト202のX方向の当りと、Y方向の当りとが判定される。さらに、Y方向では、プレイヤオブジェクト202が回転オブジェクト200のようなオブジェクトをすり抜けるなどの不都合を無くすために、J線およびK線で挟む範囲(J線およびK線の両方)のように、Y方向に厚みを設けて、当該範囲について当りを判定するのが一般的である。
しかし、このような当り判定方法では、Y方向について2回当りを判定する必要があるため、判定回数が多くなってしまう。
そこで、この実施例では、回転オブジェクト200が回転した場合には、当該回転オブジェクト200を複数の(この実施例では、正方形であるため、4つの)直角三角形を用いて分解し、当り判定の対象となる1の直角三角形を決定し、図6(C)に示すように、当該直角三角形とプレイヤオブジェクト202との当りを判定するようにしてある。かかる場合には、後述するように、Y方向では、M線についての判定処理を実行する必要がなく、L線についての判定処理のみを実行すればよいので、X方向およびY方向のそれぞれについて1回の判定処理を実行すればよい。以下、詳細に説明することにする。
図7に示すように、当りを判定する場合には、まず、回転オブジェクト200は、直角三角形(1)〜(4)とこれらに囲まれる1つの正方形とに分解される。ここで、2次元のゲーム空間では、図面の左右方向がX軸方向であり、上下方向がY軸方向である。これらの直角三角形(1)〜(4)は、X軸およびY軸と平行な2つ辺を有し、その2つの辺と回転オブジェクト200の1つの辺とによって形成される。ただし、X軸およびY軸に平行な辺は、回転オブジェクト200の各頂点から回転オブジェクト200の内側に延びる線分である。
当り判定では、プレイヤオブジェクト202の位置に基づいて、当りを判定するための1つの直角三角形が、直角三角形(1)〜(4)から決定される。図7からも分かるように、直角三角形(1)〜(4)のそれぞれは、X軸およびY軸と平行な2つ辺を含み、その2つの辺を回転オブジェクト200の外側に伸ばした2本の直線で挟む領域(I)〜(IV)(コメント:領域(I)と(IV)についての文字が(・)というように表示されていましたので、訂正しましたが、どれであったかは定かでありません。すみません。)、それぞれ、直角三角形(1)〜(4)に対応する。つまり、領域(I)は直角三角形(1)に対応し、領域(II)は直角三角形(2)に対応し、領域(III )は直角三角形(3)に対応し、そして、領域(IV)は直角三角形(4)に対応する。
したがって、領域(I)内にプレイヤオブジェクト202が存在する場合には、当りを判定する直角三角形に直角三角形(1)が決定され、領域(II)内にプレイヤオブジェクト202が存在する場合には、当りを判定する直角三角形に直角三角形(2)が決定され、領域(III )内にプレイヤオブジェクト202が存在する場合には、当りを判定する直角三角形に直角三角形(3)が決定され、そして、領域(IV)内にプレイヤオブジェクト202が存在する場合には、当りを判定する直角三角形に直角三角形(4)が決定される。これは、回転オブジェクト200の外側に伸びた直線とプレイヤオブジェクト202の位置(座標)とによって決定される。
当りを判定するための1の直角三角形が決定されると、次にプレイヤオブジェクト202が当該直角三角形の範囲内にあるか否かが判断される。つまり、プレイヤオブジェクト202が当該直角三角形に当たっているかどうかが判断される。図8(A)および図8(B)を用いて、プレイヤオブジェクト202が回転オブジェクト200に当たっているかどうかの判定方法を説明する。図8(A)では、プレイヤオブジェクト202は領域(I)に存在し、当りを判定する直角三角形(1)に斜線を付して示してある。また、簡単のため、プレイヤオブジェクト202は点A(x,y)で示してある。回転オブジェクト200は、角度「θ」だけ回転され、その中心は、原点O(0,0)で示してある。また、当該回転オブジェクト200の一辺の長さは「a」としてある。
なお、図8(図9も同じ。)では、分かり易く説明するため、回転オブジェクト200の中心を原点としてあるが、実際には、このような2次元のゲーム空間の原点は、たとえば、横長の長方形状に展開される背景画像の左上の頂点である。
図8(B)は、図8(A)に示す斜線を付した直角三角形(1)を拡大した拡大図である。この図8(B)に示すように、当該直角三角形(1)の頂点を、点P、点P1および点P2のように決定すると、直角を有する頂点Pの座標(m,n)は数1で表される。
また、点P(m,n)としたとき、点P1の座標を(m,n+asinθ)と表すことができ、点P2の座標を(m+acosθ,n)と表すことができる。当該直角三角形(1)とプレイヤオブジェクト202との当りを判定する場合には、当該直角三角形(1)の内部にプレイヤオブジェクト202(ここでは、点A)が埋まっているかどうかが判断される。言い換えると、当該直角三角形(1)の斜辺を超えて、その内部に点Aが在るか否かが判断される。したがって、まず、X方向について判定するために、点A(x,y)のX座標が数2を満たすかどうかが判断される。つまり、図中の(i)で示す範囲内に点Aが存在するかどうか、すなわち、点AのX座標が当該直角三角形(1)の範囲内に存在するかどうかが判断される。
次に、Y方向について判定をするために、点A(x,y)のY座標が数3を満たすかどうかが判断される。つまり、図中の(ii)で示す範囲に点Aが存在するかどうか、すなわち、点AのY座標が当該直角三角形(1)の範囲内に存在するかどうかが判断される。ただし、Y方向では、点AのX座標の位置によって、数3の右辺に示す値は変動する。
点A(x,y)が数2および数3を満たす場合には、点Aが当該直角三角形(1)の範囲内(内部)に存在するため、プレイヤオブジェクト202が当該直角三角形(1)すなわち回転オブジェクト200に当たっていると判定する。
このように、Y方向の判定は、数3を用いて1回だけ実行すればよい。これは、当該直角三角形(1)を決定する際に、プレイヤオブジェクト202が点Pと点P2とを通る直線よりも上方に位置することを既に検出しているためである。
また、直角三角形(2)が当りを判定する直角三角形として決定された場合について、図9(A)および図9(B)を用いて説明することにする。ただし、図8(A)および図8(B)と同じ内容については、簡単に説明することにする。この図9(A)では、プレイヤオブジェクト202は領域(II)に存在し、当りを判定する直角三角形(2)に斜線を付して示してある。また、図8(A)および図8(B)に示した場合と同様に、プレイヤオブジェクト202は点A(x,y)で示し、回転オブジェクト200は、角度「θ」だけ回転され、その中心は、原点O(0,0)で示してある。さらに、当該回転オブジェクト200の一辺の長さは「a」である。
図9(B)は、図9(A)に示す斜線を付した直角三角形(2)を拡大した拡大図である。この図9(B)に示すように、当該直角三角形(2)の頂点を、点P、点P1および点P2のように決定すると、直角を有する頂点P(m,n)は数4で表される。
また、点P(m,n)とすると、点P1の座標を(m,n+asinθ)と表すことができ、点P2の座標を(m+acosθ,n)と表すことができる。したがって、まず、X方向についての判定をするために、点A(x,y)のX座標が数5を満たすかどうかが判断される。つまり、図中の(i)で示す範囲内に点Aが存在するかどうかが判断される。
次に、Y方向の判定をするために、点A(x,y)のY座標が数6を満たすかどうかが判断される。つまり、図中の(ii)で示す範囲に点Aが存在するかどうかが判断される。
点A(x,y)が数5および数6を満たす場合には、点Aが当該直角三角形(1)の範囲内に存在すると判断して、プレイヤオブジェクト202の位置を補正する。
なお、Y方向についての判定を1回行えば十分であることは、上述した通りである。
以上のようにして、直角三角形(1)または(2)の範囲内にプレイヤオブジェクト202が存在するかどうかが判断され、直角三角形(1)または(2)の範囲内に存在すると判断された場合には、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判断して、プレイヤオブジェクト202の位置が補正され、プレイヤオブジェクト202が回転オブジェクト200の上に乗るように画面表示される。言い換えると、プレイヤオブジェクト202と回転オブジェクト200との接触状態を示すゲーム画像が表示される。
なお、直角三角形(3)や(4)の範囲内に存在するか否かの判断は、直角三角形(1)や(2)の場合と同様であるため、ここでは説明は省略することにする。ただし、直角三角形(3)や(4)の範囲内に存在すると判断された場合には、プレイヤオブジェクト202の位置が補正され、当該プレイヤオブジェクト202の頭部或いは体が回転オブジェクト200に接触する(突き当たる)ように画面表示される。
また、図8および図9に示した例では、決定した直角三角形(1)または(2)の範囲内に存在するか否かを判断するようにしてあるが、実際には、プレイヤオブジェクト202が1フレームで移動する移動量を考慮し、図6(C)にも示したように、すり抜けなどを防止するために、直角三角形(1)〜(4)に一定の厚みを設けた範囲で判断するようにしてある。したがって、プレイヤオブジェクト202は、当りを判定する直角三角形の斜辺から当該直角三角形の外方向に一定の厚みに相当する所定距離よりも離れている場合には、回転オブジェクト200とプレイヤオブジェクト202とは当たっていないと判定され、逆に、所定距離離れていない場合には、回転オブジェクト200とプレイヤオブジェクト202とは当たっていると判定される。このため、上述したように、直角三角形の範囲内にプレイヤオブジェクト202が存在するか否かを判断する場合には、数3の右辺および数6の左辺の値に、当該厚みに相当する値が加算されることになる。
たとえば、直角三角形(1)について説明すると、図10(A)に示すように、Y軸方向に厚みが設けられる。プレイヤオブジェクト202が回転オブジェクト200を分解した直角三角形(1)に着地しようとする場合には、直角三角形(1)と厚みとで形成される範囲内に移動しなければ、回転オブジェクト200とプレイヤオブジェクト202とが当たっているとは判定されない。
しかし、図10(B)に示すように、直角三角形(1)の内部にまで、プレイヤオブジェクト202が移動した場合には、回転オブジェクト200とプレイヤオブジェクト202とが当たっていると判定される。また、図10(C)に示すように、直角三角形(1)から少し離れた位置に、プレイヤオブジェクト202が移動している場合であっても、厚みの部分にプレイヤオブジェクト202が移動しているため、回転オブジェクト200とプレイヤオブジェクト202とが当たっていると判定される。
上述したように、回転オブジェクト200とプレイヤオブジェクト202とが当たっていると判定された場合には、プレイヤオブジェクト202の位置が補正されるため、図10(B)に示すような場合には、矢印で示すように、プレイヤオブジェクト202の位置が直角三角形(1)の斜辺の上、すなわち回転オブジェクト200上に乗るように、上方向に位置が補正される。また、図10(C)に示すような場合には、矢印で示すように、プレイヤオブジェクト202の位置がプレイヤオブジェクト202上に乗るように、下方向に位置が補正される。
このような補正は、単にプレイヤオブジェクト202のY座標に補正量を加算または減算することにより、実現できる。図示は省略するが、回転オブジェクト200の下方向からプレイヤオブジェクト202の頭部が当たる場合についても同様に考えることができる。
また、図8および図9においては、簡単のため、プレイヤオブジェクト202を1つの点Aで示して、当りを判定する方法について説明したが、実際には、この実施例では、図10(A)〜(C)に示すように、プレイヤオブジェクト202について、当りを判定する点は4つ設けられる。具体的には、頭部の点202a、足元の点202b、右側面の点202cおよび左側面の点202dが設けられる。
なお、右側面の点202cはプレイヤオブジェクト202の右手の方向に設けられ、左側面の点202dはプレイヤオブジェクト202の左手の方向に設けられる。
当り判定では、このうちの2点が用いられるが、いずれの2点を用いるかは、プレイヤオブジェクト202の移動方向と、回転オブジェクト200の位置およびプレイヤオブジェクト202の位置とによって選択される。
図7を用いて詳しく説明することにする。ただし、図7において、プレイヤオブジェクト202は、それぞれ回転オブジェクト200に向かう方向に移動しているものと仮定する。プレイヤオブジェクト202が領域(I)に存在する場合には、プレイヤオブジェクト202の移動方向は左または下であるため、当りを判定する点として、足元の点202bおよび右側面の点202cが選択される。また、プレイヤオブジェクト202が領域(II)に存在する場合には、プレイヤオブジェクト202の移動方向は右または下であるため、当りを判定する点として、足元の点202bおよび左側面の点202dが選択される。さらに、プレイヤオブジェクト202が領域(III )に存在する場合には、プレイヤオブジェクトの移動方向は右または上であるため、当りを判定する点として、頭部の点202aおよび左側面の点202dが選択される。さらにまた、プレイヤオブジェクト202が領域(IV)に存在する場合には、プレイヤオブジェクト202の移動方向は左または上であるため、当りを判定する点として、頭部の点202aおよび右側面の点202cが選択される。
このように、頭部や足元だけでなく、右側面および左側面にも当りを判定する点を設けるのは、図11(A)に示すように、回転オブジェクト200の回転角度によっては、当りを判定する直角三角形が急な斜辺を有する場合があり、かかる場合には、図11(B)に示すように、プレイヤオブジェクト202の足元が当該回転オブジェクト200に当たるよりも、プレイヤオブジェクト202の体(側面)が当該回転オブジェクト200に先に当たってしまうからである。また、図示は省略するが、プレイヤオブジェクト202が回転オブジェクト200に対して横方向から当たる場合にも、正確に当りを判定する必要があるからでもある。このような場合であっても正確に当りを判断して、プレイヤオブジェクト202の位置を補正するようにしてある。このとき、プレイヤオブジェクト202のX座標に補正量を加算または減算することにより、つまりプレイヤオブジェクト202を左右に移動させることにより、回転オブジェクト200とプレイヤオブジェクト202とが接触するように位置を補正される。
また、図12(A)に示すように、当り判定では、プレイヤオブジェクト202が直角三角形の範囲内に存在するか否かをY方向について判断する場合は、直角三角形(1)では頂点Aを基準点とし、直角三角形(2)では頂点Bを基準点とし、直角三角形(3)では頂点Cを基準点とし、直角三角形(4)では頂点Dを基準点とするのが一般的である。しかし、このように基準点を決定した場合には、たとえば、図13(A)に示すように、プレイヤオブジェクト202が直角三角形(2)の上から直角三角形(1)の上に移動する場合には、頂点Aがずれてしまう場合があり、プレイヤオブジェクト202が不自然な動きをしてしまう。
これは、直角三角形の範囲内に存在するか否かをY方向について調べる場合の数3の右辺および数6の左辺の項に起因している。つまり、θの値が0度または90度に近づくと、tanθの値が0または∞に近づくため、tanθを含む数3および数6の項についての計算誤差が大きくなってしまうからである。このため、直角三角形(2)の基準点を点Bに決定した場合には、点Bから点Aに向かう直線に誤差が生じてしまい、たとえば、図13(A)に示すように、頂点Aが頂点A′のようにずれてしまう。これは、点Aから点Dに向かう直線、点Dから点Cに向かう直線および点Cから点Bに向かう直線についても同様である。
したがって、この実施例では、直角三角形(1)および(2)については、基準点を点Aに決定し、直角三角形(3)および直角三角形(4)については、基準点を点Cに決定するようにしてある。ただし、実際のゲーム中では、回転オブジェクト200は回転するため、当りを判定する際に、Y座標が最大または最小となる回転オブジェクト200の頂点を基準点に決定するようにしてある。
このため、図13(B)に示すように、頂点Aでの誤差をなくすことができ、プレイヤオブジェクト202が直角三角形(2)の上から直角三角形(1)の上に移動する場合に、頂点Aをまたいでも、プレイヤオブジェクト202の動きが不自然になることはない。
なお、このように、Y座標が最大または最小となる点Aおよび点Cを基準点とした場合には、点Bおよび点Dにおいて、上述したような誤差が生じることとなるが、点Bや点Dをプレイヤオブジェクト202がまたいで移動するようなことがないため、画面表示に不都合が生じることはない。
また、上述の当り判定の説明においては省略したが、図8(B)および図9(B)では、この計算誤差を考慮して、Y座標が最大となる頂点P1を基準点に決定した場合について説明してある。つまり、Y方向についての判定をするための数3および数6については、点P2の要素を含まないようにしてある。
図14は、このゲーム機10のゲーム動作の一例を示すフロー図である。ゲームカートリッジ32を装着したゲーム機10の電源を投入すると、ゲームカートリッジ32のROM52から必要なプログラムおよびデータが読み出され、ワークメモリ44にロード(記憶)されて、CPU40によって処理が開始される。プレイヤによる操作部42の操作入力によってゲーム開始が指示されると、図14に示すように、最初のステップS1で、コースないしステージに必要な背景画像データ82、マップデータ84およびオブジェクト配置データ88をROM52から読み出して、ワークメモリ44のデータ記憶領域44bにロードする。これにより、このコースの背景が発生され、当該コースに存在するオブジェクトも発生される。
なお、ステップS1では、ゲームを始めから開始する場合には、最初のコースについての背景画像データ82等がロードされるが、前回の続きからゲームを始める場合には、前回の続きとなるコースについての背景画像データ82等がロードされる。
次にステップS3で、背景画像をLCD14に表示し、ステップS5で、プレイヤオブジェクト202およびノンプレイヤオブジェクトを表示する。つまり、プレイヤオブジェクト202および表示されるべき回転オブジェクト200や敵オブジェクトなどが表示される。次に、ステップS7では、操作部42から操作入力信号を取得(検出)する。
なお、ゲーム開始時等に最初の画面を表示するまでは、このステップS5の処理を不能化して、操作入力を受け付けないようにしてもよい。この場合、ステップS9以降の処理が実行されて最初の画面が表示されることとなり、プレイヤはその最初の画面を見てゲームプレイを開始する。
続くステップS9では、プレイヤオブジェクト202およびノンプレイヤオブジェクトの動作処理を実行する。すなわち、ステップS5において取得した操作入力信号およびプログラムに基づいてプレイヤオブジェクト202を動作させる。たとえば、プレイヤが操作部42の十字ボタン16を操作した場合、CPU40は、ゲーム空間においてプレイヤオブジェクト202を操作された方向に移動させ、現フレームにおけるプレイヤオブジェクト202の位置を更新する。また、CPU40は、敵キャラクタや回転オブジェクト200のようなノンプレイヤオブジェクトについても、操作入力信号およびプログラムに基づいて、必要に応じて動作させる。
そして、ステップS11では、回転オブジェクト200がプレイヤオブジェクト202の近辺に存在するかどうかを判断する。つまり、CPU40は、ワークメモリ44のデータ記憶領域44bに記憶されるプレイヤオブジェクト位置データ92と回転オブジェクト位置データ98とを参照して、プレイヤオブジェクト202の位置を中心とする所定範囲内に回転オブジェクト200が存在するかどうかを判断する。ここで、所定範囲は、ゲームプログラマ等の開発者が予め設定した範囲であり、たとえば、プレイヤオブジェクト202の1フレーム期間における最大の移動範囲に決定される。ステップS11で“NO”であれば、つまり回転オブジェクト200がプレイヤオブジェクト202の近辺に存在しない場合には、そのままステップS15に進む。一方、ステップS11で“YES”であれば、つまり回転オブジェクト200がプレイヤオブジェクト202の近辺に存在する場合には、ステップS13で、後述するプレイヤオブジェクト202の位置補正処理(図15および図16参照)を実行して、ステップS15に進む。
ステップS15では、プレイヤオブジェクト202がこのコースのゴールに達したか否かを判断する。ステップS15で“YES”であれば、つまりプレイヤオブジェクト202がこのコースのゴールに達すれば、このコースのゲーム処理を終了する。一方、ステップS15で“NO”であれば、つまりプレイヤオブジェクト202がこのコースのゴールに達していなければ、ステップS17で、エリア切替かどうかを判断する。つまり、プレイヤオブジェクト202が、スクロール可能な範囲を超えて移動したかどうかを判断する。
ステップS17で“YES”であれば、つまりエリア切替であれば、ステップS19でエリア切替処理を実行して、ステップS1に戻る。エリア切替処理では、次の(隣の)背景画像を取得し、かつプレイヤオブジェクト202がゲーム画面の左右方向における中央に表示されるように、ゲーム画面の開始位置を取得する。したがって、その後、ステップS1の処理を実行することにより、エリアを切り替えたゲーム画面が表示される。
一方、ステップS17で“NO”であれば、つまりエリア切替でなければ、ステップS21でスクロール移動処理を実行してステップS3に戻る。スクロール移動処理では、プレイヤオブジェクト202が移動した移動量に応じて画面をスクロールし、すなわち上下または左右に移動し、プレイヤオブジェクト202が画面の左右方向における中央に表示されるように、当該エリア内のゲーム画面の開始位置を取得する。したがって、その後、ステップS3の処理を実行することにより、スクロールされたゲーム画面が表示される。
図15および図16は、図14のステップS13のプレイヤオブジェクト202の位置補正処理を示すフロー図である。CPU40は、位置補正処理を開始すると、図15に示すように、ステップS31で回転オブジェクト200が回転しているかどうかを判断する。ステップS31で“NO”であれば、つまり回転オブジェクト200が回転していなければ、ステップS33で、通常の正方形のオブジェクトとして当り判定処理等を実行し、位置補正処理をリターンする。つまり、ステップS33では、プレイヤオブジェクト202の位置に基づいて、正方形のいずれの辺との当りを判定するかを決定し、決定した当該辺を含む一定範囲についての当りを判定する。具体的には、図6(B)に示した場合と同じように、当該辺に一定の厚みを与えて、その厚みの上下或いは左右の座標とプレイヤオブジェクト202との位置を比較し、静止している回転オブジェクト200との当りを判定し、プレイヤオブジェクト202の位置を補正しているのである。
一方、ステップS31で“YES”であれば、つまり回転オブジェクト200が回転している場合には、ステップS35で、当該回転オブジェクト200を、周りの4つの直角三角形と中心に1つの正方形とに分解する。続くステップS37では、プレイヤオブジェクト202の座標から当りをチェック(判定)する1つの直角三角形を決定する。つまり、図7に示したように、回転オブジェクト200に対してプレイヤオブジェクト202がいずれの領域に存在するのかを検出することにより、1つの直角三角形が決定される。
そして、ステップS39では、プレイヤオブジェクト202のY方向の速度が当該直角三角形に近づく方向かどうかを判断する。ステップS39で“NO”であれば、つまりプレイヤオブジェクト202が当該直角三角形から離れる方向に移動している場合には、Y方向の当りを判定する必要がないため、図16に示すステップS51に進む。
一方、ステップS39で“YES”であれば、つまりプレイヤオブジェクト202が当該直角三角形に近づく方向に移動している場合には、Y方向の当りを判定する必要があるため、ステップS41で、プレイヤオブジェクト202が上昇中かどうかを判断する。ステップS41で“NO”であれば、つまりプレイヤオブジェクト202が下降中であれば、ステップS43で、足元が当たっているかどうかを判断する。つまり、当該直角三角形の範囲内に、プレイヤオブジェクト202、厳密には、足元の点202bが存在するか否かを判断する。また、直角三角形には、図10(A)〜図10(C)に示したように、厚みに相当する領域も含むものとする。以下、この実施例において同じである。
なお、ステップS41の判断処理により、当りを判定する点202aまたは202bを選択しているのである。
ステップS43で“NO”であれば、つまり足元が当たっていなければ、そのままステップS51に進む。一方、ステップS43で“YES”であれば、つまり足元が当たっていれば、ステップS45で、着地処理すなわち上下方向の補正(上下補正)をして、位置補正処理を終了する。ステップS45においては、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判定すると、実際の回転オブジェクト200の外形線すなわち当該直角三角形の斜辺(かかる場合には、厚みを含まない実際の直角三角形を意味する。)とプレイヤオブジェクト202との位置の差分を検出し、当該差分が無くなるように、プレイヤオブジェクト202が上下方向に移動される。
また、ステップS41で“YES”であれば、つまりプレイヤオブジェクト202が上昇中であれば、ステップS47で、プレイヤオブジェクト202の頭部の点202aが当該直角三角形の範囲内に存在するかどうかを判断する。ステップ47で“NO”であれば、つまり頭部の点202aが当該直角三角形の範囲内に存在しなければ、そのままステップS51に進む。一方、ステップS47で“YES”であれば、つまり頭部の点202aが当該直角三角形の範囲内に存在すれば、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判定して、ステップS49で、プレイヤオブジェクトを上下方向に補正し、位置補正処理をリターンする。
なお、ステップS49における処理は、ステップS45における処理と同じであるため、重複した説明は省略することにする。
図16に示すように、ステップS51では、プレイヤオブジェクト202が右に移動中であるかどうかを判断する。このステップS51の判断処理により、当りを判定する点202cまたは点202dを選択しているのである。ステップS51で“NO”であれば、つまりプレイヤオブジェクト202が左に移動中であれば、ステップS53でプレイヤオブジェクト202の右側面すなわち右側面の点202cが当該直角三角形の範囲内に存在するかどうかを判断する。ステップS53で“YES”であれば、つまりプレイヤオブジェクト202の右側面の点202cが当該直角三角形の範囲内に存在すれば、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判断して、ステップS55で、プレイヤオブジェクト202を左右方向に補正して、図15に示したように、位置補正処理をリターンする。
ステップS55においては、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判定すると、実際の回転オブジェクト200の外形線すなわち当該直角三角形の斜辺(かかる場合には、厚みを含まない実際の直角三角形を意味する。)とプレイヤオブジェクト202との位置の差分を検出し、当該差分が無くなるように、プレイヤオブジェクト202が左右方向に移動される。
一方、ステップS51で“YES”であれば、つまりプレイヤオブジェクト202が右に移動中であれば、ステップS57で、プレイヤオブジェクト202の左側面すなわち左側面の点202dが当該直角三角形の範囲内に存在するかどうかを判断する。ステップS57で“NO”であれば、つまりプレイヤオブジェクト202の左側面の点202dが当該直角三角形の範囲内になければ、そのまま位置補正処理を終了する。一方、ステップS57で“YES”であれば、つまりプレイヤオブジェクト202の左側面の点202dが当該三角形の範囲内に在れば、プレイヤオブジェクト202が回転オブジェクト200に当たっていると判断して、ステップS59で、プレイヤオブジェクト202を左右方向に補正して、位置補正処理をリターンする。
なお、ステップS59における左右方向の補正は、ステップS55の処理と同じであるため、重複した説明は省略する。
この実施例によれば、回転オブジェクトが任意の角度だけ回転すると、当該オブジェクトを4つの直角三角形を用いて分解し、プレイヤオブジェクトの位置に応じて決定した直角三角形の範囲にプレイヤオブジェクトが存在するか否かによって当りを判定するので、回転する正方形のオブジェクトであっても当り判定を正確で簡単に行うことができる。
また、正方形の回転オブジェクトの頂点うち、Y座標が最大または最小となる点を基準点に決定するので、当該基準点における計算誤差を無くすことができ、当該基準点付近における当りを正確に判定することができる。
上述の実施例では、回転オブジェクトの形状を正方形とした場合について示したが、回転オブジェクトの形状はこれに限定されるべきでなく、任意の形状を採ることができる。たとえば、図17(A)〜図17(C)に示すように、回転オブジェクト200は、正五角形、正六角形または正八角形とすることができる。このような矩形であっても、X軸およびY軸に平行な2つの辺を有する複数の直角三角形に分解することができるので、プレイヤオブジェクトの位置に基づいていずれか1つの直角三角形を決定するようにすれば、簡単に当りを判定し、プレイヤオブジェクトの位置を補正することができる。
また、上述の実施例では、回転するオブジェクトについて示したが、これに限定される必要はなく、たとえば、正方形のような形状の矩形オブジェクトを斜めに固定的に配置した場合であっても、当該矩形オブジェクトを、上述の場合と同様に、複数の直角三角形を用いて分解して、当りを判定し、プレイヤオブジェクトの位置を補正することができる。つまり、オブジェクトの形や配置する方向(角度)を任意に設定することができるので、ゲームのコースやステージのバリエーションを増やすことができる。これにより、ゲームの趣向性を向上させることができるのである。
なお、上述の実施例では、回転オブジェクトの頂点のうち、Y座標が最大または最小となる点を基準点に決定するようにしたが、基準点をプレイヤオブジェクトの位置からより近い点に決定するようにすれば、回転オブジェクトのどの位置においても正確な当り判定を行うことができる。たとえば、基準点は、頂点と頂点との間(回転オブジェクトの外形線の線分)を、1/2,1/4,1/8,1/16,…のように、細かく分けて複数の基準点を設けるようにすればよい。ただし、かかる場合には、プレイヤオブジェクトの位置に応じて、いずれの基準点を使用するのかを判定する処理が増えるため、基準点の個数を増やし過ぎた場合には、処理負担が大きくなることに留意すべきである。
また、上述の実施例では、携帯型のゲーム機についてのみ説明したが、これに限定される必要はない。たとえば、家庭用のビデオゲーム装置やゲーム機能を有する携帯電話機などにも適用することができる。また、ゲームカートリッジに変えて、CD−ROM,DVDなどの光学式情報記録媒体、光磁気ディスクまたは磁気ディスクなどの種々の情報記録媒体を適用することが可能である。