diff options
| author | ilotterytea <iltsu@alright.party> | 2025-01-24 01:14:40 +0500 |
|---|---|---|
| committer | ilotterytea <iltsu@alright.party> | 2025-01-24 01:14:40 +0500 |
| commit | 54a3d7b3177b3875532d2bed376a96e2dde0d92d (patch) | |
| tree | 84af1d17f2cbde80d739abf6ee0d7088793522ce /core/src | |
| parent | ff9d8f584616cc3d9d7000e95f681707fd508497 (diff) | |
feat: overhauled the chat widget
Diffstat (limited to 'core/src')
3 files changed, 190 insertions, 81 deletions
diff --git a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java index 4f8b1c7..73e8f49 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java @@ -1,6 +1,7 @@ package kz.ilotterytea.frogartha.screens; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.*; import com.badlogic.gdx.graphics.g3d.Material; @@ -11,19 +12,17 @@ import com.badlogic.gdx.graphics.g3d.decals.CameraGroupStrategy; import com.badlogic.gdx.graphics.g3d.decals.DecalBatch; import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder; import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; -import com.badlogic.gdx.scenes.scene2d.ui.*; -import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.viewport.ScreenViewport; -import kz.ilotterytea.frogartha.FrogarthaConstants; import kz.ilotterytea.frogartha.FrogarthaGame; import kz.ilotterytea.frogartha.assets.Assets; import kz.ilotterytea.frogartha.domain.PlayerData; -import kz.ilotterytea.frogartha.domain.actions.ChatMessageAction; import kz.ilotterytea.frogartha.entities.LocalPlayerEntity; import kz.ilotterytea.frogartha.entities.PlayerEntity; +import kz.ilotterytea.frogartha.ui.game.ChatTable; import net.mgsx.gltf.scene3d.attributes.PBRCubemapAttribute; import net.mgsx.gltf.scene3d.attributes.PBRTextureAttribute; import net.mgsx.gltf.scene3d.lights.DirectionalShadowLight; @@ -41,8 +40,7 @@ public class GameScreen implements Screen { private Stage stage; private Skin skin; - private Table chatMessageTable; - private ScrollPane chatPane; + private ChatTable chatTable; private PerspectiveCamera camera; private SceneManager sceneManager; @@ -88,6 +86,16 @@ public class GameScreen implements Screen { decalBatch.flush(); + if (Gdx.input.isKeyJustPressed(Input.Keys.T) && !chatTable.isOpened()) { + stage.setKeyboardFocus(chatTable.getChatField()); + chatTable.open(); + } + + if (Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE) && chatTable.isOpened()) { + chatTable.close(); + stage.unfocus(chatTable.getChatField()); + } + stage.act(delta); stage.draw(); @@ -186,80 +194,13 @@ public class GameScreen implements Screen { stage.addActor(mainTable); // --- Chat --- - Table chatBase = new Table(); - chatBase.pad(8f); - chatBase.align(Align.bottomLeft); - mainTable.add(chatBase).grow(); - - Table chatWrapper = new Table(skin); - chatWrapper.setBackground("halftransparentblack"); - chatWrapper.pad(4f); - chatBase.add(chatWrapper).width(384f).align(Align.bottomLeft); - - chatMessageTable = new Table(); - chatMessageTable.setFillParent(true); - chatMessageTable.align(Align.bottom); - chatPane = new ScrollPane(chatMessageTable, skin); - chatPane.setScrollbarsVisible(true); - chatPane.setScrollingDisabled(true, false); - - chatWrapper.add(chatPane).growX().height(300f).row(); - - // Chat sender table - Table chatSenderTable = new Table(); - chatWrapper.add(chatSenderTable).grow(); - - TextField chatField = new TextField("", skin); - chatField.setMessageText("..."); - chatField.setMaxLength(FrogarthaConstants.Chat.MAX_MESSAGE_LENGTH); - chatSenderTable.add(chatField).grow().padRight(16f); - - TextButton chatSendButton = new TextButton("Send", skin); - chatSenderTable.add(chatSendButton).grow(); - - chatSendButton.addListener(new ClickListener() { - @Override - public void clicked(InputEvent event, float x, float y) { - super.clicked(event, x, y); - - if (chatField.getText().isEmpty()) return; - - game.getSessionClient().send(new ChatMessageAction(chatField.getText())); - chatField.setText(""); - } - }); - } - - public void addMessage(int playerId, String message) { - String name = null; - - if (playerId == game.getSessionClient().getConnectionId()) { - name = game.getIdentityClient().getUsername(); - } else { - for (Map.Entry<Integer, PlayerData> entry : game.getSessionClient().getPlayerDataMap().entrySet()) { - if (entry.getKey() == playerId) { - name = entry.getValue().getIdentity().getUsername(); - break; - } - } - } + Table chatBaseTable = new Table(); + chatBaseTable.align(Align.bottomLeft); + chatBaseTable.setFillParent(true); + stage.addActor(chatBaseTable); - if (name == null) return; - - Table table = new Table(skin); - if (chatMessageTable.getCells().size % 2 == 0) { - table.setBackground("halftransparentblack"); - } - - Label nameLabel = new Label(name, skin); - table.add(nameLabel).padBottom(4f).growX().row(); - - Label messageLabel = new Label(message, skin); - messageLabel.setWrap(true); - table.add(messageLabel).padLeft(4f).width(296f).row(); - - chatMessageTable.add(table).growX().row(); - chatPane.scrollTo(0f, 0f, 0f, 0f); + chatTable = new ChatTable(skin); + chatBaseTable.add(chatTable).width(600f).height(400f).padLeft(16f).padBottom(64f); } public LocalPlayerEntity getPlayerEntity() { @@ -269,4 +210,8 @@ public class GameScreen implements Screen { public HashMap<Integer, PlayerEntity> getPlayerEntityMap() { return playerEntityMap; } + + public ChatTable getChatTable() { + return chatTable; + } } 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 0c89b04..946a903 100644 --- a/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java +++ b/core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java @@ -134,6 +134,6 @@ public class SessionHandlers { } GameScreen screen = (GameScreen) game.getScreen(); - screen.addMessage(event.getPlayerId(), event.getMessage()); + screen.getChatTable().addMessage(event.getPlayerId(), event.getMessage()); } } diff --git a/core/src/main/java/kz/ilotterytea/frogartha/ui/game/ChatTable.java b/core/src/main/java/kz/ilotterytea/frogartha/ui/game/ChatTable.java new file mode 100644 index 0000000..4325711 --- /dev/null +++ b/core/src/main/java/kz/ilotterytea/frogartha/ui/game/ChatTable.java @@ -0,0 +1,164 @@ +package kz.ilotterytea.frogartha.ui.game; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.Input; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.ui.*; +import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import com.badlogic.gdx.utils.Align; +import kz.ilotterytea.frogartha.FrogarthaConstants; +import kz.ilotterytea.frogartha.FrogarthaGame; +import kz.ilotterytea.frogartha.domain.PlayerData; +import kz.ilotterytea.frogartha.domain.actions.ChatMessageAction; + +import java.util.Map; + +public class ChatTable extends Table { + private final Skin skin; + private final Table messageTable, sendTable; + private final ScrollPane pane; + private final TextField chatField; + + private boolean isOpened; + + public ChatTable(Skin skin) { + super(skin); + pad(8f); + + this.skin = skin; + + // Chat messages + this.messageTable = new Table(); + messageTable.setFillParent(true); + messageTable.align(Align.bottom); + + this.pane = new ScrollPane(messageTable, skin); + pane.setScrollbarsVisible(true); + pane.setScrollingDisabled(true, !isOpened); + add(pane).grow().padBottom(16f).row(); + + // Sender table + this.sendTable = new Table(); + add(sendTable).growX(); + + chatField = new TextField("", skin); + chatField.setMessageText("..."); + chatField.setMaxLength(FrogarthaConstants.Chat.MAX_MESSAGE_LENGTH); + sendTable.add(chatField).grow().padRight(16f); + + TextButton chatSendButton = new TextButton("Send", skin); + sendTable.add(chatSendButton); + + chatSendButton.addListener(new ClickListener() { + @Override + public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); + sendMessage(); + } + }); + + close(); + } + + @Override + public void act(float delta) { + super.act(delta); + if (Gdx.input.isKeyJustPressed(Input.Keys.ENTER) && isOpened) { + sendMessage(); + } + } + + public void addMessage(int playerId, String message) { + String name = null; + + if (playerId == FrogarthaGame.getInstance().getSessionClient().getConnectionId()) { + name = FrogarthaGame.getInstance().getIdentityClient().getUsername(); + } else { + for (Map.Entry<Integer, PlayerData> entry : FrogarthaGame.getInstance().getSessionClient().getPlayerDataMap().entrySet()) { + if (entry.getKey() == playerId) { + name = entry.getValue().getIdentity().getUsername(); + break; + } + } + } + + if (name == null) return; + + Table table = new Table(); + table.pad(10f); + + Label nameLabel = new Label(name, skin); + table.add(nameLabel).padBottom(8f).growX().row(); + + Label messageLabel = new Label(message, skin); + messageLabel.setAlignment(Align.left); + messageLabel.setWrap(true); + table.add(messageLabel).padLeft(16f).growX().row(); + + if (!isOpened) { + table.addAction(Actions.sequence( + Actions.alpha(1f), + Actions.delay(5f), + Actions.alpha(0f, 1f) + )); + } + + messageTable.add(table).growX().row(); + pane.scrollTo(0f, 0f, 0f, 0f); + } + + public void open() { + isOpened = true; + pane.setScrollbarsVisible(true); + pane.setFadeScrollBars(false); + pane.setScrollingDisabled(true, false); + pane.scrollTo(0f, 0f, 0f, 0f); + sendTable.setVisible(true); + chatField.setText(""); + + for (Cell x : messageTable.getCells()) { + x.getActor().clearActions(); + x.getActor().setColor(1f, 1f, 1f, 1f); + } + + setBackground("halftransparentblack"); + } + + public void close() { + isOpened = false; + pane.setScrollbarsVisible(false); + pane.setFadeScrollBars(true); + pane.setScrollingDisabled(true, true); + pane.scrollTo(0f, 0f, 0f, 0f); + sendTable.setVisible(false); + + for (Cell x : messageTable.getCells()) { + x.getActor().addAction(Actions.sequence( + Actions.alpha(1f), + Actions.delay(5f), + Actions.alpha(0f, 1f) + )); + } + + setBackground("transparent"); + } + + public boolean isOpened() { + return isOpened; + } + + public TextField getChatField() { + return chatField; + } + + private void sendMessage() { + if (chatField.getText().isEmpty()) { + close(); + return; + } + + FrogarthaGame.getInstance().getSessionClient().send(new ChatMessageAction(chatField.getText())); + chatField.setText(""); + } +} |
