package com.ntlab.irisserver.entities; import java.util.HashMap; import java.util.List; import java.util.Map; public class DrawingController { private int stage = 0; private int maxstage; private Game game; private Map<Member, List<Integer>> assignments; private List<Member> members; private IStateListener stateListener; //ニックネームからメンバーを特定するマップ private Map<String,Member> membersMap= new HashMap<>(); private long startTime; //ステージの開始時刻 private long nowTime; //現在の時刻 private int drawingTime; //お絵描きのタイムリミット private int countdown; //あと何秒でタイムリミットになるか private boolean isDrawingTimer; //タイマーを使うかどうか //描いている最中にタイムリミット(countdown==0)がくれば、描いている途中のものをputさせる。既に描き終わっている人は何もしない //時間が0になったときに、描き終わっていない人は「描いている最中の絵をput」する。(クライアントサイド) デバッグがしにくい assingmentのgetで見れるようにする //getdnoの番号が変わっていたら、「新しい絵を描く」 public DrawingController(IStateListener stateListener, List<Member> members, Game game) { this.members = members; this.stateListener = stateListener; this.game = game; assignments = game.getAssignments(); //16枚の絵をそろえるために必要なステージ数を計算 16/人数 端数切り上げ maxstage = (16 + members.size() - 1)/members.size(); for(Member mem :members) { String nick = mem.getNickname(); membersMap.put(nick,mem); } //お絵描きのタイムリミットを記録 Settings setting = game.getSettings(); startTime = System.nanoTime(); this.drawingTime = setting.getDrawingTimerTimes(); this.isDrawingTimer = setting.isDrawingTimer(); } //絵がアップロードされたときに、ステージを進めるか確認する public void update(){ boolean canUpdate = true; //参加者全員が絵を書き終わっているかを確認 for(Member mem :members) { int dno = getDno(mem.getNickname()); Drawing drawing = game.getDrawing(dno); //まだ描けていない絵があればステージ変更しない if(drawing == null){ canUpdate = false; } } //全員描き終わていれば、ステージを進める if(canUpdate) { stage += 1; //タイマーをリセット startTime = System.nanoTime(); countdown = drawingTime; //ゲームに必要な枚数がそろうと、roomのstateを「お絵描き中2」から「ゲーム中3」に変更 if(stage == maxstage){ stateListener.changeState(); } } } //お絵描き中のタイマーを更新 private void updateTimer(){ //経過した時間を計算(秒) nowTime = System.nanoTime(); int count = ((int)nowTime - (int)startTime)/1000; if(drawingTime - count > 0){ countdown = drawingTime - count; }else{ countdown = 0; } } //pathパラメーターを引数にするので、memberではなくてString //nicknameから書いてほしいdnoを返す public Integer getDno(String nickname) { Member mem = membersMap.get(nickname); if(mem == null){ return null; } List<Integer> dnoList = assignments.get(mem); int dno = dnoList.get(stage); return dno; } public int getCountdown(){ if(isDrawingTimer){ updateTimer(); return countdown; }else{ return 1; } } }