package edu.gatech.cs2340.trydent.sample.tictactoe; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseButton; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import edu.gatech.cs2340.trydent.ContinuousEvent; import edu.gatech.cs2340.trydent.GameObject; import edu.gatech.cs2340.trydent.Keyboard; import edu.gatech.cs2340.trydent.Mouse; import edu.gatech.cs2340.trydent.TrydentEngine; import edu.gatech.cs2340.trydent.internal.MouseImpl; import edu.gatech.cs2340.trydent.log.Log; import edu.gatech.cs2340.trydent.math.Position; public class TitleScreenController { private static final String GAME_SCREEN = "edu/gatech/cs2340/trydent/sample/tictactoe/TicTacToeGameScreen.fxml"; @FXML private Button start1; @FXML private Button start2; @FXML private Button start3; private boolean started2; private boolean started3; private Map<String, Rectangle> tiles; private Map<KeyCode, String> keyToName; private Set<Rectangle> used; private boolean player; public TitleScreenController() { Log.debug("Initialized tic-tac-toe title screen."); new ContinuousEvent() { @Override public void onUpdate() { if(started2) { handleKeyboard(); } else if(started3) { handleMouse(); } } }; } private void handleKeyboard() { Rectangle target = null; for(KeyCode key : keyToName.keySet()) { if(Keyboard.isKeyDownOnce(key)) { target = tiles.get(keyToName.get(key)); break; } } if(target != null && !used.contains(target)) { if(player) { target.setFill(Color.RED); } else { target.setFill(Color.BLUE); } player = !player; used.add(target); } } private void handleMouse() { if(Mouse.isMouseDownOnce(MouseButton.PRIMARY)) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { Rectangle target = tiles.get(i + "_" + j); if(target.contains(target.sceneToLocal(MouseImpl.getMouseX(), MouseImpl.getMouseY())) && !used.contains(target)) { if(player) { target.setFill(Color.RED); } else { target.setFill(Color.BLUE); } player = !player; used.add(target); } } } } } @FXML private void toGameScreen(ActionEvent event) { TrydentEngine.runOnce(() -> { if(started2 || started3) return; Log.debug("Switching to game screen."); TrydentEngine.setForeground(getClass().getClassLoader().getResourceAsStream(GAME_SCREEN)); } ); } private void initEventScreen() { tiles = new HashMap<>(); used = new HashSet<>(); for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { String name = i + "_" + j; Rectangle rect = new Rectangle(50, 50, Color.BLACK); tiles.put(name, rect); new GameObject(name, rect).setPosition(new Position(i * 60, j * 60)); } } keyToName = new HashMap<>(); keyToName.put(KeyCode.Q, "0_0"); keyToName.put(KeyCode.A, "0_1"); keyToName.put(KeyCode.Z, "0_2"); keyToName.put(KeyCode.W, "1_0"); keyToName.put(KeyCode.S, "1_1"); keyToName.put(KeyCode.X, "1_2"); keyToName.put(KeyCode.E, "2_0"); keyToName.put(KeyCode.D, "2_1"); keyToName.put(KeyCode.C, "2_2"); start1.setOpacity(0); start2.setOpacity(0); start3.setOpacity(0); } @FXML private void toGameScreen2(ActionEvent event) { TrydentEngine.runOnce(() -> { if(started2 || started3) return; Log.debug("Started game type 2."); initEventScreen(); started2 = true; } ); } @FXML private void toGameScreen3(ActionEvent event) { TrydentEngine.runOnce(() -> { if(started2 || started3) return; Log.debug("Started game type 3."); initEventScreen(); started3 = true; } ); } }