diff options
| author | ilotterytea <iltsu@alright.party> | 2025-01-23 02:51:04 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-01-23 02:51:04 +0500 |
| commit | 35fafc313b8c9a7425af0d1fb930ed33c3c8413a (patch) | |
| tree | 0fc1fe6d3c6b993bc8d38911c4c61147db332994 /core/src | |
| parent | 039ac4e9be1534e581ee8da207641325689c9147 (diff) | |
feat: topic selector
Diffstat (limited to 'core/src')
4 files changed, 136 insertions, 11 deletions
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(); + } +} |
