package org.test; import java.util.Arrays; import loon.LSystem; import loon.Screen; import loon.action.sprite.ImageBackground; import loon.component.LClickButton; import loon.component.LComponent; import loon.component.LToast; import loon.event.ClickListener; import loon.event.GameTouch; import loon.opengl.GLEx; import loon.utils.ArrayMap; import loon.utils.ArrayMap.Entry; import loon.utils.ListMap; import loon.utils.processes.RealtimeProcess; import loon.utils.timer.LTimerContext; public class GameView extends Screen { private static final int PIECE_WIDTH = 67, PIECE_HEIGHT = 67; private static final int SY_COE = 68, SX_COE = 68; private static final int SX_OFFSET = 50, SY_OFFSET = 15; private ListMap<String, LClickButton> pieceObjects = new ListMap<String, LClickButton>(); private Board board; private String selectedPieceKey; private GameController controller; private LClickButton lblPlayer; public GameView() { } public void movePieceFromModel(String pieceKey, int[] to) { LClickButton pieceObject = pieceObjects.get(pieceKey); int[] sPos = modelToViewConverter(to); pieceObject.setLocation(sPos[0], sPos[1]); selectedPieceKey = null; } public void movePieceFromAI(String pieceKey, int[] to) { Piece inNewPos = board.getPiece(to); if (inNewPos != null) { remove(pieceObjects.get(inNewPos.key)); pieceObjects.removeKey(inNewPos.key); } LClickButton pieceObject = pieceObjects.get(pieceKey); int[] sPos = modelToViewConverter(to); pieceObject.setLocation(sPos[0], sPos[1]); selectedPieceKey = null; } private int[] modelToViewConverter(int pos[]) { int sx = pos[1] * SX_COE + SX_OFFSET, sy = pos[0] * SY_COE + SY_OFFSET; return new int[] { sx, sy }; } private int[] viewToModelConverter(int sPos[]) { int ADDITIONAL_SY_OFFSET = 25; int y = (sPos[0] - SX_OFFSET) / SX_COE, x = (sPos[1] - SY_OFFSET - ADDITIONAL_SY_OFFSET) / SY_COE; return new int[] { x, y }; } public void showPlayer(char player) { lblPlayer.setTexture("assets/" + player + ".png"); } public void showWinner(char player) { String text = (player == 'r') ? "Red player has won!" : "Black player has won!"; add(LToast.makeText(text)); } @Override public void draw(GLEx g) { } @Override public void onLoad() { controller = new GameController(); board = controller.playChess(); add(new ImageBackground("assets/board.png")); lblPlayer = LClickButton.makePath("assets/r.png"); lblPlayer.setLocation(10, 320); lblPlayer.setSize(PIECE_WIDTH, PIECE_HEIGHT); add(lblPlayer); ArrayMap pieces = board.pieces; for (int i=0;i<pieces.size();i++) { Entry e = pieces.getEntry(i); if (e != null) { String key = (String) e.getKey(); int[] pos = ((Piece)(e.getValue())).position; int[] sPos = modelToViewConverter(pos); LClickButton lblPiece = LClickButton.makePath("assets/" + key.substring(0, 2) + ".png"); lblPiece.setLocation(sPos[0], sPos[1]); lblPiece.setSize(PIECE_WIDTH, PIECE_HEIGHT); lblPiece.SetClick(new PieceOnClickListener(key)); pieceObjects.put(key, lblPiece); add(lblPiece); } } RealtimeProcess aiProcess = new RealtimeProcess() { @Override public void run(LTimerContext time) { if (controller.hasWin(board) == 'x') { showPlayer('r'); // 用户走棋 if (board.player == 'r') { return; } if (controller.hasWin(board) != 'x') { showWinner('r'); } // ai走棋 showPlayer('b'); controller.responseMoveChess(board, GameView.this); } else { showWinner('b'); } } }; // 每秒刷新一次AI aiProcess.setDelay(LSystem.SECOND); addProcess(aiProcess); } @Override public void alter(LTimerContext timer) { } @Override public void resize(int width, int height) { } @Override public void touchDown(GameTouch e) { if (selectedPieceKey != null) { int[] sPos = new int[] { e.x(), e.y() }; int[] pos = viewToModelConverter(sPos); int[] selectedPiecePos = ((Piece)board.pieces.get(selectedPieceKey)).position; for (int[] each : Rules.getNextMove(selectedPieceKey, selectedPiecePos, board)) { if (Arrays.equals(each, pos)) { controller.moveChess(selectedPieceKey, pos, board); movePieceFromModel(selectedPieceKey, pos); break; } } } } @Override public void touchUp(GameTouch e) { } @Override public void touchMove(GameTouch e) { } @Override public void touchDrag(GameTouch e) { } @Override public void resume() { } @Override public void pause() { } @Override public void close() { } class PieceOnClickListener implements ClickListener { private String key; PieceOnClickListener(String key) { this.key = key; } @Override public void DoClick(LComponent comp) { } @Override public void DownClick(LComponent comp, float x, float y) { if (selectedPieceKey != null && key.charAt(0) != board.player) { Piece p = (Piece) board.pieces.getValue(key); if (p == null) { return; } int[] pos = p.position; int[] selectedPiecePos = ((Piece)board.pieces.get(selectedPieceKey)).position; for (int[] each : Rules.getNextMove(selectedPieceKey, selectedPiecePos, board)) { if (Arrays.equals(each, pos)) { remove(pieceObjects.get(key)); pieceObjects.removeKey(key); controller.moveChess(selectedPieceKey, pos, board); movePieceFromModel(selectedPieceKey, pos); break; } } } else if (key.charAt(0) == board.player) { selectedPieceKey = key; } } @Override public void UpClick(LComponent comp, float x, float y) { } @Override public void DragClick(LComponent comp, float x, float y) { } } }