/
ledart
/
RRP_LedNik
Обзор
Документация
Войти
/
ledart
/
RRP_LedNik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
client/UI/RoomScreen.java
360 строк
15 KB
Darya
добавила быстрые сообщения в лобби и в комнате. история сообщений сохраняется в лобби и в комнатах
18 дек 2025, 03:32
18 дек 2025, 03:32
b48cb9c
Код
Авторство
О чём код?
package client.UI; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.input.KeyCode; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.Stage; import client.Network; import client.model.ChatHistoryManager; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class RoomScreen { private Network network; private Stage stage; private String roomName; private GameField gameField; private Text overlay; private Text scoreText; private LobbyScreen lobbyScreen; private TextArea chatArea; private ChatHistoryManager chatHistory; private enum GameState { WAITING, COUNTDOWN, RUNNING, GAME_OVER } private GameState state = GameState.WAITING; private boolean isBotGame = false; private Map<String, Integer> sessionScores = new HashMap<>(); public RoomScreen(Network network, Stage stage, String roomName, LobbyScreen lobbyScreen) { this.network = network; this.stage = stage; this.roomName = roomName; this.lobbyScreen = lobbyScreen; this.gameField = new GameField(); this.overlay = new Text(); this.scoreText = new Text(); this.chatHistory = new ChatHistoryManager(); this.overlay.setStyle("-fx-font-size: 20px; -fx-fill: white; -fx-font-weight: bold;"); this.scoreText.setStyle("-fx-font-size: 14px; -fx-fill: yellow; -fx-font-weight: bold;"); this.scoreText.setY(20); network.setGameField(gameField); setupNetworkCallbacks(); } private void setupNetworkCallbacks() { network.setOnMessageCallback(msg -> { Platform.runLater(() -> { System.out.println("[RoomScreen] Received: " + msg); if (msg.startsWith("PLAYER_JOINED:")) { String player = msg.substring(14); overlay.setText(player + " joined!\nWaiting for game start..."); String message = player + " joined the room"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.equals("ROOM_WAITING")) { state = GameState.WAITING; overlay.setText("Waiting for another player...\nRoom: " + roomName); } else if (msg.equals("ROOM_READY")) { state = GameState.WAITING; overlay.setText("Room ready! 2 players connected.\nGame starting..."); String message = "Room ready! Game starting..."; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.startsWith("COUNTDOWN:")) { String count = msg.substring(10); state = GameState.COUNTDOWN; overlay.setText(count); if (count.equals("START")) { overlay.setText("GO!"); String message = "Game started!"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); new Thread(() -> { try { Thread.sleep(1000); } catch (InterruptedException ignored) {} Platform.runLater(() -> overlay.setText("")); }).start(); } else { String message = "Countdown: " + count; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } } else if (msg.equals("GAME_START")) { state = GameState.RUNNING; overlay.setText(""); gameField.start(); } else if (msg.startsWith("PLAYER_DEAD:")) { String player = msg.substring(12); overlay.setText(player + " died!"); String message = player + " died!"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.equals("GAME_OVER")) { state = GameState.GAME_OVER; overlay.setText("GAME OVER!\nPress 'Start Game' to play again"); String message = "Game over!"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.equals("GAME_STOPPED")) { state = GameState.WAITING; overlay.setText("Game stopped\nWaiting for players..."); String message = "Game stopped"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.startsWith("SCORES:")) { // Очки из GameSession - игнорируем для отображения } else if (msg.startsWith("SESSION_SCORES:")) { String scoreData = msg.substring(15); String[] parts = scoreData.split(";"); sessionScores.clear(); for (String part : parts) { String[] scoreParts = part.split(":"); if (scoreParts.length >= 2) { try { String player = scoreParts[0]; int score = Integer.parseInt(scoreParts[1]); sessionScores.put(player, score); } catch (NumberFormatException e) {} } } updateScoreDisplay(); } else if (msg.startsWith("CHAT_MSG:")) { String message = msg.substring(9); addChatMessage(message); chatHistory.saveRoomMessage(roomName, message); } else if (msg.equals("SCORES_RESET")) { sessionScores.clear(); updateScoreDisplay(); String message = "Scores reset"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.startsWith("ERROR:")) { String error = msg.substring(6); overlay.setText("Error: " + error); String message = "Error: " + error; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); if (error.contains("not found") || error.contains("Room not found")) { new Thread(() -> { try { Thread.sleep(2000); } catch (InterruptedException ignored) {} Platform.runLater(() -> { if (lobbyScreen != null) { lobbyScreen.start(); } }); }).start(); } } else if (msg.startsWith("JOIN_ROOM_OK:")) { String joinedRoom = msg.substring(13); overlay.setText("Successfully joined\n" + joinedRoom); String message = "Joined room: " + joinedRoom; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } else if (msg.startsWith("LEAVE_ROOM_OK:")) { if (lobbyScreen != null) { lobbyScreen.start(); } } else if (msg.startsWith("PLAYER_LEFT:")) { String player = msg.substring(12); String message = player + " left the room"; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } }); }); } private void updateScoreDisplay() { if (sessionScores.isEmpty()) { scoreText.setText("Session: 0"); return; } StringBuilder sb = new StringBuilder("Session: "); for (Map.Entry<String, Integer> entry : sessionScores.entrySet()) { sb.append(entry.getKey()).append(": ").append(entry.getValue()).append(" "); } scoreText.setText(sb.toString()); } public void start() { network.setCurrentScreen("ROOM"); BorderPane root = new BorderPane(); root.setPadding(new javafx.geometry.Insets(10)); // ЛЕВАЯ ПАНЕЛЬ: Игровое поле и управление VBox leftPanel = new VBox(10); leftPanel.setPrefWidth(450); // Верхняя панель с кнопками HBox topBox = new HBox(10); Button backButton = new Button("Back to Lobby"); backButton.setOnAction(e -> { network.sendMessage("LEAVE_ROOM:" + roomName); }); Button startButton = new Button("Start Game"); startButton.setOnAction(e -> { if (isBotGame) { network.sendMessage("START_GAME:BOT"); } else { network.sendMessage("START_GAME:PLAYER"); } }); topBox.getChildren().addAll(backButton, startButton); // Игровое поле StackPane gameContainer = new StackPane(); gameContainer.getChildren().addAll(gameField, overlay, scoreText); leftPanel.getChildren().addAll(topBox, gameContainer); // ПРАВАЯ ПАНЕЛЬ: Чат и быстрые сообщения VBox rightPanel = new VBox(10); rightPanel.setPrefWidth(250); Label chatLabel = new Label("Room Chat"); chatLabel.setStyle("-fx-font-size: 14px; -fx-font-weight: bold;"); // Область чата chatArea = new TextArea(); chatArea.setEditable(false); chatArea.setWrapText(true); chatArea.setPrefHeight(350); chatArea.setStyle("-fx-font-family: monospace; -fx-font-size: 12px;"); // Загружаем историю чата комнаты loadRoomChatHistory(); // Кнопки быстрых сообщений - ВЕРТИКАЛЬНЫЙ СТОЛБИК VBox quickChatBox = new VBox(5); Button readyBtn = new Button("Ready?"); Button goodGameBtn = new Button("Good Game!"); Button wellPlayedBtn = new Button("Well Played!"); Button helloBtn = new Button("Hello!"); Button goodLuckBtn = new Button("Good Luck!"); readyBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:READY")); goodGameBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:GOOD_GAME")); wellPlayedBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:WELL_PLAYED")); helloBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:HELLO")); goodLuckBtn.setOnAction(e -> network.sendMessage("QUICK_CHAT:GOOD_LUCK")); // Устанавливаем одинаковую ширину для всех кнопок readyBtn.setPrefWidth(200); goodGameBtn.setPrefWidth(200); wellPlayedBtn.setPrefWidth(200); helloBtn.setPrefWidth(200); goodLuckBtn.setPrefWidth(200); quickChatBox.getChildren().addAll(readyBtn, goodGameBtn, wellPlayedBtn, helloBtn, goodLuckBtn); rightPanel.getChildren().addAll(chatLabel, chatArea, quickChatBox); // Размещаем панели root.setLeft(leftPanel); root.setRight(rightPanel); Scene scene = new Scene(root, 750, 500); stage.setScene(scene); stage.setTitle("Chase Snake - Room: " + roomName); stage.show(); gameField.start(); scene.setOnKeyPressed(event -> { if (state != GameState.RUNNING) { System.out.println("[RoomScreen] Cannot move, game not running. State: " + state); return; } String direction = ""; if (event.getCode() == KeyCode.UP || event.getCode() == KeyCode.W) { direction = "UP"; } else if (event.getCode() == KeyCode.DOWN || event.getCode() == KeyCode.S) { direction = "DOWN"; } else if (event.getCode() == KeyCode.LEFT || event.getCode() == KeyCode.A) { direction = "LEFT"; } else if (event.getCode() == KeyCode.RIGHT || event.getCode() == KeyCode.D) { direction = "RIGHT"; } if (!direction.isEmpty()) { System.out.println("[RoomScreen] Sending move command: " + direction); network.sendMessage("MOVE:" + direction); } }); overlay.setText("Welcome to room: " + roomName + "\nWaiting..."); addSystemMessage("Welcome to room: " + roomName); chatHistory.saveRoomMessage(roomName, "[SYSTEM] Welcome to room: " + roomName); } private void loadRoomChatHistory() { List<String> history = chatHistory.loadRoomHistory(roomName); for (String message : history) { chatArea.appendText(message + "\n"); } scrollChatToBottom(); System.out.println("[RoomScreen] Loaded " + history.size() + " messages from room history: " + roomName); } public void startBotGame() { isBotGame = true; overlay.setText("Starting bot game...\nRoom: " + roomName); String message = "Starting bot game..."; addSystemMessage(message); chatHistory.saveRoomMessage(roomName, "[SYSTEM] " + message); } private void addChatMessage(String message) { String time = new SimpleDateFormat("HH:mm").format(new Date()); String formattedMessage = "[" + time + "] " + message; chatArea.appendText(formattedMessage + "\n"); scrollChatToBottom(); } private void addSystemMessage(String message) { String time = new SimpleDateFormat("HH:mm").format(new Date()); String formattedMessage = "[" + time + "] [SYSTEM] " + message; chatArea.appendText(formattedMessage + "\n"); scrollChatToBottom(); } private void scrollChatToBottom() { chatArea.setScrollTop(Double.MAX_VALUE); } }