這篇我們要來實作Player1ChessGame的程式,這邊會是放主要功能的地方
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player1_chess_game);
tv_show_room_number = findViewById(R.id.tv_show_room_number);
tv_message = findViewById(R.id.tv_message);
tv_systemMessage = findViewById(R.id.tv_systemMessage);
tv_moveData = findViewById(R.id.tv_moveData);
btn_back = findViewById(R.id.btn_back);
btn_setting = findViewById(R.id.btn_setting);
grid_playerChessboard = findViewById(R.id.grid_playerChessboard);
grid_playerChessman = findViewById(R.id.grid_playerChessman);
grid_playerChessmanSelect = findViewById(R.id.grid_playerChessmanSelect);
// 取得上個頁面的資料
getLastPageData();
// 設置返回功能
back();
// 設置"設置"功能
setting();
// 先取得一次資料庫中的資料
dbp.getData(roomNumber);
// 設置房間號碼
tv_show_room_number.setText(roomNumber);
// 創建棋盤
createBoard.createChessboard(grid_playerChessboard,colorList);
// 設置資料變動監聽器
listenConversations();
}
dbp是DatabasePresenter類的變數,用來調用我們定義的修改資料庫的方法,需要先創建變數:
private DatabasePresenter dbp = new DatabasePresenter(this);
接著要implements DatabaseContract.view:
public class Player1ChessGame extends AppCompatActivity implements DatabaseContract.view
最後需要實作回調的四種方法:
public void addSuccess(){
Log.d("TAG", "資料上傳成功");
}
public void addError(){
Log.d("TAG", "資料上傳失敗");
}
public void getSuccess(String getId,
String getRoomNumber,
Boolean getPlayer1OnlineState,
Boolean getPlayer2OnlineState,
String getMoveState,
HashMap<String,Object> getChessboardData,
HashMap<String,Object> getChessmanMoveData,
String getTurn,
HashMap<String,Object> getPawnMove1,
HashMap<String,Object> getPawnMove2,
HashMap<String,Object> getCastlingMove1,
HashMap<String,Object> getCastlingMove2,
String getDate,
String getPlayer1message,
String getPlayer2message,
String getWinPlayer){
Log.d("TAG", "資料獲取成功");
// 回調的變數對應到全域變數
roomKey = getId;
player1OnlineState = getPlayer1OnlineState;
player2OnlineState = getPlayer2OnlineState;
moveState = getMoveState;
chessboardData = getChessboardData;
chessmanMoveData = getChessmanMoveData;
turn = Integer.parseInt(getTurn);
pawnMove1 = getPawnMove1;
pawnMove2 = getPawnMove2;
castlingMove1 = getCastlingMove1;
castlingMove2 = getCastlingMove2;
date = getDate;
player1message = getPlayer1message;
player2message = getPlayer2message;
winPlayer = getWinPlayer;
}
public void getError(){
Log.d("TAG", "資料獲取失敗");
}
public void uploadSuccess(){
Log.d("TAG", "資料修改成功");
}
public void uploadError(){
Log.d("TAG", "資料修改失敗");
}
public void deleteSuccess(){
Log.d("TAG", "資料刪除成功");
}
public void deleteError(){
Log.d("TAG", "資料刪除失敗");
}
除了綁定先前layout的元件,我們可以先增加幾個function:
public void getLastPageData(){
roomKey = getIntent().getStringExtra("roomKey");
musicList = getIntent().getIntegerArrayListExtra("musicData");
colorList = getIntent().getIntegerArrayListExtra("colorData");
gameMode = getIntent().getStringExtra("gameMode");
if(getIntent().getStringExtra("RoomNumber") != null){
roomNumber = getIntent().getStringExtra("RoomNumber");
}
if(getIntent().getStringExtra("room_number") != null){
roomNumber = getIntent().getStringExtra("room_number");
}
}
public void back(){
btn_back.setOnClickListener(v -> {
dialogData.showExitDialog("確定退出對局?","確定","取消");
});
}
public void setting(){
btn_setting.setOnClickListener(v -> {
// 跳出設置對話框
showSettingDialog();
});
}
我們在先前的CreateBoardData.class中加上一個function,用來創建棋盤最外圍部分
private ArrayList<TextView> chessboard = new ArrayList<>();
private String[] board_coordinate;
public void createChessboard(GridLayout grid_playerChessboard,
ArrayList colorList){
// 創建棋盤(最外圍,包括座標)
// 設定GridLayout的列數和行數
grid_playerChessboard.setColumnCount(10);
grid_playerChessboard.setRowCount(10);
// 動態建立Textview並添加到GridLayout中
for (int i = 0; i < 100; i++) {
chessboard.add(new TextView(activity));
// 讀取螢幕大小,並根據大小調整按鈕比例
DisplayMetrics displayMetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int newWidth = (int) (displayMetrics.widthPixels * 0.1f);
int newHeight = (int) (newWidth);
int newMarginsWidth = (int) (displayMetrics.widthPixels * 0);
int newMarginsHeight = (int) (newMarginsWidth);
// 設定Textview的Layout參數
GridLayout.LayoutParams params = new GridLayout.LayoutParams();
params.width = newWidth;
params.height = newHeight;
params.setMargins(newMarginsWidth, newMarginsHeight, newMarginsWidth, newMarginsHeight);
params.setGravity(Gravity.CENTER);
// 設定Textview的列和行位置
params.rowSpec = GridLayout.spec(i / 10);
params.columnSpec = GridLayout.spec(i % 10);
chessboard.get(i).setTypeface(null, Typeface.BOLD);
chessboard.get(i).setGravity(Gravity.CENTER);
if(colorList == null || colorList.size() == 0){
colorList = new ArrayList();
colorList.add(0);
}
// 設定棋盤顏色
if((i % 20 == 11 || i % 20 == 13 || i % 20 == 15 || i % 20 == 17 ||
i % 20 == 2 || i % 20 == 4 || i % 20 == 6 || i % 20 == 8 )&& i > 10 && i < 89){
chessboard.get(i).setBackgroundResource(colorData.light_color[(int)colorList.get(0)]);
} else if (i < 10) {
chessboard.get(i).setText(board_coordinate[i]);
chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
chessboard.get(i).setBackgroundResource(R.drawable.black);
} else if (i >= 10 && i <= 89 && i % 10 == 0) {
chessboard.get(i).setText(board_coordinate[9+i/10]);
chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
chessboard.get(i).setBackgroundResource(R.drawable.black);
} else if (i >= 10 && i <= 89 && i % 10 == 9) {
chessboard.get(i).setText(board_coordinate[17+(i - 9) / 10]);
chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
chessboard.get(i).setBackgroundResource(R.drawable.black);
} else if (i > 89) {
chessboard.get(i).setText(board_coordinate[26+i % 90]);
chessboard.get(i).setTextColor(Color.parseColor("#ffffff"));
chessboard.get(i).setBackgroundResource(R.drawable.black);
} else {
chessboard.get(i).setBackgroundResource(colorData.dark_color[(int)colorList.get(0)]);
}
// 將Textview添加到GridLayout中
grid_playerChessboard.addView(chessboard.get(i),params);
}
}
傳入2個參數,包括:
監聽器以及設置選單的部分下一篇我們再做介紹及實作