summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--assets/sprites/gui/ui.skin4
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/screens/GameScreen.java105
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/sessions/SessionHandlers.java2
-rw-r--r--core/src/main/java/kz/ilotterytea/frogartha/ui/game/ChatTable.java164
4 files changed, 194 insertions, 81 deletions
diff --git a/assets/sprites/gui/ui.skin b/assets/sprites/gui/ui.skin
index 7fe419f..5f9df6c 100644
--- a/assets/sprites/gui/ui.skin
+++ b/assets/sprites/gui/ui.skin
@@ -40,6 +40,10 @@
color: white,
name: tile
},
+ transparent: {
+ color: { hex: "#00000000" },
+ name: tile
+ },
halftransparentblack: {
color: { hex: "#00000099" },
name: tile
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("");
+ }
+}