diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/GameController.java b/CheckersClient/core/src/com/mygdx/game/controllers/GameController.java index a08d7f7afbebeccc2aaee5721ca40ebc3a371f78..3c8fc5d28c93db1e109858e3ec1d4767b256e925 100644 --- a/CheckersClient/core/src/com/mygdx/game/controllers/GameController.java +++ b/CheckersClient/core/src/com/mygdx/game/controllers/GameController.java @@ -19,6 +19,9 @@ public class GameController { private Vector3 previousCoordinateClicked; // Previously clicked coordinate private final PlayerController playerController; + private List<Integer> usedBoardSlots; + private List<List<Float>> playerNameTextFieldCoordinates; + public GameController(Game model, PlayView view, PlayerController playerController) { this.model = model; this.view = view; @@ -28,12 +31,13 @@ public class GameController { this.previousCoordinateClicked = null; // Get used boardslots and coordinates to place name of players - List<Integer> playerIndexes = this.model.getUsedBoardSlots(playerController.getLobby().getPlayers().size()); - List<List<Float>> playerNameTextFieldCoordinates = this.model.getPlayerNameCoordinates(this.view.hex_side_length); + usedBoardSlots = this.model.getUsedBoardSlots(playerController.getLobby().getPlayers().size()); + playerNameTextFieldCoordinates = this.model.getPlayerNameCoordinates(this.view.hex_side_length); // Initialize pieces and place playernames this.view.initializePieces(this.model.getStartFieldCoordinates()); - this.view.placePlayerNames(playerIndexes, playerNameTextFieldCoordinates); + this.view.placePlayerNames(usedBoardSlots, playerNameTextFieldCoordinates); + this.view.placeRocket(playerNameTextFieldCoordinates.get(0)); } public void handleClick(float x, float y) { @@ -64,6 +68,8 @@ public class GameController { playerController.getNetWorkController().sendToServer(new cPlayerPieceMove(previousCoordinateClicked, cubeCoordinates, playerController.getLobby().getID(), playerController.getPlayer().getID())); previousCoordinateClicked = null; // TODO: Check if all pieces of the player are in goal? (model.isPlayerFinished) + System.out.println(model.isPlayerFinished(playerController.getPlayer().getID())); + this.view.placeRocket(playerNameTextFieldCoordinates.get(this.model.getPlayerTurnSlot())); } else { System.out.println("Move was not allowed"); // TODO: Give feedback (move was not valid/not executed) @@ -76,6 +82,7 @@ public class GameController { public void playerMovedPiece(Vector3 fromCoordinates, Vector3 toCoordinates, int playerId) { if (this.model.movePiece(fromCoordinates, toCoordinates, playerId)) { this.view.moveOtherPlayerPiece(fromCoordinates, toCoordinates); + this.view.placeRocket(playerNameTextFieldCoordinates.get(this.model.getPlayerTurnSlot())); } else { System.out.println("ERROR: Could not execute moving of other players piece"); } diff --git a/CheckersClient/core/src/com/mygdx/game/model/Game.kt b/CheckersClient/core/src/com/mygdx/game/model/Game.kt index 145bcde2d68aafd64217f126e9b17348007581c9..cc130294c00f403eae5e530615f33712dbf8d1bf 100644 --- a/CheckersClient/core/src/com/mygdx/game/model/Game.kt +++ b/CheckersClient/core/src/com/mygdx/game/model/Game.kt @@ -9,6 +9,7 @@ class Game(gameState: GameState, playerIds: HashSet<Int>) { private var playerIds: HashSet<Int> private var playerTurnId: Int private var playerTurnIndex: Int = 0 // TODO: Random initial value + private var playerTurnSlot: Int = 0; // TODO: Random initial value init { this.gameState = gameState @@ -50,6 +51,10 @@ class Game(gameState: GameState, playerIds: HashSet<Int>) { return playerTurnId } + fun getPlayerTurnSlot(): Int { + return gameState.getRules().getUsedBoardSlots(playerIds.size).get(playerTurnIndex) + } + fun nextPlayer() { playerTurnIndex++ if (playerTurnIndex == playerIds.size) { @@ -64,7 +69,9 @@ class Game(gameState: GameState, playerIds: HashSet<Int>) { } fun isPlayerFinished(playerId: Int): Boolean { - val targetFields = this.gameState.getRules().getPlayerTargetFields(playerId) + + val boardSlot = gameState.getRules().getUsedBoardSlots(playerIds.size).get(playerIds.indexOf(playerId)); + val targetFields = this.gameState.getRules().getPlayerTargetFields(boardSlot) for (targetField: Vector3 in targetFields) { if (this.gameState.getBoardState().fields[targetField]?.getPiece()?.getOwnerId() != playerId) { diff --git a/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/AbstractRules.kt b/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/AbstractRules.kt index 3725e44c56853d4f3ef30bc52471797273f6e4e9..618a82f637d6e7019553779818fed181e6bf1089 100644 --- a/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/AbstractRules.kt +++ b/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/AbstractRules.kt @@ -8,8 +8,8 @@ abstract class AbstractRules { abstract var moveRange: Int // How far a piece can be moved abstract var jumpRange: Int // How many pieces a piece can jump over - abstract fun getPlayerStartfields(playerIndex: Int) : List<Vector3> // Returns a list of startfields for a given player - abstract fun getPlayerTargetFields(playerIndex: Int) : List<Vector3> // Returns a list of targetfields for a given player + abstract fun getPlayerStartfields(boardSlot: Int) : List<Vector3> // Returns a list of startfields for a given player + abstract fun getPlayerTargetFields(boardSlot: Int) : List<Vector3> // Returns a list of targetfields for a given player abstract fun generateStartFields(playerCount: Int = 6): List<List<Vector3>> // Returns a list with lists of startfields abstract fun getUsedBoardSlots(playerCount: Int): List<Int> // Returns a list with used boardslots abstract fun getPlayerNameCoordinates(hex_side_length: Float): List<List<Float>> // Returns a list with lists of coordinates for playernames diff --git a/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/DefaultRules.kt b/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/DefaultRules.kt index 1d3d7a7d60b0589712ed0441c421c823a5de5243..b63d340aa29123cea9b226869f0fe08a92ad655d 100644 --- a/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/DefaultRules.kt +++ b/CheckersClient/core/src/com/mygdx/game/model/gamemodes/rules/DefaultRules.kt @@ -10,21 +10,21 @@ class DefaultRules: AbstractRules() { override var moveRange = 1 override var jumpRange = 2 - override fun getPlayerStartfields(playerIndex: Int): List<Vector3> { - return startFields[playerIndex] + override fun getPlayerStartfields(boardSlot: Int): List<Vector3> { + return startFields[boardSlot] } - override fun getPlayerTargetFields(playerIndex: Int): List<Vector3> { - var index = playerIndex + override fun getPlayerTargetFields(boardSlot: Int): List<Vector3> { + var slot = boardSlot for (i in 0..2) { - index++ + slot++ // Wrap around to first player - if(index == 6) { - index = 0 + if(slot == 6) { + slot = 0 } } - return startFields[index] + return startFields[slot] } // Sequence: top, upperright, lowerright, bottom, lowerleft, upperleft diff --git a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java index 73da906c56718e0fc68759001ac38027b0b08d6e..99e48a7bd508bd45fc4de49d657104304cc5bb68 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java @@ -722,7 +722,6 @@ public class LobbyView extends View{ if(Gdx.input.justTouched()){ lastTouch[0] = Gdx.input.getX(); lastTouch[1] = stage.getViewport().getScreenHeight()-Gdx.input.getY(); - System.out.println("Only once"); } if(Gdx.input.isTouched()){ float camXPos = camera.position.x + (lastTouch[0]-Gdx.input.getX())* touchSensitivity; //camera.position.x + (Gdx.input.getX()-lastTouch[0])*sensitivity; @@ -732,7 +731,6 @@ public class LobbyView extends View{ float b = MathUtils.clamp(camYPos, camera.viewportHeight/2, backgroundImage.getImageHeight()-camera.viewportHeight/2); camera.position.set(a, b, 0); - System.out.println("Multiple times"); } } diff --git a/CheckersClient/core/src/com/mygdx/game/views/PlayView.java b/CheckersClient/core/src/com/mygdx/game/views/PlayView.java index 8bf43416d575a5ccd1775158b7dd47ded6cef7bc..a098537e6640711a8735c5b5d698c17573ca9978 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/PlayView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/PlayView.java @@ -25,8 +25,6 @@ import java.util.Arrays; import java.util.List; import java.util.concurrent.ConcurrentHashMap; -import javax.xml.soap.Text; - public class PlayView extends View{ @@ -43,6 +41,9 @@ public class PlayView extends View{ Texture starPieceHead; Texture starPieceHeadBorder; + Image rocketImage; + Image rocketExhaustImage; + ConcurrentHashMap<Vector3, StarPiece> pieces; // Concurrent to avoid ConcurrentModificationException due to render-function GameController gameController; List<TextField> playerNameFields; @@ -78,7 +79,6 @@ public class PlayView extends View{ boardImage.setPosition(Gdx.graphics.getWidth() / 2F - boardImage.getWidth() * boardImage.getScaleX() / 2F, Gdx.graphics.getHeight() / 2F - board.getHeight() * boardImage.getScaleY() / 2F); stage.addActor(boardImage); - for (PlayAssets asset : PlayAssets.values()) { assetManager.load(asset.path, asset.classType); } @@ -86,6 +86,18 @@ public class PlayView extends View{ setFadeColor(Color.BLACK); + Texture rocket = (Texture) assetManager.get(PlayAssets.ROCKET.path, PlayAssets.ROCKET.classType); + rocketImage = new Image(rocket); + rocketImage.setScale(0.5F, 0.5F); + rocketImage.rotateBy(-30); + stage.addActor(rocketImage); + + Texture rocketExhaust = (Texture) assetManager.get(PlayAssets.ROCKET_EXHAUST.path, PlayAssets.ROCKET_EXHAUST.classType); + rocketExhaustImage = new Image(rocketExhaust); + rocketExhaustImage.setScale(0.5F, 0.5F); + rocketExhaustImage.rotateBy(-30); + stage.addActor(rocketExhaustImage); + starPieceBase = (Texture) assetManager.get(PlayAssets.STAR_PIECE_BASE.path, PlayAssets.STAR_PIECE_BASE.classType); starPieceBaseBorder = (Texture) assetManager.get(PlayAssets.STAR_PIECE_BASE_BORDER.path, PlayAssets.STAR_PIECE_BASE_BORDER.classType); starPieceMast = (Texture) assetManager.get(PlayAssets.STAR_PIECE_MAST.path, PlayAssets.STAR_PIECE_MAST.classType); @@ -94,19 +106,6 @@ public class PlayView extends View{ starPieceHeadBorder = (Texture) assetManager.get(PlayAssets.STAR_PIECE_HEAD_BORDER.path, PlayAssets.STAR_PIECE_HEAD_BORDER.classType); this.pieces = new ConcurrentHashMap<>(); - - /*for (Player player : playerController.getLobby().getPlayers()) { - String playerName = player.getPlayerName(); - - TextField textField = getPlayerNameTextField(player.getPlayerName(), index); - - TextField textField = new TextField(player.getPlayerName(), skin); - textField.setSize(300, 80); - textField.setPosition(Gdx.graphics.getWidth() / 2F - textField.getWidth() - (2 * hex_side_length), Gdx.graphics.getHeight() - (3 * hex_side_length)); - - stage.addActor(textField); - playerNameFields.add(textField); - }*/ } public void setGameController(GameController gameController) { @@ -173,6 +172,27 @@ public class PlayView extends View{ } } + public void placePlayerNames(List<Integer> usedBoardSlots, List<List<Float>> coordinateList) { + + List<Player> players = playerController.getLobby().getPlayers(); + playerNameFields = new ArrayList<>(); + + for (int i = 0; i < players.size(); i++) { + TextField textField = new TextField(players.get(i).getPlayerName(), skin); + textField.setColor(PIECE_COLORS.get(i)); + textField.setSize(Constants.PLAYER_NAME_TEXT_FIELD_WIDTH, Constants.PLAYER_NAME_TEXT_FIELD_HEIGHT); + textField.setPosition(coordinateList.get(usedBoardSlots.get(i)).get(0), coordinateList.get(usedBoardSlots.get(i)).get(1)); + + stage.addActor(textField); + playerNameFields.add(textField); + } + } + + public void placeRocket(List<Float> coordinates) { + rocketImage.setPosition(coordinates.get(0) - 60F, coordinates.get(1) + 50F); + rocketExhaustImage.setPosition(rocketImage.getX() - 62F, rocketImage.getY() + 20F - (rocketImage.getHeight()) * rocketImage.getScaleY()); + } + @Override public void fadeIn(float dt) { stage.getBatch().begin(); @@ -223,21 +243,6 @@ public class PlayView extends View{ return startFieldCoordinatesPixel; } - public void placePlayerNames(List<Integer> playerIndexes, List<List<Float>> coordinateList) { - - List<Player> players = playerController.getLobby().getPlayers(); - playerNameFields = new ArrayList<>(); - - for (int i = 0; i < players.size(); i++) { - TextField textField = new TextField(players.get(i).getPlayerName(), skin); - textField.setSize(Constants.PLAYER_NAME_TEXT_FIELD_WIDTH, Constants.PLAYER_NAME_TEXT_FIELD_HEIGHT); - textField.setPosition(coordinateList.get(playerIndexes.get(i)).get(0), coordinateList.get(playerIndexes.get(i)).get(1)); - - stage.addActor(textField); - playerNameFields.add(textField); - } - } - public void movePiece(StarPiece piece, Vector3 toCoordinates) { Float[] pixelCoordinates = UtilsKt.cubeToPixel(toCoordinates, hex_side_length); diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java index 735057d8b89bdd4dce271fd7e1e3e5901263bd0e..129d2d96fb33b285c72dc1877ec659226fcf4152 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java +++ b/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java @@ -11,7 +11,9 @@ public enum PlayAssets { STAR_PIECE_HEAD("Game/1x/StarPiece_Head.png", Texture.class), STAR_PIECE_HEAD_BORDER("Game/1x/StarPiece_HeadBrd.png", Texture.class), STAR_PIECE_MAST("Game/1x/StarPiece_Mast.png", Texture.class), - STAR_PIECE_MAST_BORDER("Game/1x/StarPiece_MastBrd.png", Texture.class); + STAR_PIECE_MAST_BORDER("Game/1x/StarPiece_MastBrd.png", Texture.class), + ROCKET("Menu/0.25x/Rocket_Main@0.25x.png", Texture.class), + ROCKET_EXHAUST("Menu/0.25x/Rocket_Exhaust@0.25x.png", Texture.class); public final String path; public final Class classType;