グループT †
企画 †
- タイトル:ダブルラケット
- 2人で協力して遊ぶブロック崩しのゲーム。
- ラケットが2枚あり、2人のプレーヤーがそれぞれのラケットを別々に操作してブロックを崩していく。
- すべてのブロックを消すとそのシーンはクリアとなり、次のシーンに進む。
- 特定のブロックを消すとパワーアップアイテムが落ちてきて、それを拾うと一定時間だけ特殊機能が発動する。
- ボールを下に逃すとボールが1つ減り、ボールがなくなるとゲームオーバー。
外部仕様 †
画面のイメージは以下の通り。

- ゲームの進行について
- アプリを起動するとデモモードとなる。
- デモモードでスペースキーを押すとゲーム開始。
- 開始直後は、プレーヤー1のラケットにボールがくっついている状態で、もう一度スペースキーを押すとボールが動き始める。
- プレーヤー1はZとXキーで、プレーヤー2には左右の矢印キーでラケットを左右に移動することができる。
- ボールを後ろに逃すとボールが1つ減り、開始直後の状態に戻る。
- ボールがなくなるとデモモードに戻る。
- ボールの移動角度について
- ボールは原則として直進する。
- 壁やラケット、ブロックに当たると完全弾性衝突して跳ね返る。
- ラケットに当たった場所によって跳ね返る角度が変わる。
- メッセージについて
- ゲーム中、随所にメッセージが登場する。
- ゲーム開始時
- パワーアップ時
- ボールロスト時
- ゲームオーバー時
- シーンクリア時
- メッセージの種類
- スライド型:右や下から現れ、左や上に消える
- ズーム型:特定の場所に縮小しながら現れ消える
- アイテムについて
- 特定のブロックを消すとアイテムが落ちてくる。
- そのアイテムを取ると何かが起こる。
- 起こること:
- ボールが増える
- 一定時間ラケットが伸びる
- 一定時間ラケットが縮む
- 一定時間ボールの速度が上がる
- 一定時間ボールの速度が下がる
- 一定時間ビームが打てるようになる
- アイテムは種類によって色が違う。
- 何かわからない場合もある。
- ブロックの硬さについて
- 硬いブロックがあり、何度か当てないと消えない。
- 硬さは色でわかる。(当たると色が変わる)
- シーンによって決まっている。
- シーンについて
- ゲーム開始直後はシーン1が表示される。
- シーンによってブロックの配置、アイテムの場所等が決まっている。
- どこかにデータを持つ。
内部仕様 †
抽出したオブジェクトは以下の通り。
- ゲーム
- ボール
- ラケット
- ブロック
- シーン
- カプセル
- メッセージャー
- アニメーター
- モーショナー
- 衝突判定者
- コリジョナー
以下、各オブジェクトについての詳細を述べる。
ゲーム †
- ゲームの全体を制御するためのオブジェクト。
- 描画領域としてのキャンバスである。
- 全体の流れを制御するためのスレッドを持つ。
- 登場する他のオブジェクトを持つ。
モーショナー †
- 動くオブジェクト。
- アニメーターのよって保持され、固有のタイミングと優先度で動かされる。
- 不要になればアニメーターから削除され、画面から消えるように、移動後に不要かどうかを返す。
アニメーター †
- モーショナーを動かすオブジェクト。
- モーショナーのリストを追加することができる。
- 追加されたモーショナーは動作を行い、不要になれば削除される。
- タイミングを同期するため、独自のスレッドではなくゲームオブジェクトから制御される。
描画の優先度の段階を持つ。(生成時に指定する) ←アニメーターは動きだけを制御し描画は行わないので、これは不要。
コリジョナー †
- 衝突するオブジェクト。
- 互いに衝突判定ができる。
- 衝突時に通知を受け取る。
- 衝突可能かどうかの判断を行う。(一定時間は衝突しない、などへの対応)
衝突判定者 †
- コリジョナーのリスト2つの衝突判定を行う。
- タイミングを同期するため、独自のスレッドではなくゲームオブジェクトから制御される。
ボール †
- モーショナーであり、コリジョナーでもある。
- 小さい円で表示される。
- ラケットで跳ね返る。
- 左右と上の壁でも跳ね返る。
- 下の壁に当たると1つ減る。
- ブロックに当たると、ブロックが変化する。
ラケット †
- モーショナーであり、コリジョナーでもある。
- 長方形で表示される。
- ボールと当たると跳ね返す。
- ブロックとは衝突しない。
- カプセルと当たると、ラケットやボール等が変化する。
ブロック †
- コリジョナーである。
- 長方形で表示される。
- ボールと当たると変化する。
- ブロックは種類に応じて派生クラス(ブロックA、ブロックBなど)がある。
シーン †
- ブロックの配置等の情報を持つ。
- テキスト情報で表現されたファイルを読み込む。
カプセル †
- モーショナーであり、コリジョナーでもある。
- 楕円で表示される。
- 特定のブロックが消える現れ、下に移動する。
- ラケットで取るとラケットやボール等が変化する。
メッセンジャー †
- モーショナーである。
- ゲームの随所でメッセージを表示するために使用される。
- スライドメッセンジャーとズームメッセンジャーという2つの派生クラスがある。
- アニメータに追加され、メッセージの表示が終わると削除される。
処理の流れ †
大まかな処理の流れは次のようになる。

