package org.ntlab.irisclient; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import org.ntlab.irisclient.entities.TurnJson; import org.ntlab.irisclient.models.Game; import org.ntlab.irisclient.viewmodels.DrawingStateViewModel; import org.ntlab.irisclient.viewmodels.GameViewModel; public class GameMasterActivity extends AppCompatActivity{ private GameViewModel gameViewModel; //操作可能かどうかを記録。これがfalseの時は何のボタンを押すこともできない。 //時間があればオフラインの動作はできるようにしたい。 private boolean IsActive = false; private String myTeam; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_game_master); // Fragmentを作成します DrawingCardFragment fragment = new DrawingCardFragment(); GamePlayerListFragment RedPlayerList = new GamePlayerListFragment("r"); GamePlayerListFragment BluePlayerList = new GamePlayerListFragment("b"); // Fragmentの追加や削除といった変更を行う際は、Transactionを利用します FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // 新しく追加を行うのでaddを使用します // 他にも、よく使う操作で、replace removeといったメソッドがあります // メソッドの1つ目の引数は対象のViewGroupのID、2つ目の引数は追加するfragment transaction.add(R.id.container, fragment); transaction.add(R.id.RedPlayerListContainer, RedPlayerList); transaction.add(R.id.BluePlayerListContainer,BluePlayerList); // 最後にcommitを使用することで変更を反映します transaction.commit(); //Irisから必要な情報を取得 Iris iris = (Iris) this.getApplication(); String rid = iris.getRid(); String nickName = iris.getNickname(); myTeam = iris.getTeam(); //viewModelに必用な情報をセット gameViewModel= new ViewModelProvider(this).get(GameViewModel.class); gameViewModel.setRid(rid); //ボタンの情報を入力 buttonProcesses(); //自分が赤チームマスターの場合はヒントが入力可能 if(myTeam == null) { System.out.println(("myteamがnullです")); }else if(myTeam.equals("r")){ IsActive = true; } //タイマースタート呼び出し gameViewModel.start(500,iris); //hint,openList,max,turnstate,の更新を反映。(gamestate・ゲームの勝敗結果はカードフラグメントが作る) gameViewModel.getTurnLiveData().observe(this, new Observer<TurnJson>() { @Override public void onChanged(TurnJson turnJson) { //turnJsonから情報を貰ってきて、操作できるのかどうかとかを判断する。 IsActive = CheckActivity(turnJson); //時間があれば何をしてほしいのかのアナウンスを入れる //時間があれば背景の色を変える //ヒントが変更されているか、ターンが切り替わったときに //UpdateHint(); } }); } private void buttonProcesses(){ Button SendHintButton = (Button) findViewById(R.id.SendHint); SendHintButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(!IsActive){return;}//アクティブのときだけボタンを押せる EditText Hint = findViewById(R.id.GameHint); EditText HintMax = findViewById(R.id.GameHintMax); //テキストを適した変数に変更 String hint = Hint.getText().toString(); Integer hintMax; if(HintMax != null){ hintMax = Integer.parseInt(HintMax.getText().toString()); }else{ hintMax = null; } //ニックネームまたは部屋番号が入力されていない場合エラーメッセージを表示する if (hint.isEmpty()) { Hint.setError("ヒントが入力されていません"); } else if (hintMax == null) { HintMax.setError("数字が入力されていません"); } else { gameViewModel.putHint(hint,hintMax); } } }); } //操作可能かどうかを調べる関数。masterとかturnをオブザーブしておいて、変更があれば反映する。 private boolean CheckActivity(TurnJson turnjson){ boolean isActive = false; //最新のゲームの状況を取得 String CurrentTeam = turnjson.getTeam(); int turnState = turnjson.getTurnstate(); //自分のチームのターンで、かつ「ヒント入力」時間の場合は行動可能 if(CurrentTeam.equals(myTeam) && turnState == 0){ isActive = true; } return isActive; } private void UpdateHint(String hint,Integer hintMax){ EditText Hint = findViewById(R.id.GameHint); EditText HintMax = findViewById(R.id.GameHintMax); Hint.setText(hint); HintMax.setText(hintMax); } }