summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/sprites/topics/pond.pngbin0 -> 51290 bytes
-rw-r--r--assets/sprites/topics/unknown.pngbin0 -> 12199 bytes
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java70
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java39
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java5
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/ui/menu/RoomTopicWidget.java33
6 files changed, 136 insertions, 11 deletions
diff --git a/assets/sprites/topics/pond.png b/assets/sprites/topics/pond.png
new file mode 100644
index 0000000..5e6b8da
--- /dev/null
+++ b/assets/sprites/topics/pond.png
Binary files differ
diff --git a/assets/sprites/topics/unknown.png b/assets/sprites/topics/unknown.png
new file mode 100644
index 0000000..33d8104
--- /dev/null
+++ b/assets/sprites/topics/unknown.png
Binary files differ
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java b/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java
index 60eb5c6..13b69ea 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/MenuScreen.java
@@ -5,6 +5,7 @@ import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.math.Interpolation;
+import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
@@ -15,11 +16,16 @@ import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import kz.ilotterytea.frogartha.FrogarthaGame;
import kz.ilotterytea.frogartha.assets.Assets;
+import kz.ilotterytea.frogartha.domain.RoomTopic;
+import kz.ilotterytea.frogartha.ui.menu.RoomTopicWidget;
public class MenuScreen implements Screen {
private FrogarthaGame game;
private Stage stage;
+ private Table gameTable, topicTable;
+ private Label authorizingLabel;
+
@Override
public void show() {
game = FrogarthaGame.getInstance();
@@ -37,9 +43,18 @@ public class MenuScreen implements Screen {
stage.act(delta);
stage.draw();
+ if (
+ game.getIdentityClient().isAuthorized() &&
+ !game.getSessionClient().isJoined() &&
+ authorizingLabel.hasParent()
+ ) {
+ gameTable.clear();
+ gameTable.add(topicTable).grow();
+ }
+
if (game.getSessionClient().hasThrown()) {
game.setScreen(new KickScreen());
- } else if (game.getIdentityClient().isInRoom()) {
+ } else if (game.getSessionClient().isJoined()) {
game.setScreen(new GameScreen());
}
}
@@ -103,13 +118,54 @@ public class MenuScreen implements Screen {
logoTable.add(logoImage).center();
mainTable.add(logoTable).grow().row();
- // --- Credentials ---
- Table credentialsMainTable = new Table();
- credentialsMainTable.align(Align.center);
- mainTable.add(credentialsMainTable).grow();
+ // --- Game control ---
+ gameTable = new Table();
+ gameTable.align(Align.center);
+ mainTable.add(gameTable).grow();
+
+ // --- Authorizing label ---
+ authorizingLabel = new Label("Authorizing", skin);
+ authorizingLabel.setAlignment(Align.center);
+
+ // --- Topic selector ---
+ topicTable = new Table();
+ for (int i = 0; i < Math.max(RoomTopic.values().length, 4); i++) {
+ RoomTopic topic = null;
+
+ if (RoomTopic.values().length > i) {
+ topic = RoomTopic.values()[i];
+ }
+
+ RoomTopicWidget widget = new RoomTopicWidget(topic, skin);
+
+ RoomTopic finalTopic = topic;
+ widget.addListener(new ClickListener() {
+ @Override
+ public void clicked(InputEvent event, float x, float y) {
+ super.clicked(event, x, y);
+ if (finalTopic != null) game.getSessionClient().joinServer(finalTopic);
+ }
+
+ @Override
+ public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+ super.enter(event, x, y, pointer, fromActor);
+ widget.addAction(Actions.moveBy(0f, 10f, 0.5f, Interpolation.smoother));
+ }
+
+ @Override
+ public void exit(InputEvent event, float x, float y, int pointer, Actor toActor) {
+ super.exit(event, x, y, pointer, toActor);
+ widget.addAction(Actions.moveBy(0f, -10f, 0.5f, Interpolation.smoother));
+ }
+ });
+
+ topicTable.add(widget).expand();
+ }
+
+ // --- Credentials ---
Table credentialsTable = new Table();
- credentialsMainTable.add(credentialsTable).grow().maxWidth(384f);
+ gameTable.add(credentialsTable).grow().maxWidth(384f);
// Username
Label usernameLabel = new Label("Username", skin);
@@ -128,6 +184,8 @@ public class MenuScreen implements Screen {
public void clicked(InputEvent event, float x, float y) {
super.clicked(event, x, y);
FrogarthaGame.getInstance().getIdentityClient().authorize(usernameField.getText());
+ gameTable.removeActor(credentialsTable);
+ gameTable.add(authorizingLabel).grow();
}
});
credentialsTable.add(loginButton).grow().row();
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java
index cde0b2e..ba05f37 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionClient.java
@@ -9,6 +9,9 @@ import kz.ilotterytea.frogartha.FrogarthaConstants;
import kz.ilotterytea.frogartha.FrogarthaGame;
import kz.ilotterytea.frogartha.domain.Identity;
import kz.ilotterytea.frogartha.domain.PlayerData;
+import kz.ilotterytea.frogartha.domain.RoomTopic;
+import kz.ilotterytea.frogartha.domain.actions.JoinRoomAction;
+import kz.ilotterytea.frogartha.domain.actions.LeaveRoomAction;
import kz.ilotterytea.frogartha.domain.events.*;
import kz.ilotterytea.frogartha.exceptions.PlayerKickException;
import kz.ilotterytea.frogartha.utils.Logger;
@@ -23,7 +26,11 @@ public class SessionClient implements WebSocketListener {
private final ManualSerializer serializer;
private final HashMap<Integer, PlayerData> playerDataMap;
- private int connectionId;
+ private boolean isJoining, joined;
+
+ private Integer connectionId;
+ private RoomTopic topic;
+
private Throwable lastThrow;
public SessionClient() {
@@ -74,8 +81,12 @@ public class SessionClient implements WebSocketListener {
} else if (obj instanceof ChangedDirectionEvent) {
SessionHandlers.handleChangedDirectionEvent((ChangedDirectionEvent) obj);
} else if (obj instanceof SenderJoinedRoomEvent) {
+ this.joined = true;
+ this.isJoining = false;
SessionHandlers.handleSenderJoinedRoomEvent((SenderJoinedRoomEvent) obj);
} else if (obj instanceof SenderLeftRoomEvent) {
+ this.joined = false;
+ this.topic = null;
SessionHandlers.handleSenderLeftRoomEvent((SenderLeftRoomEvent) obj);
} else if (obj instanceof PlayerJoinedRoomEvent) {
SessionHandlers.handlePlayerJoinedRoomEvent((PlayerJoinedRoomEvent) obj);
@@ -111,6 +122,20 @@ public class SessionClient implements WebSocketListener {
}
}
+ public void joinServer(RoomTopic topic) {
+ if (joined || isJoining) return;
+
+ send(new JoinRoomAction(topic));
+ this.topic = topic;
+ this.isJoining = true;
+ }
+
+ public void leaveServer() {
+ send(new LeaveRoomAction());
+ this.topic = null;
+ this.joined = false;
+ }
+
public void connect() {
connection.connect();
}
@@ -153,4 +178,16 @@ public class SessionClient implements WebSocketListener {
public HashMap<Integer, PlayerData> getPlayerDataMap() {
return playerDataMap;
}
+
+ public boolean isJoined() {
+ return joined;
+ }
+
+ public boolean isJoining() {
+ return isJoining;
+ }
+
+ public RoomTopic getTopic() {
+ return topic;
+ }
}
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
index 0da5894..55f3bdb 100644
--- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
+++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java
@@ -3,8 +3,6 @@ package kz.ilotterytea.frogartha.sessions;
import com.badlogic.gdx.math.Vector2;
import kz.ilotterytea.frogartha.FrogarthaGame;
import kz.ilotterytea.frogartha.domain.PlayerData;
-import kz.ilotterytea.frogartha.domain.RoomTopic;
-import kz.ilotterytea.frogartha.domain.actions.JoinRoomAction;
import kz.ilotterytea.frogartha.domain.events.*;
import kz.ilotterytea.frogartha.entities.PlayerEntity;
import kz.ilotterytea.frogartha.screens.GameScreen;
@@ -23,7 +21,6 @@ public class SessionHandlers {
client.setConnectionId(event.getPlayerId());
game.getIdentityClient().setAuthorized(true);
- client.send(new JoinRoomAction(RoomTopic.POND));
}
public static void handlePlayerJumpEvent(PlayerJumpEvent event) {
@@ -132,7 +129,7 @@ public class SessionHandlers {
log.log("The screen is not GameScreen, but the session received PlayerLeftRoomEvent");
return;
}
-
+
game.getSessionClient().getPlayerDataMap().remove(event.getPlayerId());
GameScreen screen = (GameScreen) game.getScreen();
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/ui/menu/RoomTopicWidget.java b/core/src/main/java/kz/ilotterytea/frogartha/ui/menu/RoomTopicWidget.java
new file mode 100644
index 0000000..e4b80e4
--- /dev/null
+++ b/core/src/main/java/kz/ilotterytea/frogartha/ui/menu/RoomTopicWidget.java
@@ -0,0 +1,33 @@
+package kz.ilotterytea.frogartha.ui.menu;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
+import com.badlogic.gdx.scenes.scene2d.ui.Table;
+import com.badlogic.gdx.utils.Align;
+import kz.ilotterytea.frogartha.FrogarthaGame;
+import kz.ilotterytea.frogartha.domain.RoomTopic;
+
+public class RoomTopicWidget extends Table {
+ public RoomTopicWidget(RoomTopic topic, Skin skin) {
+ super();
+ align(Align.center);
+
+ FrogarthaGame game = FrogarthaGame.getInstance();
+
+ String textureName = "unknown", titleName = "???";
+
+ if (topic != null) {
+ textureName = topic.name().toLowerCase();
+ titleName = topic.name().toLowerCase();
+ }
+
+ Image icon = new Image(game.getAssetManager().get(String.format("sprites/topics/%s.png", textureName), Texture.class));
+ add(icon).grow().size(128f, 128f).padBottom(15f).row();
+
+ Label title = new Label(titleName, skin);
+ title.setAlignment(Align.center);
+ add(title).grow().row();
+ }
+}