From 35fafc313b8c9a7425af0d1fb930ed33c3c8413a Mon Sep 17 00:00:00 2001 From: ilotterytea Date: Thu, 23 Jan 2025 02:51:04 +0500 Subject: feat: topic selector --- assets/sprites/topics/pond.png | Bin 0 -> 51290 bytes assets/sprites/topics/unknown.png | Bin 0 -> 12199 bytes .../ilotterytea/frogartha/screens/MenuScreen.java | 70 +++++++++++++++++++-- .../frogartha/sessions/SessionClient.java | 39 +++++++++++- .../frogartha/sessions/SessionHandlers.java | 5 +- .../frogartha/ui/menu/RoomTopicWidget.java | 33 ++++++++++ 6 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 assets/sprites/topics/pond.png create mode 100644 assets/sprites/topics/unknown.png create mode 100644 core/src/main/java/kz/ilotterytea/frogartha/ui/menu/RoomTopicWidget.java diff --git a/assets/sprites/topics/pond.png b/assets/sprites/topics/pond.png new file mode 100644 index 0000000..5e6b8da Binary files /dev/null and b/assets/sprites/topics/pond.png differ diff --git a/assets/sprites/topics/unknown.png b/assets/sprites/topics/unknown.png new file mode 100644 index 0000000..33d8104 Binary files /dev/null and b/assets/sprites/topics/unknown.png 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 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 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(); + } +} -- cgit v1.2.3