図1を参照して、この発明の実施例であるゲーム装置10は、第1の液晶表示器(LCD)12および第2のLCD14を含む。LCD12およびLCD14は、所定の配置位置となるようにハウジング16に収納される。この実施例では、ハウジング16は、上側
ハウジング16aと下側ハウジング16bとによって構成され、LCD12は上側ハウジング16aに収納され、LCD14は下側ハウジング16bに収納される。したがって、LCD12とLCD14とは縦(上下)に並ぶように近接して配置される。
なお、この実施例では、表示器としてLCDを用いるようにしてあるが、LCDに代えて、EL(Electronic Luminescence)ディスプレイやプラズマディスプレイを用いるよう
にしてもよい。
図1からも分かるように、上側ハウジング16aは、LCD12の平面形状よりも少し大きな平面形状を有し、一方主面からLCD12の表示面を露出するように開口部が形成される。一方、下側ハウジング16bは、その平面形状が上側ハウジング16aと略同じであり、その略中央部にLCD14の表示面を露出するように開口部が形成される。下側ハウジング16bの右側面には電源スイッチ18が設けられる。
また、上側ハウジング16aには、LCD12を挟んで左右に、スピーカ36aおよび36b(図2)のための音抜き孔20aおよび20bが形成される。そして、下側ハウジング16bには、マイク(図示せず)のためのマイク孔20cが形成されるとともに、操作スイッチ22(22a,22b,22c,22d,22e,22f,22g,22Lおよび22R)が設けられる。
また、上側ハウジング16aと下側ハウジング16bとは、上側ハウジング16aの下辺(下端)と下側ハウジング16bの上辺(上端)の一部とが回動可能に連結されている。したがって、たとえば、ゲームをプレイしない場合には、LCD12の表示面とLCD14の表示面とが対面するように、上側ハウジング16aを回動させて折りたたんでおけば、LCD12の表示面およびLCD14の表示面に傷がつくなどの破損を防止することができる。ただし、上側ハウジング16aと下側ハウジング16bとは、回動可能に連結せずに、それらを一体的(固定的)に設けたハウジング16を形成するようにしてもよい。
操作スイッチ22は、方向指示スイッチ(十字スイッチ)22a,スタートスイッチ22b、セレクトスイッチ22c、動作スイッチ(Aボタン)22d、動作スイッチ(Bボタン)22e、動作スイッチ(Xボタン)22f、動作スイッチ(Yボタン)22g、動作スイッチ(Lボタン)22Lおよび動作スイッチ(Rボタン)22Rを含む。スイッチ22aは、下側ハウジング16bの一方主面であり、LCD14の左側に配置される。その他のスイッチ22b−22gは、下側ハウジング16bの一方主面であり、LCD14の右側に配置される。さらに、スイッチ22Lおよびスイッチ22Rは、それぞれ、上側ハウジング16aとの連結部を挟む下側ハウジング16bの上側面の左右角部に配置される。
方向指示スイッチ22aは、ディジタルジョイスティックとして機能し、4つの押圧部の1つを操作することによって、ユーザないしプレイヤによって操作可能なプレイヤキャラクタ(またはプレイヤオブジェクト)の移動方向を指示したり、カーソルの移動方向を指示したりする等に用いられる。また、各押圧部には、特定の役割を割り当てることができ、4つの押圧部の1つを操作することによって、割り当てられた役割を指示(指定)することができる。
スタートスイッチ22bは、プッシュボタンで構成され、ゲームを開始(再開)したり、一時停止(Pause)したりする等に用いられる。また、セレクトスイッチ22cは、プッ
シュボタンで構成され、ゲームモードの選択等に用いられる。
動作スイッチ22dすなわちAボタンは、プッシュボタンで構成され、方向指示以外の動作、すなわち、プレイヤキャラクタに打つ(パンチ)、投げる、つかむ(取得)、乗る、ジャンプするなどの任意のアクションをさせることができる。たとえば、アクションゲームにおいては、ジャンプ、パンチ、武器を動かす等を指示することができる。また、ロールプレイングゲーム(RPG)やシミュレーションRPGにおいては、アイテムの取得、武器やコマンドの選択および決定等を指示することができる。動作スイッチ22eすなわちBボタンは、プッシュボタンで構成され、セレクトスイッチ22cで選択したゲームモードの変更やAボタン22dで決定したアクションの取り消し等のために用いられる。
動作スイッチ22fすなわちXボタン、および動作スイッチ22gすなわちYボタンは、プッシュボタンで構成され、Aボタン22dとBボタン22eだけでは、ゲーム進行ができないときに、補助的な操作に用いられる。ただし、Xボタン22fおよびYボタン22gは、Aボタン22dおよびBボタン22eと同様の操作に用いることも可能である。もちろん、ゲームプレイにおいてXボタン22fとYボタン22gとを必ずしも使用しなくてよい。
動作スイッチ22L(左押しボタン)および動作スイッチ22R(右押しボタン)は、プッシュボタンで構成され、左押しボタン(Lボタン)22Lおよび右押しボタン(Rボタン)22Rは、Aボタン22dおよびBボタン22eと同様の操作に用いることができ、また、Aボタン22dおよびBボタン22eの補助的な操作に用いることができる。さらに、Lボタン22LおよびRボタン22Rは、方向スイッチ22a、Aボタン22d,Bボタン22e,Xボタン22f,Yボタン22gに割り当てられた役割を、他の役割に変更することができる。
また、LCD14の上面には、タッチパネル24が装着される。タッチパネル24としては、たとえば、抵抗膜方式、光学式(赤外線方式)および静電容量結合式のいずれかの種類のものを用いることができる。また、タッチパネル24は、その上面をスティック26ないしはペン(スタイラスペン)或いは指(以下、これらを「スティック26等」という場合がある。)で、押圧したり、撫でたり、触れたりすることにより操作(タッチオン操作)すると、スティック26等の操作位置の座標を検出して、検出した座標(検出座標)に対応する座標データを出力する。
なお、この実施例では、LCD14(LCD12も同じ、または略同じ)の表示面の解像度は256dot×192dotであり、タッチパネル24の検出精度も表示画面に対応して256dot×192dotとしてあるが、タッチパネル24の検出精度は表示画面の解像度よりも低くてもよく、高くてもよい。
LCD12およびLCD14には異なるゲーム画面が表示されてもよい。たとえば、レ
ースゲームでは一方のLCDに運転席からの視点による画面を表示し、他方のLCDにレース(コース)全体の画面を表示することができる。また、RPGでは、一方のLCDにマップやプレイヤキャラクタ等のキャラクタを表示し、他方のLCDにプレイヤキャラクタが所有するアイテムを表示することができる。さらに、一方のLCD(この実施例では、LCD14)にゲームの操作画面(ゲーム画面)を表示し、他方のLCD(この実施例では、LCD12)に当該ゲームに関する情報(得点やレベルなど)を含む他のゲーム画面を表示することができる。さらには、2つのLCD12およびLCD14を合わせて1つの画面として用いることにより、プレイヤキャラクタが倒さなければならない巨大な怪物(敵キャラクタ)を表示することもできる。
したがって、プレイヤはスティック26等でタッチパネル24を操作することにより、LCD14の画面に表示されるプレイヤキャラクタ、敵キャラクタ、アイテムキャラクタ、操作オブジェクトなどの画像を指示(操作)したり、コマンドを選択(入力)したりすることができる。また、3次元ゲーム空間に設けられる仮想カメラ(視点)の方向(視線の向き)を変化させたり、ゲーム画面(マップ)のスクロール(徐々に移動表示)方向を指示したりすることもできる。
なお、ゲームの種類によっては、タッチパネル24を用いることにより、その他の入力指示も可能である。たとえば、座標入力指示を入力したり、LCD14において文字,数字,記号等を手書き入力したりすることができる。
このように、ゲーム装置10は、2画面分の表示部となるLCD12およびLCD14を有し、いずれか一方(この実施例では、LCD14)の上面にタッチパネル24が設けられるので、2画面(12,14)と2系統の操作部(22,24)とを有する構成になっている。
また、この実施例では、スティック26は、たとえば下側ハウジング16bに設けられる収納部(図示せず)に収納することができ、必要に応じて取り出される。ただし、スティック26を設けない場合には、その収納部も設ける必要はない。
さらに、ゲーム装置10はメモリカード(またはカートリッジ)28を含み、このメモリカード28は着脱自在であり、下側ハウジング16bの裏面ないしは下端(底面)に設けられる挿入部30(図1では点線で示す)に挿入される。図1では省略するが、挿入部30の奥部には、メモリカード28の挿入方向先端部に設けられるコネクタ(図示せず)と接合するためのコネクタ32(図2参照)が設けられており、したがって、メモリカード28が挿入部30に挿入されると、コネクタ同士が接合され、ゲーム装置10のCPUコア34(図2参照)がメモリカード28にアクセス可能となる。
なお、図1では表現できないが、上側ハウジング16aの音抜き孔20aおよび20bと対応する位置であり、この上側ハウジング16aの内部にはスピーカ36aおよび36b(図2参照)が設けられる。
また、図1では省略するが、たとえば、下側ハウジング16bの裏面側には、電池収容ボックスが設けられ、また、下側ハウジング16bの底面側には、音量スイッチ、外部拡張コネクタおよびイヤフォンジャックなどが設けられる。
図2はゲーム装置10の電気的な構成を示すブロック図である。図2を参照して、ゲーム装置10は電子回路基板38を含み、この電子回路基板38には上述のCPUコア34等の回路コンポーネントが実装される。CPUコア34は、バス40を介して前述のコネクタ32に接続されるとともに、RAM42、第1のグラフィック処理ユニット(GPU
)44、第2のGPU46、入出カインターフエース回路(以下、「I/F回路」という。)48およびLCDコントローラ50が接続される。
コネクタ32には、上述したように、メモリカード28が着脱自在に接続される。メモリカード28は、ROM28aおよびRAM28bを含み、図示は省略するが、ROM28aおよびRAM28bは、互いにバスで接続され、さらに、コネクタ32と接合されるコネクタ(図示せず)に接続される。したがって、上述したように、CPUコア34は、ROM28aおよびRAM28bにアクセスすることができるのである。
ROM28aは、ゲーム装置10で実行すべきゲームのためのゲームプログラム、画像データ(文字やオブジェクトの画像、背景画像、アイテム画像、アイコン(ボタン)画像、メッセージ画像など)およびゲームに必要な音(音楽)のデータ(音データ)等を予め記憶する。RAM(バックアップRAM)28bは、そのゲームの途中データやゲームの結果データなどを記憶(セーブ)する。
RAM42は、バッファメモリないしはワーキングメモリとして使用される。つまり、CPUコア34は、メモリカード28のROM28aに記憶されたゲームプログラム、画像データおよび音データ等をRAM42にロードし、ロードしたゲームプログラムを実行する。また、CPUコア34は、ゲームの進行に応じて一時的に発生するデータ(ゲームデータやフラグデータ)をRAM42に記憶しつつゲーム処理を実行する。
なお、ゲームプログラム、画像データおよび音データ等は、ROM28aから一度に全部、または部分的かつ順次的に読み出され、RAM42に記憶(ロード)される。
GPU44およびGPU46は、それぞれ、描画手段の一部を形成し、たとえばシングルチップASICで構成され、CPUコア34からのグラフィックスコマンド(作画命令)を受け、そのグラフィックスコマンドに従って画像データを生成する。ただし、CPUコア34は、グラフィックスコマンドに加えて、画像データの生成に必要な画像生成プログラム(ゲームプログラムに含まれる。)をGPU44およびGPU46のそれぞれに与える。
また、GPU44には、第1のビデオRAM(以下、「VRAM」という。)52が接続され、GPU46には、第2のVRAM54が接続される。GPU44およびGPU46が作画コマンドを実行するにあたって必要なデータ(画像データ:ポリゴンやテクスチャ等のデータ)は、GPU44およびGPU46が、それぞれ、第1のVRAM52および第2のVRAM54にアクセスして取得する。
なお、CPUコア34は、描画に必要な画像データをGPU44およびGPU46を介して第1のVRAM52および第2のVRAM54に書き込む。GPU44はVRAM52にアクセスして描画のための画像データを作成し、GPU46はVRAM54にアクセスして描画のための画像データを作成する。
VRAM52およびVRAM54は、LCDコントローラ50に接続される。LCDコントローラ50はレジスタ56を含み、レジスタ56はたとえば1ビットで構成され、CPUコア34の指示によって「0」または「1」の値(データ値)を記憶する。LCDコントローラ50は、レジスタ56のデータ値が「0」である場合には、GPU44によって作成された画像データをLCD12に出力し、GPU46によって作成された画像データをLCD14に出力する。また、LCDコントローラ50は、レジスタ56のデータ値が「1」である場合には、GPU44によって作成された画像データをLCD14に出力し、GPU46によって作成された画像データをLCD12に出力する。
なお、LCDコントローラ50は、VRAM52およびVRAM54から直接画像データを読み出したり、GPU44およびGPU46を介してVRAM52およびVRAM54から画像データを読み出したりする。
I/F回路48には、操作スイッチ22,タッチパネル24およびスピーカ36a,36bが接続される。ここで、操作スイッチ22は、上述したスイッチ22a,22b,22c,22d,22e,22f,22g,22Lおよび22Rであり、操作スイッチ22が操作されると、対応する操作信号(操作データ)がI/F回路48を介してCPUコア34に入力される。また、タッチパネル24からの座標データがI/F回路48を介してCPUコア34に入力される。さらに、CPUコア34は、ゲーム音楽(BGM)、効果音またはゲームキャラクタの音声(擬制音)などのゲームに必要な音データをRAM42から読み出し、I/F回路48を介してスピーカ36a,36bから出力する。
図3は、この実施例の仮想ゲームをプレイする場合に、LCD14に表示されるゲーム画面100の例を示す。このゲーム画面100には、トランプを模したカードのオブジェクト(カードオブジェクト)OBJが複数表示される。図3に示すゲーム画面100は、クロンダイクと呼ばれるトランプゲームをプレイするための画面である。図4(A)からも分かるように、このゲーム画面100は、場札としてのカードオブジェクトOBJを表示するための表示領域102、山札としてのカードオブジェクトOBJを表示するための表示領域104および組札としてのカードオブジェクトOBJを表示するための表示領域106が設けられる。
以下、この実施例では、単に「カードオブジェクトOBJ」と言う場合には、単数または複数のカードオブジェクトOBJを意味することとする。
また、ゲーム画面100には、その左上端部にボタン110が表示され、その右下端部にボタン112が表示される。ボタン110は、この仮想ゲームを止めることを指示するためのGUI(Graphical User Interface)であり、ボタン112は、山札をすべて裏返すためのGUIである。
さらに、ゲーム画面100の表示領域102には、場札のカードオブジェクトOBJが配置されるべき位置(列)を示す略四角形の枠(指標枠)120が表示される。この指標枠120は、たとえば、場札のカードオブジェクトOBJが配置されていない列に、プレイヤがカードオブジェクトOBJを移動ないし配置させる際の指標となる。図3に示すゲーム画面100では、1つの指標枠120のみを示してあるが、同様に、場札の各列の背面側には指標枠120がそれぞれ設定(表示)されている。
さらにまた、ゲーム画面100の表示領域106には、組札のカードオブジェクトOBJを配置するべき位置を示す略四角形の枠(指標枠)122が表示される。この指標枠122には、カードオブジェクトOBJの種類のうち、マークと同じ模様が表示され、ユーザが配置すべきカードオブジェクトOBJのマークを分かり易く示してある。この実施例では、カードオブジェクトOBJの種類とは、マーク(スペード、ダイヤ、クローバー、ハートなど)と、数字(2−10)または英字(A,J,Q,K)とを意味する。また、英字A,J,Q,Kは、それぞれ、数字の1,11,12,13に相当する。以下、「数字」と「英字」とをまとめて「文字」と呼ぶことがある。
図3に示すゲーム画面100では、スペードの模様が描画された指標枠122とダイヤの模様が描画された指標枠122とが表示される。同様に、ハートの模様が描画された指標枠122やクローバーの模様が描画された指標枠122も組札のカードオブジェクトO
BJの背面側にそれぞれ設定(表示)されている。
ここで、このゲーム画面100を用いた仮想ゲーム(トランプゲーム)について簡単に説明する。ここでは、トランプゲームとして、ソリティアのクロンダイクをプレイする場合について説明する。図示は省略するが、仮想ゲームが開始された当初では、場札は7列の組(グループ)に分類され、ゲーム画面100の左から順に第1列(列(1)),第2列(列(2)),第3列(列(3),第4列(列(4)),第5列(列(5)),第6列(列(6)),第7列(列(7))としてある。
また、カードオブジェクトOBJの枚数は、第1列から第7列に向かうに従って増加するように設定されている。たとえば、第1列には、カードオブジェクトOBJが1枚配置され、第2列には、カードオブジェクトOBJが2枚配置され、第3列には、カードオブジェクトOBJが3枚配置され、第4列には、カードオブジェクトOBJが4枚配置され、第5列には、カードオブジェクトOBJが5枚配置され、第6列には、カードオブジェクトOBJが6枚配置され、そして、第7列には、カードオブジェクトOBJが7枚配置される。
また、各列では、最前面(最上段)に重ねられたカードオブジェクトOBJはその種類が見えるように、表向きで表示され、それ以外の下側(下層)のカードオブジェクトOBJはその種類が見えないように、裏向きで表示される。ただし、カードオブジェクトOBJは少しずつずらして重ねられる。
さらに、仮想ゲームが開始された当初では、場札以外のカードオブジェクトOBJは、すべて山札のカードオブジェクトOBJとして裏向きで表示領域104に表示される。
図4(B)に示すように、2次元或いは3次元の仮想空間には、2次元平面のゲームフィールドが設けられ、このゲームフィールド内に、LCD14の表示領域が設定される。このように、ゲームフィールドをLCD14の表示領域よりも大きく設定するのは、ゲームの進行状況によっては、カードオブジェクトOBJがLCD14の表示領域をはみ出てしまうことがあるからである(図9,図11参照)。これを回避するために、場に並べるカードオブジェクトOBJの数を制限したり、仮想ゲームに使用するカードオブジェクトOBJの総数を制限したりすることも考えられるが、そのようにした場合には、ゲームの難易度が低下し、プレイヤが直ぐにゲームに飽きてしまう怖れがある。
また、図4(B)に示すように、仮想空間では、横(水平方向)がX軸方向であり、縦(上下方向)がY軸方向であり、LCD14の表示領域の左上の頂点がワールド座標系の原点Oに設定される。ただし、図4(B)に示すように、右方向がX軸のプラス方向であり、下方向がY軸のプラス方向である。
この仮想ゲームでは、一組のトランプ、すなわち、ハート、スペード、ダイヤ、クローバーのそれぞれについて、エース(A)からキング(K)までの13枚(合計52枚)のカードオブジェクトOBJが用いられる。また、この仮想ゲームは、組札として、同じマークのカードオブジェクトOBJを数の小さい順に積み重ねて、4つのマークのそれぞれについて、13枚のカードオブジェクトOBJの組を完成させることを最終目的とする。そのために、場札のカードオブジェクトOBJを異なる列に移動したり、山札のカードオブジェクトOBJを場札のカードオブジェクトOBJとしていずれかの列に移動したり、組札のカードオブジェクトOBJを場札のカードオブジェクトOBJとしていずれかの列に移動し(戻し)たりする。
ただし、所定のルールによって、カードオブジェクトOBJの移動は制限される。具体
的には、山札、場札または組札のカードオブジェクトOBJを、場札の所望の列(場札のカードオブジェクトOBJの場合は他の列)に移動させる場合には、当該所望の列の最前面のカードオブジェクトOBJと異なる色であり、かつ「1」だけ小さい数のカードオブジェクトOBJを重ねることができる。たとえば、スペードやクローバーのカードオブジェクトOBJには、これよりも「1」だけ小さい数のハートやダイヤのカードオブジェクトOBJを重ねることができる。逆に、ハートやダイヤのカードオブジェクトOBJには、これよりも「1」だけ小さい数のスペードやクローバーのカードオブジェクトOBJを重ねることができる。
ただし、移動させるカードオブジェクトOBJは、1枚に限定されず、交互に異なる色で前面(上層)に向かうに従って数が1ずつ小さくなるように重なっている複数枚のカードオブジェクトOBJを一度に移動させることも可能である。かかる場合には、複数枚のカードオブジェクトOBJの最背面に位置するカードオブジェクトOBJが、移動させる所望の列の最前面のカードオブジェクトOBJと異なる色であり、かつ「1」だけ小さい数となっている必要がある。
なお、図面では色の違いを表現することができないが、通常、スペードおよびクローバーのカードオブジェクトOBJのマークおよび文字は黒で記載され、ハートおよびダイヤのカードオブジェクトOBJのマークおよび文字は赤で記載される。以下、同様である。
また、場札の列にカードオブジェクトOBJが何ら表示されていない場合には、当該列(指標枠120が見える列)には、KのカードオブジェクトOBJを移動させることができる。ただし、上述した所定のルール(異なる色のマークで数が連続する)に従って重ねられ、KのカードオブジェクトOBJを含む複数枚のカードオブジェクトOBJを、指標枠120が見える列に移動させることも可能である。
図示等は省略するが、山札、場札、組札のカードオブジェクトOBJを場札の列に移動させる場合に、移動させるために選択された1枚または複数のカードオブジェクトOBJを手札のカードオブジェクトOBJということがある。クロンダイクでは、場札のカードオブジェクトOBJであって、表向きで表示されているカードオブジェクトOBJ、山札のカードオブジェクトOBJで最前面に表向きで表示されているカードオブジェクトOBJ、および組札のカードオブジェクトOBJで最前面に表向きで表示されているカードオブジェクトOBJが手札として選択可能である。ただし、表向きに表示された場札のカードオブジェクトOBJが2枚以上重なっている場合には、そのうちの所望のカードオブジェクトOBJを選択(タッチオン)し、ドラッグすることにより、タッチオンしたカードオブジェクトOBJを含み、その上層に重なっているカードオブジェクトOBJのすべてを手札として選択することができる。
さらに、山札や場札のカードオブジェクトOBJを組札のカードオブジェクトOBJとして移動する場合には、移動させたい組の最前面に表示されているカードオブジェクトOBJと同じマークであり、かつ「1」だけ大きい数のカードオブジェクトOBJを重ねることができる。ただし、組に何らカードオブジェクトOBJが表示されていない場合には、指標枠122に表示されたマークと同じマークのAのカードオブジェクトOBJを移動させることができる。
なお、ゲーム中に、場札のカードオブジェクトOBJを移動した結果、裏向きのカードオブジェクトOBJが場札の列の最前面に位置する場合には、これをタッチオンないしクリック(指定)することにより、当該最前面のカードオブジェクトOBJは表向きで表示される。ただし、裏向きで表示された場札のカードオブジェクトOBJが最前面に位置することとなったときに、自動的に表向きで表示するようにしてもよい。
また、図3からも分かるように、場札のカードオブジェクトOBJを表示する場合には、列に含まれるカードオブジェクトOBJの数に応じて、重なり合うカードオブジェクトOBJの上端(上辺)のY軸方向の間隔(Y座標間隔)aが算出され、それに従って各カードオブジェクトOBJの当該列内におけるY軸方向の位置が決定される。これは、列に含まれるすべてのカードオブジェクトOBJを表示するためである。
たとえば、図5に示すように、場札の表示領域102において、裏向きカードオブジェクトOBJのY座標間隔Scおよび表向きのカードオブジェクトOBJのY座標間隔aが決定される。
なお、図5(後述する図7も同じ)では、簡単のため、場札を一列のみ示してあり、また、カードオブジェクトOBJの表に記載されたマークと文字とを省略してある。
ただし、裏向きのカードオブジェクトOBJは、カードオブジェクトOBJが裏向きであることと、その枚数を認識できれば良いため、Y座標間隔Scは、比較的短い距離で固定的に設定されている。一方、表向きのカードオブジェクトOBJは、その種類を出来るだけ見えるように表示する必要があるため、その枚数に応じて出来るだけ長い距離を確保できるように可変的に設定される。ただし、Y座標間隔aを必要以上に長い距離を設定すると、ゲーム画面100が見難くなるため、Y座標間隔aの上限は最大間隔Soに設定される。
ただし、この実施例では、最大間隔Soは、カードオブジェクトOBJの上端部に記載れているマークと文字とが上層に重なっているカードオブジェクトOBJによって隠れてしまわない距離(長さ)に設定される。
したがって、図5に示すように、3枚の裏向きのカードオブジェクトOBJの上層に5枚の表向きのカードオブジェクトOBJが配置される場合には、場札の表示領域102のY軸方向の長さから、3枚の裏向きのカードオブジェクトOBJについてのY座標間隔Scおよび最上層のカードオブジェクトOBJのY軸方向の長さEを引いた残りの長さ(D−3×Sc−E)を5枚のカードオブジェクトOBJで均等に分けるようにしてある。ただし、1ドットよりも短い距離については分割できないため、均等に分けた場合の余りの長さ(ドット)については、場札の表示領域102の縦方向の余白となる(背景が表示される)。
ここで、図3に示すように、第6列では、比較的多数のカードオブジェクトOBJが重なった状態で表示されている。第6列の場札は、第2列の場札や第5列の場札と比較して分かるように、カードオブジェクトOBJ同士の重なり具合が大きいため、上層のカードオブジェクトOBJによって下層のカードオブジェクトOBJの種類(内容)が見え難い。
したがって、この実施例では、プレイヤが場札のカードオブジェクトOBJをタッチオンし、タッチオンしたカードオブジェクトOBJの上層に他のカードオブジェクトOBJが重なっている場合には、上層のすべてのカードオブジェクトOBJが下方向に移動される。このため、少なくともプレイヤがタッチオンしたカードオブジェクトOBJ(以下、「フォーカスされたカードオブジェクトOBJ」ということがある。)の露出量が大きくされ、このフォーカスされたカードオブジェクトのマークおよび文字が見える。
この実施例では、図6に示すように、プレイヤがタッチオンした列に複数のカードオブジェクトOBJが存在し、タッチオン操作によって指示したカードオブジェクトOBJの
上層に他のカードオブジェクトOBJが重なっており、その重なり具合が大きい場合には、タッチオンされたカードオブジェクトOBJおよびその上層のカードオブジェクトOBJがすべて予め決定してある最大間隔Soで表示される。
具体的には、図5に示した状態において、プレイヤがカードオブジェクトOBJをタッチオンすると、図7に示すように、場札の表示領域102の大きさ(範囲)に拘わらず、タッチオンされたカードオブジェクトOBJより上層のすべてのカードオブジェクトOBJが移動され、タッチオンされたカードオブジェクトOBJと、これより上層のすべてのカードオブジェクトOBJとのY座標間隔aが最大間隔Soに設定される。したがって、プレイヤは、少なくとも、タッチオンされたカードオブジェクトOBJすなわちフォーカスされたカードオブジェクトOBJの種類を知ることができる。
また、この実施例では、タッチオンすることにより、Y座標間隔aを最大間隔Soに設定するために移動された上層のすべてのカードオブジェクトOBJは、その後、プレイヤがタッチオフ操作を実行してから一定時間(この実施例では、60フレーム)経過後に、元の位置に移動される(戻される)。つまり、図6に示した状態で、タッチオフ操作が実行されると、図3に示したゲーム画面100が再度表示されるのである。ただし、フレームは画面更新の単位時間であり、1フレームは1/60秒に相当する。
図8には、他の仮想ゲームをプレイするためのゲーム画面200が表示される。この他の仮想ゲームは、スパイダーと呼ばれるトランプゲームである。図9からも分かるように、ゲーム画面200には、場札としてのカードオブジェクトOBJを表示するための表示領域202および山札としてのカードオブジェクトOBJを表示するための表示領域204が設けられる。場札は複数の(この実施例では、8つの)列(グループ)に分割されており、ゲーム画面200の左から順に第1列(列(1)),第2列(列(2)),…,第7列(列(7)),第8列(列(8))としてある。
図9では省略するが、図4(B)に示したように、仮想空間にはゲームフィールドが設けられ、このゲームフィールド内にLCD14の表示領域が設定される。また、仮想空間についてのワールド座標系およびLCD14の表示領域の原点Oの位置も図4(B)に示した場合と同じである。
また、ゲーム画面200には、ボタン210および場札を配置するための指標となる略四角形の枠(指標枠)220が表示される。図8では示すことができないが、場札の他の列にも指標枠220は表示(設定)されており、列内のカードオブジェクトOBJが無くなると現れる。ボタン210は、当該仮想ゲームを止めることを指示(選択)するためのGUIである。
なお、この実施例では、図示は省略するが、後述するようにして作成された組札を、ボタン210と山札の表示領域204との間に表示するようにしてもよい。
この他の仮想ゲームについて簡単に説明する。図示は省略するが、ゲームが開始された当初では、場札として複数の列に複数枚のカードオブジェクトOBJが配置される。ただし、各列におけるカードオブジェクトOBJの枚数は同じでも異なっていてもよい。また、各列では、最前面のカードオブジェクトOBJが表向きで表示され、それ以外の背面のカードオブジェクトOBJは裏向きで表示される。場札のカードオブジェクトOBJ以外のカードオブジェクトOBJは、すべて山札として裏向きで表示領域204に表示される。
この他の仮想ゲームでは、プレイヤは、場札の列において、同じマークのカードオブジ
ェクトOBJをキングからエースまで連続的に数が小さくなるように積み重ねて、13枚のカードオブジェクトOBJの組を作成し、所定数の組を作成することを最終目標とする。ただし、所定数の組は、使用するトランプのセット数に応じて異なり、使用するトランプのセット数はゲームの難易度に応じて可変的に設定される。
ゲーム中では、プレイヤは、場札のカードオブジェクトOBJを異なる列に移動させることができる。また、場札のカードオブジェクトOBJを移動できない場合には、山札のカードオブジェクトOBJをクリック(タッチオン)することにより、山札を場札の各列に一枚ずつ追加することができる。ただし、場札のカードオブジェクトOBJを移動させる場合には、所定のルール(クロンダイクとは異なるルール)によって、その移動が制限される。
具体的には、場札のカードオブジェクトOBJを他の所望の列に移動させる場合には、当該所望の列の最前面に表示されたカードオブジェクトOBJと同じマークであり、かつ数が「1」だけ小さいカードオブジェクトOBJを重ねることができる。ただし、移動させるカードオブジェクトOBJは、1枚に限定されず、同じマークで数が連続する複数枚のカードオブジェクトOBJを一度に移動させることも可能である。かかる場合には、複数枚のカードオブジェクトOBJのうちの最下層のカードオブジェクトOBJが、移動させる所望の列の最前面のカードオブジェクトOBJと同じマークであり、かつ「1」だけ小さい数となっている必要がある。
ただし、移動させることができるカードオブジェクトOBJ(選択可能なカードオブジェクトOBJ)は、場札の各列の最前面のカードオブジェクトOBJおよび当該最前面のカードオブジェクトOBJと同じマークで、下層に向かうに従って数が連続的に1ずつ増加する1枚または複数枚のカードオブジェクトOBJである。選択可能なカードオブジェクトOBJであれば、そのすべてを選択しなくても、一部のみを選択して移動させることもできる。
なお、列の途中で、最前面のカードオブジェクトOBJとマークが異なったり、数字が連続していなかったりして、不連続な個所が出来ている場合には、その下層において、同じマークで下層に向かうに従って数が次第に大きくなるように重なっている複数枚のカードオブジェクトOBJが配置されていても、これらは選択可能なカードオブジェクトOBJではない。
また、カードオブジェクトOBJが表示されていない列すなわち指標枠220が見える列には、選択可能なカードオブジェクトOBJであれば、その種類に関係なく、自由に移動させることができる。ただし、指標枠220が見える列に複数枚のカードオブジェクトOBJを移動させる場合には、当該複数枚のカードオブジェクトOBJが同じマークで下層に向かうに従って数が1ずつ大きくなるように重なっている必要がある。
この他の仮想ゲームでは、選択可能なカードオブジェクトOBJの全部または一部を選択して移動させる場合に、選択された1枚または複数枚のオブジェクトOBJが手札のオブジェクトOBJである。
この他の仮想ゲームにおいても、上述した仮想ゲームと同様に、複数枚のカードオブジェクトOBJのうち、裏向きのカードオブジェクトOBJは、固定的に設定されたY座標間隔Scで配置され、表向きのカードオブジェクトOBJは、上述したように、算出されたY座標間隔a(最大間隔So)で配置される。したがって、図8に示すゲーム画面200の場札の第2列に示すように、列内に配置されるカードオブジェクトOBJの数が比較的多数になると、Y座標間隔aが狭くなり、つまり重なり具合が大きくなり、カードオブ
ジェクトOBJの種類が見え難い。
このため、この他の仮想ゲームにおいても、プレイヤが所望のカードオブジェクトOBJをタッチオンすると、タッチオンしたカードオブジェクトOBJより上層のカードオブジェクトOBJのY座標間隔aが表示領域202の大きさに拘わらず、最大間隔Soに設定される。したがって、たとえば、図10に示すように、ゲーム画面200において、少なくとも、タッチオンされたカードオブジェクトOBJすなわちフォーカスされたカードオブジェクトOBJの種類を見ることができる。
なお、図10からも分かるように、ゲーム画面200からはみ出しているカードオブジェクトOBJについては、見えなくなってしまうが、プレイヤが見たいのはタッチオンしたカードオブジェクトOBJであると考えられるため、何ら支障は無いと考えられる。
図11には、ゲーム画面200の他の例が示される。このゲーム画面200では、プレイヤがスティック26を用いてドラッグ操作(スライド操作)を行うことにより、複数のカードオブジェクトOBJ(手札のカードオブジェクトOBJ)が移動される様子が示される。
図11から分かるように、複数のカードオブジェクトOBJを移動させる場合には、タッチオンされているカードオブジェクトOBJの上層に重なっている一部のカードオブジェクトOBJは、少しずつ遅れて移動されるように、移動制御される。これは、カードオブジェクトOBJの移動を滑らかに表現して、プレイヤに見易くするためである。
なお、図示等は省略したが、上述の仮想ゲーム(クロンダイク)において手札のカードオブジェクトOBJを移動させる場合にも、同様の移動制御が実行される。
この実施例では、選択可能なカードオブジェクトOBJのうち、所望のカードオブジェクトOBJがタッチオンされ、その後のドラッグ操作によって、手札のカードオブジェクトOBJが選択される。ただし、上述したように、場札の列の最上層から下層に向かう途中で、マークが異なったり、数が連続的に大きくなっていなかったりするカードオブジェクトOBJが現れると、それよりも下層に存在するカードオブジェクトOBJは、たとえ同一マークで数が連続して大きくなるように重なっているとしても、移動させることはできない。つまり、手札のカードオブジェクトOBJとして選択することができない。
たとえば、図12に示すように、プレイヤが、所望のカードオブジェクトOBJをタッチオンし、その後、図13に示すように、ドラッグ操作を行うと、タッチオンされたカードオブジェクトOBJではなく、選択可能なカードオブジェクトOBJが手札としてそのドラッグ操作に従って選択される。
図12および図13に示すゲーム画面200の例では、プレイヤがタッチオンしている列では、最前面にハートの8のカードオブジェクトOBJが表示され、その下層にハートの9および10のカードオブジェクトOBJが連続して配置されている。また、ハートの10のカードオブジェクトOBJの下層には、スペードの3のカードオブジェクトOBJが配置される。したがって、上記の所定のルール(マークが同じで数が連続する)に従えば、選択可能なカードオブジェクトOBJは、ハートの8から10までの3枚のカードオブジェクトOBJである。
したがって、図13に示すように、プレイヤが、スペードの8のカードオブジェクトOBJをタッチオンし、その後、ドラッグ操作すると、手札としてハートの8から10までの3枚のカードオブジェクトOBJが選択されるのである。つまり、プレイヤがタッチオ
ンしているスペードの8のカードオブジェクトOBJは、選択可能なカードオブジェクトOBJではないため、手札として選択されないのである。
ここで、図11に示したように、列における最上層のカードオブジェクトOBJからタッチオンしたカードオブジェクトOBJまでが所定のルールに従う順序で並んでいる場合には、タッチオンしたカードオブジェクトOBJを含む複数枚のカードオブジェクトOBJを手札とすることができる。ただし、図12および図13に示したように、列の最上層のカードオブジェクトOBJとタッチ座標との間において、マークが異なっていたり、数字が不連続になっていたりする場合には、タッチオンしたカードオブジェクトOBJを含まずに、当該列の最上層のカードオブジェクトOBJとタッチ座標と間にある選択可能なカードオブジェクトOBJが手札として選択される。つまり、選択可能なカードオブジェクトOBJのうち、タッチ座標に最も近いカードオブジェクトOBJおよびそれに関連する(所定のルールに従って重なる)カードオブジェクトOBJが手札として選択されるのである。
また、上述したように、プレイヤが或る列のカードオブジェクトOBJをタッチオンすると、タッチオンしたカードオブジェクトOBJおよびその上層のすべてのカードオブジェクトOBJのY座標間隔aが最大間隔Soに設定される。ただし、Y座標間隔aが最大間隔So未満である場合に限られる。このため、図12に示すように、列の一部がゲーム画面200の外にはみ出している。このような場合であっても、図13に示すように、ドラッグ操作によって手札を選択することができる。つまり、プレイヤは、見えていないカードオブジェクトOBJであっても手札として選択することができるのである。
図12および図13では分かり難いが、この実施例では、タッチオンしたカードオブジェクトOBJと、手札として選択されたカードオブジェクトOBJとが異なり、手札が選択された時点においてタッチ座標と手札のカードオブジェクトOBJとが離れている場合には、その後の処理(後述する手札更新処理)によって、手札のカードオブジェクトOBJがタッチ座標に次第に近づくようにしてある。したがって、ゲーム画面200からはみ出しているカードオブジェクトOBJが手札として選択された場合であっても、手札更新処理によって、ゲーム画面200に表示されるのである。
また、この実施例のトランプゲーム(クロンダイクおよびスパイダー)では、場札のカードオブジェクトOBJのうち、表向きのカードオブジェクトOBJをタッチオンすることにより、タッチオンされたカードオブジェクトOBJおよびその上層のカードオブジェクトOBJのY座標間隔aが最大間隔Soに設定される。ただし、場札のカードオブジェクトOBJのうち、裏向きのカードオブジェクトOBJがタッチオンされた場合には、表向きのカードオブジェクトOBJがタッチオンされた場合と同様に、タッチオンされた裏向きのカードオブジェクトOBJをフォーカスするための処理(後述する場札更新処理)を実行するが、フォーカスされる際に、裏向きのカードオブジェクトOBJについては、Y座標間隔Scは変更されない。したがって、かかる場合には、裏向きのカードオブジェクトOBJの上層に重なっている表向きのカードオブジェクトOBJのY座標間隔aが最大間隔Soに設定される。
したがって、図14に示すように、場札の裏向きのカードオブジェクトOBJがタッチオンされた場合には、その上層に重なっている表向きのカードオブジェクトOBJのY座標間隔aが最大間隔Soに設定され、表向きのカードオブジェクトOBJの種類が視認可能にされる。
続いて、プレイヤが、ドラッグ操作すると、手札としてのカードオブジェクトOBJが選択される。ただし、上述したように、図14では、裏向きのカードオブジェクトOBJ
をタッチオンしているため、つまり選択不能なカードオブジェクトOBJをタッチオンしているため、直接的に手札としてのカードオブジェクトOBJが選択されない。この実施例では、かかる場合には、選択可能なカードオブジェクトOBJから自動的に手札としてのカードオブジェクトOBJが選択される。図14では、表向きのカードオブジェクトOBJは、すべて所定のルールに従って重なっており、選択可能なカードオブジェクトOBJであるため、これらすべてのカードオブジェクトOBJが手札として選択される。このとき、図14からも分かるように、手札としてのカードオブジェクトOBJは、タッチ座標にくっつくように移動される。
また、この実施例のトランプゲーム(クロンダイクおよびスパイダー)では、図15に示すように、各カードオブジェクトOBJには、その左上の頂点が基準点すなわち原点Pに設定される。したがって、カードオブジェクトOBJは、ワールド座標系における配置位置に、原点Pが来るように、ゲームフィールドに配置される。
また、カードオブジェクトOBJがタッチオンされている場合には、タッチ座標とカードオブジェクトOBJとの位置関係(距離)が記憶される。たとえば、図15に示すように、そのタッチ座標と当該カードオブジェクトOBJの原点Pとの距離(Ox,Oy)が記憶される。このように、タッチ座標とカードオブジェクトOBJの原点Pと距離(Ox,Oy)を記憶しておくのは、後述するように、ドラッグ操作(タッチ座標)に従ってカードオブジェクトOBJを移動制御するためである。図示は省略するが、カードオブジェクトOBJ自体がタッチオンされた場合にも、距離(Ox,Oy)は記憶される。
なお、図15に示すように、距離(Ox,Oy)は、原点Pの座標(X1,Y1)−タッチ座標(X2,Y2)で算出される。つまり、Ox=X1−X2であり、Oy=Y1−Y2である。
図16は、図2に示したゲーム装置10のRAM42のメモリマップ70である。RAM42は、プログラム記憶領域72およびデータ記憶領域74を含む。プログラム記憶領域72には、情報処理プログラムとしてのゲームプログラムが記憶され、ゲームプログラムは、メイン処理プログラム72a、画像生成プログラム72b、画像表示プログラム72c、画像更新プログラム72d、入力判定プログラム72e、手札更新プログラム72f、リリース実行プログラム72g、タッチ操作プログラム72h、カード取得プログラム72iおよび場札更新プログラム72jなどによって更新される。
メイン処理プログラム72aは、この実施例の仮想ゲームのメインルーチンを処理するためのプログラムである。画像生成プログラム72bは、後述する画像データ74bを用いてゲーム画像を生成するためのプログラムである。画像表示プログラム72cは、画像生成プログラム72bに従って生成されたゲーム画像をゲーム画面(100,200)として、LCD14(またはLCD12)に表示するためのプログラムである。画像更新プログラム72dは、画像生成プログラム72bに従って生成され、画像表示プログラム72cに従って表示された、ゲーム画像(ゲーム画面)を一定時間(1フレーム)毎に更新するためのプログラムである。
入力判定プログラム72eは、プレイヤによる入力操作を判定する。この実施例では、タッチオン操作であるかどうか、タッチオフ操作であるかどうか、およびドラッグ操作であるかどうかが判断される。手札更新プログラム72fは、ワールド座標系における手札のカードオブジェクトOBJの位置を更新するためのプログラムである。この実施例では、手札更新プログラム72fは、タッチ座標に応じて、手札のカードオブジェクトOBJの座標(ワールド座標)を更新する。手札のカードオブジェクトOBJが1枚の場合には、当該手札のカードオブジェクトOBJがタッチ座標に従って移動される。また、手札の
カードオブジェクトOBJが複数枚の場合には、そのうちの最下層のカードオブジェクトOBJがタッチ座標に従って移動され、最下層のカードオブジェクトOBJよりも上層のカードオブジェクトOBJの各々は、1つ上層のカードオブジェクトOBJを追従するように移動される。
リリース実行プログラム72gは、手札のカードオブジェクトOBJを場札のカードオブジェクトOBJとして元の位置に戻すためのプログラムである。この実施例では、手札のカードオブジェクトOBJをドラッグしているときに、プレイヤがタッチオフ操作を実行すると、手札のカードオブジェクトOBJを離したと判断して、当該手札のカードオブジェクトOBJが元の場札の列(位置)に移動される。詳細な説明は省略するが、場札のカードオブジェクトOBJから手札のカードオブジェクトOBJが選択された場合であっても、場札としての情報は消去されずに、カードデータ74cの位置データ(図17参照)に記憶されている。したがって、プレイヤが手札のカードオブジェクトOBJを離すと、カードデータ74cに従って元の位置に戻される。このとき、現在位置から元の位置に、所定の割合(たとえば、25%)で、X軸方向およびY軸方向の距離(間隔)が縮まるように、手札のカードオブジェクトOBJは移動される。ただし、現在位置は毎フレーム更新される。以下、同様である。
なお、上述したように、クロンダイクの場合には、山札や組札のカードオブジェクトOBJを手札のカードオブジェクトOBJとして選択することもできるが、この発明の本質的な内容では無いため、これ以降では省略することにする。同様に、リリースした場合のカードオブジェクトOBJの移動についても、この発明の本質的な内容では無いため、これ以降では省略することにする。ただし、山札のカードオブジェクトOBJが手札のカードオブジェクトOBJとして選択された場合には、離されたカードオブジェクトOBJは山札としてその最前面に戻される。また、組札のカードオブジェクトOBJが手札のカードオブジェクトOBJとして選択された場合には、離されたカードオブジェクトOBJは元の組の最前面に戻される。
タッチ操作プログラム72hは、プレイヤがタッチオンした場札のカードオブジェクトOBJをフォーカスされたカードオブジェクトOBJとして設定するとともに、フォーカスされる一定時間(この実施例では、60フレーム)を後述するフォーカスカウンタ74j(図17参照)に設定するためのプログラムである。
カード取得プログラム72iは、プレイヤの入力操作に従って、場札のカードオブジェクトOBJから、手札のカードオブジェクトOBJを選択するためのプログラムである。上述したように、プレイヤがタッチオンした場札の列において、選択可能なカードオブジェクトOBJのうち、最上層に存在する1枚ないしそれに重なる複数枚のカードオブジェクトOBJが、タッチオン操作に続くドラッグ操作に応じて、手札として選択される。
場札更新プログラム72jは、場札のカードオブジェクトOBJを、必要に応じて、列毎にその配置位置を上下に移動させるためのプログラムである。具体的には、プレイヤがタッチオンした場札のカードオブジェクトOBJおよびその上層のすべてのカードオブジェクトOBJのY座標間隔aが最大間隔Soとなるように、当該上層のすべてのカードオブジェクトOBJが下方向に移動される。また、プレイヤがタッチオフしたときから一定時間(60フレーム)が経過したときに、タッチオンされたカードオブジェクトOBJをフォーカスするためにY座標間隔aを強制的に最大間隔Soに設定していたすべてのカードオブジェクトOBJが上方向に移動され、元の配置位置に戻される。
なお、後述の場札更新処理において説明するように、場札のカードオブジェクトOBJを上下に移動させる場合にも、目標(移動後)の位置座標(目標位置)と現在の位置座標
(現在位置)との間隔が所定の割合(この実施例では、25%)で短くなるように制御される。したがって、手札のカードオブジェクトOBJをドラッグしたり、リリースしたりする場合のみならず、所望のカードオブジェクトOBJをフォーカスしたり、フォーカスを終了したりする場合にも、滑らかにカードオブジェクトOBJが移動される様子が示される。
図示は省略するが、ゲームプログラムは、音出力プログラムやバックアッププログラムなども含む。音出力プログラムは、プレイヤオブジェクトの音声ないし擬声音、効果音、BGMなどのゲームに必要な音(音楽)を生成および出力するためのプログラムである。バックアッププログラムは、ゲームデータ(途中データ,結果データ)をメモリカード28のRAM28bにセーブするためのプログラムである。
図17は、図16に示したデータ記憶領域74の具体例を示す図解図である。図17に示すように、データ記憶領域74には、入力バッファ74aが設けられる。また、データ記憶領域74には、画像データ74b、カードデータ74c、現在タッチ座標データ74d、前回タッチ座標データ74e、距離データ74f、Y座標間隔データ74g、最大間隔データ74hが記憶される。さらに、データ記憶領域74には、タッチフラグ74iおよびフォーカスカウンタ74jが設けられる。
入力バッファ74aは、操作スイッチ22から入力されるキーデータおよびタッチパネル24から入力される座標データを時系列に従って一時記憶する。キーデータおよび座標データは、ゲーム処理に利用されると、その後、入力バッファ74aから削除される。
画像データ74bは、ゲーム画像を生成するためのポリゴンデータおよびテクスチャデータなどのデータである。カードデータ74cは、ゲームフィールドに存在するすべて(N枚)のカードオブジェクトOBJの各々についてのデータである。具体的には、カードデータ74cは、カード1データ740、カード2データ742,…,カードNデータ74Nを含む。図17に示すように、カード1データ740は、種類データ740a、位置データ740b、大きさデータ740cおよび状態判別フラグ740dを含む。
種類データ740aは、当該カードオブジェクトOBJ(ここでは、カード1である。以下、同じ。)の種類(マークおよび文字)を識別するためのデータである。位置データ740bは、当該カードオブジェクトOBJが山札、場札、手札のいずれであるかを識別するための識別データおよび当該カードオブジェクトOBJのワールド座標についての座標データを含む。ただし、この実施例では、識別データは、単に山札、場札、手札の別を示す情報のみならず、当該カードオブジェクトOBJが何番目に重ねられているかを示す情報も含まれる。さらに、場札は、列毎に振り分けられるため、列と列内における順番(最下層から順に数えた場合の番号)とを区別するための情報が記憶されている。また、上述したように、プレイヤが手札のカードオブジェクトOBJを離すと、場札のカードオブジェクトOBJとして元の位置に戻すようにしてあるため、場札の情報については、当該カードオブジェクトOBJが手札として選択された場合であっても消去されないようにしてある。ただし、他の列に移動された場合には、手札の情報が消去され、場札の情報(列および順番)が更新される。
大きさデータ740cは、当該カードオブジェクトOBJの大きさを示すデータであり、具体的には、当該カードオブジェクトOBJの横および縦の長さ(ドット数)についての数値データである。ただし、同一の仮想ゲームに使用されるすべてのカードオブジェクトOBJは同じ大きさであるため、大きさデータ740cはカードオブジェクトOBJ毎に記憶せずに、カードデータ74cに1つだけ記憶するようにしてもよい。状態判別フラグ740dは、カードオブジェクトOBJが裏向きか表向きかを判別するためのフラグで
ある。具体的には、状態判別フラグ740dは、1ビットのレジスタで構成される。状態判別フラグ740dがオフ(不成立)であれば、レジスタにデータ値「0」が設定される。一方、状態判別フラグ740dがオン(成立)であれば、レジスタにデータ値「1」が設定される。ただし、カードオブジェクトOBJが裏向きである場合に、状態判別フラグ740dがオフされ、カードオブジェクトOBJが表向きである場合に、状態判別フラグ740dがオンされる。
詳細な説明は省略するが、カード2データ742,…,カードNデータ74Nについても同様である。
なお、図示および詳細な説明は省略するが、この実施例の仮想ゲームでは、一手戻すこともできるため、実際には、カードオブジェクトOBJの移動履歴を記憶しており、一手戻す場合には、その移動履歴を逆方向に適用するようにしてある。
現在タッチ座標データ74dは、現フレームにおいて、プレイヤがタッチオンしているタッチ座標についての座標データである。この実施例では、入力バッファ74aに一時記憶される現フレームの座標データがコピーされて、現在タッチ座標データ74dとしてデータ記憶領域74に記憶される。この実施例では、1フレーム毎に、現在タッチ座標データ74dは更新される。ただし、プレイヤがタッチオフしている場合には、入力バッファ74aには、座標データが記憶(入力)されないため、かかる場合には、現在タッチ座標データ74dとしてNULLデータが記憶される。
前回タッチ座標データ74eは、現フレームの1つ手前のフレームにおいて、プレイヤがタッチオンしていたタッチ座標についての座標データである。この実施例では、前回タッチ座標データ74eも、1フレーム毎に更新される。具体的には、上述したように、1フレーム毎に、現在タッチ座標データ74dが更新されるため、当該現在タッチ座標データ74dが更新される前に、そのコピーが前回タッチ座標データ74eとしてデータ記憶領域74に一時記憶される。
距離データ74fは、手札として選択されたカードオブジェクトOBJのうち、最下層に配置されるカードオブジェクトOBJのローカル座標系における原点Pと、手札を選択するためにタッチオンしたときのタッチ座標との距離(ドット数)についての数値データである。ただし、上述したように、距離データ74fが示す距離は、X軸方向の距離Oxと、Y軸方向の距離Oyとで表わされる。Y座標間隔データ74gは、場札の列毎に、重なるカードオブジェクトOBJ同士のY座標間隔a(ドット数)を示す数値データである。最大間隔データ74hは、Y座標間隔aの最大値(最大間隔So)を示す数値データである。
タッチフラグ74iは、プレイヤがタッチパネル24をタッチオンしているかどうかを判別するためのフラグであり、1ビットのレジスタで構成される。タッチフラグ74iがオフであれば、レジスタにデータ値「0」が設定され、タッチフラグ74iがオンであれば、レジスタにデータ値「1」が設定される。ただし、プレイヤがタッチパネル24をタッチオンしていない場合(タッチオフの場合)に、タッチフラグ74iはオフされ、プレイヤがタッチパネル24をタッチオンしている場合に、タッチフラグ74iはオンされる。
フォーカスカウンタ74jは、プレイヤがタッチオンしたカードオブジェクトOBJがフォーカスされている一定時間をカウントするためのカウンタである。この実施例では、フォーカスカウンタ74jは、ダウンカウンタであり、タッチオンされたカードオブジェクトOBJがフォーカスされ、プレイヤがタッチオフ操作を実行してからの一定時間(6
0フレーム)をカウントする。つまり、プレイヤがタッチオン操作を継続している間は、フォーカスカウンタ74jはカウントダウンされない。
図示は省略するが、データ記憶領域74には、ゲームに必要な、他のデータ、他のフラグ、および他のカウンタ(タイマ)も記憶される。
図18および図19は、図2に示したCPUコア34のメイン処理を示すフロー図である。なお、図示は省略するが、CPUコア34は、メイン処理と並列的に、操作スイッチ22からのキーデータおよびタッチパネル22からの座標データを検出する処理を実行する。つまり、CPUコア34は、操作スイッチ22から入力されるキーデータおよびタッチパネル22から入力される座標データを、時系列に従って入力バッファ74aに記憶する。
図18に示すように、CPUコア34は、メイン処理を開始すると、ステップS1で、変数Tkおよび変数Tiのそれぞれに「0」を設定する。ただし、変数Tkは、プレイヤがタッチオンした場札の列(k)の番号を示す。また、変数Tiは、プレイヤがタッチオンしたカードオブジェクトOBJの列内における番号を示す。ここで、列内における番号は、最下層(ゲーム画面100,200の上側)から上層(ゲーム画面100,200の下側)に向かう順序で付される。したがって、ステップS1では、プレイヤが場札のカードオブジェクトOBJをタッチオンしていない状態を、変数Tkおよび変数Tiに設定しているのである。
続くステップS3では、手札が有るかどうかを判断する。ここでは、CPUコア34は、カードデータ74cを参照して、位置データ(740bなど)に手札の情報が記載されたカードオブジェクトOBJが存在するかどうかを判断する。ステップ3で“NO”であれば、つまり手札が無ければ、図19に示すステップS19に進む。一方、ステップS3で“YES”であれば、つまり手札が有れば、ステップS5で、タッチ中かどうかを判断する。ここでは、CPUコア34は、タッチオンの状態が継続しているかどうかを判断する。具体的には、CPUコア34は、タッチフラグ74iがオンであり、かつ現在タッチ座標データ74dとしてNULLデータが記憶されていないかどうかを判断する。
なお、詳細な説明は省略するが、この実施例では、メイン処理が開始された当初では、タッチフラグ74iはオフであり、また、現在タッチ座標データ74dおよび前回タッチ座標データ74eとして、NULLデータが記憶される。
ステップS5で“YES”であれば、つまりタッチフラグ74iがオンであり、現在タッチ座標データ74dとしてNULLデータが記憶されていなければ、タッチ中であると判断して、ステップS7で、後述する手札更新処理(図20参照)を実行して、ステップS11に進む。一方、ステップS5で“NO”であれば、つまりタッチフラグ74iはオンであるが、現在タッチ座標データ74dとしてNULLデータが記憶されていれば、タッチオフされたと判断して、ステップS9で、後述するリリース処理(図21参照)を実行して、ステップS11に進む。
なお、図示は省略するが、ステップS5で“NO”と判断されたときに、タッチフラグ74iはオフされる。
ステップS11では、後述する場札更新処理(図24−図26)を実行し、ステップS13では、ステップS5と同様に、タッチ中であるかどうかを判断する。ステップS13で“YES”であれば、つまりタッチ中であれば、そのままステップS17に進む。一方、ステップS13で“NO”であれば、つまりタッチ中でなければ、ステップS15で、
プレイヤがタッチオンした場札の列の番号を示す変数Tkに「0」を設定してから、ステップS17に進む。
ステップS17では、ゲーム画面更新処理を実行する。詳細な説明は省略するが、ここでは、CPUコア34は、カードデータ74cに従って、すべてのカードオブジェクトOBJをゲームフィールドに描画する。したがって、ゲーム画面(100,200)が更新される。
また、上述したように、手札が無い場合には、ステップS3で“NO”となり、図19に示すステップS19で、タッチオンかどうかを判断する。つまり、CPUコア34は、タッチオフの状態からタッチオンの状態に変化したかどうかを判断する。具体的には、CPUコア34は、タッチフラグ74iがオフであり、かつ、現在タッチ座標データ74dとして座標データが記憶されるとともに、前回タッチ座標データ74eとしてNULLデータが記憶されているかどうかを判断する。
ステップS19で“YES”であれば、つまりタッチフラグ74iがオフであり、かつ、現在タッチ座標データ74dとして座標データが記憶されるとともに、前回タッチ座標データ74eとしてNULLデータが記憶されていれば、タッチオンであると判断して、ステップS21で、後述するタッチオン操作処理(図22参照)を実行して、図18に示したステップS11に進む。
図示は省略するが、ステップS19で“YES”と判断されると、タッチフラグ74iはオンされる。
一方、ステップS19で“NO”であれば、つまりタッチフラグ74iがオンであったり、タッチフラグ74iはオフであるが、前回タッチ座標データ74eとしてNULLデータ以外の座標データが記憶されたり、タッチフラグ74iはオフであるが、現在タッチ座標データ74dとしてNULLデータが記憶されたりしている場合には、タッチオンではないと判断して、ステップS23で、ステップS5と同様に、タッチ中かどうかを判断する。
ステップS23で“NO”であれば、つまりタッチ中でなければ、そのままステップS11に進む。一方、ステップS23で“YES”であれば、つまりタッチ中であれば、ステップS25で、後述するカード取得処理(図23参照)を実行してから、ステップS11に進む。
なお、ステップS3からステップS17までのスキャンタイムが1フレームである。したがって、ゲーム画面(100,200)が1フレーム毎に更新されるのである。
図20は、図18に示したステップS7の手札更新処理のフロー図である。図20に示すように、CPUコア34は、手札更新処理を開始すると、距離データ74fが示すY軸方向の距離Oyが0より大きいかどうかを判断する。ここでは、CPUコア34は、タッチ座標が手札のカードオブジェクトOBJよりも上方であるかどうかを判断しているのである。
ステップS41で“NO”であれば、つまりY軸方向の距離Oyが0以下であれば、そのままステップS45に進む。一方、ステップS41で“YES”であれば、つまりY軸方向の距離Oyが0よりも大きければ、タッチ座標が手札のカードオブジェクトOBJよりも上方であると判断して、ステップS43で、距離OyにOy−Oy*0.25を設定して、ステップS45に進む。つまり、CPUコア34は、ステップS43で、距離Oy
を25%短くして、手札のカードオブジェクトOBJをタッチ座標に近づけるようにしてある。
ステップS45では、距離Oxが0より大きいかどうかを判断する。つまり、CPUコア34は、タッチ座標が手札のカードオブジェクトOBJよりも左側であるかどうかを判断しているのである。ステップS45で“NO”であれば、つまり距離Oxが0以下であれば、そのままステップS49に進む。ステップS45で“YES”であれば、つまり距離Oxが0よりも大きければ、タッチ座標が手札のカードオブジェクトOBJよりも左側であると判断して、ステップS47で、距離OxにOx−Ox*0.25を設定して、ステップS49に進む。上述したように、ステップS47では、CPUコア34は、距離Oxを25%短くして、手札のカードオブジェクトOBJをタッチ座標に近づけるようにしてある。
ステップS49では、距離Oxが−Wよりも小さいかどうかを判断する。ただし、上述したように、定数WはカードオブジェクトOBJの横幅(ドット数)である。つまり、CPUコア34は、タッチ座標が手札のカードオブジェクトOBJよりも右側であるかどうかを判断しているのである。ステップS49で“NO”であれば、つまり距離Oxが−W以上であれば、そのままステップS53に進む。一方、ステップS49で“YES”であれば、つまり距離Oxが−Wよりも小さければ、ステップS51で、距離Oxに、Ox−(Ox+W)*0.25を設定して、ステップS53に進む。つまり、CPUコア34は、ステップS51においても、距離Oxを25%短くして、手札のカードオブジェクトOBJをタッチ座標に近づけるようにしてある。
ステップS53では、手札(1)の座標に、タッチ座標に距離(Ox,Oy)を加算した値を設定する。ここで、手札(1)は、すべての手札のカードオブジェクトOBJのうち、最下層に配置されるカードオブジェクトOBJである。ここでは、手札のカードオブジェクトOBJの各々には、最下層から順に番号(1,2,…,M)が付されている。
したがって、ステップS41−ステップS51に処理よって、タッチ座標と手札(1)とが離れている場合には、手札(1)が次第にタッチ座標に近づくように移動されるのである。
次のステップS55では、変数iに「2」を設定する。ここで、変数iは、手札のカードオブジェクトOBJを個別に識別するために用いられる。続くステップS57では、変数iが最大値M以下であるかどうかを判断する。ここで、最大値Mは、手札のカードオブジェクトOBJの総数である。つまり、CPUコア34は、ステップS57で、手札のすべてのカードオブジェクトOBJについての更新処理を終了したかどうかを判断するのである。
ステップS57で“NO”であれば、つまり変数iが最大値Mを超えていれば、手札のすべてのカードオブジェクトOBJについての更新処理を終了したと判断して、そのままメイン処理にリターンする。一方、ステップS57で“YES”であれば、つまり変数iが最大値M以下であれば、更新処理を実行していない手札のカードオブジェクトOBJが存在すると判断して、ステップS59で、手札(i)の座標に、手札(i)の座標+(手札(i−1)の座標+(0,So)−手札(i)の座標)*0.25を設定する。ただし、Soは、上述したY軸方向の最大間隔である。
そして、ステップS61で、変数iに1加算して、ステップS57に戻る。つまり、次の手札のカードオブジェクトOBJについての更新処理が実行されるのである。ただし、上述したように、次の手札のカードオブジェクトOBJが無ければ、メイン処理にリター
ンする。
このように、ステップS41−S51の処理によって、カードオブジェクトOBJの外側をタッチしてカードオブジェクトOBJを取得した場合に、タッチ座標にカードオブジェクトOBJが移動してくることを実現している。このため、たとえば画面外にあるカードオブジェクトOBJを取得した場合にも、取得したカードオブジェクトOBJが画面内に移動してくるため、取得したカードオブジェクトOBJを容易に識別したり、容易に操作したりすることができる。
また、ステップS57−S61の処理によって、手札(i(ここでは、2以上))のカードオブジェクトOBJは、1つ下層のカードオブジェクトOBJとの間の距離を所定の割合(25%)で短くするように、当該1つ下層のカードオブジェクトOBJを追従するのである。
図21は、図18に示したステップS9のリリース処理のフロー図である。図21に示すように、CPUコア34は、リリース処理を開始すると、ステップS71で、手札(1)から手札(M)を、手札として選択されたときにタッチオンされた場札(Tk,N(Tk)+1)から場札(Tk,N(Tk)+M)とする。つまり、リリース処理では、手札(1)から手札(M)を元の位置に戻すのである。ただし、N(Tk)は、すべての場札のカードオブジェクトOBJのうち、タッチオンした列(k)に在るカードオブジェクトOBJの総数である。そして、ステップS73で、変数N(Tk)に、N(Tk)+Mを設定して、メイン処理にリターンする。つまり、CPUコア34は、ステップS73で、タッチオンされた列(k)のカードオブジェクトOBJの総数を、元に戻された手札のカードオブジェクトOBJの数だけ加算して、更新しているのである。
図22は図19に示したステップS21のタッチオン操作処理のフロー図である。図22に示すように、CPUコア34は、タッチオン操作処理を開始すると、ステップS81で、変数kに「1」を設定する。ただし、変数kは場札の列を識別するために用いられる。列の番号については上述したとおりである。
次のステップS83では、変数kが最大値L以下であるかどうかを判断する。つまり、CPUコア34は、すべての列についてタッチオン操作の処理を実行したかどうかを判断するのである。ただし、最大値Lは、ゲームの種類や難易度で異なる。ステップS83で“NO”であれば、つまり変数kが最大値Lを超えている場合には、すべての列についてタッチオン操作の処理を実行したと判断して、そのままメイン処理にリターンする。一方、ステップS83で“YES”であれば、つまり変数kが最大値L以下である場合には、タッチオン操作の処理を実行していない列が存在すると判断して、ステップS85で、変数iにN(k)を設定する。ここで、変数iは列(k)のカードオブジェクトOBJを個別に識別するために使用され、N(k)は列(k)に存在するカードオブジェクトOBJの総数である。
続いて、ステップS87で、変数iが0よりも大きいかどうかを判断する。ステップS87で“NO”であれば、つまり変数iが0であれば、列(k)にカードオブジェクトOBJが存在しない、または、列(k)のすべてのカードオブジェクトOBJについてタッチオン操作の有無を判定したと判断して、ステップS89で、変数kに、k+1を設定して、ステップS83に戻る。つまり、CPUコア34は、次の列(k)についてのタッチオン操作の処理に移行する。
一方、ステップS87で“YES”であれば、つまり変数iが0よりも大きければ、ステップS91で、タッチ座標が場札(k,i)に重なっているかどうかを判断する。ここ
では、タッチ座標がカードオブジェクトOBJの表示領域に含まれるかどうかを判断する。ただし、場札(k,i)は、列(k)のi番目のカードオブジェクトOBJを意味する。
また、詳細な説明は省略するが、カードオブジェクトOBJの表示位置(配置位置)およびその大きさはカードデータ74cから分かるため、タッチ座標がカードオブジェクトOBJ(場札(k,i))に重なるかどうかを簡単に調べることができる。
また、場札としてのカードオブジェクトOBJは、列毎に重なるように配置されているため、上層のカードオブジェクトOBJと下層のカードオブジェクトOBJとで表示領域も重なるが、この仮想ゲームのルール上、上層のカードオブジェクトOBJが優先されるため、上層のカードオブジェクトOBJから順に調べるようにしてある。
ステップS91で“NO”であれば、つまりタッチ座標が場札(k,i)に重なっていなければ、ステップS93で、変数iに、i−1を設定して、ステップS87に戻る。つまり、CPUコア34は、タッチ座標と1つ下層の(次の)カードオブジェクトOBJとの重なりを判断するのである。
一方、ステップS91で“YES”であれば、つまりタッチ座標が場札(k,i)に重なっていれば、ステップS95で、列(k)においてフォーカス(タッチオン)された列(k)のカードオブジェクトOBJの番号F(k)が0であるか、または、当該番号F(k)が変数iよりも大きいかどうかを判断する。つまり、列(k)において、現在フォーカスされているカードオブジェクトOBJが存在しないか、現在フォーカスされているカードオブジェクトOBJよりも、下層の(優先度の低い)カードオブジェクトOBJのフォーカスが指示されたかどうかを判断しているのである。
ステップS95で“YES”であれば、つまり番号F(k)が0である場合か、または、番号F(k)が変数iよりも大きい場合には、ステップS97で、番号F(k)に、変数iの数値を設定して、ステップS99に進む。つまり、当該列(k)に現在フォーカスされているカードオブジェクトOBJが無い場合には、今回のタッチオンによって、フォーカスされるカードオブジェクトOBJが設定される。また、当該列(k)に現在(既に)フォーカスされているカードオブジェクトOBJが有る場合には、それよりも下層のカードオブジェクトOBJがタッチされた場合に、フォーカスされているカードオブジェクトOBJが更新される。
一方、ステップS95で“NO”であれば、つまり番号F(k)が0で無く、しかも番号F(k)が変数i以下である場合には、そのままステップS99に進む。ステップS99では、フォーカスカウンタ74jのカウント値Fcount(k)に「60」を設定し、タッチ
オンされた列(k)を記憶するための変数Tkに当該列(k)を、タッチオンされたカードを記憶するための変数Tiに変数iの数値を設定して、メイン処理にリターンする。
図23は、図19に示したステップS25のカード取得処理のフロー図である。図23に示すように、カード取得処理を開始すると、ステップS111で、変数Tkが0であるかどうかを判断する。つまり、いずれの列(k)のカードオブジェクトOBJも(場札のカードオブジェクトOBJが)タッチオンされていないかどうかを判断する。ステップS111で“YES”であれば、つまり変数Tkが0であれば、いずれの列(k)のカードオブジェクトOBJもタッチオンされていないと判断して、そのままメイン処理にリターンする。
しかし、ステップS111で“NO”であれば、つまり変数TKが0でなければ、列(
k)のカードオブジェクトOBJのいずれかがタッチオンされていると判断して、ステップS113で、前フレームのタッチ座標と、現フレームのタッチ座標との差が一定以上であるかどうかを判断する。具体的には、前回タッチ座標データ74eが示すタッチ座標(前タッチ座標)と、現在タッチ座標データ74dが示すタッチ座標(現タッチ座標)との差分(絶対値)を検出し、当該差分が一定値(一定の閾値)を超えているかどうかを判断する。ここで、一定値(一定の閾値)は、ドラッグ操作を開始したか否かを判断するための値であり、実験等によって経験的に得られた値が設定される。
ステップS113で“NO”であれば、前タッチ座標と現タッチ座標との差分が一定未満であれば、ドラッグ操作を開始していないと判断して、そのままメイン処理にリターンする。一方、ステップS113で“YES”であれば、前タッチ座標と現タッチ座標との差分が一定以上であれば、ドラッグ操作を開始したと判断して、ステップS115で、変数iに、タッチオンされている列(k)のカードオブジェクトOBJの総数を設定する。
続いて、ステップS117では、変数iがタッチオンされた場札(Tk,i)の番号Ti以上であるかどうかを判断する。ステップS117で“NO”であれば、つまり変数iがタッチオンされた場札(Tk,i)の番号Ti未満であれば、そのままステップS125に進む。一方、ステップS117で“YES”であれば、つまり変数iがタッチオンされた場札(Tk,i)の番号Ti以上であれば、ステップS119で、タッチオンされた場札(Tk,i)が手に取れるかどうかを判断する。つまり、CPUコア34は、タッチオンされた場札(Tk,i)が表向きであり、この実施例の仮想ゲームの所定のルールに違反していないかどうかを判断するのである。ただし、所定のルールは、上述したように、クロンダイクとスパイダーとで異なる。
ステップS119で“YES”であれば、つまりタッチオンされた場札(Tk,i)を手に取ることができる場合には、ステップS121で、変数iに、i−1を設定して、ステップS117に戻る。つまり、当該列(k)の下層の(次の)カードオブジェクトOBJを手に取ることができるか否かが判断されるのである。一方、ステップS119で“NO”であれば、つまりタッチオンされた場札(Tk,i)を手に取ることができない場合には、ステップS123で、変数iに、i+1を設定して、ステップS125に進む。ステップS123の処理により、手に取ることができると判断された1つ上層の(前の)カードオブジェクトOBJに変数iが戻されるのである。
ステップS125では、タッチオンされた列(k)の場札(Tk,i)から場札(Tk,N(Tk))までを、手札(1)から手札(N(Tk)−i)として設定する。つまり、タッチ座標のY座標よりも下方であり、手に取ることができる1または連続的に重なっている複数のカードオブジェクトOBJが手札として選択されるのである。したがって、上述したように、直接的にタッチオンしていないカードオブジェクトOBJであっても、手札として自動的に選択することができるのである。
なお、詳細な説明は省略するが、このとき、カードデータ74cが更新される。上述したように、識別データにおいて、場札の情報は消去されずに、手札の情報が追加される。その後、カードオブジェクトOBJが他の列に移動されると、手札の情報が消去され、場札の情報が更新される。
続いて、ステップS127では、手札の総数Mに、N(Tk)−iを設定するとともに、列(k)のカードオブジェクトOBJの総数N(Tk)に、変数iの数値を設定する。そして、ステップS129で、距離(Ox,Oy)に、手札(1)の座標−タッチ座標(現タッチ座標)を設定して、メイン処理にリターンする。
図24−図26は、図18に示したステップS11の場札更新処理のフロー図である。図24に示すように、CPUコア34は、場札更新処理を開始すると、ステップS141で、変数kに「1」を設定する。つまり、最初に、場札のうちの列(1)についての更新処理が実行される。続くステップS143では、変数kが最大値L以下であるかどうかを判断する。ここで、最大値Lは、場札の列(k)の総数である。
ステップS143で“NO”であれば、つまり変数kが最大値Lを超えていれば、すべての列(k)についての更新処理を終了したと判断して、メイン処理にリターンする。一方、ステップS143で“YES”であれば、つまり変数kが最大値L以下であれば、更新処理を終了していない列(k)が存在すると判断して、ステップS145で、タッチ中かどうかを判断する。このステップS145の処理は、上述したメイン処理のステップS5と同じであるため、詳細な説明は省略することにする。
ステップS145で“YES”であれば、つまりタッチ中であれば、そのままステップS153に進む。一方、ステップS145で“NO”であれば、つまりタッチ中でなければ、ステップS147で、カウント値Fcount(k)に、Fcount(k)−1を設定し、ステップS149で、カウント値Fcount(k)が0以下であるかどうかを判断する。つまり、フォーカ
スされている一定時間(60フレーム)が経過したかどうかが判断される。
ステップS149で“NO”であれば、つまりカウント値Fcount(k)が0よりも大きけ
れば、フォーカスされている一定時間が経過していないと判断して、そのままステップS153に進む。一方、ステップS149で“YES”であれば、つまりカウント値Fcount(k)が0以下であれば、フォーカスされている一定時間が経過したと判断して、ステップ
S151で、変数F(k)に「0」を設定して、ステップS153に進む。ただし、変数F(k)は、フォーカス(タッチオン)されている列(k)を示すために用いられる。
ステップS153では、変数iに「1」を設定するとともに、変数yに「Y1」を設定する。ここで、変数iは、当該列(k)内のカードオブジェクトOBJを識別するために用いられる。また、変数yは重なり合うカードオブジェクトOBJのY座標間隔aを設定するために用いられる。さらに、定数Y1は、場札の列(k)において、最下層のカードオブジェクトOBJの原点P(左上の頂点)が配置されるべき位置のワールド座標系におけるY座標である。
図25に示すように、次のステップS155では、変数iが最大値N(k)以下であるかどうかを判断する。つまり、当該列(k)のすべてのカードオブジェクトOBJについて更新処理を実行したかどうかが判断される。ステップS155で“NO”であれば、つまり変数iが最大値N(k)よりも大きければ、当該列(k)のすべてのカードオブジェクトOBJについての更新処理を実行したと判断して、図26に示すステップS171に進む。一方、ステップS155で“YES”であれば、つまり変数iが最大値N(k)以下であれば、更新処理を実行していないカードオブジェクトOBJが当該列(k)に存在すると判断して、ステップS157で、場札(k,i)が裏向きであるかどうかを判断する。つまり、CPUコア34は、カードデータ74cを参照して、当該場札(k,i)の状態判別フラグがオフであるかどうかを判断するのである。
ステップS157で“NO”であれば、つまり場札(k,i)が表向きであれば、図26に示すステップS163に進む。一方、ステップS157で“YES”であれば、つまり場札(k,i)が裏向きであれば、ステップS159で、場札(k,i)のY座標に、場札(k,i)のY座標+(y−場札(k,i)のY座標)*0.25を設定する。そして、ステップS161で、変数yに、y+Scを設定するとともに、変数iに、i+1を設定して、ステップS155に戻る。ただし、定数Scは、裏向きのカードオブジェクト
OBJのY座標間隔である。
上述したように、場札(k,i)が表向きであれば、ステップS157で“NO”となり、図26に示すステップS163で、変数aに、(Y2−y)/(N(k)−i−1)を設定する。ここで、変数aは、上述したように、表向きのカードオブジェクトOBJのY座標間隔であり、定数Y2は、場札の表示領域(102,202)の下端のY座標である。つまり、CPUコア34は、ステップS163で、場札の表示領域(102,202)のY軸方向の長さから裏向きのカードオブジェクトOBJを表示するためのY軸方向の長さを引いた長さ(Y2−y)を、表向きのカードオブジェクトのY座標間隔aが均等になるように分けているのである。
次のステップS165では、変数aが最大間隔Soよりも大きいかどうかを判断する。ステップS165で“NO”であれば、つまり変数aが最大間隔So以下であれば、そのままステップS169に進む。一方、ステップS165で“YES”であれば、つまり変数aが最大間隔Soよりも大きければ、ステップS167で、変数aに、最大間隔Soを設定して、ステップS169に進む。つまり、Y座標間隔aが最大間隔Soを超えないように補正(制限)されるのである。
ステップS169では、ステップS155と同様に、変数iが最大値N(k)以下であるかどうかを判断する。ステップS169で“NO”であれば、つまり変数iが最大値N(k)を超えると、ステップS171で、変数kに、k+1を設定して、図24に示したステップS143に戻る。つまり、次の列(k)についての更新処理が実行される。
しかし、ステップS169で“YES”であれば、つまり変数iが最大値N(k)以下であれば、ステップS173で、変数F(k)と変数iが等しいかどうかを判断する。つまり、着目するカードオブジェクトOBJが、フォーカスされているカードオブジェクトOBJであるかどうかが判断される。ステップS173で“NO”であれば、つまり変数F(k)と変数iとが等しくなければ、そのままステップS177に進む。一方、ステップS173で“YES”であれば、つまり変数F(k)と変数iとが等しければ、Y座標間隔aを最大間隔Soに設定して、ステップS177に進む。
ステップS177では、ステップS159と同様に、場札(k,i)Y座標に、場札(k,i)のY座標+(y−場札(k,i)のY座標)*0.25を設定する。そして、ステップS179で、変数yに、y+aを設定するとともに、変数iに、i+1を設定して、ステップS169に戻る。
この実施例によれば、プレイヤがカードオブジェクトをタッチオンしたときに、下層のカードオブジェクトの内容が見えるように、カードオブジェクトを移動させるので、表示画面の大きさに制限されることなく、カードオブジェクトの内容を容易に知ることができる。また、表示画面の大きさに起因して、カードオブジェクトの総数が制限されたり、カードオブジェクトの表示数が制限されたりすることがない。
なお、この実施例では、プレイヤがタッチオンしたカードオブジェクトよりも上層のカードオブジェクトを下方向(ワールド座標のY軸のプラス方向)に移動させることにより、下層のカードオブジェクトの露出量を増加させて、そのマークおよび文字が見えるようにしたが、これに限定される必要はない。下層のオブジェクトを上方向(ワールド座標のY軸のマイナス方向)に移動させてもよいし、上層および下層のオブジェクトを上下方向で互いに逆の向きに移動させてもよい。または、上層のカードオブジェクトを、右方向(ワールド座標のX軸のプラス方向)や左方向(ワールド座標のX軸のマイナス方向)に移動させてもよいし、上層および下層のオブジェクトを左右方向で互いに逆向きに移動させ
てもよい。さらには、上層または下層のオブジェクトを、上下左右のいずれかの方向または斜め方向に移動させてもよいし、上層および下層のカードオブジェクトを、上下左右のいずれかの方向または斜め方向で互いに逆向きまたは互いに離れる方向に移動させてもよい。
また、この実施例では、ゲーム装置を用いて、トランプゲームをプレイする場合のカードオブジェクトの表示制御について説明したが、これに限定される必要はない。表示画面に複数のオブジェクトが表示される場合に、ユーザの指示に従って、下層のオブジェクトの内容が見えるように、上層または下層のオブジェクトをずらす点に着目されたい。つまり、この実施例では、情報処理プログラムの一例としてゲームプログラムが実行される場合について示したが、これに限定されるべきではない。
さらに、この実施例では、タッチオンされたカードオブジェクトを含み、その上層のすべてのカードオブジェクトのY座標間隔が最大間隔になるように、カードオブジェクトを移動させるようにしたが、これに限定されるべきではない。たとえば、タッチオンされたカードオブジェクトの種類のみが見えるように、それより上層のすべてのカードオブジェクトをまとめて移動させるようにしてもよい。また、タッチオンされたカードオブジェクトおよびその近辺(前後数枚または上層あるいは下層の数枚)のカードオブジェクトのY座標間隔だけを最大間隔にするように移動させるようにしてもよい。または、タッチオンしたカードオブジェクトが属する列のすべてのカードオブジェクト(表向きのカードオブジェクトのみでも可)のY座標間隔が最大間隔になるように、カードオブジェクトを移動させるようにしてもよい。
さらにまた、この実施例では、トランプゲームのルールに従うため、選択可能なカードオブジェクトは、そのルールに従って重なっているカードオブジェクトとしたが、これに限定される必要はない。タッチオンされたオブジェクトと同じ属性を有しているような関連するオブジェクトが選択されてもよい。たとえば、オブジェクトの属性としては、実施例におけるマーク(色、模様)や数字のみならず、オブジェクトの形状や大きさなども含む。
また、タッチオンされたオブジェクトと所定の関係を有する位置に配置されたオブジェクトが関連するオブジェクトとして選択されてもよい。たとえば、タッチオンされたオブジェクトの位置を1つの頂点とした場合に、正三角形や正方形のような所定の図形を形成するような位置に配置されたオブジェクトが選択されたり、所定の点を中心とした場合に、タッチオンされたオブジェクトと点対称や線対称となる位置に配置されているオブジェクトが選択されたりしてもよい。
さらに、この実施例では、タッチオン操作によりカードオブジェクトがフォーカスされると、タッチオフ操作後に、一定時間(60フレーム)が経過すると、Y座標間隔が最大間隔に移動されていたすべてのカードオブジェクトを元の位置に戻すようにしたが、タッチオフ操作後、直ぐに元の位置に戻すようにしてもよい。
また、ゲーム装置の構成は、上述の実施例の構成に限定されるべきでない。たとえば、LCDは1つでもよく、タッチパネルは2つのLCDのそれぞれに設けるようにしてもよい。