diff --git a/CheckersClient/.idea/caches/build_file_checksums.ser b/CheckersClient/.idea/caches/build_file_checksums.ser index 13675fdaaed4926c89b045bb8c396fb86f523650..ff2c783aa53bb9b4f4b5276e8b692f30a5ec539a 100644 Binary files a/CheckersClient/.idea/caches/build_file_checksums.ser and b/CheckersClient/.idea/caches/build_file_checksums.ser differ diff --git a/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml b/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml new file mode 100644 index 0000000000000000000000000000000000000000..791ccad4fc6da6b6e176aa2a55444318bfcaf3dd --- /dev/null +++ b/CheckersClient/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml @@ -0,0 +1,11 @@ +<component name="libraryTable"> + <library name="Gradle: org.javatuples:javatuples:1.2"> + <CLASSES> + <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/507312ac4b601204a72a83380badbca82683dd36/javatuples-1.2.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/a7495f5370bdfcf46c6f3c6ed0badf52877aa467/javatuples-1.2-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/CheckersClient/android/assets/Menu/1x/Lobby.png b/CheckersClient/android/assets/Menu/1x/Lobby.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b932205022ad0d0d5bb1003f3ddded80637d0c Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/Lobby.png differ diff --git a/CheckersClient/android/assets/Menu/1x/LobbyMenu@1x.png b/CheckersClient/android/assets/Menu/1x/LobbyMenu@1x.png index e32bb0211c00fcdb8162545271b661e85ea02467..e5846c8fca429429a70b90dcf4fd953a5fd9e8d5 100644 Binary files a/CheckersClient/android/assets/Menu/1x/LobbyMenu@1x.png and b/CheckersClient/android/assets/Menu/1x/LobbyMenu@1x.png differ diff --git a/CheckersClient/android/assets/Menu/1x/MainMenu@1x.png b/CheckersClient/android/assets/Menu/1x/MainMenu@1x.png index 7087a58412cbdd8363f7793659ac6be421ca5b40..49e98d44d7b293830464bf523b6cab7646435b44 100644 Binary files a/CheckersClient/android/assets/Menu/1x/MainMenu@1x.png and b/CheckersClient/android/assets/Menu/1x/MainMenu@1x.png differ diff --git a/CheckersClient/android/assets/Menu/1x/MrServer.png b/CheckersClient/android/assets/Menu/1x/MrServer.png new file mode 100644 index 0000000000000000000000000000000000000000..57a4adbfc58c73e2f9c79879a15cb558d363ffda Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/MrServer.png differ diff --git a/CheckersClient/android/assets/Menu/1x/MrServerBubblePointer.png b/CheckersClient/android/assets/Menu/1x/MrServerBubblePointer.png new file mode 100644 index 0000000000000000000000000000000000000000..2c701128ef243ac63f3c2a5121536abbd6af5e02 Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/MrServerBubblePointer.png differ diff --git a/CheckersClient/android/assets/Menu/1x/MrServerBubbleSquare.png b/CheckersClient/android/assets/Menu/1x/MrServerBubbleSquare.png new file mode 100644 index 0000000000000000000000000000000000000000..98b8772403f067b3902e460ac5406a16de5bad15 Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/MrServerBubbleSquare.png differ diff --git a/CheckersClient/android/assets/Menu/1x/PlayerReady.png b/CheckersClient/android/assets/Menu/1x/PlayerReady.png new file mode 100644 index 0000000000000000000000000000000000000000..4cba8dc27d25bb4393a58b1f401141977f44b434 Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/PlayerReady.png differ diff --git a/CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png b/CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png new file mode 100644 index 0000000000000000000000000000000000000000..7b34127c2981fd699b19bfc0c757400edbf0904f Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/PlayerReadyCheck.png differ diff --git a/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogoWithBackground.png b/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogoWithBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..1459cd41e87948848498cd6e7bfbb8e327b50de5 Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogoWithBackground.png differ diff --git a/CheckersClient/android/assets/characters/MrServer1@1x.png b/CheckersClient/android/assets/characters/MrServer1@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bec3a1bdbf675a96e871066dac923858efd1873b Binary files /dev/null and b/CheckersClient/android/assets/characters/MrServer1@1x.png differ diff --git a/CheckersClient/android/assets/characters/MrServer2@1x.png b/CheckersClient/android/assets/characters/MrServer2@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..5aae4331a0e9f49bd27ea96a8d8ef00e817b8fc2 Binary files /dev/null and b/CheckersClient/android/assets/characters/MrServer2@1x.png differ diff --git a/CheckersClient/android/assets/characters/MrServer3@1x.png b/CheckersClient/android/assets/characters/MrServer3@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..ad404fa898550132e12db36a0b007e87deef00b1 Binary files /dev/null and b/CheckersClient/android/assets/characters/MrServer3@1x.png differ diff --git a/CheckersClient/android/assets/characters/MrServerName.png b/CheckersClient/android/assets/characters/MrServerName.png new file mode 100644 index 0000000000000000000000000000000000000000..b0bb41a160668f668395ab603d57256779161db5 Binary files /dev/null and b/CheckersClient/android/assets/characters/MrServerName.png differ diff --git a/CheckersClient/android/assets/characters/MrServerPortrait@1x.png b/CheckersClient/android/assets/characters/MrServerPortrait@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c7dce48b35822d09931f827c601b143977109ae8 Binary files /dev/null and b/CheckersClient/android/assets/characters/MrServerPortrait@1x.png differ diff --git a/CheckersClient/build.gradle b/CheckersClient/build.gradle index 9d029760e9c300472e88cde54c412a341f3f91e4..dfc747b21022807316a09656376034b42935c0f6 100644 --- a/CheckersClient/build.gradle +++ b/CheckersClient/build.gradle @@ -13,8 +13,6 @@ buildscript { classpath 'com.android.tools.build:gradle:3.5.4' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - - } } @@ -53,6 +51,7 @@ project(":desktop") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } @@ -79,6 +78,7 @@ project(":android") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } @@ -92,5 +92,6 @@ project(":core") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } \ No newline at end of file diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java index bb21226cdc36dc61932a35a3cea510bd8a1024ed..dfdbb501915317c049054cfdd6905e1b9d7ec494 100644 --- a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java +++ b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java @@ -11,6 +11,9 @@ import com.mygdx.game.model.Lobby; import com.mygdx.game.model.Player; import com.mygdx.game.views.tokens.PlayerAvatar; +import org.javatuples.Pair; +import org.javatuples.Tuple; + import java.io.IOException; import java.util.ArrayList; import java.util.LinkedList; @@ -27,7 +30,7 @@ public class NetworkController { client.start(); try { //192.168.87.34 - String IP4_LAN_ADDRESS = "192.168.10.154"; + String IP4_LAN_ADDRESS = "192.168.87.23"; client.connect(10000, IP4_LAN_ADDRESS, 54555, 54777); } catch (IOException e) { e.printStackTrace(); @@ -53,6 +56,9 @@ public class NetworkController { kryo.register(cLobbyDelete.class, 23); kryo.register(cLobbyGetList.class, 24); kryo.register(cSetIndexAvatar.class, 25); + kryo.register(cSetPlayerReady.class, 26); + kryo.register(cSetPlayerName.class, 27); + kryo.register(cStartGame.class, 28); } public Client getClient() { return client; } diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java index f2410d9f55c4789cd07dd4b50ee042961cf2bcbb..14b1461a79cbb67cc6d2b741d293cd0f02132497 100644 --- a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java +++ b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java @@ -1,14 +1,18 @@ package com.mygdx.game.controllers; +import com.badlogic.gdx.utils.Null; import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Listener; import com.mygdx.game.controllers.commands.*; import com.mygdx.game.model.Lobby; import com.mygdx.game.model.Player; +import org.javatuples.Pair; + import java.util.ArrayList; import java.util.LinkedList; + public class PlayerController { private NetworkController net; @@ -45,12 +49,20 @@ public class PlayerController { public void lobbyGetList(){ sendCommand(new cLobbyGetList()); } + public void setLobbyPlayerReady(boolean isPlayerReady){ + sendCommand(new cSetPlayerReady(isPlayerReady, lobby.getID(), player.getID())); + } + public void connectPlayer(int avatarIndex){ sendCommand(new cPlayerJoin(avatarIndex));} public void createLobby(String name, int MAX_PLAYERS){ sendCommand(new cLobbyCreate(name, MAX_PLAYERS)); } public void updateIndexAvatar(int indexAvatar){ sendCommand(new cSetIndexAvatar(indexAvatar)); } + public void playerSetName(String name) { + sendCommand(new cSetPlayerName(name)); + } + public void deleteLobby(int id){ sendCommand(new cLobbyDelete(id)); } public void joinLobby(int id){ sendCommand(new cLobbyJoin(id)); } @@ -69,6 +81,22 @@ public class PlayerController { public void setLobbies(ArrayList<Lobby> lobbies){ this.lobbies = lobbies; } + public boolean isOwningPlayerInLobby(){ + try{ + if(lobby==null){ + return false; + } + else if(lobby.getID() == -1){ + return false; + } + else{ + return true; + } + }catch (NullPointerException e){ + return false; + } + } + public PlayerController getPlayerController(){ return this; } public NetworkController getNetWorkController() { return net; } @@ -76,6 +104,4 @@ public class PlayerController { public Command getLastCommand(){ return receivedCommands.getFirst(); } - - } diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java index b917c6980a2e03d916895cb2e4959747cc2fa23c..fb713e07bfc07644cce55e5c140248a29bdd0427 100644 --- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java +++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java @@ -7,7 +7,7 @@ import com.mygdx.game.model.Lobby; public class cSetIndexAvatar extends Command { - public cSetIndexAvatar() { super("cLobbyJoin"); } + public cSetIndexAvatar() { super("cSetIndexAvatar"); } public cSetIndexAvatar(int indexAvatar) { super("cSetIndexAvatar", indexAvatar); diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java new file mode 100644 index 0000000000000000000000000000000000000000..b89a72c7761aae6c0c02746b267fc03ed28de372 --- /dev/null +++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerName.java @@ -0,0 +1,27 @@ +package com.mygdx.game.controllers.commands; + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controllers.PlayerController; +import com.mygdx.game.model.Lobby; +import com.mygdx.game.model.Player; + +import org.javatuples.Pair; + + +public class cSetPlayerName extends Command{ + + public cSetPlayerName() { super("cSetPlayerName"); } + + public cSetPlayerName(String name) { + super("cSetPlayerName", name); + } + + @Override + public void execute(PlayerController playerController, Connection connection){ + if(data instanceof String){ + String name = (String) data; + playerController.getPlayer().setPlayerName(name); + System.out.printf("Player name is updated on server. %s \n", name); + } + } +} diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java new file mode 100644 index 0000000000000000000000000000000000000000..af752e948d1799a52c28ba486a32bd24084d5787 --- /dev/null +++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetPlayerReady.java @@ -0,0 +1,35 @@ +package com.mygdx.game.controllers.commands; + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controllers.PlayerController; + +public class cSetPlayerReady extends Command{ + + public cSetPlayerReady() { super("cSetPlayerReady"); } + + private int lobbyID; + private int playerID; + + public cSetPlayerReady(boolean isPlayerReady, int lobbyID) { + super("cSetPlayerReady", isPlayerReady); + this.lobbyID = lobbyID; + this.playerID = playerID; + } + + public cSetPlayerReady(boolean isPlayerReady, int lobbyID, int playerID) { + super("cSetPlayerReady", isPlayerReady); + this.lobbyID = lobbyID; + this.playerID = playerID; + } + + @Override + public void execute(PlayerController playerController, Connection connection){ + if(data instanceof Boolean){ + boolean isPlayerReady = (Boolean) data; + if(playerID == playerController.getPlayer().getID()) playerController.getPlayer().setIsPlayerReady(isPlayerReady); + playerController.getLobby().getPlayerByID(playerID).setIsPlayerReady(isPlayerReady); + //System.out.println("value of playerID" + playerID); + System.out.printf("Player status updated. Is player %d currently ready? %b \n", playerID, isPlayerReady); + } + } +} diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cStartGame.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cStartGame.java new file mode 100644 index 0000000000000000000000000000000000000000..65911658b63156212ab1b12872670dc2ebab5db2 --- /dev/null +++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cStartGame.java @@ -0,0 +1,19 @@ +package com.mygdx.game.controllers.commands; + + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controllers.PlayerController; + +public class cStartGame extends Command{ + + public cStartGame() { super("cStartGame"); } + + public cStartGame(int id) { super("cStartGame", (Integer) id); } + + @Override + public void execute(PlayerController playerController, Connection connection){ + playerController.getLobby().setLobbyGameStarted(true); + System.out.println("GAME HAS STARTED"); + + } +} diff --git a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java index 4b170d62e45db0a338fdfcf35fa115da11220114..9dfe3ba94a9b4feb979a8b3812d3125ef1c301fd 100644 --- a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java +++ b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java @@ -9,6 +9,7 @@ public class Lobby { private String name; private int MAX_PLAYERS; private ArrayList<Player> players; + private boolean lobbyGameStarted = false; public Lobby() {} @@ -26,6 +27,13 @@ public class Lobby { public int getID(){ return ID; } + public boolean getLobbyGameStarted(){ + return lobbyGameStarted; + } + public void setLobbyGameStarted(boolean lobbyGameStarted){ + this.lobbyGameStarted = lobbyGameStarted; + } + public void setName(String name){ this.name = name; } @@ -34,6 +42,17 @@ public class Lobby { return name; } + public Player getPlayerByID(int playerID){ + + Player returnPlayer = null; + + for (Player player : players){ + if (player.getID() == playerID) returnPlayer = player; + } + + return returnPlayer; + } + public int getMaxPlayers(){ return MAX_PLAYERS; } diff --git a/CheckersClient/core/src/com/mygdx/game/model/Player.java b/CheckersClient/core/src/com/mygdx/game/model/Player.java index e8200a4ff01d3bb3bbc6a2d8f71d9417ff93fdc4..1a3a7c9799d7ae0c34ea13715a652ca6d86a787b 100644 --- a/CheckersClient/core/src/com/mygdx/game/model/Player.java +++ b/CheckersClient/core/src/com/mygdx/game/model/Player.java @@ -5,6 +5,7 @@ public class Player { private int ID; private int indexAvatar; private String playerName; + private boolean isPlayerReady; public Player(){} @@ -43,4 +44,16 @@ public class Player { public void setPlayerName(String playerName) { this.playerName = playerName; } + + public String getPlayerName(){ + return this.playerName; + } + + public void setIsPlayerReady(boolean isPlayerReady) { + this.isPlayerReady = isPlayerReady; + } + + public boolean getIsPlayerReady(){ + return this.isPlayerReady; + } } diff --git a/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java b/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java index 2a1c001ba04ff01fd8fe7c3b42c56c353f3cd4ac..b6cfdeae4b4d09d3a1c012b8e1af10247557281f 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java @@ -52,6 +52,7 @@ public class LoadingView extends View { @Override public void update(float dt) { if(assetManager.update()){ + stage.clear(); gvm.set(new MenuView(gvm, playerController, assetManager, stage, skin)); } else{ diff --git a/CheckersClient/core/src/com/mygdx/game/views/LobbyPlayTransitionScreen.java b/CheckersClient/core/src/com/mygdx/game/views/LobbyPlayTransitionScreen.java new file mode 100644 index 0000000000000000000000000000000000000000..73d52a8464bc5a6fab1c89855eabb0f03d7b759f --- /dev/null +++ b/CheckersClient/core/src/com/mygdx/game/views/LobbyPlayTransitionScreen.java @@ -0,0 +1,89 @@ +package com.mygdx.game.views; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.assets.AssetManager; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.BitmapFont; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.mygdx.game.controllers.PlayerController; +import com.mygdx.game.views.enums.LobbyAssets; +import com.mygdx.game.views.tokens.PlayerAvatar; + +import java.util.ArrayList; + + +public class LobbyPlayTransitionScreen extends View{ + + private Texture background; + private Texture rocketTexture; + private Texture exhaustTexture; + private Image rocketImage; + private Image whiteImage; + private Image exhaustImage; + private Image backgroundImage; + + protected LobbyPlayTransitionScreen(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin, ArrayList<PlayerAvatar> availableAvatars) { + super(gvm, playerController, assetManager, stage, skin); + background = (Texture) assetManager.get(LobbyAssets.BACKGROUND.path, LobbyAssets.BACKGROUND.classType); + rocketTexture = (Texture) assetManager.get(LobbyAssets.ROCKET.path, LobbyAssets.ROCKET.classType); + exhaustTexture = (Texture) assetManager.get(LobbyAssets.ROCKET_EXHAUST.path, LobbyAssets.ROCKET_EXHAUST.classType); + + backgroundImage = new Image(background); + rocketImage = new Image(rocketTexture); + rocketImage.setSize(200, 270); + rocketImage.setPosition(Gdx.graphics.getWidth()/2+40, 370); + rocketImage.setOrigin(0,0); + + exhaustImage = new Image(exhaustTexture); + exhaustImage.setSize(col_width*0.6f, row_height*2f); + exhaustImage.setPosition(rocketImage.getX()+rocketImage.getWidth()/2-exhaustImage.getWidth()/2, rocketImage.getY()-exhaustImage.getHeight()); + exhaustImage.setColor(1, 1, 1, 0); + + stage.addActor(backgroundImage); + } + + @Override + protected void handleInput() { + if(Gdx.input.isKeyPressed(Input.Keys.ESCAPE)){ + + } + } + + private void isGameOver(){ + boolean someCondition = false; + if (someCondition){ + Gdx.app.exit(); + } + } + + @Override + public void update(float dt) { + stage.act(dt); + isGameOver(); + handleInput(); + } + + + @Override + public void render(float dt) { + stage.getBatch().begin(); + stage.getBatch().draw(background, 0, 0); + stage.getBatch().end(); + stage.draw(); + + } + + private void debugDraw(SpriteBatch sb, String text, int xPos, int yPos){ + + } + + @Override + public void dispose() { + + } +} diff --git a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java index dce43f98a4004339ec4f20133bce4cf821e354b2..ca31751a652416fe6e4d25ed799f2aa2e2f7e591 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java @@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.InputListener; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.List; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; @@ -44,21 +45,23 @@ public class LobbyView extends View{ private boolean startRocketTransition; private Button createLobbyButton; - private Button lobbyListBackButton; + private Button findLobbyButton; private Button joinLobbyButton; private Button lobbyBackButton; private Button lobbyListRefreshButton; private Button lobbyRefreshButton; - private Button findLobbyButton; - private Button setUserNameButton; + private Button lobbyListBackButton; private Button startLobbyButton; private float fadeTransitionLength = 1f; private float alphaFadeValue = 1; private Image backgroundImage; + private PlayerAvatar mrServer; + private Image mrServerNameImage; private Image exhaustImage; private Image lobbyListBubbleImage; + private Image lobbyListBubblePointerImage; private Image rocketImage; private Image whiteImage; @@ -73,11 +76,12 @@ public class LobbyView extends View{ private TextField lobbyCreateTextField; - private SelectBox<Integer> lobbyCreateSizeSelectBox; + private Image playerReady; + private ImageButton playerReadyCheckButton; + private SelectBox<Integer> lobbyCreateSizeSelectBox; private ShapeRenderer shapeRenderer; - public LobbyView(GameViewManager gvm, final PlayerController playerController, AssetManager assetManager, final Stage stage, Skin skin, ArrayList<PlayerAvatar> availableAvatars) { super(gvm, playerController, assetManager, stage, skin); @@ -92,20 +96,47 @@ public class LobbyView extends View{ background = (Texture) assetManager.get(LobbyAssets.BACKGROUND.path, LobbyAssets.BACKGROUND.classType); rocketTexture = (Texture) assetManager.get(LobbyAssets.ROCKET.path, LobbyAssets.ROCKET.classType); - exhaustTexture = (Texture) assetManager.get(LobbyAssets.ROCKETEXHAUST.path, LobbyAssets.ROCKETEXHAUST.classType); + exhaustTexture = (Texture) assetManager.get(LobbyAssets.ROCKET_EXHAUST.path, LobbyAssets.ROCKET_EXHAUST.classType); buttonClickAudio = (Sound) assetManager.get(MenuAssets.BUTTON_CLICK_AUDIO.path, MenuAssets.BUTTON_CLICK_AUDIO.classType); - Texture lobbyListTexture = (Texture) assetManager.get(LobbyAssets.LOBBYLIST.path, LobbyAssets.LOBBYLIST.classType); + + Image playerReady = new Image(assetManager.get(LobbyAssets.PLAYER_READY.path, Texture.class)); + final Image playerReadyCheck = new Image((Texture) assetManager.get(LobbyAssets.PLAYER_READY_CHECK.path, Texture.class)); + + playerReadyCheckButton = new ImageButton(playerReadyCheck.getDrawable()); + playerReadyCheckButton.setPosition(col_width*6, row_height*2); + + backgroundImage = new Image(background); rocketImage = new Image(rocketTexture); + rocketImage.setSize(200, 270); + rocketImage.setPosition(Gdx.graphics.getWidth()/2+40, 370); + rocketImage.setOrigin(0,0); + exhaustImage = new Image(exhaustTexture); - rocketImage.setPosition(col_width*8.5f, row_height*4f); - rocketImage.setSize(col_width*1, row_height*2.5f); exhaustImage.setSize(col_width*0.6f, row_height*2f); exhaustImage.setPosition(rocketImage.getX()+rocketImage.getWidth()/2-exhaustImage.getWidth()/2, rocketImage.getY()-exhaustImage.getHeight()); + exhaustImage.setColor(1, 1, 1, 0); - lobbyListBubbleImage = new Image(lobbyListTexture); - lobbyListBubbleImage.setPosition(col_width*0.25f, row_height*5.5f); - backgroundImage = new Image(background); + lobbyListBubbleImage = new Image((Texture) assetManager.get(LobbyAssets.MR_SERVER_BUBBLE_SQUARE.path, LobbyAssets.MR_SERVER_BUBBLE_SQUARE.classType)); + + Texture mrServerAnim1 = (Texture) assetManager.get(LobbyAssets.MR_SERVER_ANIM1.path, LobbyAssets.MR_SERVER_ANIM1.classType); + Texture mrServerAnim2 = (Texture) assetManager.get(LobbyAssets.MR_SERVER_ANIM2.path, LobbyAssets.MR_SERVER_ANIM2.classType); + Texture mrServerAnim3 = (Texture) assetManager.get(LobbyAssets.MR_SERVER_ANIM3.path, LobbyAssets.MR_SERVER_ANIM3.classType); + + ArrayList<Texture> mrServerAnimTextures= new ArrayList<>(Arrays.asList(mrServerAnim1, mrServerAnim2, mrServerAnim3)); + + mrServer = new PlayerAvatar( mrServerAnimTextures, (Texture) assetManager.get(LobbyAssets.MR_SERVER_PORTRAIT.path, LobbyAssets.MR_SERVER_PORTRAIT.classType), "Mr. Server"); + mrServer.setScale(0.3f, 0.3f); + mrServer.setPosition(col_width*2, row_height*1); + mrServer.setOrigin(0, 0); + + mrServerNameImage = new Image((Texture) assetManager.get(LobbyAssets.MR_SERVER_PORTRAIT.path, LobbyAssets.MR_SERVER_PORTRAIT.classType)); + + lobbyListBubbleImage = new Image((Texture) assetManager.get(LobbyAssets.MR_SERVER_BUBBLE_SQUARE.path, LobbyAssets.MR_SERVER_BUBBLE_SQUARE.classType)); + lobbyListBubbleImage.setPosition(col_width*0.25f, row_height*4.5f); + + lobbyListBubblePointerImage = new Image((Texture) assetManager.get(LobbyAssets.MR_SERVER_BUBBLE_POINTER.path, LobbyAssets.MR_SERVER_BUBBLE_POINTER.classType)); + lobbyListBubblePointerImage.setPosition(lobbyListBubbleImage.getX()+lobbyListBubblePointerImage.getWidth()*1.25f, lobbyListBubbleImage.getY()-lobbyListBubblePointerImage.getHeight()+2); outputLabel = new Label("Press a Button",skin,"black"); outputLabel.setSize(Gdx.graphics.getWidth(),row_height); @@ -113,47 +144,48 @@ public class LobbyView extends View{ outputLabel.setAlignment(Align.topLeft); outputLabel.setFontScale(2); - mrServerBubbleLabel = new Label("Hi, I am mr. Server. I allow creation and joining of lobby rooms.", skin,"black"); - mrServerBubbleLabel.setSize(col_width*2.5f, row_height*3f); - mrServerBubbleLabel.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f, row_height*8f); - mrServerBubbleLabel.setWrap(true); - mrServerBubbleLabel.setFontScale(2); + float xpad = col_width/2; + float ypad = row_height/2; createLobbyButton = new TextButton("Create Lobby",skin,"small"); - createLobbyButton.setSize(col_width*1f,(float)(row_height*0.65)); - createLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + createLobbyButton.setSize(col_width*1f,(float)(row_height*0.75)); + createLobbyButton.setPosition(lobbyListBubbleImage.getX()+xpad,lobbyListBubbleImage.getY()+ypad); findLobbyButton = new TextButton("Find Lobby",skin,"small"); - findLobbyButton.setSize(col_width*1f,(float)(row_height*0.65)); - findLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + findLobbyButton.setSize(col_width*1f,(float)(row_height*0.75)); + findLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()-findLobbyButton.getWidth()-xpad,lobbyListBubbleImage.getY()+ypad); + + mrServerBubbleLabel = new Label("Hi, I am mr. Server. I allow creation and joining of lobby rooms.", skin,"black"); + mrServerBubbleLabel.setSize(lobbyListBubbleImage.getWidth()-xpad*2, lobbyListBubbleImage.getHeight()-createLobbyButton.getY()-createLobbyButton.getHeight()-ypad*2); + mrServerBubbleLabel.setPosition(lobbyListBubbleImage.getX()+xpad, createLobbyButton.getY()+lobbyListBubbleImage.getHeight()-ypad*3); + + mrServerBubbleLabel.setOrigin(0,0); + mrServerBubbleLabel.setWrap(true); + mrServerBubbleLabel.setFontScale(2); lobbyListRefreshButton = new TextButton("Refresh",skin,"small"); lobbyListRefreshButton.setSize(col_width*1f,(float)(row_height*0.65)); - lobbyListRefreshButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + lobbyListRefreshButton.setPosition(createLobbyButton.getX(), createLobbyButton.getY()); lobbyRefreshButton = new TextButton("Refresh",skin,"small"); lobbyRefreshButton.setSize(col_width*1f,(float)(row_height*0.65)); - lobbyRefreshButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + lobbyRefreshButton.setPosition(createLobbyButton.getX(), createLobbyButton.getY()); lobbyBackButton = new TextButton("Back",skin,"small"); lobbyBackButton.setSize(col_width*1f,(float)(row_height*0.65)); - lobbyBackButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + lobbyBackButton.setPosition(findLobbyButton.getX(), findLobbyButton.getY()); lobbyListBackButton = new TextButton("Back",skin,"small"); lobbyListBackButton.setSize(col_width*1f,(float)(row_height*0.65)); - lobbyListBackButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); + lobbyListBackButton.setPosition(findLobbyButton.getX(),findLobbyButton.getY()); joinLobbyButton = new TextButton("Join Lobby",skin,"small"); joinLobbyButton.setSize(col_width*1f,(float)(row_height*0.65)); - joinLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*2); + joinLobbyButton.setPosition(findLobbyButton.getX(), findLobbyButton.getY()+ypad+findLobbyButton.getHeight()/3); startLobbyButton = new TextButton("Start",skin,"small"); startLobbyButton.setSize(col_width*1f,(float)(row_height*0.65)); - startLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1); - - setUserNameButton = new TextButton("Text Button",skin,"small"); - setUserNameButton.setSize(col_width*2,(float)(row_height*0.5)); - setUserNameButton.setPosition(col_width*5,Gdx.graphics.getHeight()-row_height*4); + startLobbyButton.setPosition(createLobbyButton.getX(), createLobbyButton.getY()); lobbyCreateTextField = new TextField("", skin); lobbyCreateTextField.setMessageText("Enter lobby name."); @@ -166,8 +198,8 @@ public class LobbyView extends View{ lobbyCreateSizeSelectBox.setSize(lobbyListBackButton.getWidth(), lobbyListBackButton.getHeight()); backgroundImage.setZIndex(1); - lobbyListBubbleImage.setZIndex(2); - outputLabel.setZIndex(3); + backgroundImage.setPosition(Gdx.graphics.getWidth()/2-backgroundImage.getWidth()/2, 0); + backgroundImage.setOrigin(0,0); stage.clear(); @@ -176,6 +208,7 @@ public class LobbyView extends View{ stage.addActor(rocketImage); stage.addActor(exhaustImage); stage.addActor(lobbyListBubbleImage); + stage.addActor(lobbyListBubblePointerImage); mainUIActors.add(createLobbyButton); mainUIActors.add(findLobbyButton); mainUIActors.add(mrServerBubbleLabel); @@ -203,6 +236,23 @@ public class LobbyView extends View{ outputLabel.setText("createLobbyButton"); } }); + playerReadyCheckButton.addListener(new InputListener(){ + @Override + public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { + return true; + } + @Override + public void touchUp (InputEvent event, float x, float y, int pointer, int button) { + buttonClickAudio.play(0.8f); + outputLabel.setText("Player Ready"); + playerController.setLobbyPlayerReady(true); + } + @Override + public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { + outputLabel.setText("playerReadyCheckButton"); + } + }); + findLobbyButton.addListener(new InputListener(){ @Override public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { @@ -286,6 +336,7 @@ public class LobbyView extends View{ playerController.leaveLobby(lobby.getID()); } + showMainLobbyWindow(); } @@ -497,9 +548,6 @@ public class LobbyView extends View{ mainUIActors.add(lobbyListBackButton); mainUIActors.add(lobbyListRefreshButton); mainUIActors.add(joinLobbyButton); - joinLobbyButton.setPosition(col_width*4, row_height*3); - lobbyListRefreshButton.setY(row_height*3); - lobbyListBackButton.setY(row_height*3); for (Actor actor: mainUIActors){ stage.addActor(actor); @@ -507,6 +555,7 @@ public class LobbyView extends View{ lobbyListRefresh(); } + float[] player1Pos = {col_width*3.75f, row_height*2}; float[] player2Pos = {col_width*3.5f, row_height*1.5f}; @@ -516,35 +565,87 @@ public class LobbyView extends View{ float[] player5Pos = {col_width*5, row_height*2}; float[] player6Pos = {col_width*4.8f, row_height*1.5f}; + float[] player7Pos = {col_width*5.7f, row_height*2}; + float[] player8Pos = {col_width*5.5f, row_height*1.5f}; + + float[] player1LabelPos = {col_width*0.5f, row_height*9.8f}; + float[] player2LabelPos = {col_width*0.5f, row_height*9.3f}; + + float[] player3LabelPos = {col_width*0.5f, row_height*8.8f}; + float[] player4LabelPos = {col_width*0.5f, row_height*8.3f}; + + float[] player5LabelPos = {col_width*0.5f, row_height*7.8f}; + float[] player6LabelPos = {col_width*0.5f, row_height*7.3f}; + + float[] player7LabelPos = {col_width*0.5f, row_height*6.8f}; + float[] player8LabelPos = {col_width*0.5f, row_height*6.3f}; + private Lobby lobby; private ArrayList<Player> playersInLobby; - ArrayList<float[]> playerPositions= new ArrayList<>(Arrays.asList(player1Pos, player2Pos, player3Pos, player4Pos, player5Pos, player6Pos));; + ArrayList<float[]> playerPositions= new ArrayList<>(Arrays.asList(player1Pos, player2Pos, player3Pos, player4Pos, player5Pos, player6Pos, player7Pos, player8Pos));; + ArrayList<float[]> playerLabelPositions= new ArrayList<>(Arrays.asList(player1LabelPos, player2LabelPos, player3LabelPos, player4LabelPos, player5LabelPos, player6LabelPos, player7LabelPos, player8LabelPos));; private final ArrayList<PlayerAvatar> availableAvatars; private ArrayList<PlayerAvatar> lobbyAvatars = new ArrayList<>(); + private ArrayList<Image> playerReadyImages = new ArrayList<>(); + private ArrayList<Label> lobbyLabels= new ArrayList<>(); + private void lobbyRefresh(){ - if(playerController.getLobby() == null) { - System.out.println("Error during lobby refresh: not in a lobby"); + if(playerController.getLobby().getID() == -1) { + System.out.println("Player currently not in lobby."); } else{ lobbyAvatars.clear(); lobby = playerController.getLobby(); playersInLobby = lobby.getPlayers(); + + if(lobby.getID() == -1 || playerController.getPlayer().getIsPlayerReady()) playerReadyCheckButton.remove(); + else stage.addActor(playerReadyCheckButton); + + for (Label label : lobbyLabels) label.remove(); + for (Image image : playerReadyImages) image.remove(); //System.out.println("My avatar Index: "+ playerController.getPlayer().getIndexAvatar()); //System.out.println("Number of players in lobby: "+ lobby.getPlayers().size()); - + //System.out.printf(">Current Lobby Size:\t%d\n", lobby.getPlayers().size()); for(int i = 0; i<playersInLobby.size(); i++){ - //System.out.println("This players ID: "+ playersInLobby.get(i).getID() + " avatarIndex: "+ playersInLobby.get(i).getIndexAvatar()); - PlayerAvatar pa = availableAvatars.get(playersInLobby.get(i).getIndexAvatar()); - pa.setScale(0.3f, 0.3f); - pa.setOrigin(0, 0); - pa.setPosition(playerPositions.get(i)[0], playerPositions.get(i)[1]); - lobbyAvatars.add(pa); + Player player = playersInLobby.get(i); + //System.out.printf(" >PlayerName:%s\tID:%d\n", player.getPlayerName(), player.getID()); + PlayerAvatar playerAvatar =availableAvatars.get(player.getIndexAvatar()); + + playerAvatar.setScale(0.3f, 0.3f); + playerAvatar.setOrigin(0, 0); + playerAvatar.setPosition(playerPositions.get(i)[0], playerPositions.get(i)[1]); + lobbyAvatars.add(playerAvatar); + + Label label = new Label("Player"+i+":\t%d" + player.getPlayerName() + "\t", skin, "black"); + label.setColor(1, 0, 0, 1); + label.scaleBy(1.5f); + label.setPosition(playerLabelPositions.get(i)[0], playerLabelPositions.get(i)[1]); + + lobbyLabels.add(label); + + if(player.getIsPlayerReady()) { + Image image = new Image(assetManager.get(LobbyAssets.PLAYER_READY.path, Texture.class)); + image.setPosition(label.getX()+image.getWidth()+col_width*1f, label.getY()-image.getHeight()/2+label.getHeight()/2); + playerReadyImages.add(image); + + //System.out.println("ready???"); + } + else{ + System.out.println("Player is not ready.."); + } + + stage.addActor(lobbyLabels.get(i)); + } + for (Image image : playerReadyImages){ + stage.addActor(image); } } } + + private void showLobbyWindow(){ clearActors(); mainUIActors.add(lobbyBackButton); @@ -554,6 +655,7 @@ public class LobbyView extends View{ stage.addActor(actor); } } + private void showMainLobbyWindow(){ clearActors(); mainUIActors.add(createLobbyButton); @@ -573,6 +675,7 @@ public class LobbyView extends View{ sound.dispose(); */ } + @Override public void handleInput() { if(Gdx.input.isTouched()) { @@ -581,14 +684,51 @@ public class LobbyView extends View{ } } + @Override + public void render(float dt) { + Gdx.gl.glClearColor(1, 1, 1, 1); + + stage.draw(); + stage.getBatch().begin(); + for(PlayerAvatar playerAvatar : lobbyAvatars){ + if(updateAvatarTimer>= updateAvatarFrequency){ + playerAvatar.updateTexture(); + } + playerAvatar.draw(stage.getBatch()); + } + if(updateAvatarTimer>= updateAvatarFrequency){ + mrServer.updateTexture(); + updateAvatarTimer=0; + } + + mrServer.draw(stage.getBatch()); + stage.getBatch().end(); + + if(playerController.getLobby().getLobbyGameStarted()){ + if(whiteImage.getStage() != stage){ + stage.addActor(whiteImage); + } + whiteImage.setZIndex(1000); + whiteImage.setColor(1, 1, 1, alphaFadeValue); + alphaFadeValue += dt/(fadeTransitionLength*3); + if(alphaFadeValue >= 1){ + stage.clear(); + stage.addActor(whiteImage); + gvm.set(new LobbyPlayTransitionScreen(gvm, playerController, assetManager, stage, skin, availableAvatars)); + } + } + + drawGrid(); + } + float updateAvatarTimer = 0; float updateAvatarFrequency = 0.120f; //update every 250ms float refreshLobbyTimer = 1; - @Override - public void render(float dt) { - Gdx.gl.glClearColor(1, 1, 1, 1); + + @Override + public void update(float dt) { updateAvatarTimer+= dt; if(refreshLobbyTimer >= 1) { @@ -607,27 +747,9 @@ public class LobbyView extends View{ whiteImage.setZIndex(0); } } - else if(startRocketTransition){ + stage.act(dt); + - } - stage.draw(); - stage.getBatch().begin(); - for(PlayerAvatar playerAvatar : lobbyAvatars){ - if(updateAvatarTimer>= updateAvatarFrequency){ - playerAvatar.updateTexture(); - } - playerAvatar.draw(stage.getBatch()); - } - if(updateAvatarTimer>= updateAvatarFrequency){ - updateAvatarTimer=0; - } - stage.getBatch().end(); - drawGrid(); - } - @Override - public void update(float dt) { - stage.act(dt); - handleInput(); } } diff --git a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java index 3051fb3e375e2b59fb2341ae3cf61b583c60efa6..a42b7b3256d0114e8756509bbe90c8d107596027 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java @@ -21,7 +21,6 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; -import com.badlogic.gdx.utils.Align; import com.mygdx.game.controllers.PlayerController; import com.mygdx.game.views.enums.CharacterAssets; import com.mygdx.game.views.enums.LobbyAssets; @@ -39,6 +38,7 @@ public class MenuView extends View{ private Button formButton; private Image backgroundImage; + private Image logoImage; private Image formImage; private Image connectionBarImage; private Image connectionBarGreenCircle; @@ -81,22 +81,23 @@ public class MenuView extends View{ } shapeRenderer = new ShapeRenderer(); // Used for draw debugging - background = (Texture) assetManager.get(MenuAssets.BACKGROUND.path, MenuAssets.BACKGROUND.classType); - this.backgroundImage = new Image (background); + this.backgroundImage = new Image ((Texture) assetManager.get(MenuAssets.BACKGROUND.path, MenuAssets.BACKGROUND.classType)); + backgroundImage.setPosition(Gdx.graphics.getWidth()/2-backgroundImage.getWidth()/2, 0); + backgroundImage.setOrigin(0,0); - backgroundImage.setPosition(col_width*6-backgroundImage.getWidth()/2, row_height*6-backgroundImage.getHeight()/2); - - form = (Texture) assetManager.get(MenuAssets.FORM.path, MenuAssets.FORM.classType); - - this.formImage = new Image(form); - formImage.setPosition(col_width*5, row_height*5); - formImage.setAlign((Align.center)); + formImage = new Image((Texture) assetManager.get(MenuAssets.FORM.path, MenuAssets.FORM.classType)); + formImage.setPosition(col_width*6-formImage.getWidth()/2, row_height*0.15f); + formImage.setOrigin(0, 0); formButtonTex = (Texture) assetManager.get(MenuAssets.FORM_BUTTON.path, MenuAssets.FORM_BUTTON.classType); music = Gdx.audio.newMusic(Gdx.files.internal(MenuAssets.LOOP_AUDIO.path)); buttonClickAudio = (Sound) assetManager.get(MenuAssets.BUTTON_CLICK_AUDIO.path, MenuAssets.BUTTON_CLICK_AUDIO.classType); transitionAudio = (Sound) assetManager.get(MenuAssets.TRANSITION_AUDIO.path, MenuAssets.TRANSITION_AUDIO.classType); + logoImage = new Image((Texture) assetManager.get(MenuAssets.LOGO.path, MenuAssets.LOGO.classType)); + logoImage.setPosition(col_width*6-logoImage.getWidth()/2, row_height*11.75f-logoImage.getHeight()); + logoImage.setOrigin(0,0); + outputLabel = new Label("Press a Button",skin,"black"); outputLabel.setSize(Gdx.graphics.getWidth(),row_height); outputLabel.setPosition(col_width*0.5f,row_height*10); @@ -104,13 +105,12 @@ public class MenuView extends View{ usernameTextField = new TextField("", skin); usernameTextField.setMessageText("Your name .."); - usernameTextField.setSize(col_width*2, row_height*1); - usernameTextField.setPosition(col_width*5-usernameTextField.getMaxWidth(),row_height*8.15f-usernameTextField.getMaxHeight()/2); + usernameTextField.setSize(formImage.getWidth()*0.75f, row_height*1); + usernameTextField.setPosition(formImage.getX()+formImage.getWidth()/2-usernameTextField.getWidth()/2,formImage.getHeight()*0.75f); + usernameTextField.setOrigin(0,0); formButton = new TextButton("Enter",skin,"default"); - formButton.setPosition(col_width*6-formButton.getWidth()/2,row_height*2.25f-formButton.getHeight()/2); - - formImage.setPosition(col_width*6-formImage.getWidth()/2, row_height*6-formImage.getHeight()/2); + formButton.setPosition(formImage.getX()+formImage.getWidth()/2 -formButton.getWidth()/2,formImage.getHeight()*0.08f); Pixmap tablePixmap = new Pixmap(1,1, Pixmap.Format.RGB565); tablePixmap.setColor(1, 1, 1, 1); @@ -144,10 +144,10 @@ public class MenuView extends View{ PlayerAvatar grandmaAvatar = new PlayerAvatar(anim_tex_arr, portrait, "Grandma"); availableAvatars.add(grandmaAvatar); - anim_tex_1 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME1.path, Texture.class); - anim_tex_2 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME2.path, Texture.class); - anim_tex_3 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME3.path, Texture.class); - portrait = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_PORTRAIT.path, Texture.class); + anim_tex_1 = assetManager.get(CharacterAssets.HIGH_SCHOOL_GUY_ANIM_FRAME1.path, Texture.class); + anim_tex_2 = assetManager.get(CharacterAssets.HIGH_SCHOOL_GUY_ANIM_FRAME2.path, Texture.class); + anim_tex_3 = assetManager.get(CharacterAssets.HIGH_SCHOOL_GUY_ANIM_FRAME3.path, Texture.class); + portrait = assetManager.get(CharacterAssets.HIGH_SCHOOL_GUY_PORTRAIT.path, Texture.class); anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3)); PlayerAvatar highSchoolGuy = new PlayerAvatar(anim_tex_arr, portrait, "High School Guy"); availableAvatars.add(highSchoolGuy); @@ -237,6 +237,7 @@ public class MenuView extends View{ transitionAudio.play(0.50f); startFadeFromBlankToWhite = true; whiteImage.setZIndex(stage.getActors().size); + playerController.playerSetName(usernameTextField.getText()); playerController.updateIndexAvatar(currentIndexAvatar); } return true; @@ -254,8 +255,7 @@ public class MenuView extends View{ public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) { buttonClickAudio.play(0.8f); if(usernameTextField.getText().isEmpty()){ - playerController.getPlayer().setPlayerName(usernameTextField.getText()); - outputLabel.setText(""); + outputLabel.setText(usernameTextField.getText()); } } }); @@ -269,6 +269,7 @@ public class MenuView extends View{ stage.addActor(nextAvatarButton); stage.addActor(previousAvatarButton); stage.addActor(avatarPortraitImage); + stage.addActor(logoImage); stage.addActor(whiteImage); } diff --git a/CheckersClient/core/src/com/mygdx/game/views/PlayView.java b/CheckersClient/core/src/com/mygdx/game/views/PlayView.java index 0f227b949019ce0edccbd1bbb6e76db496fc6877..da6a209dd969ff3db0f8ee918cdfc521688fbf21 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/PlayView.java +++ b/CheckersClient/core/src/com/mygdx/game/views/PlayView.java @@ -10,27 +10,19 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.mygdx.game.controllers.PlayerController; +import com.mygdx.game.views.tokens.PlayerAvatar; + +import java.util.ArrayList; public class PlayView extends View{ private Texture background; - private Sound gameLoop; - private Sound transitionFX; - - BitmapFont font; - protected PlayView(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin) { + protected PlayView(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin, ArrayList<PlayerAvatar> availableAvatars) { super(gvm, playerController, assetManager, stage, skin); background = new Texture ("Game/GameBoard/1x/GameBoard@1x.png"); - font = new BitmapFont(); - - gameLoop = Gdx.audio.newSound(Gdx.files.internal("Game/Audio/GameLoop.mp3")); - transitionFX= Gdx.audio.newSound(Gdx.files.internal("Game/Audio/TransitionFX.mp3")); - transitionFX.play(); - gameLoop.loop(0.6f); - } @Override @@ -57,21 +49,19 @@ public class PlayView extends View{ @Override public void render(float dt) { + stage.getBatch().begin(); + stage.getBatch().draw(background, 0, 0); + stage.getBatch().end(); stage.draw(); + } private void debugDraw(SpriteBatch sb, String text, int xPos, int yPos){ - font.draw(sb, text, xPos, yPos); + } @Override public void dispose() { - /* DISPOSE OBJECTS - for (Object ob: objects){ - ob.dispose(); - - } - */ } } diff --git a/CheckersClient/core/src/com/mygdx/game/views/View.java b/CheckersClient/core/src/com/mygdx/game/views/View.java index 36018df802ea679bbc9c3fe2c24326a063b962a4..2e105e327ff4817c7ec0835c213df68fff64903a 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/View.java +++ b/CheckersClient/core/src/com/mygdx/game/views/View.java @@ -19,6 +19,7 @@ public abstract class View extends ApplicationAdapter { protected final Stage stage; protected Skin skin; + public final int gridStep = 1920/20; public final int Help_Guides = 12; public final int row_height = Gdx.graphics.getHeight() / Help_Guides; public final int col_width = Gdx.graphics.getWidth() / Help_Guides; diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java index faa815eedbc5537d6efecfd5fe59f6f9342646a0..a74887a922a1347499eab794f4053267a64bca37 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java +++ b/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java @@ -14,10 +14,10 @@ public enum CharacterAssets { GRANDMA_ANIM_FRAME3("characters/Grandma3@1x.png", Texture.class), GRANDMA_PORTRAIT("characters/GrandmaPortrait@1x.png", Texture.class), - HIGHSCHOOL_GUY_ANIM_FRAME1("characters/HighSchoolGuy1@1x.png", Texture.class), - HIGHSCHOOL_GUY_ANIM_FRAME2("characters/HighSchoolGuy2@1x.png", Texture.class), - HIGHSCHOOL_GUY_ANIM_FRAME3("characters/HighSchoolGuy3@1x.png", Texture.class), - HIGHSCHOOL_GUY_PORTRAIT("characters/HighSchoolGuyPortrait@1x.png", Texture.class), + HIGH_SCHOOL_GUY_ANIM_FRAME1("characters/HighSchoolGuy1@1x.png", Texture.class), + HIGH_SCHOOL_GUY_ANIM_FRAME2("characters/HighSchoolGuy2@1x.png", Texture.class), + HIGH_SCHOOL_GUY_ANIM_FRAME3("characters/HighSchoolGuy3@1x.png", Texture.class), + HIGH_SCHOOL_GUY_PORTRAIT("characters/HighSchoolGuyPortrait@1x.png", Texture.class), HIPSTER_GIRL_ANIM_FRAME1("characters/HipsterGirl1@1x.png", Texture.class), HIPSTER_GIRL_ANIM_FRAME2("characters/HipsterGirl2@1x.png", Texture.class), diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java index b57ecc40aaef0f875cee6bee3121418c80356f26..ce7bae67a250e495de30d1f8bf799b78d727a655 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java +++ b/CheckersClient/core/src/com/mygdx/game/views/enums/LobbyAssets.java @@ -4,10 +4,20 @@ import com.badlogic.gdx.graphics.Texture; public enum LobbyAssets { - LOBBYLIST("Menu/1x/LobbyList.png", Texture.class), + LOBBY_LIST("Menu/1x/LobbyList.png", Texture.class), BACKGROUND("Menu/1x/LobbyMenu@1x.png", Texture.class), + LOBBY("Menu/1x/MrServer.png", Texture.class), + MR_SERVER_ANIM1("characters/MrServer1@1x.png", Texture.class), + MR_SERVER_ANIM2("characters/MrServer2@1x.png", Texture.class), + MR_SERVER_ANIM3("characters/MrServer3@1x.png", Texture.class), + MR_SERVER_PORTRAIT("characters/MrServerPortrait@1x.png", Texture.class), + MR_SERVER_NAME("characters/MrServerName.png", Texture.class), + MR_SERVER_BUBBLE_SQUARE("Menu/1x/MrServerBubbleSquare.png", Texture.class), + MR_SERVER_BUBBLE_POINTER("Menu/1x/MrServerBubblePointer.png", Texture.class), ROCKET("Menu/1x/Rocket_Main@1x.png", Texture.class), - ROCKETEXHAUST("Menu/1x/Rocket_Exhaust@1x.png", Texture.class); + ROCKET_EXHAUST("Menu/1x/Rocket_Exhaust@1x.png", Texture.class), + PLAYER_READY_CHECK("Menu/1x/PlayerReadyCheck.png", Texture.class), + PLAYER_READY("Menu/1x/PlayerReady.png", Texture.class); public final String path; public final Class classType; diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java index 3a6f241eebaffbb325068a599752ef4778f7f175..b79d542d1923f1744e840df10ef23516aaf7a8de 100644 --- a/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java +++ b/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont; public enum MenuAssets { FORM_BUTTON("Menu/1x/FormButton.png", Texture.class), BACKGROUND("Menu/1x/MainMenu@1x.png", Texture.class), + LOGO("Menu/1x/SpaceCheckersLogoWithBackground.png", Texture.class), FORM("Menu/1x/MainMenuForm.png", Texture.class), LOOP_AUDIO("Menu/MenuLoop.mp3",Sound .class), BUTTON_CLICK_AUDIO("Menu/ButtonClick1.mp3",Sound .class), diff --git a/CheckersServer/.idea/caches/build_file_checksums.ser b/CheckersServer/.idea/caches/build_file_checksums.ser index 480a5d2f508b4aad98032d39a6cb4fff257b0c33..47d0d86c7d85efaa967a18f7352fc5005063ac72 100644 Binary files a/CheckersServer/.idea/caches/build_file_checksums.ser and b/CheckersServer/.idea/caches/build_file_checksums.ser differ diff --git a/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml b/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml deleted file mode 100644 index 369215da594e454a7837187b554b3dc8ecc711ec..0000000000000000000000000000000000000000 --- a/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml +++ /dev/null @@ -1,9 +0,0 @@ -<component name="libraryTable"> - <library name="Gradle: CheckersServer.desktop.desktop-1.0"> - <CLASSES> - <root url="jar://$PROJECT_DIR$/desktop/build/libs/desktop-1.0.jar!/" /> - </CLASSES> - <JAVADOC /> - <SOURCES /> - </library> -</component> \ No newline at end of file diff --git a/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml b/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml new file mode 100644 index 0000000000000000000000000000000000000000..791ccad4fc6da6b6e176aa2a55444318bfcaf3dd --- /dev/null +++ b/CheckersServer/.idea/libraries/Gradle__org_javatuples_javatuples_1_2.xml @@ -0,0 +1,11 @@ +<component name="libraryTable"> + <library name="Gradle: org.javatuples:javatuples:1.2"> + <CLASSES> + <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/507312ac4b601204a72a83380badbca82683dd36/javatuples-1.2.jar!/" /> + </CLASSES> + <JAVADOC /> + <SOURCES> + <root url="jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javatuples/javatuples/1.2/a7495f5370bdfcf46c6f3c6ed0badf52877aa467/javatuples-1.2-sources.jar!/" /> + </SOURCES> + </library> +</component> \ No newline at end of file diff --git a/CheckersServer/build.gradle b/CheckersServer/build.gradle index 5c2215da91e6b1acf38c9b87f66c340d43d3d0f7..d8825f555768b1081e122ce6ce88fda6c4bd8591 100644 --- a/CheckersServer/build.gradle +++ b/CheckersServer/build.gradle @@ -12,9 +12,6 @@ buildscript { dependencies { classpath 'com.android.tools.build:gradle:4.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - - - } } @@ -53,6 +50,7 @@ project(":desktop") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } @@ -79,6 +77,7 @@ project(":android") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } @@ -92,5 +91,6 @@ project(":core") { api "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation group: "com.esotericsoftware", name: 'kryonet', version: "2.22.0-RC1" + implementation group: "org.javatuples", name: 'javatuples', version: "1.2" } } diff --git a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java index 7174984c8e015d874b989531b7d3c32cfd258eed..fc3b72f22cdb075d7788ae99ebf6552bf4be237d 100644 --- a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java +++ b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java @@ -155,6 +155,9 @@ public class NetworkController { kryo.register(cLobbyDelete.class, 23); kryo.register(cLobbyGetList.class, 24); kryo.register(cSetIndexAvatar.class, 25); + kryo.register(cSetPlayerReady.class, 26); + kryo.register(cSetPlayerName.class, 27); + kryo.register(cStartGame.class, 28); } public NetworkController getNetworkController() { return this; } diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java new file mode 100644 index 0000000000000000000000000000000000000000..323be48847559289ea56bd005f016e208f8dbd27 --- /dev/null +++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerName.java @@ -0,0 +1,27 @@ +package com.mygdx.game.controller.commands; + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controller.NetworkController; +import com.mygdx.game.model.Lobby; +import com.mygdx.game.model.Player; + +import org.javatuples.Pair; + +public class cSetPlayerName extends Command{ + + public cSetPlayerName() { super("cLobbyJoin"); } + + public cSetPlayerName(String name) { + super("cLobbyJoin", name); + } + + @Override + public void execute(NetworkController net, Connection connection){ + if(data instanceof String){ + String name = (String) data; + net.getPlayer(connection.getID()).setPlayerName(name); + connection.sendTCP(this); + System.out.printf("Player name is updated. %s \n", name); + } + } +} \ No newline at end of file diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java new file mode 100644 index 0000000000000000000000000000000000000000..eb793ad0742c6e7f9473a98834db1876a8c5c7a7 --- /dev/null +++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetPlayerReady.java @@ -0,0 +1,46 @@ +package com.mygdx.game.controller.commands; + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controller.NetworkController; +import com.mygdx.game.model.Lobby; + +public class cSetPlayerReady extends Command{ + + public cSetPlayerReady() { super("cSetPlayerReady"); } + + private int lobbyID; + private int playerID; + + public cSetPlayerReady(boolean isPlayerReady, int lobbyID) { + super("cSetPlayerReady", isPlayerReady); + this.lobbyID = lobbyID; + this.playerID = playerID; + } + + public cSetPlayerReady(boolean isPlayerReady, int lobbyID, int playerID) { + super("cSetPlayerReady", isPlayerReady); + this.lobbyID = lobbyID; + this.playerID = playerID; + } + + @Override + public void execute(NetworkController net, Connection connection){ + if(data instanceof Boolean){ + boolean isPlayerReady = (Boolean) data; + net.getPlayer(connection.getID()).setIsPlayerReady(isPlayerReady); + Lobby lobby = net.getLobby(lobbyID); + + for (Connection c : net.getConnections(lobby)) { + c.sendTCP(new cSetPlayerReady(isPlayerReady, lobbyID, connection.getID())); + } + + if(lobby.isFullAndReady()){ + for (Connection c : net.getConnections(lobby)) { + c.sendTCP(new cStartGame()); + } + System.out.printf("Lobby %b is about to start. \n", lobbyID); + } + System.out.printf("Player status updated. Is player %d currently ready? %b \n", playerID, isPlayerReady); + } + } +} \ No newline at end of file diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cStartGame.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cStartGame.java new file mode 100644 index 0000000000000000000000000000000000000000..0b907c8dfca301ccf82f729926856a99d7f9ddb4 --- /dev/null +++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cStartGame.java @@ -0,0 +1,17 @@ +package com.mygdx.game.controller.commands; + +import com.esotericsoftware.kryonet.Connection; +import com.mygdx.game.controller.NetworkController; +import com.mygdx.game.model.Lobby; + +public class cStartGame extends Command{ + + public cStartGame() { super("cStartGame"); } + + public cStartGame(int id) { super("cStartGame", (Integer) id); } + + @Override + public void execute(NetworkController net, Connection connection){ + + } +} diff --git a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java index 57eb0c96655bf2236e828692b88130fc4000b314..3f57299d1d5b51f93ca1f0e7bcda01d757db90d9 100644 --- a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java +++ b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java @@ -50,8 +50,42 @@ public class Lobby { return set; } + public Player getPlayerByID(int playerID){ + + Player returnPlayer = null; + + for (Player player : players){ + if (player.getID() == playerID) returnPlayer = player; + } + + return returnPlayer; + } + + public ArrayList<Player> getPlayers(){ + return players; + } + public int getPlayersCount(){ return players.size(); } + public boolean isFullAndReady(){ + if(MAX_PLAYERS == getPlayersCount()){ + for(Player player : players){ + if(!player.getIsPlayerReady()) { + System.out.println("This should run only once."); + return false; + } + } + System.out.println("This should run a few times."); + return true; + } + else{ + System.out.println("This should many times."); + return false; + } + + + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/CheckersServer/core/src/com/mygdx/game/model/Player.java b/CheckersServer/core/src/com/mygdx/game/model/Player.java index 2797bc0136acc153b84b08f80ef547ddf9e8b8fe..4d983c30a153da076fdf5657e701a2152c556863 100644 --- a/CheckersServer/core/src/com/mygdx/game/model/Player.java +++ b/CheckersServer/core/src/com/mygdx/game/model/Player.java @@ -5,6 +5,7 @@ public class Player { private int ID; private int indexAvatar; private String playerName; + private boolean isPlayerReady; public Player(){} @@ -43,4 +44,16 @@ public class Player { public void setPlayerName(String playerName) { this.playerName = playerName; } + + public String getPlayerName(){ + return this.playerName; + } + + public void setIsPlayerReady(boolean isPlayerReady) { + this.isPlayerReady = isPlayerReady; + } + + public boolean getIsPlayerReady(){ + return this.isPlayerReady; + } }