Newer
Older
IrisClient / app / src / main / java / org / ntlab / irisclient / GameMemberActivity.java
g-akagi on 10 Nov 2022 6 KB 11/10テスト前のコミット
  1. package org.ntlab.irisclient;
  2.  
  3. import androidx.appcompat.app.AppCompatActivity;
  4. import androidx.fragment.app.FragmentManager;
  5. import androidx.fragment.app.FragmentTransaction;
  6. import androidx.lifecycle.Observer;
  7. import androidx.lifecycle.ViewModelProvider;
  8.  
  9. import android.content.Intent;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14.  
  15. import org.ntlab.irisclient.entities.TurnJson;
  16. import org.ntlab.irisclient.models.Game;
  17. import org.ntlab.irisclient.viewmodels.DrawingStateViewModel;
  18. import org.ntlab.irisclient.viewmodels.GameViewModel;
  19.  
  20. public class GameMemberActivity extends AppCompatActivity {
  21.  
  22. private GameViewModel gameViewModel;
  23.  
  24. //操作可能かどうかを記録。これがfalseの時は何のボタンを押すこともできない。
  25. //時間があればオフラインの動作はできるようにしたい。
  26. private boolean isActive = false;
  27. private String myTeam;
  28.  
  29. //赤チームの「ヒント入力」からスタート
  30. private String currentTeam = "r";
  31. private int turnState = 0;//0:ヒント入力,1:カード選択
  32.  
  33. //ヒントの情報
  34. private String hint = "a";
  35. private Integer hintMax = 0;
  36.  
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_member_game);
  41.  
  42. // Fragmentを作成します
  43. DrawingCardFragment fragment = new DrawingCardFragment();
  44. GamePlayerListFragment RedPlayerList = new GamePlayerListFragment("r");
  45. GamePlayerListFragment BluePlayerList = new GamePlayerListFragment("b");
  46. // Fragmentの追加や削除といった変更を行う際は、Transactionを利用します
  47. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  48. // 新しく追加を行うのでaddを使用します
  49. // 他にも、よく使う操作で、replace removeといったメソッドがあります
  50. // メソッドの1つ目の引数は対象のViewGroupのID、2つ目の引数は追加するfragment
  51. transaction.add(R.id.container, fragment);
  52. transaction.add(R.id.redPlayerListContainer, RedPlayerList);
  53. transaction.add(R.id.bluePlayerListContainer,BluePlayerList);
  54.  
  55. // 最後にcommitを使用することで変更を反映します
  56. transaction.commit();
  57.  
  58. //Irisから必要な情報を取得
  59. Iris iris = (Iris) this.getApplication();
  60. String rid = iris.getRid();
  61. String nickName = iris.getNickname();
  62. myTeam = iris.getTeam();
  63.  
  64. //viewModelに必用な情報をセット
  65. gameViewModel= new ViewModelProvider(this).get(GameViewModel.class);
  66. gameViewModel.setRid(rid);
  67.  
  68. //ボタンの情報を入力
  69. buttonProcesses();
  70.  
  71. //自分が赤チームマスターの場合はヒントが入力可能
  72. if(myTeam == null) {
  73. System.out.println(("myteamがnullです"));
  74. }else if(myTeam.equals("r")){
  75. isActive = true;
  76. }
  77.  
  78. //タイマースタート呼び出し
  79. gameViewModel.start(500,iris);
  80.  
  81. //ヒントの変更を監視
  82. gameViewModel.getHintLiveData().observe(this, new Observer<String>() {
  83. @Override
  84. public void onChanged(String new_Hint) {
  85. hint = new_Hint;
  86. }
  87. });
  88.  
  89. gameViewModel.getMaxLiveData().observe(this, new Observer<Integer>() {
  90. @Override
  91. public void onChanged(Integer new_HintMax) {
  92. hintMax = new_HintMax;
  93. }
  94. });
  95.  
  96. //どちらのターンかを監視
  97. gameViewModel.getTurnsLiveData().observe(this, new Observer<String>() {
  98. @Override
  99. public void onChanged(String new_currentTeam) {
  100.  
  101. //チームの情報を更新
  102. currentTeam = new_currentTeam;
  103.  
  104. //操作できるかを判断する。
  105. isActive = CheckActivity();
  106. }
  107. });
  108.  
  109. //「ヒント入力」か「カード選択」かを監視
  110. gameViewModel.getTurnStateLiveData().observe(this, new Observer<Integer>() {
  111. @Override
  112. public void onChanged(Integer new_turnState) {
  113.  
  114. //チームの情報を更新
  115. turnState = new_turnState;
  116.  
  117. //ヒントの情報を反映
  118. EditText Hint = findViewById(R.id.GameHint);
  119. EditText HintMax = findViewById(R.id.GameHintMax);
  120.  
  121.  
  122. if(new_turnState == 0){
  123. //「ヒント入力」になったときは古いヒントを消す
  124. Hint.getEditableText().clear();
  125. HintMax.getEditableText().clear();
  126. }else{
  127. //「カード選択」のときは新しいヒントを表示する
  128. Hint.setText(hint);
  129. HintMax.setText(hintMax.toString());
  130. }
  131.  
  132.  
  133. //操作できるかを判断する。
  134. isActive = CheckActivity();
  135. }
  136. });
  137.  
  138. //触れないボタンを設定
  139. }
  140.  
  141. public void buttonProcesses() {
  142.  
  143. Button FinishGuessButton = (Button) findViewById(R.id.finishGuessButton);
  144.  
  145. //推測終了を押した時に、ターン終了を通知
  146. FinishGuessButton.setOnClickListener(new View.OnClickListener() {
  147. @Override
  148. public void onClick(View view) {
  149.  
  150. if (!isActive) {return;}//アクティブのときだけボタンを押せる}
  151.  
  152. //次のターンに行くようにする
  153. gameViewModel.sendTurnState();
  154. }
  155. });
  156. }
  157.  
  158. //操作可能かどうかを調べる関数。masterとかturnをオブザーブしておいて、変更があれば反映する。
  159. private boolean CheckActivity(){
  160.  
  161. boolean isActive = false;
  162.  
  163. //自分のチームのターンで、かつ「ヒント入力」時間の場合は行動可能
  164. if(currentTeam.equals(myTeam) && turnState == 1){
  165. isActive = true;
  166. }
  167.  
  168. //非アクティブであれば推測終了の入力を禁止する
  169. Button FinishGuessButton = (Button) findViewById(R.id.finishGuessButton);
  170. if(isActive == false){
  171. FinishGuessButton.setFocusable(false);
  172. }else{
  173. FinishGuessButton.setFocusable(true);
  174. }
  175.  
  176. return isActive;
  177. }
  178. }
  179.