この中には、細かい処理は記述してない。
細かい処理としては、
- ラケットの移動
- カプセル取得後の処理
- 衝突後の処理
などが考えられる。
クラス図 †
初期クラス図は以下の通り。

Blockクラスの派生クラスはまだ書き込んでない。
詳細仕様 †
ここから、ゲームの詳細な内容の検討に入る。
シーンの定義について †
シーンとは、ゲームの面のことである。
デモはシーンの一種であり、ボールが自動的に動く以外は通常のシーンと同様である。
シーンは、下記で述べるシーン定義属性を使ってテキストファイルによって記述される。()でデフォルト値がある属性は省略可能。
scene STR ... シーンの名称。シーンの最初にスライドメッセージで表示される
left N(=10) ... ブロック群と左端との距離
right N(=10) ... ブロック群と右端との距離
top N(=40) ... ブロック群と上端との距離
blocks_begin ... ブロック群定義部の開始
AAZAAAAA ... ブロック定義(A,B,C...はブロックの種類)
AAA..AAA ... '.'はブロックがないことを意味する
AAAAYAAA
BXB..BBB
CCCCCCCC
blocks_end ... ブロック群定義部の終了
height N(=20) ... ブロックの高さ
brink STR ... シーン中、常に点滅表示されるメッセージ
demo ... デモ指定(なければシーン)
bg N(=FFFFFF) ... 背景色のRGB各2桁の16進値
img STR(=null) ... 背景画像(nullならば画像なし)
シーンの生成について †
シーンは上記のシーン定義を読み込んだシーンオブジェクトを用いて行われる。
class Scene
---
String getString();
int getRows();
int getCols();
int getLeft();
int getRight();
int getTop();
boolean isDemo();
int getBG();
Image getImage();
シーン生成の処理はゲームオブジェクトが行う。
class Game
---
makeScene(Scene s);
シーンの生成は、現在のゲームの大きさに基づいて行われる。
まず、1つのブロックの幅を左右のマージンを差し引いて計算し、ブロック間の間隔を考慮して決める。
次にブロックの種類をシーンのブロック文字で決めて、そのブロックを生成しブロックリストに追加する。
ラケットの移動について †
- ラケットはキーリスナーであり、それ自体がキーイベントを受け取ることができる。
- ラケットは2つのキーを登録でき、それがラケットを左右に動かすキーとなる。
- ラケットは左右移動キーの状態を記憶しており、キーイベントでその状態を変更する。
- ラケットはモーショナーであり、move()で現在の移動キーの状態に応じて移動する。
アニメータについて †
- アニメータはモーショナーの「リストのリスト」を持っている。
- アニメータに登録されているリスト内のモーショナーは、固有のタイミングで動く。
- モーショナーのmove()メソッドはboolean値を返し、それがtrueならばリストから取り除かれる。
衝突判定者について †
- 衝突判定者はコリジョナーの「リストのリスト」を2つ持っている。
- コリジョナーのリスト(List1とList2)を2つ同時に追加し、List1の中の要素c1とList2の中の要素c2の衝突判定を行う。
- c1とc2とが衝突していたら、c1とc2の両方の衝突通知が行われる。
- 通知の結果によって、そのオブジェクトをリストから削除する。
メッセンジャーについて †
- 文字列の表示を行うオブジェクト。
- メッセンジャーが生成されアニメーターに追加されると、所定の動作を行い消える。
実装 †
テスト †
Javaセミナー2014