図1は、本発明の一実施形態に係る情報処理装置の一例であるゲームシステムの構成を示す外観図であり、図2はそのブロック図である。図1および図2に示すように、ゲームシステム1は、ゲーム装置2、光ディスク3、メモリカード4、コントローラ5、テレビ6(図2に示すスピーカ25を含む)を備える。光ディスク3およびメモリカード4は、ゲーム装置2に着脱自在に装着される。コントローラ5は、ゲーム装置2に設けられる複数(図1では、4つ)のコントローラポート用コネクタのいずれかに接続される。コントローラ5は複数の操作部を有し、具体的には、第1のタッチパッド7a、第2のタッチパッド7b、スタートボタン8a、セレクトボタン8b、Lボタン8c、およびRボタン8dを含む。また、他の実施形態においては、ゲーム装置2とコントローラ5との通信は、通信ケーブルを用いずに無線通信によって行われてもよい。また、テレビ6およびスピーカ25は、AVケーブル等によってゲーム装置2に接続される。なお、本発明は図1に示すような据え置き型のゲーム装置に限らず、携帯型のゲーム装置であってもよいし、業務用のゲーム装置であってもよいし、携帯電話やパソコン等、プログラムを実行することができる装置であってもよいことはもちろんである。以下、図2を参照しながら、本発明に係るゲームシステムにおける各部を詳細に説明するとともに、ゲームシステムにおける一般的な動作を説明する。
外部記憶媒体の一例である光ディスク3は、例えばDVD−ROMであり、本発明に係るプログラムの一例であるゲームプログラムやキャラクタデータ等のゲームに関するデータを固定的に記憶している。プレイヤがゲームを行う場合、光ディスク3はゲーム装置2に装着される。なお、ゲームプログラム等を記憶する手段は、DVD−ROMに限らず、例えばCD−ROM、MO、メモリカード、ROMカートリッジ等の記憶媒体であってもよい。ゲームプログラム等は、ゲーム装置本体内のメモリやハードディスク等の記憶手段に記憶されるようにしてもよく、この場合、通信によりゲームプログラムをダウンロードするようにしてもよい。メモリカード4は、例えばフラッシュメモリ等の書き換え可能な記憶媒体によって構成され、例えばゲームにおけるセーブデータ等のデータを記憶する。
ゲーム装置2は、光ディスク3に記録されているゲームプログラムを読み出し、ゲーム処理を行う。コントローラ5は、プレイヤがゲーム操作に関する入力を行うための入力装置である。コントローラ5は、プレイヤによるタッチパッド7aおよび7bの操作や各操作ボタン8a〜8dの押圧操作や後述するスイッチ(図示しない)の押圧操作に応じて操作データをゲーム装置2に出力する。複数のプレイヤによってゲームを行う場合、コントローラ5はプレイヤの数だけ設けられる。テレビ6は、ゲーム装置2から出力された画像データを画面に表示する。また、スピーカ25は、典型的にはテレビ6に内蔵されており、ゲーム装置2から出力されたゲームの音声を出力する。
前述のように、コントローラ5は、その主面の左右両側に1つずつ、計2つのタッチパッド7aおよび7bを有する。なお、2つのタッチパッド7aおよび7bは同じ構成であり、以下では、2つのタッチパッド7aおよび7bを特に区別しない場合、単に「タッチパッド7」と記載する。タッチパッド7としては、例えば抵抗膜方式や光学式(赤外線方式)や静電容量結合式など、任意の方式のものを利用することができる。タッチパッド7は、その入力面にプレイヤの指等が触れると、接触位置(入力位置)に対応する座標データ(入力座標データ)を出力する。タッチパッド7は、所定のサンプリング時間毎に入力位置を検出して入力座標データを出力する。入力座標データは、操作データとしてコントローラ5からゲーム装置2に出力される。ここでは、所定のサンプリング時間を画面表示のフレーム時間と同じであるとする。なお、タッチパッド7は、入力座標データを出力するものであればどのようなものであってもよい。例えば、タッチパッド7は、プレイヤの指等が入力面に接触している面積を示すデータを上記入力座標データとともにゲーム装置2に出力してもよいし、入力位置の移動速度(後述する入力ベクトル)を検出して出力してもよい。また、本実施形態においては、タッチパッド7の入力面は、押下可能なようにバネ等で支持されており、タッチパッド7の裏面にはそれぞれスイッチ(図示せず)が設けられる。プレイヤは、タッチパッド7の入力面を押下することによってスイッチを押下することができる。
なお、以上に説明したコントローラ5は、本発明において用いられる入力装置の一例であり、入力装置は、入力面上における入力位置を検出することが可能なポインティングデバイスであればどのようなものであってもよい。例えば、入力装置は、タッチパッドを1つのみ備える構成であってもよいし、タッチパッドに代えてタッチパネルを備える構成であってもよい。
次に、ゲーム装置2の構成について説明する。図2において、ゲーム装置2内には、CPU11およびそれに接続されるメモリコントローラ20が設けられる。さらに、ゲーム装置2内において、メモリコントローラ20は、グラフィックスプロセッシングユニット(GPU)24と、メインメモリ17と、デジタル信号処理回路(DSP)36と、各種インターフェース(I/F)21〜26とに接続される。また、DSP18を介してサブメモリ19と接続される。メモリコントローラ20は、これら各構成要素間のデータ転送を制御する。
ゲーム開始の際、まず、ディスクドライブ27は、ゲーム装置2に装着された光ディスク3を駆動する。光ディスク3に記憶されているゲームプログラムは、ディスクI/F26およびメモリコントローラ20を介して、メインメモリ17に読み込まれる。メインメモリ17上のプログラムをCPU11が実行することによって、ゲームが開始される。ゲーム開始後、プレイヤは、各タッチパッド7aおよび7bや各操作ボタン8a〜8dや上記スイッチを用いてコントローラ5に対してゲーム操作等の入力を行う。プレイヤによる入力に従い、コントローラ5は、操作データをゲーム装置2に出力する。コントローラ5から出力される操作データは、コントローラI/F21およびメモリコントローラ20を介してCPU11に入力される。CPU11は、入力された操作データに応じてゲーム処理を行う。ゲーム処理における画像データ生成等に際して、GPU12やDSP18が用いられる。また、サブメモリ19は、DSP18が所定の処理を行う際に用いられる。
GPU12は、ジオメトリユニット13およびレンダリングユニット14を含み、画像処理専用のメモリに接続されている。この画像処理専用メモリは、例えばカラーバッファ15およびZバッファ16として利用される。ジオメトリユニット13は、仮想3次元空間であるゲーム空間に置かれた物体や図形に関する立体モデル(例えばポリゴンで構成されるオブジェクト)の座標についての演算処理を行うものであり、例えば立体モデルの回転・拡大縮小・変形や、ワールド座標系の座標から視点座標系やスクリーン座標系の座標への変換を行うものである。レンダリングユニット14は、所定のテクスチャに基づいて、スクリーン座標に投影された立体モデルについてピクセル毎のカラーデータ(RGBデータ)をカラーバッファ15に書き込むことによって、ゲーム画像を生成する。また、カラーバッファ15は、レンダリングユニット14によって生成されたゲーム画像データ(RGBデータ)を保持するために確保されたメモリ領域である。Zバッファ16は、3次元の視点座標から2次元のスクリーン座標に変換する際に視点からの奥行情報を保持するために確保されたメモリ領域である。GPU12は、これらを用いてテレビ6に表示すべき画像データを生成し、適宜メモリコントローラ20およびビデオI/F22を介してテレビ6に出力する。なお、ゲームプログラム実行時にCPU11において生成される音声データは、メモリコントローラ20からオーディオI/F24を介して、スピーカ25に出力される。なお、本実施形態では、画像処理専用のメモリを別途設けたハードウェア構成としたが、これに限らず例えばメインメモリ17の一部を画像処理用のメモリとして利用する方式(UMA:Unified Memory Architecture)を使うようにしてもよい。ゲーム装置2は、ゲームプログラムを実行することにより生成したゲームデータをメモリコントローラ20およびメモリI/F23を介してメモリカード4に転送する。また、ゲーム装置2は、ゲーム開始に先立って、メモリカード4に記憶されたゲームデータを、メモリコントローラ20およびメモリI/F23を介してメインメモリ17に読み込む。
次に、本実施形態に係るプログラムによってゲーム装置2において実行される処理の概要を説明する。本実施形態において、ゲーム装置2は、プレイヤによるタッチパッド7に対する入力に基づいて表示制御処理を実行する。表示制御処理とは、テレビ6に表示される内容を制御する処理であり、具体的には、ゲーム画面をスクロールさせる処理(画面に表示されている画像全体をスクロールさせる処理)や、画面に表示されているオブジェクトを移動させる処理である。
ここで、ゲーム装置2は、タッチパッド7への入力に基づいて出力ベクトルを算出する。ゲーム装置2は、この出力ベクトルに基づいてプレイヤによる操作内容を判断し、プレイヤによる操作に従った表示制御処理を行う。なお、本実施形態では、ゲーム装置2によって3次元の仮想ゲーム空間が構築され、テレビ6には、当該仮想ゲーム空間内に設定される仮想カメラから見た当該仮想ゲーム空間の画像が表示される。本実施形態に係るゲーム装置2は、上記表示制御処理として、出力ベクトルに応じて仮想カメラの視線方向を変化させる処理を実行する。
図3および図4は、本実施形態における表示制御処理の例を示す図である。図3に示す仮想ゲーム空間が画面に表示されていた状態において、例えば、タッチパッド7上で左から右へ軌跡を描く入力をプレイヤが行ったとする。このとき、ゲーム装置2は、右方向を向く出力ベクトルを算出し、テレビ6の画面に表示されている仮想ゲーム空間の画像全体を左方向へ移動させる(画面を右方向へスクロールさせる)(図4)。すなわち、仮想ゲーム空間の画像全体を左方向へ移動させるように仮想カメラの視線方向を変化させる(図4)。なお、本実施形態では、表示制御処理として画像全体をスクロールさせる処理を実行する場合を例として説明するが、表示制御処理は、画面に表示されている画像中のオブジェクトを移動させる処理であってもよい。プレイヤによって操作されるプレイヤキャラクタが画面に表示される場合には、表示制御処理は、当該プレイヤキャラクタを仮想ゲーム空間内で移動させる処理であってもよい。
次に、出力ベクトルの算出方法について図5〜図8を用いて説明する。図5は、タッチパッド7に対する入力の一例を示す図である。タッチパッド7に対する入力を行う際、プレイヤは、タッチパッド7の入力面上で軌跡を描くように入力を行う。本実施形態のように仮想カメラの視線方向を移動させる操作をタッチパッド7を用いて行う場合、典型的には、プレイヤは直線状の軌跡を入力面上に描くと考えられる。ただし図5および図7では、後述する目標点および追従点の移動の様子を見やすくする目的で、曲線状の軌跡が描かれた場合を例として示している。
タッチパッド7は、所定のサンプリング時間間隔で入力位置を検出する。例えば図5において、プレイヤが点線で示す軌跡を描いた場合、タッチパッド7は、入力位置として、位置P1’、P2’、P3’、およびP4’を順に連続して検出する。入力位置の座標(入力座標)を示すデータは、入力位置が検出される度にコントローラ5からゲーム装置2へ出力される。ゲーム装置2は、出力された入力座標の位置と前回に出力された入力座標の位置との差を示すベクトルを算出する。以下、このベクトルを入力ベクトルと呼ぶ。入力ベクトルは、前回に検出された入力位置を始点とし、最後に検出された入力位置(最新の入力位置)を終点とするベクトルである。換言すれば、入力ベクトルは、入力面上を入力位置が移動する速度を示す。図5の例においては、入力位置P2’が検出されたとき、入力ベクトルとしてベクトルVi1’が算出される。また、入力位置P3’が検出されたとき、入力ベクトルとしてベクトルVi2’が算出され、入力位置P4’が検出されたとき、入力ベクトルとしてベクトルVi3’が算出される。なお、上記入力位置を示す入力座標および入力ベクトルは、タッチパッド7の入力面上の位置を表すための座標系によって表現される。ここでは、入力面上の座標系をx’y’座標系と表す。
なお、他の実施形態においては、タッチパッド7が入力位置の移動速度(すなわち、入力ベクトル)を検出することが可能である場合には、入力ベクトルを示すデータが操作データとしてタッチパッド7からゲーム装置2へ出力されてもよい。この場合、ゲーム装置2は、入力位置から入力ベクトルを算出する処理を実行する必要がない。
図6は、仮想平面の一例を示す図である。仮想平面とは、出力ベクトルを算出するためにゲーム装置2が設定する仮想の平面である。本実施形態では、仮想平面は有限の大きさを有しているとする。仮想平面上には、出力ベクトルを算出するために用いられる目標点および追従点が設定される。目標点は、上記入力ベクトルの大きさおよび向きに基づいて移動される点である。追従点は、目標点を追従するように移動される点である。図6に示すように、目標点および追従点は、最初は同じ位置に設定される。目標点および追従点の位置を表す座標系(xy座標系)は、タッチパッド7の入力面上の位置を表す座標系と同じであってもよいし、異なる座標系であってもよい。なお、ここでは、xy座標系とx’y’座標系とは同じ座標系であるとし、xy座標系のx軸がx’y’座標系のx’軸に対応し、xy座標系のy軸がx’y’座標系のy’軸に対応するものとする。
図6は、図5に示した入力が行われた場合における目標点および追従点の移動の様子を示している。なお、図6においては、目標点を白丸で示し、追従点を黒丸で示している。初期状態においては、目標点の初期位置P1および追従点の初期位置Q1は同じ位置である。目標点および追従点の位置は、入力位置が検出されて入力ベクトルが算出される度に更新される。目標点は、入力ベクトルの向きに対応する方向に、入力ベクトルの大きさに基づいた距離だけ移動される。具体的には、目標点は、入力ベクトルに基づいて算出される目標移動ベクトルにより示される距離および方向に移動される。なお、後述する詳細なゲーム処理(図9〜図12参照)においては、入力ベクトルの大きさの変化を緩和するように目標移動ベクトルが算出されるが、図5〜図8においては、説明をわかりやすくする目的で、入力ベクトルと目標移動ベクトルとは同じであるとする。
例えば図6において、入力位置P2’が検出されて入力ベクトルVi1’が算出されたとき、位置P1にある目標点は、入力ベクトルVi1’に基づいて算出される目標移動ベクトルVi1により示される距離および方向に移動される結果、位置P2に移動される。さらに、位置Q1にある追従点は、目標点に追従するように位置Q1から位置P2の方向へ移動される結果、追従点は位置Q2に移動される。つまり、追従点の移動先の位置は、位置Q1と位置P2との間の位置となる。
出力ベクトルは、前回の追従点の位置を始点とし、現在の追従点の位置を終点とするベクトルとして算出される。つまり、出力ベクトルは、追従点の速度を示すベクトルである。例えば図6において、入力位置P2’が検出されて入力ベクトルVi1’が算出されたとき、追従点はQ1からQ2に移動されるので、このときの出力ベクトルは、位置Q1を始点とし位置Q2を終点とするベクトルVo1となる。
また例えば、入力位置P3’が検出されて入力ベクトルVi2’が算出されたとき、位置P2にある目標点は、入力ベクトルVi2’に基づいて算出される目標移動ベクトルVi2により示される距離および方向に移動される結果、位置P3に移動される。さらに、位置Q2にある追従点は、目標点に追従するように位置Q2から位置P3の方向へ移動される結果、位置Q3に移動される。このとき、出力ベクトルは、位置Q2を始点とし位置Q3を終点とするベクトルVo2となる。同様に、入力位置P4’が検出されて入力ベクトルVi3’が算出されたとき、位置P3にある目標点は位置P4に移動され、位置Q3にある追従点は位置Q4に移動される。その結果、出力ベクトルは、位置Q3を始点とし位置Q4を終点とするベクトルVo4となる。
上記のように本実施形態では、ゲーム装置2は、入力位置の移動速度を示す入力ベクトルに基づいて目標点を移動し、目標点を追従するように移動される追従点の速度を示す出力ベクトルを算出する。これによって、入力ベクトルの大きさおよび向きに急激な変化があった場合でも、出力ベクトルではこのような急激な変化が緩和されることになる。ゲーム装置2は、この出力ベクトルを用いて仮想カメラの視線方向を移動することによって、仮想カメラの視線方向が急激に変化することを防止することができる。すなわち、仮想カメラの視線方向が急激に変化することによって、画面が急にスクロールしたり、スクロールしていた画面が急に停止したりすることを防止することができる。したがって、画面の急激な移動によってプレイヤが不快さを感じることを防止することができる。
次に、目標点および追従点の移動動作について図7および図8を用いて詳細に説明する。図7および図8は、目標点および追従点が移動する様子をフレーム毎に示す図である。なお、本実施形態では、タッチパッド7における入力位置の検出が1フレーム毎に行われ、目標点および追従点の移動は1フレーム毎に行われるものとする。また、図7および図8では説明を容易にする目的で、目標点および追従点が1次元の直線上を移動するものとして説明する。
まず、タッチパッド7に対する入力が最初に検出されたフレーム(1フレーム目)では、目標点および追従点はそれぞれ初期位置P1およびQ1に設定される。なお、1フレーム目の時点では追従点が移動していないので、出力ベクトルは0である。
2フレーム目では、目標点が位置P2に移動したとする。位置Q1にある追従点は、位置P2の方向へ移動される。ここで、追従点の移動距離は、位置Q1と位置P2との距離(位置Q1から位置P2までのベクトル)Vm1に基づいて算出される。具体的には、追従点は、位置Q1と位置P2との距離に所定の定数Sを積算した距離だけ移動される。つまり、追従点の移動距離、すなわち、出力ベクトルVo1の大きさは、ベクトルVm1に当該所定の定数Sを積算することによって算出される。この所定の定数は、追従点が目標点を追従する度合いを表すので、以下では、当該所定の定数を「追従度」と呼ぶ。なお、追従度Sは、0<S<1である。したがって、出力ベクトルVo1はベクトルVi1より小さくなるので、入力ベクトルの大きさの変化が出力ベクトルでは緩和され、入力開始時の急激な速度変化を緩和することができることがわかる。
3フレーム目以降でも2フレーム目と同様に目標点および追従点が移動される。すなわち、n(nは2以上の整数)フレーム目における追従点の移動距離Vo(n)は、n−1フレーム目における追従点の位置と、nフレーム目における目標点の位置との距離Vm(n)に基づいて決定される。
図7および図8では、5フレーム目でタッチパッド7に対する入力がなくなったものとする。このとき、ゲーム装置2は目標点を移動しない。つまり、4フレーム目における目標点の位置がそのまま維持され、目標点は初期位置に戻らない。一方、追従点は、2フレーム目以降と同様に移動される。つまり、5フレーム目においても追従点は位置Q4から位置Q5まで移動する。したがって、出力ベクトルVo4は、0ではない大きさを有する。
なお、6フレーム目以降においても、追従点は5フレーム目と同様に移動する。そして、追従点は、実質的に目標点に追いついたと判断された時点で移動を停止する。ゲーム装置2は、追従点から目標点までの距離Vm(n)が、予め定められた所定の距離(後述する到達領域の半径R)以内になった場合、「追従点が実質的に目標点に追いついた」と判断する。すなわち、目標点から所定の距離以内に追従点が位置する場合、追従点は移動されない。
図7に示したように、本実施形態においては、タッチパッド7に対する入力がなくなった後のフレームにおいても、出力ベクトルが0でない大きさとなる結果、画面のスクロールが続けられる。つまり、画面のスクロールは、タッチパッド7に対する入力がなくなってからしばらくの間(追従点が目標点に追いつくまでの間)続行され、次第にスクロールの速度が遅くなりながら最後にスクロールが停止する。これによって、入力終了時に入力ベクトルの大きさが急激に変化する場合であっても、画面のスクロールの速度が急激に変化することを防止することができる。
なお、入力終了時に入力ベクトルの大きさが急激に変化することを防止するためには、目標点が停止した後も追従点を移動させる方法の他に、入力終了時における出力ベクトルの大きさを単に小さくし(例えば、0<a<1である定数aを入力ベクトルに乗算する)、目標点が停止したことに応じて追従点を停止する方法も考えられる。例えば、図4の例で言えば、ベクトルVo3の大きさを小さくするように調整するのである。
しかし、この方法では、目標点の総移動量(図7に示す位置P1から位置P4までの距離)と、追従点の総移動量(位置Q1から位置Q4までの距離)とが、等しくならない。目標点の総移動量と追従点の総移動量とは比例しないので、プレイヤによる軌跡の描き方(軌跡を描いた速度等)によって、追従点の総移動量が目標点の総移動量に近い値になったり、大きく異なる値になったりする。したがって、プレイヤが同じ長さの軌跡をタッチパッド7上に描いたとしても、軌跡を描いた速度や1フレーム毎の速度の変化量によって、追従点の移動量、すなわち、画面のスクロール量が異なってしまう。そのため、プレイヤは、自分が描いた直線の長さによって画面のスクロール量をイメージすることができず、プレイヤが思っていたよりも画面がスクロールしなかったり、逆に、思っていたよりも画面がスクロールしすぎたりすることになる。このとき、プレイヤは、画面のスクロールに不自然な印象を受け、操作性が悪いと感じる。
そこで、本実施形態では、目標点の移動が停止した後も追従点を移動するようにしている。これによって、入力ベクトルに基づいて移動する目標点の総移動距離と、出力ベクトルを算出する元になる追従点の総移動距離とは、ほぼ同じになる。したがって、タッチパッド7の入力面上に描かれた軌跡の長さに応じた距離だけ目標点を移動させるようにすれば、追従点の総移動距離、すなわち、出力ベクトルの総和は、当該軌跡の長さに応じて決まることになる。これによって、プレイヤが描いた直線の長さと、画面がスクロールする距離とを比例させることができる。例えば、プレイヤがタッチパッド7上に所定長さの直線を描いたことによる画面のスクロール量は、当該所定長さの半分の長さの直線を描いたことによる画面のスクロール量の約2倍となる。プレイヤは、自分が描いた直線の長さによって画面のスクロール量をイメージすることができるので、プレイヤが思っていたよりも画面がスクロールしなかったり、逆に、思っていたよりも画面がスクロールしすぎたりすることを防止することができる。つまり、プレイヤが不自然な印象を受けることを防止し、プレイヤに快適な操作性を提供することができる。
次に、プレイヤが一旦タッチオフした(タッチパッド7から指等を離した)後で再度タッチオン(タッチパッド7に触れる)する状況を考える。例えば、プレイヤが画面を大きくスクロールさせる場合にこのような状況が起こると考えられる。例えば、画面を右方向に大きくスクロールさせる操作をプレイヤが行う場合を考える。この場合、プレイヤは、タッチパッド7上において左から右に延びる軌跡を描く操作を行う。ただし、1回の当該操作による画面のスクロール量は決まっているので、1回の操作で所望のスクロール量が得られない場合、プレイヤは当該操作を複数回連続して行う。この場合、プレイヤは、1回の上記操作が完了したことによってタッチオフした直後に、再度同じ操作を行うためにタッチオンする。本実施形態では、このようなタッチオフ直後に再度タッチオンする場合においても、画面をスムーズにスクロールさせることができる。以下、タッチオフ後に再度タッチオンする場合における目標点および追従点の動作について説明する。
図8は、目標点および追従点が移動する様子をフレーム毎に示す図である。図8は、図7において5フレーム目でプレイヤがタッチオフした後、8フレーム目で再度タッチオンを行った場合の移動の様子を示す図である。
プレイヤがタッチオフしている間のフレーム(5フレーム目〜7フレーム目)では、上述のように、目標点の位置はそのまま維持される。すなわち、目標点は位置P4の位置にある。さらに、プレイヤが再度タッチオンする8フレーム目では、入力ベクトルは0であるので、8フレーム目においても目標点は移動しない。一方、追従点は5フレーム目〜8フレーム目の間も移動し続け、8フレーム目の時点では位置Q8にある。
次の9フレーム目において、目標移動ベクトルVi8が算出された結果、位置P4にあった目標点は位置P9に移動される。このとき、追従点は、現在の位置Q8から目標点の位置P9までを結ぶベクトルVm8に基づいて移動される。すなわち、追従点は、位置Q8と位置P9との距離に上記追従度Sを積算した距離だけ移動される。10フレーム目以降については、9フレーム目の場合と同様に目標点および追従点の移動が行われる。
以上のように、本実施形態においては、タッチオフ後に再度タッチオンされた場合であっても、目標点の位置はタッチオフ前の位置が継続して用いられる。また、追従点は、タッチオフ中であるかタッチオン中であるかにかかわらず、目標点を追従するように移動される。
ここで、仮に、タッチオフ後に再度タッチオンされた場合に目標点および追従点の位置をリセットする(初期位置に移動する)ようにした場合を考える。この場合、タッチオンされた時点における出力ベクトルは0になる。したがって、タッチオンされた時点で追従点が目標点に追いついていない場合には、画面のスクロールが急に停止してしまう。これによって、画面を自然にスクロールさせることができなくなる。また、タッチオンされる直前のフレームまでに追従点が目標点に追いついていない場合には、目標点の総移動距離と追従点の総移動距離とが異なることになる。そのため、プレイヤが思っていたよりも画面がスクロールしなくなるので、プレイヤは画面のスクロールに対して不自然な印象を受けてしまう。
一方、本実施形態においては、目標点および追従点についてタッチオフ前の位置が継続されるので、追従点が目標点に追いついていない場合にはタッチオン時における出力ベクトルは0にならない。したがって、タッチオン時に画面のスクロールが急に停止することがない。また、タッチオフおよびタッチオンが複数回繰り返されても、最終的な総移動距離は目標点と追従点とでほぼ同じになるので、プレイヤが画面のスクロールに対して不自然な印象を受けることがない。
なお、本実施形態では、タッチパッド7を用いて仮想カメラの視線方向を移動させるモード(第1モード)と、それ以外のモード(第2モード:例えば、仮想ゲーム空間に登場するプレイヤキャラクタをプレイヤによる操作に従って移動させるモード)とが用意されている。例えば、ゲームモードが第2モードに設定されている場合、仮想ゲーム空間内のプレイヤキャラクタが画面に表示されるように仮想カメラが設定され、プレイヤキャラクタが移動する様子を仮想カメラで撮像して画面に表示される。一方、ゲームモードが第1モードに設定されている場合、プレイヤキャラクタから仮想ゲーム空間を見た始点となるように仮想カメラの位置が切り替わる。目標点および追従点は、第2モードから第1モードへ切り替わったときにリセットされる。第1モード中においては、上述したように、タッチオフ後に再度タッチオンされた場合であっても目標点および追従点の位置はリセットされない。
次に、ゲームプログラムを実行することによってゲーム装置2において行われるゲーム処理の詳細を説明する。まず、ゲーム処理において用いられる主なデータについて図9を用いて説明する。図9は、ゲーム装置2のメインメモリ17に記憶される主なデータを示す図である。図9に示すように、メインメモリ17には、現在入力座標データ41、前入力座標データ42、入力ベクトルデータ43、入力速度データ44、目標座標データ45、追従座標データ46、距離ベクトルデータ47、2点間距離データ48、出力ベクトルデータ49、速度定数データ50、補正定数データ51、仮想平面データ52、到達領域データ53、追従度データ54、および、モードデータ55等が記憶される。なお、メインメモリ17には、図9に示すデータの他、プレイヤキャラクタに関するデータ(プレイヤキャラクタの画像データや位置データ等)やゲーム空間に関するデータ(地形データ等)等、ゲーム処理に必要なデータが記憶される。
現在入力座標データ41は、タッチパッド7によって検出された最新の入力位置を表す座標(現在入力座標)を示すデータである。タッチパッド7が検出した入力座標データは、操作データとしてコントローラ5からゲーム装置2へ出力される。ゲーム装置2のCPU11は、当該操作データに含まれる入力座標データを現在入力座標データ41としてメインメモリ17に記憶する。なお、ゲーム装置2は1フレーム毎に操作データをコントローラ5から取得して現在入力座標データ41の内容を更新する。したがって、現在入力座標データ41は、現在の入力位置(最も最近に検出された入力位置)の座標を示すことになる。なお、以下では、現在入力座標の値を(Ipx,Ipy)と表す。
また、前入力座標データ42は、タッチパッド7によって検出された前回の入力位置を表す座標(前入力座標)を示すデータである。すなわち、CPU11は、新たな座標データをコントローラ5から取得すると、取得した座標データの内容を現在入力座標データ41としてメインメモリ17に更新して記憶するとともに、更新前の現在入力座標データ41の内容を前入力座標データ42としてメインメモリ17に記憶する。なお、以下では、前入力座標の値を(Ipx’,Ipy’)と表す。
入力ベクトルデータ43は、上記入力ベクトルを示すデータである。入力ベクトルは、上記現在入力座標データ41および前入力座標データ42に基づいて算出される。なお、本実施形態では、タッチパッド7上の位置を表す座標系と、仮想平面上の位置を表す座標系とについて同じ座標系を用いる。これによって、タッチパッド7上の位置を表す座標を、仮想平面上の位置を表す座標へ変換する処理が不要になる。すなわち、上記入力ベクトルを上記目標移動ベクトルへ変換する処理が不要になる。したがって、入力ベクトルデータ43は、上記入力ベクトルを示すとともに、上記目標移動ベクトルを示すことになる。なお、以下では、入力ベクトルの値を(Ivx,Ivy)と表す。
入力速度データ44は、入力速度を示すデータである。入力速度は、入力ベクトルの時間変化を緩和するための計算(後述するステップS21およびS22)において用いられる変数である。なお、以下では、入力速度の値をIsと表す。本実施形態では、入力速度データ44は1フレーム毎に算出され、入力速度データ44の内容は1フレーム毎に更新される。なお、図示していないが、本実施形態においては、前回に算出された入力速度(更新前の入力速度。Is’と表す。)を示すデータがメインメモリ17に記憶される。
目標座標データ45は、上記目標点の位置を表す座標(目標座標)を示すデータである。また、追従座標データ46は、上記追従点の位置を表す座標(追従座標)を示すデータである。以下では、目標座標の値(2次元の座標値)を(Dpx,Dpy)と表し、追従座標の値を(Fpx、Fpy)と表す。また、距離ベクトルデータ47は、追従点から目標点までの結ぶベクトル(距離ベクトル)を示すデータである。距離ベクトルは、出力ベクトルを算出するために用いられるベクトルであり、図7および図8に示したVm(n)に相当する。以下では、距離ベクトルの値を(Lx,Ly)と表す。また、2点間距離データ48は、追従点から目標点までの距離(2点間距離)を示すデータである。すなわち、2点間距離データ48は、距離ベクトルの大きさを示す。以下では、2点間距離の値をLと表す。
出力ベクトルデータ49は、上記出力ベクトルを示すデータである。入力ベクトルは、上記現在入力座標データ41および前入力座標データ42に基づいて算出される。以下では、出力ベクトルの値を(Fvx、Fvy)と表す。
速度定数データ50は、上記入力速度を算出する処理(後述するステップS21)に用いる定数である速度定数Apを示すデータである。補正定数データ51は、上記入力ベクトルを補正する処理(後述するステップS22)に用いる定数である補正定数Spを示すデータである。
仮想平面データ52は、仮想平面の大きさを示すデータである。仮想平面は無限の広がりを持つ平面として設定してもよいが、目標座標および追従座標の値を所定の範囲内で表すために、本実施形態では仮想平面を有限の大きさとしている。なお詳細は後述するが、仮想平面の端は逆側の端に接続されている(図13参照)。ここでは、仮想平面は正方形であるとする。したがって、仮想平面の大きさは、正方形の一辺の長さWによって表すことができる。また、仮想平面上の位置を表すための座標系は、正方形の所定の頂点に原点が位置するものとする(図13参照)。
到達領域データ53は、追従点が目標点に追いついたと判断される領域(到達領域と呼ぶ)を示すデータである。本実施形態では到達領域は目標点の位置を中心とした円形領域とする。したがって、到達領域は円形領域の半径によって表すことができる。すなわち、到達領域データ53としては、当該円形領域の半径の長さを示す値を記憶しておけばよい。ここでは、到達領域である円形領域の半径をRとする。
追従度データ54は、上記追従度Sを示すデータである。追従度Sは、0<S<1の範囲で設定される。追従度Sの値を大きくすると、目標点に対する追従点の追従性を高くすることができ、追従度Sの値を小さくすると、目標点に対する追従点の追従性を低くすることができる。
なお、上記定数(速度定数Ap、補正定数Sp、仮想平面の幅W、半径R、および追従度S)の値は、ゲームプログラムにおいて予め設定されている値をゲーム装置2が読み込んでメインメモリ17に記憶させるようにしてもよいし、ゲーム状況やプレイヤによる指示に応じて値が適宜設定されるようにしてもよい。
モードデータ55は、現在のモードを示すデータである。すなわち、モードデータ55は、上記第1モードおよび第2モードのいずれかを示す。モードデータ55の内容は、モードが切り替わる度に更新される。
次に、ゲームプログラムを実行することによってゲーム装置2において行われるゲーム処理の詳細を、図10〜図14を用いて説明する。図10は、ゲーム装置2において実行されるゲーム処理の流れを示すフローチャートである。ゲーム装置2の電源が投入されると、ゲーム装置2のCPU11は、図示しないブートROMに記憶されている起動プログラムを実行し、これによってメインメモリ17等の各ユニットが初期化される。そして、光ディスク3に記憶されたゲームプログラムがメインメモリ17に読み込まれ、CPU11によって当該ゲームプログラムの実行が開始される。図10に示すフローチャートは、以上の処理が完了した後に行われるゲーム処理を示すフローチャートである。なお、図10〜図12に示すフローチャートにおいては、ゲーム処理のうち、タッチパッド7への入力に基づいて上記出力ベクトルを算出する処理について詳細に示し、本願発明と直接関連しない他のゲーム処理については詳細な説明を省略する。
図10のステップS1において、まず、初期処理が行われる。具体的には、上記定数(速度定数Ap、補正定数Sp、仮想平面の幅W、半径R、および追従度S)の値を示す各種データ48〜53が、メインメモリ17に記憶される。さらにステップS1においては、3次元の仮想のゲーム空間が構築されるとともに、プレイヤキャラクタ等のゲーム空間に登場するキャラクタがゲーム空間に配置される。そして、初期状態のゲーム空間がテレビ6に表示される。なお、本実施形態では、初期状態においてゲームモードは第2モードに設定されているものとする。すなわち、メインメモリ17に記憶されているモードデータ55は第2モードを示す。ステップS1の初期処理によってゲームが開始され、以降のステップS2〜S12の処理ループが1フレーム毎に繰り返されることによってゲームが進行していく。
ステップS2において、コントローラ5に対してプレイヤによって行われた入力が取得される。すなわち、CPU11は、タッチパッド7aおよび7bや各ボタン8a〜8dに対する操作内容を示す操作データをコントローラ5から取得する。続くステップS3において、モードを変更する操作が行われたか否かが判定される。すなわち、CPU11は、ステップS2d取得した操作データに基づいて、モードを変更する操作(例えば、Rボタン8dを押下する操作)が行われたか否かを判定する。判定の結果、モードを変更する操作が行われたと判定される場合、ステップS4の処理が実行される。一方、モードを変更する操作が行われていないと判定される場合、ステップS4の処理がスキップされてステップS5の処理が実行される。
ステップS4においては、モードを変更する操作に応じてモードが切り替えられる。すなわち、操作前が第1モードであった場合には第2モードに切り替えられ、操作前が第2モードであった場合には第2モードに切り替えられる。CPU11は、メインメモリ17中のモードデータ55の内容を、切り替えられたモードに応じて変更する。本実施形態では、モードの切り替えに応じて仮想カメラの位置が変更される。具体的には、第1モードの場合には仮想カメラの位置はプレイヤキャラクタの頭部付近に設定され、第2モードの場合には仮想カメラの位置はプレイヤキャラクタを俯瞰する位置に設定される。ステップS4の次にステップS5の処理が実行される。
ステップS5において、現在のゲームモードが第1モードであるか否かが判定される。CPU21は、メインメモリ17中のモードデータ55を参照して、現在のゲームモードが第1モードであるか第2モードであるかを判定する。判定の結果、第1モードである場合、ステップS7〜S11の処理が実行される。一方、第2モードである場合、ステップS6の処理が実行される。
まず、第2モードにおけるゲーム処理を説明する。ステップS6において、プレイヤによるゲーム操作に基づいたゲーム処理が行われる。なお、第2モードにおけるゲーム処理はどのようなものであってもよいが、例えば、ゲーム操作に従ってプレイヤキャラクタを移動させたり、敵キャラクタが登場する場合にはプレイヤキャラクタに敵キャラクタを攻撃させたりする処理が考えられる。ステップS6の後、後述するステップS12の処理が実行される。
次に、第1モードにおけるゲーム処理を説明する。ステップS7において、ゲームモードが切り替えられた直後であるか否かが判定される。具体的には、直前に実行されたステップS3における判定が肯定であったか否かが判定される。判定の結果、ゲームモードが切り替えられた直後であると判定される場合、ステップS8の処理が実行される。一方、ゲームモードが切り替えられた直後でないと判定される場合、ステップS8の処理がスキップされてステップS9の処理が実行される。
ステップS8においては、仮想平面上における目標点および追従点が初期位置に設定される。CPU11は、メインメモリ17に記憶されている目標座標データ45および追従座標データ46の内容を、予め定められた初期位置の座標値とする。さらに、ステップS8においては、CPU11は、メインメモリ17に記憶されている現在入力座標データ41、前入力座標データ42、入力ベクトルデータ43、入力速度データ44、距離ベクトルデータ47、および出力ベクトルデータ49の内容をクリアする。ステップS8の次にステップS9の処理が実行される。
ステップS9において、ステップS2で取得された座標データが現在入力座標データ41としてメインメモリ17に記憶される。ステップS2でコントローラ5から取得される操作データにはタッチパッド7から出力される入力座標データが含まれているので、CPU11は、操作データに含まれている入力座標データの内容を現在入力座標データ41としてメインメモリ17に更新して記憶する。つまり、現在入力座標データ41の内容は、ステップS2で取得された入力座標データの内容に更新される。さらにステップS9においては、更新前における現在入力座標データ41の内容が、前入力座標データ42としてメインメモリ17に記憶される。
続くステップS10において、出力ベクトル算出処理が実行される。出力ベクトル算出処理は、ステップS2で取得された入力座標データに基づいて出力ベクトルを算出するための処理である。以下、図11〜図14を用いて出力ベクトル算出処理の詳細を説明する。
図11および図12は、図10に示す出力ベクトル算出処理(S10)の詳細な処理の流れを示すフローチャートである。出力ベクトル算出処理においては、まずステップS21において、入力座標から入力ベクトルが算出される。入力ベクトル(Ivx,Ivy)は、現在入力座標(Ipx,Ipy)と前入力座標(Ipx’,Ipy’)とを用いて算出される。すなわち、CPU11は、メインメモリ17中の現在入力座標データ41および前入力座標データ42を参照して、次の式(1)に従って入力ベクトルを算出する。
Ivx=Ipx−Ipx’
Ivy=Ipy−Ipy’ …(1)
なお、タッチパッド7に対する入力が開始されたフレーム(タッチパッド7に対する入力があったフレームであって、前回のフレームで当該入力がなかったフレーム)では、入力ベクトル(Ivx,Ivy)は(0,0)として算出される。上式(1)で算出された入力ベクトルを示すデータは、入力ベクトルデータ43としてメインメモリ17に更新して記憶される。ステップS21の次にステップS22の処理が実行される。
次のステップS22およびS23では、入力ベクトルを補正する処理が実行される。ステップS22およびS23の処理は、入力ベクトルの時間変化を緩和するように入力ベクトルが補正するための処理である。本実施形態では、目標点を追従する追従点の時間変化を出力ベクトルとすることによって入力ベクトルの時間変化を緩和するとともに、ステップS22およびS23の処理によって入力ベクトルの時間変化を緩和している。なお、他の実施形態においては、ステップS22およびS23の処理を実行せず、ステップS21で算出された入力ベクトルをそのままステップS24以降の処理に用いるようにしてもよい。
具体的には、ステップS22において、ステップS21で算出された入力ベクトルに基づいて入力速度が算出される。入力速度Isは、入力ベクトル(Ivx,Ivy)と、前回の入力速度(ステップS22で入力速度が更新される前の入力速度データ44により示される入力速度)Is’と、速度定数Apとを用いて算出される。すなわち、CPU11は、メインメモリ17中の入力ベクトルデータ43、入力速度データ44、および速度定数データ50を参照して、次の式(2)に従って入力速度を算出する。
Is=Is’+(Iv−Is’)×Ap …(2)
上式(2)において、Ivは入力ベクトル(Ivx,Ivy)の長さである。なお、上式(2)において、タッチパッド7に対する入力が開始されたフレームでは、前回の入力速度(Isx’,Isy’)は(0,0)として計算される。上式(2)で算出された入力速度を示すデータは、入力速度データ44としてメインメモリ17に更新して記憶される。
続くステップS23において、ステップS22で算出された入力速度に基づいて入力速度が補正される。入力ベクトル(Ivx,Ivy)は、ステップS22で算出された入力速度(Isx,Isy)、補正前の入力ベクトル(Ivx’,Ivy’)、および補正定数Spを用いて算出される。すなわち、CPU11は、メインメモリ17中の入力ベクトルデータ43、入力速度データ44、および補正定数データ51を参照して、次の式(3)に従って入力ベクトルを補正する。
Ivx=Ivx’×(Is×Sp+1)
Ivy=Ivy’×(Is×Sp+1) …(3)
CPU11は、メインメモリ17に記憶される入力ベクトルデータ43の値を、上式(3)で得られた値に更新する。ステップS23の次にステップS24の処理が実行される。
ステップS24において、入力ベクトルに基づいて目標点が移動される。目標点の移動後における位置を示す目標座標(Dpx,Dpy)は、移動前の目標点の位置を示す目標座標(Dpx’,Dpy’)と、入力ベクトル(Ivx,Ivy)とを用いて算出される。すなわち、CPU11は、メインメモリ17中の入力ベクトルデータ43および目標座標データ45を参照して、次の式(4)に従って目標座標の値を算出する。
Dpx=Dpx’+Ivx
Dpy=Dpy’+Ivy …(4)
上式(4)において、(Dpx’,Dpy’)は移動前の目標座標であり、式(4)の計算を行う前における目標座標データ45により示される値である。CPU11は、メインメモリ17に記憶される目標座標データ45の値を、上式(4)で得られた値に更新する。ステップS24の次にステップS25の処理が実行される。
ステップS25において、目標点が仮想平面の境界を越えたか否かが判定される。そして、目標点が仮想平面の境界を越えた場合、ステップS26において目標座標が補正される。以下、ステップS25およびS26の処理の詳細を、図13を用いて説明する。
図13は、仮想平面上を目標点が移動する様子の一例を示す図である。図13に示すように、本実施形態においては仮想平面31は正方形である。仮想平面31の位置を表すための座標系は、正方形の左下の頂点に原点が位置し、右方向をx軸正方向とし、上方向をy軸正方向とするように設定されている。仮想平面31の各辺の長さはWであるので、仮想平面のx軸方向およびy軸方向に関する範囲は0〜Wである。仮想平面31の境界は、x=0、x=W,y=0,y=Wという4つの直線で表される。
上述のように仮想平面31は有限の大きさであるので、上記ステップS24で目標点が移動されたことによって、目標点が仮想平面31の境界を越えてしまうことが考えられる。図13において、位置Paは移動前の目標点の位置であり、位置Pb’は移動後の目標点の位置である。図13では、目標点は、x=0の直線で表される境界を越えて移動している。ステップS25は、目標点が図13のように境界を越えて移動したことを検出するためのステップである。
具体的には、ステップS25においては、目標座標が仮想平面31の範囲内(0〜W)の位置を表すか否かが判定される。ステップS25の判定は、目標座標(Dpx,Dpy)および仮想平面の大きさWを用いて行うことができる。すなわち、CPU11は、メインメモリ17に記憶されている目標座標データ45および仮想平面データ52を参照して、以下の式(5)〜(8)が満たされるか否かをそれぞれ判定する。
Dpx<0 …(5)
Dpx≧W …(6)
Dpy<0 …(7)
Dpy≧W …(8)
ステップS25においては、上式(5)〜(8)のうちの少なくとも1つが満たされる場合、目標点は仮想平面31の境界を越えて移動したと判定される。一方、上式(5)〜(8)のすべてが満たされない場合、目標点は仮想平面31の境界を越えて移動していないと判定される。ステップS25の判定において、目標点は仮想平面31の境界を越えて移動したと判定される場合、ステップS26の処理が実行される。一方、目標点は仮想平面31の境界を越えて移動していないと判定される場合、ステップS26の処理がスキップされて図12に示すステップS30の処理が実行される。
ステップS26においては、仮想平面31内の座標値をとるように目標座標が補正される。図13を例にとって説明すると、目標点が移動によって仮想平面31外の位置Pb’となった場合、目標点は仮想平面31内の位置Pbに補正される。すなわち、仮想平面31の各辺には、仮想平面31と同じ座標系を有する別の仮想平面(仮の仮想平面と呼ぶ)32が接続していると考え、当該仮の仮想平面32における座標系で位置Pbを表した場合の座標値を、補正後の目標座標の座標値とする。これによって、仮想平面の境界は、逆側の境界に接続されていることとなる。なお、図13では、x=0の直線で表される境界を目標点が超えた場合を例として説明したが、他の境界を越えた場合も同様に処理することができる。
具体的には、ステップS26においては、目標座標(Dpx,Dpy)の各成分の値が適宜補正される。すなわち、CPU11は、次の条件に従って式(9)〜(12)の計算を行い、目標座標(Dpx,Dpy)を補正する。
上式(5)が満たされる場合:Dpx=Dpx’+W …(9)
上式(6)が満たされる場合:Dpx=Dpx’−W …(10)
上式(7)が満たされる場合:Dpy=Dpy’+W …(11)
上式(8)が満たされる場合:Dpy=Dpy’−W …(12)
上式(9)〜(12)において、(Dpx’,Dpy’)は補正前の目標座標である。なお、上記ステップS25において、式(5)〜(8)のうちのいずれか2つの式が満たされる場合には、式(9)〜(12)のうちで当該2つの式に対応する2つの式の計算が行われる。以上のステップS26の次にステップS27の処理が実行される。
ステップS27において、目標点の位置および追従点の位置に基づいて距離ベクトルが算出される。距離ベクトル(Lx,Ly)は、目標座標(Dpx,Dpy)および追従座標(Fpx,Fpy)を用いて算出される。すなわち、CPU11は、メインメモリ17に記憶されている目標座標データ45および追従座標データ46を参照して、次の式(13)に従って距離ベクトルを算出する。
Lx=Dpx−Fpx
Ly=Dpy−Fpy …(13)
CPU11は、メインメモリ17に記憶される距離ベクトルデータ47の値を、上式(13)で得られた値に更新する。ステップS27の次にステップS28の処理が実行される。
なお、目標点が仮想平面の境界を超えた場合、ステップS27で算出された距離ベクトルが、追従点から目標点への正しいベクトルとならない。図14は、目標点が仮想平面の境界を超えた場合における目標点および追従点を示す図である。図14に示すように、位置Paにあった目標点が仮想平面の境界を越えて位置Pbに移動した場合、ステップS27において算出される距離ベクトルは、ベクトルVaとなる。しかし、このベクトルVaは追従点から目標点への正しいベクトルではなく、正しいベクトルはVbとなるべきである。そこで、目標点が仮想平面の境界を超えた場合に距離ベクトルを補正するために、ステップS28およびS29の処理が実行される。
ステップS28においては、ステップS27で算出された距離ベクトルを補正するか否かが判定される。ここで、本実施形態では、距離ベクトルの各成分の大きさに上限値を設定しておき、仮想平面の大きさWを当該上限値の2倍よりも大きくなるように設定する。なお、距離ベクトルの各成分の大きさには上限がないが、タッチパッド7を用いた操作を実際に行う上で十分な大きさの値を上限値として設定しておけばよい。以上のように仮想平面の大きさWを設定することによって、距離ベクトルの各成分の大きさLxおよびLyが仮想平面の大きさWの半分以上の場合には、距離ベクトルの各成分の大きさのいずれかが上限値を超えているので、距離ベクトルを補正すべきと判断することができる。
具体的には、ステップS28において、CPU11は、メインメモリ17に記憶されている距離ベクトルデータ47および仮想平面データ52を参照して、以下の式(14)〜(17)が満たされるか否かをそれぞれ判定する。
Lx<−W/2 …(14)
Lx≧W/2 …(15)
Ly<−W/2 …(16)
Ly≧W/2 …(17)
ステップS28においては、上式(14)〜(17)のうちの少なくとも1つが満たされる場合、距離ベクトルを補正すると判定される。この場合、ステップS29の処理が実行される。一方、上式(14)〜(17)のすべてが満たされない場合、距離ベクトルを補正しないと判定される。この場合、ステップS29の処理がスキップされて図12に示すステップS30の処理が実行される。
ステップS29においては、ステップS27で算出された距離ベクトルの各成分の大きさが補正される。具体的には、CPU11は、次の条件に従って式(18)〜(21)の計算を行い、距離ベクトル(Lx,Ly)を補正する。
上式(14)が満たされる場合:Lx=Lx’+W …(18)
上式(15)が満たされる場合:Lx=Lx’−W …(19)
上式(16)が満たされる場合:Ly=Ly’+W …(20)
上式(17)が満たされる場合:Ly=Ly’−W …(21)
上式(18)〜(21)において、(Lx’,Ly’)は補正前の距離ベクトルである。なお、上記ステップS29において、式(14)〜(17)のうちのいずれか2つの式が満たされる場合には、式(18)〜(21)のうちで当該2つの式に対応する2つの式の計算が行われる。以上のステップS29の次に図12に示すステップS30の処理が実行される。
なお、追従点は目標点を追従するように移動するので、目標点が仮想平面の境界を越えた以降において追従点も目標点と同様に仮想平面の境界を越えて移動することになる(後述するステップS36およびS37)。ステップS29の補正処理は、目標座標の補正が実行され、かつ、当該目標座標の補正が実行された結果実行されるべき追従座標の補正がまだ実行されていない場合(すなわち、追従点が境界をまだ超えていない場合)に実行されることになる。
なお、ステップS28およびS29においては、距離ベクトルの各成分の大きさに上限値(W/2)を設け、当該各成分が上限値を超える場合に距離ベクトルを補正するようにした。ここで、他の実施形態では、目標点が仮想平面の境界を超えており、かつ、追従点が仮想平面の境界をまだ越えていないことを示すフラグを用いて、距離ベクトルを補正するか否かを判定するようにしてもよい。具体的には、ステップS25における判定結果が肯定であった場合、フラグをオンに設定する。ステップS28では、上述した判定に代えて、当該フラグがオンであるか否かを判定する。そして、フラグがオンである場合、ステップS29の処理を行う。なお、フラグは、目標点に続いて追従点が仮想平面の境界を超えた場合(後述するステップS36の判定結果が肯定であった場合)にオフに設定される。以上の処理によっても、距離ベクトルを正しい値に補正することができる。
図12に示すステップS30において、距離ベクトルを用いて追従点から目標点までの距離(2点間距離)が算出される。すなわち、CPU11は、メインメモリ17に記憶されている距離ベクトルデータ47により示される距離ベクトル(Lx,Ly)の大きさを2点間距離Lとして算出する。算出された2点間距離Lを示すデータは、2点間距離データ48としてメインメモリ17に記憶される。
続くステップS31において、追従点が上記到達領域内に位置するか否かが判定される。到達領域は、目標点を中心とした半径Rの円形領域である。したがって、ステップS31の判定は、ステップS30で算出された2点間距離Lが到達領域の半径R以下であるか否かによって行うことができる。すなわち、CPU11は、メインメモリ17に記憶されている到達領域データ53および2点間距離データ48を参照して、L≦Rであるか否かを判定する。ステップS31の判定処理は、追従点が目標点に到達したと見なされるか否かを判定するための処理である。
ステップS31の判定において、追従点が上記到達領域内に位置すると判定される場合、ステップS32の処理が実行される。ステップS32において、出力ベクトルの値が0に設定される。すなわち、メインメモリ17に記憶されている出力ベクトルデータ49の内容は、(0,0)に更新される。ステップS32の次に、ステップS35の処理が実行される。
一方、ステップS31の判定において、追従点が上記到達領域内に位置しないと判定される場合、ステップS33およびS34の処理が実行される。ステップS33およびS34の処理は、追従点を目標点に追従するように移動させる処理である。まず、ステップS33においては、距離ベクトルの大きさが調整される。距離ベクトルの大きさは、追従点から到達領域の外周までの距離となるように調整される。調整後の距離ベクトル(Lx,Ly)は、上記2点間距離L、調整前の距離ベクトル(Lx’,Ly’)、および到達領域の半径Rを用いて算出される。すなわち、CPU11は、メインメモリ17に記憶されている距離ベクトルデータ47、2点間距離データ48、および到達領域データ53を参照して、次の式(22)に従って距離ベクトルを算出する。
Lx=Lx’×(L−R)/L
Ly=Ly’×(L−R)/L …(22)
CPU11は、メインメモリ17に記憶される距離ベクトルデータ47の値を、上式(22)で得られた値に更新する。
続くステップS34において、距離ベクトル(Lx,Ly)および追従度Sに基づいて出力ベクトル(Fvx,Fvy)が算出される。すなわち、CPU11は、メインメモリ17に記憶されている距離ベクトルデータ47および追従度データ54を参照して、次の式(23)に従って出力ベクトルを算出する。
Fvx=Lx×S
Fvy=Ly×S …(23)
CPU11は、メインメモリ17に記憶される出力ベクトルデータ49の値を、上式(23)で得られた値に更新する。このステップS34で得られた出力ベクトルに基づいて、画面に表示されている画像を移動させる処理が実行される(後述するステップS11)。ステップS34の次に、ステップS35の処理が実行される。
ステップS35においては、ステップS34で算出された出力ベクトルに従って追従点が移動される。移動後の追従点の位置を示す追従座標(Fpx,Fpy)は、移動前の追従点の位置を示す追従座標(Fpx’,Fpy’)と、ステップS32またはステップS34で算出された出力ベクトル(Fvx,Fvy)を用いて算出される。すなわち、CPU11は、メインメモリ17に記憶されている追従座標データ46および出力ベクトルデータ49を参照して、次の式(24)に従って追従座標を算出する。
Fpx=Fpx’+Fvx
Fpy=Fpy’+Fvy …(24)
CPU11は、メインメモリ17に記憶される追従座標データ46の値を、上式(24)で得られた値に更新する。ステップS35の次にステップS36の処理が実行される。
ステップS36において、追従点が仮想平面の境界を越えたか否かが判定される。ステップS36の判定処理は、判定を行う対象を目標座標に代えて追従座標とする点を除いて、目標座標が仮想平面の境界を越えたか否かを判定するステップS25の判定処理と同様である。ステップS36の判定において、追従点が仮想平面の境界を越えたと判定される場合、ステップS37において追従座標が補正される。ステップS37の処理は、補正を行う対象を目標座標に代えて追従座標とする点を除いて、目標座標を補正するステップS26の処理と同様である。一方、ステップS36の判定において、追従点が仮想平面の境界を越えていないと判定される場合、ステップS37の処理がスキップされ、CPU11は出力ベクトル算出処理を終了する。
図10の説明に戻り、ステップS10の出力ベクトル算出処理の次に、ステップS11の処理が実行される。ステップS11においては、出力ベクトルの向きおよび大きさに基づいて、テレビ6の画面に表示されている画像をスクロールさせる処理が実行される。具体的には、CPU11は、仮想カメラの視線方向を、出力ベクトルの向きに対応する方向に、出力ベクトルの大きさに応じた角度だけ移動させる。これによって、画面上では画像がスクロールして表示される(図3および図4参照)。
続くステップS12において、ゲームを終了するか否かが判定される。ゲームを終了するか否かの判定は、例えば、ゲームオーバーとなる所定の条件(より具体的には、プレイヤキャラクタが敵キャラクタに倒されたこと)が満たされたか否かによって行うことができる。また、ゲームを終了するか否かの判定は、プレイヤがゲームを終了するための所定の操作を行われたか否かによって行うことができる。ステップS12の判定において、ゲームを終了すると判定される場合、CPU11は図10に示すゲーム処理を終了する。一方、ゲームを終了しないと判定される場合、ステップS2の処理が再度実行される。以降、ステップS12においてゲームを終了すると判定されるまでステップS2〜S12の処理ループが繰り返し実行される。
以上のように、本実施形態では、目標点と、目標点を追従する追従点とを設定し、追従点の移動距離を示す出力ベクトルに基づいて表示制御処理を行う。これによって、入力開始時および入力終了時における入力ベクトルの急激な変化を緩和し、画像を滑らかに移動させることができる。さらに、追従点は、目標点の移動状況にかかわらず(目標点が移動しているか否かにかかわらず)、目標点に到達すると判断されるまで移動を続ける。これによって、プレイヤが行った入力の長さに応じた量だけ画像が移動されることになるので、画像を移動させる操作の操作性を向上することができる。
なお、本実施形態では、入力ベクトルに基づいて目標点を移動させるようにしたが、他の実施形態では、入力位置に基づいて目標点を移動させるようにしてもよい。例えば、タッチパッド7の入力面上の入力位置に対応する位置に目標点を移動させるようにしてもよい。この場合でも、目標点の移動状況にかかわらず追従点を移動させることによって、上記と同様、プレイヤが行った入力の長さに応じた量だけ画像を移動させるようにすることができる。
なお、本実施形態では、タッチパッド7に対する入力位置に基づくのではなく入力ベクトルに基づいて目標点を移動させることによって、タッチオフ後にタッチオンされた場合でも目標点の位置をリセットしなくてもよい。つまり、タッチオフ後にタッチオンされた場合であってもタッチオフ前の目標点の位置を維持して追従点を移動させることができる。これによって、タッチオフ直後にタッチオンがされた場合における画像の移動をスムーズにすることができる。さらに、タッチオフ直後にタッチオンがされた場合であっても目標点と追従点の総移動量をほぼ等しくすることができ、プレイヤが行った入力の長さに応じた量だけ画像が移動させることができる。
また、他の実施形態においては、上記ステップS21で算出された入力ベクトルの大きさが、予め定められた所定値よりも小さい場合、ステップS24で目標点を移動させないようにしてもよい。なお、プレイヤが入力面上の1点をタッチしている場合であっても、タッチパッド7によって実際に検出される入力位置が若干移動してしまうことがある。このような場合には、画像が微少な距離だけ移動することになる。しかし、このような移動は、プレイヤが意図していない移動である。これに対して、入力ベクトルの大きさが微少である場合には目標点を移動させないようにすることで、プレイヤが意図しない操作によって画像が移動することを防止することができる。
また、上記実施形態においては、コントローラ5から出力された入力座標データ(または入力ベクトルのデータ)を受け取ったゲーム装置2が、出力ベクトルを算出する処理を実行した。ここで、他の実施形態では、コントローラ5側で出力ベクトルを算出する処理を実行するようにしてもよい。すなわち、コントローラ5は、上記ステップS7〜S10の処理を実行する。さらに、コントローラ5は、ステップS10の結果得られた出力ベクトルをゲーム装置2へ出力(送信)する。ゲーム装置2は、コントローラ5から出力された出力ベクトルのデータを受信し、受信した出力ベクトルに応じて仮想カメラの視線方向を決定する(ステップS11)。このように、コントローラ5がCPUやステップS2およびS3を実行する処理回路を備える場合には、出力ベクトルをコントローラ5が算出するようにしてもよい。なお、このとき、ゲーム装置2は、出力ベクトルに応じた表示制御処理を行うだけであるので、従来のゲーム装置をそのまま適用することができる。すなわち、出力ベクトルを算出可能なコントローラを従来のゲーム装置に接続することによって、図1と同等のゲームシステムを実現することができる。
また、上記実施形態においては、仮想平面上に設定される目標点を入力ベクトルに基づいて移動させることによって、目標点の位置を入力位置から独立して(目標点の位置を入力位置と一対一に対応させずに)管理するようにした。ここで、他の実施形態においては、入力面上の入力座標を仮想平面上の座標に変換する関数を用い、タッチオンされる度に当該関数を変更するようにしてもよい。すなわち、タッチオフ後にタッチオンされたことが検出された場合、ゲーム装置2は、タッチオンした位置を表す座標(タッチオン時の入力座標)を、タッチオフされた時点における目標座標に変換する関数を算出する。この関数は、具体的には、座標を所定距離だけ平行移動させる関数である。例えば、タッチオン時の入力座標を(1,0)とし、タッチオフされた時点における目標座標を(3,3)とした場合、ゲーム装置2は、x座標値を2加算し、y座標値を3加算するように座標を平行移動させる関数を算出する。ゲーム装置2は、タッチオンが行われた最初のフレームで当該関数を算出する。そして、タッチオンが継続する間は、算出された関数を用いて入力座標を変換する。なお、最初のタッチオン時(目標座標が初期位置にある時点)には、最初にタッチオンされた位置を目標座標の初期位置に変換する関数が算出される。以上のように、入力座標を上記関数を用いて変換することによって目標座標を計算し、新たにタッチオンが行われる度に当該関数を変更することで、目標点の位置を入力位置と一対一に対応させずに管理することができる。また、これによれば、タッチオフ後に再度タッチオンが行われた場合であっても、再度のタッチオン後の目標点の位置がタッチオフ前と異なることがない。
また、上記実施形態においては、ゲームプログラムおよびゲーム装置を例として説明したが、本発明は、ゲームに限らず、画面上において指定された位置または上記入力ベクトルを検出することが可能なポインティングデバイスを用いて出力ベクトルを算出する技術に適用することができる。