Step3:ターンを考慮したコマ選択機能
該当するターンのコマを選択(クリック)すると,そのコマが赤くなる機能
全タスク一覧
[Task3-1]AbstractKomaクラスの更新
[Task3-2]GameStatusクラスの作成
[Task3-3]KomaListクラスの更新
[Task3-4]Boardクラスの更新
[Task3-5]Doubutsu.pdeの更新
タスク間の依存関係
- Task3-1,3-2,3-3はこの順に実施すること
- クリックによってLeft側のコマが赤くなるかどうかはTask3-4終了時に確認できる
担当者決定
担当者を決定する.開発担当とレビュー担当をTask毎に決定し,記述すること.なお,特定のTaskについて,開発者とレビュアーを同じ人がやってはいけない.また,複数のTaskを一人でまとめて実施しても構わないが,Step毎に最低2人は開発を担当すること.
Task 3-1 | Task 3-2 | Task 3-3 | Task 3-4 | Task 3-5 | |
---|---|---|---|---|---|
開発 | |||||
レビュー |
[Task3-1]AbstractKomaクラスの更新
実施内容
AbstractKomaクラスのdraw()
メソッドを更新し,drawSelected()
メソッドを追加する
draw()
メソッドの最後に「対象のコマが選択されていれば,this.drawSelected()
を呼び出す」という処理を追加する- 選択されているコマがあるマス目を赤く塗る
drawSelected()
メソッドを追加する
AbstractKomaクラス
void draw() {
String komaImage = "";
if (this.team==0 && this.kStat.active) komaImage = this.name+"A.png";
else if (this.team==1 && this.kStat.active) komaImage = this.name+"B.png";
else return;
PImage img = loadImage(komaImage);
image(img, SQUARESIZE*this.x+2, this.y*SQUARESIZE+2, SQUARESIZE-4, SQUARESIZE-4);
if (this.kStat.selected) this.drawSelected();
}
void drawSelected() {
fill(#FF0000, SQUARESIZE);
rect(this.x*SQUARESIZE, this.y*SQUARESIZE, SQUARESIZE, SQUARESIZE);
}
レビュー項目
- AbstractKomaクラスの
draw()
メソッドとdrawSelected()
メソッドが↑の内容になっていることを確認する. - コマの色が変わるかどうかはTask3-5で確認する.
[Task3-2]GameStatusクラスの作成
実施内容
GameStatusクラスを作成する
- int型の変数turnをフィールドとして持つ.Left/Rightどちらのターンであるかを示す.0がLeft,1がRight.初期値は0(すなわちLeft側からゲームをスタートする).
class GameStatus {
int turn = 0;
}
レビュー項目
- GameStatusクラスが↑と一致していることを確認する
[Task3-3]KomaListクラスの更新
実施内容
KomaListクラスにgetSelectedKoma()
メソッド,select()
メソッドとgetKomaFromPlaceByTeam()
メソッドを追加する
getSelectedKoma()
メソッドでは,komaArrayにあるすべてのコマの中から,選択されているもの(kStat.selectedがtrueのもの)を探し,返す.select()
メソッドでは,クリックされた座標(x,y)に,そのターンのチーム(Left/Right)に属するコマが存在したとき,そのコマのkStat.selectedをtrueに変更する.getKomaFromPlaceByTeam()
メソッドはクリックされた座標(x,y)に存在するそのターンのチームに属するコマを返す.- このタスクの下記
KomaList
クラスのselect
メソッドにおいて,gs.turn
の箇所でコンパイルエラーが発生する.このコンパイルエラーはTask3-5が完了しなければ取れない(GameStatusの宣言をDoubutsu.pdeで行っているため).
KomaListクラス
AbstractKoma getSelectedKoma() {
for (AbstractKoma k : komaArray) {
if (k.kStat.selected) return k;
}
return null;
}
void select(int x, int y) {
AbstractKoma koma = this.getKomaFromPlaceByTeam(x, y, gs.turn);
if (koma != null) koma.kStat.selected=true;
}
AbstractKoma getKomaFromPlaceByTeam(int x, int y, int team) {
for (AbstractKoma k : this.komaArray) {
if (team==k.team && x == k.x && y == k.y && k.kStat.active) return k;
}
return null;
}
レビュー項目
- KomaListクラスの
getSelectedKoma()
メソッド,select()
メソッドとgetKomaFromPlaceByTeam()
メソッドが↑と一致することを確認する.
[Task3-4]Boardクラスの更新
実施内容
Boardクラスにselect()
メソッドを追加する
select()
メソッドでは,KomaListクラスのインスタンスkomaListのgetSelectedKoma()
メソッドを利用して,既に選択されているコマ(ある場合)を取得する.選択済みのコマがない場合は座標(x,y)に存在するそのターン(Left/Right)に属するコマを選択するため,komaListのselect(x,y)
を呼び出す.ある場合は選択済みのコマの選択状態を解除する.- つまり,何か選択されたコマがあれば,どこをクリックしても選択状態が解除される.
Boardクラス
void select(int x, int y){
AbstractKoma koma = komaList.getSelectedKoma();
if(koma==null){
komaList.select(x,y);
}else{
koma.kStat.selected=false;
}
}
レビュー項目
- Boardクラスの
select()
メソッドが↑と一致することを確認する.
[Task3-5]Doubutsu.pdeクラスの更新
実施内容
Doubutsu.pdeにmouseReleased()
メソッドを追加し,GameStatusクラスのインスタンス生成処理を追加する
- Processingではマウスがクリックされ,話されるときに,
mouseReleased()
メソッドが呼び出される.その機能を利用し,どこをクリックしたかを取得し,選択処理を行う. - mouseX, mouseYにはマウスでクリックされた場所のピクセル座標が入るため,それをそれぞれSQUARESIZEで割り,x,y に代入する
- x, yをBoardクラスのインスタンスboardの
select()
メソッドに渡す. 冒頭にGameStatusクラスの変数gsの宣言を追加するsetup()
メソッド内にgsの初期化処理を追加する
Doubutsu.pde
final int SQUARESIZE = 100;
Board board;
KomaList komaList;
GameStatus gs;
void setup() {
surface.setSize(6*SQUARESIZE, 4*SQUARESIZE);
board = new Board();
komaList = new KomaList();
gs = new GameStatus();
}
void draw() {
board.draw();
komaList.draw();
}
void mouseReleased() {
int x = mouseX/SQUARESIZE;
int y = mouseY/SQUARESIZE;
board.select(x, y);
}
レビュー項目
- 正常に実行可能で,Leftに属するコマを選択すると下記のように赤くなり,もう一度盤面上の任意の箇所を選択すると赤いのが戻ることを確認する
- コマが選択されていない状態で,Rightに属するコマを選択しても赤くならないことを確認すること