Guest User

Untitled

a guest
Apr 25th, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.63 KB | None | 0 0
  1. import javafx.scene.layout.BackgroundImage;
  2.  
  3. import javax.swing.*;
  4. import java.awt.*;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9.  
  10. public class RaceGui {
  11.  
  12. // private final JLabel background;
  13. Race race;
  14.  
  15. JFrame window, raceWindow;
  16. Container container, raceContainer;
  17. JPanel startPanel, startButtonPanel, customiseRacePanel, preview, nextBackPanel;
  18. JLabel startLabel, distanceLabel, lapsLabel, horsesLabel, trackSelectorLabel;
  19. Font startFont = new Font("American Typewriter", Font.BOLD, 60);
  20. Font normalFont = new Font("Arial", Font.BOLD, 20);
  21. Font isInfo = new Font("Arial", Font.BOLD, 20);
  22. Font showSymbol = new Font("", Font.PLAIN, 200);
  23. JButton startButton, customiseHorsesButton;
  24. JSlider distanceSlider, lapsSlider, horsesSlider;
  25. JPanel[] horsePanels;
  26. JButton[] horseButtons;
  27. JComboBox[] symbolSelectors;
  28. JTextField[] nameFields;
  29. JSlider[] confidenceSliders;
  30. private Map<String, ImageIcon> trackImages; // Store track images
  31. private JLayeredPane layeredPane;
  32. private JComboBox<String> trackComboBox;
  33. TitleScreenHandler tScreenHandler = new TitleScreenHandler();
  34. RaceCustomiseHandler rcHandler = new RaceCustomiseHandler();
  35. HorseCustomiseHandler horseHandler = new HorseCustomiseHandler();
  36. JPanel horseCustomizationPanel;
  37. BackgroundPanel mainBackground;
  38.  
  39. JPanel storeSymbol;
  40. JLabel holdSymbol;
  41. JPanel storeInfo;
  42. JLabel holdName;
  43. JLabel holdConfidence;
  44.  
  45. char displaySymbol;
  46. int displayConfidence;
  47. String displayName;
  48.  
  49. Color transparentGreen = new Color(0, 255, 0, 4);
  50. int numHorses = 3;
  51. int laps;
  52. int distance;
  53. private String[] trackTypes = {"Grass", "Dirt", "Underwater", "Space", "Backrooms"};
  54.  
  55. ImageIcon imageIcon;
  56. Image background, raceBackground;
  57.  
  58.  
  59. private char[] symbolChar = {
  60. '♘', 'ଲ', '♞', '♛', '♚', '♕', '♔', '❄', '❁', '➵',
  61. '✈', '☀', '☁', '⚽', '⚡', '⭐', '☕', '☂', '✿', '✤',
  62. '⓪', '①', '②', '③', '④', '⑤', '⑥', '⑦', '⑧', '⑨',
  63. '⓿', '❶', '❷', '❸', '❹', '❺', '❻', '❼', '❽', '❾',
  64. '♠', '♥', '♦', '♣',
  65. '⌘', '⏎', '⌫', '♿', '⚜', '⚛'
  66. };
  67. private JPanel trackSelectorPanel;
  68. private JPanel horsePreview;
  69. private JPanel buttonPanel;
  70. private int laneNumber;
  71. private JPanel watchRace;
  72. private ImageIcon backgroundImage;
  73.  
  74.  
  75. public static void main(String[] args) {
  76. new RaceGui();
  77. }
  78.  
  79. public RaceGui() {
  80. backgroundImage = new ImageIcon("Images/Background.jpg");
  81. trackImages = new HashMap<>();
  82. loadTrackImages();
  83. background = backgroundImage.getImage();
  84.  
  85. window = new JFrame();
  86. window.setSize(800, 600);
  87. window.setLayout(null);
  88. window.getContentPane().setBackground(Color.black);
  89. window.setResizable(false);
  90. window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  91. window.setVisible(true);
  92. container = window.getContentPane();
  93.  
  94. // backgroundImage = new ImageIcon("Images/Background.jpg");
  95. // background = new JLabel(backgroundImage,JLabel.CENTER);
  96. // background.setLayout(new BorderLayout());
  97. // background.setBounds(0, 0, 800, 600);
  98. // window.setContentPane(background);
  99. //
  100. // layeredPane.add(background, Integer.valueOf(0));
  101.  
  102. startPanel = new JPanel();
  103. startPanel.setBounds(100, 100, 600, 150);
  104. startPanel.setBackground(transparentGreen);
  105.  
  106. startLabel = new JLabel("Off To The Races");
  107. startLabel.setFont(startFont);
  108. startLabel.setForeground(Color.white);
  109.  
  110. startButtonPanel = new JPanel();
  111. startButtonPanel.setBounds(300, 400, 200, 100);
  112. startButtonPanel.setBackground(transparentGreen);
  113.  
  114. startButton = new JButton("Start Customising");
  115. startButton.setForeground(Color.white);
  116. startButton.setFont(normalFont);
  117. startButton.addActionListener(tScreenHandler);
  118.  
  119. startPanel.add(startLabel);
  120. startButtonPanel.add(startButton);
  121.  
  122.  
  123. // layeredPane.add(startPanel, Integer.valueOf(1));
  124. // layeredPane.add(startButtonPanel, Integer.valueOf(1));
  125. //
  126. // // Set the layered pane as the content pane
  127. // window.setContentPane(layeredPane);
  128.  
  129. container.add(startPanel);
  130. container.add(startButtonPanel);
  131. }
  132.  
  133. public void customiseRace() {
  134. startPanel.setVisible(false);
  135. startButtonPanel.setVisible(false);
  136.  
  137. customiseRacePanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
  138. customiseRacePanel.setLayout(new GridLayout(4, 1));
  139. trackSelectorPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
  140. customiseRacePanel.setBounds(0, 450, 550, 100); // Adjusted bounds
  141. trackSelectorPanel.setBounds(550, 450, 250, 100); // Adjusted bounds
  142. customiseRacePanel.setBackground(Color.blue);
  143. trackSelectorPanel.setBackground(Color.red);
  144. container.add(customiseRacePanel);
  145. container.add(trackSelectorPanel);
  146.  
  147. customiseRacePanel.setVisible(true);
  148. trackSelectorPanel.setVisible(true);
  149.  
  150.  
  151. // Creating and configuring sliders
  152. distanceSlider = new JSlider(1, 20, 10);
  153. lapsSlider = new JSlider(1, 5, 1);
  154. horsesSlider = new JSlider(2, 6, 3);
  155. distanceSlider.setMajorTickSpacing(2);
  156. lapsSlider.setMajorTickSpacing(1);
  157. horsesSlider.setMajorTickSpacing(1);
  158.  
  159. distanceLabel = new JLabel("Distance: 10");
  160. distanceLabel.setFont(normalFont);
  161. lapsLabel = new JLabel("Laps: 1");
  162. lapsLabel.setFont(normalFont);
  163. horsesLabel = new JLabel("Horses: 3");
  164. horsesLabel.setFont(normalFont);
  165.  
  166. // Update labels dynamically
  167. distanceSlider.addChangeListener(e -> {
  168. distance = distanceSlider.getValue();
  169. distanceLabel .setText("Distance: " + distance);
  170.  
  171. });
  172.  
  173. lapsSlider.addChangeListener(e -> {
  174. laps = lapsSlider.getValue();
  175. lapsLabel.setText("Laps: " + laps);
  176.  
  177. });
  178.  
  179. horsesSlider.addChangeListener(e -> {
  180. numHorses = horsesSlider.getValue();
  181. horsesLabel.setText("Horses: " + numHorses);
  182.  
  183. });
  184. System.out.println(numHorses);
  185.  
  186. trackComboBox = new JComboBox<>(trackTypes);
  187. trackComboBox.addActionListener(new ColorChangeHandler());
  188. trackComboBox.setPreferredSize(new Dimension(150, 30));
  189. trackSelectorLabel = new JLabel("Select Track");
  190. customiseRacePanel.add(trackComboBox); // Add combo box to the panel
  191.  
  192.  
  193. // Adding components to the panel
  194. customiseRacePanel.add(distanceLabel);
  195. customiseRacePanel.add(distanceSlider);
  196. customiseRacePanel.add(lapsLabel);
  197. customiseRacePanel.add(lapsSlider);
  198. customiseRacePanel.add(horsesLabel);
  199. customiseRacePanel.add(horsesSlider);
  200. trackSelectorPanel.add(trackSelectorLabel);
  201. trackSelectorPanel.add(trackComboBox);
  202.  
  203. // Button to proceed to horse customisation
  204. customiseHorsesButton = new JButton("Customise Horses");
  205. customiseHorsesButton.setPreferredSize(new Dimension(150, 30));
  206. customiseHorsesButton.addActionListener(rcHandler);
  207. trackSelectorPanel.add(customiseHorsesButton);
  208.  
  209. preview = new JPanel();
  210. preview.setBackground(transparentGreen);
  211. preview.setBounds(100, 100, 600, 300); // Set bounds to cover the top part of the window
  212. container.add(preview);
  213. preview.setVisible(true);
  214. }
  215.  
  216. public void customiseHorses() {
  217. Character[] symbols = new Character[symbolChar.length];
  218. for (int i = 0; i < symbolChar.length; i++) {
  219. symbols[i] = symbolChar[i]; // Auto-boxing char to Character
  220. }
  221.  
  222. storeSymbol = new JPanel();
  223. storeInfo = new JPanel();
  224.  
  225. holdSymbol = new JLabel(Character.toString(displaySymbol));
  226. holdName = new JLabel("Name: " + displayName );
  227. holdConfidence = new JLabel("Confidence: " + displayConfidence + "%");
  228.  
  229. horseCustomizationPanel = new JPanel();
  230. horseCustomizationPanel.setLayout(new GridLayout(0, 1));
  231. horseCustomizationPanel.setBounds(450, 0, 400, 500);
  232. horseCustomizationPanel.setBackground(Color.lightGray);
  233. container.add(horseCustomizationPanel);
  234.  
  235. horsePanels = new JPanel[numHorses];
  236. horseButtons = new JButton[numHorses];
  237. symbolSelectors = new JComboBox[numHorses];
  238. nameFields = new JTextField[numHorses];
  239. confidenceSliders = new JSlider[numHorses];
  240. nextBackPanel = new JPanel();
  241. nextBackPanel.setLayout(new GridLayout(0, 1));
  242.  
  243. nextBackPanel.setBounds(500, 510, 300, 50);
  244. nextBackPanel.setBackground(Color.black);
  245. nextBackPanel.setVisible(true);
  246. container.add(nextBackPanel);
  247.  
  248. String selectedTrack;
  249.  
  250.  
  251. for (int i = 0; i < numHorses; i++) {
  252. // Panel for each horse
  253. final int index = i;
  254. horsePanels[i] = new JPanel();
  255. horsePanels[i].setLayout(new FlowLayout());
  256. horsePanels[i].setBackground(Color.decode("#F0F0F0"));
  257.  
  258. // Button to select horse
  259. horseButtons[i] = new JButton("Change Horse " + (i + 1));
  260. horseButtons[index].addActionListener(e -> {
  261. displayHorseSettings(e, index); // Pass the button index
  262. });
  263. horsePanels[i].add(horseButtons[i]);
  264.  
  265. // Symbol selector
  266. symbolSelectors[i] = new JComboBox<>(symbols);
  267. symbolSelectors[i].setSelectedItem('♘'); // Default selection
  268. symbolSelectors[i].addActionListener(e -> {
  269. displaySymbol = (char) symbolSelectors[index].getSelectedItem(); // Use the captured index
  270.  
  271. //System.out.println(displaySymbol);
  272. });
  273. horsePanels[i].add(symbolSelectors[i]);
  274.  
  275. // Name field
  276. nameFields[i] = new JTextField(10);
  277. nameFields[i].addActionListener(e -> {
  278. displayName = nameFields[index].getText();; // Use the captured index
  279. displaySymbol = (char) symbolSelectors[index].getSelectedItem();
  280. //System.out.println(displayName);
  281. });
  282. horsePanels[i].add(nameFields[i]);
  283.  
  284.  
  285. // Confidence slider
  286. confidenceSliders[i] = new JSlider(1, 10, 5);
  287. confidenceSliders[i].setMajorTickSpacing(1);
  288. confidenceSliders[i].setPaintTicks(true);
  289. confidenceSliders[i].setPaintLabels(true);
  290. confidenceSliders[i].addChangeListener(e -> {
  291. // Use the captured index
  292.  
  293.  
  294. //System.out.println(displayConfidence);
  295. });
  296. //
  297.  
  298.  
  299. horsePanels[i].add(confidenceSliders[i]);
  300. // Add panel to horse customization panel
  301. horseCustomizationPanel.add(horsePanels[i]);
  302. }
  303.  
  304. JButton startRaceButton = new JButton("Start Race");
  305. startRaceButton.setBackground(Color.green);
  306. startRaceButton.setForeground(Color.white);
  307. startRaceButton.setFont(normalFont);
  308. startRaceButton.addActionListener(horseHandler);
  309. nextBackPanel.add(startRaceButton);
  310.  
  311.  
  312. JButton goBackButton = new JButton("Back to Race Config");
  313. goBackButton.setBackground(Color.green);
  314. goBackButton.setBackground(Color.white);
  315. goBackButton.setFont(normalFont);
  316. goBackButton.addActionListener(tScreenHandler);
  317. nextBackPanel.add(goBackButton);
  318.  
  319.  
  320.  
  321. container.add(storeSymbol);
  322. container.add(storeInfo);
  323. container.add(horseCustomizationPanel); // Re-add horse customization panel
  324. container.add(nextBackPanel); // Re-add next/back panel
  325.  
  326. // Set visibility to true to ensure components are visible
  327. storeInfo.setVisible(true);
  328. storeSymbol.setVisible(true);
  329. horseCustomizationPanel.setVisible(true);
  330. nextBackPanel.setVisible(true);
  331. for (int i = 0; i < numHorses; i++) {
  332. horsePanels[i].setVisible(true);
  333. }
  334.  
  335. // Show settings panel for first horse initially
  336. displayHorseSettings(new ActionEvent(horseButtons[0], ActionEvent.ACTION_PERFORMED, null), 0);
  337. }
  338.  
  339. private void displayHorseSettings(ActionEvent e, int index) {
  340. // System.out.println("♘");
  341. for (int i = 0; i < numHorses; i++) {
  342. if (e.getSource() == horseButtons[i]) {
  343.  
  344. displaySymbol = (char) symbolSelectors[index].getSelectedItem();
  345. displayConfidence = confidenceSliders[index].getValue();
  346. displayName = nameFields[index].getText();
  347.  
  348. holdSymbol.setText(Character.toString(displaySymbol));
  349. holdSymbol.setFont(showSymbol);
  350. holdName.setText("Name: " + displayName );
  351. holdConfidence.setText("Confidence: " + displayConfidence * 10 + "%");
  352. holdName.setFont(isInfo);
  353. holdConfidence.setFont(isInfo);
  354. //horsePreview.setBounds(50, 100, 350, 350);
  355.  
  356. storeSymbol.setBounds(50, 100, 350, 250);
  357. storeInfo.setBounds(50, 350, 350, 100);
  358.  
  359. storeSymbol.setBackground(Color.orange);
  360. storeInfo.setBackground(Color.red);
  361. storeInfo.setLayout(new GridLayout(0, 1));
  362.  
  363. storeInfo.add(holdName);
  364. storeInfo.add(holdConfidence);
  365. storeSymbol.add(holdSymbol);
  366. }
  367. }
  368. }
  369.  
  370. private void loadTrackImages() {
  371. // Load images for each track type
  372. trackImages.put("Grass", new ImageIcon("Images/Grass.jpg"));
  373. trackImages.put("Dirt", new ImageIcon("Images/Dirt.jpg"));
  374. trackImages.put("Underwater", new ImageIcon("Images/Underwater.jpg"));
  375. trackImages.put("Space", new ImageIcon("Images/Space.jpg"));
  376. trackImages.put("Backrooms", new ImageIcon("Images/Backrooms.jpg"));
  377. trackImages.put("Background", new ImageIcon("Images/Background.jpg"));
  378. }
  379.  
  380. private void updatePreview(String trackType) {
  381. imageIcon = trackImages.get(trackType);
  382.  
  383. if (imageIcon != null) {
  384. // Scale the image to fit the panel while maintaining aspect ratio
  385. Image scaledImage = imageIcon.getImage().getScaledInstance(preview.getWidth(), preview.getHeight(), Image.SCALE_SMOOTH);
  386.  
  387. preview.removeAll(); // Clear existing content
  388. preview.add(new JLabel(new ImageIcon(scaledImage))); // Add scaled image to preview
  389. preview.revalidate(); // Refresh the panel
  390. preview.repaint(); // Redraw the panel
  391. }
  392. }
  393.  
  394.  
  395. public void beginRace() {
  396. customiseRacePanel.setVisible(false);
  397. nextBackPanel.setVisible(false);
  398. container.setVisible(false);
  399.  
  400. raceWindow = new JFrame();
  401. raceWindow.setSize(800, 600);
  402. raceWindow.setLayout(null);
  403. raceWindow.getContentPane().setBackground(Color.black);
  404. raceWindow.setResizable(false);
  405. raceWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  406. raceWindow.setVisible(true);
  407.  
  408. raceContainer = raceWindow.getContentPane();
  409.  
  410. // Create a panel to display the race
  411. watchRace = new BackgroundPanel(background, BackgroundPanel.SCALED){
  412. @Override
  413. protected void paintComponent(Graphics g) {
  414. // Call the superclass to ensure other Swing components are painted
  415. super.paintComponent(g);
  416. // Draw the background image first
  417. if (watchRace.getBackground() != null) {
  418. System.out.println(backgroundImage);
  419.  
  420. g.drawImage(
  421. backgroundImage.getImage().getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH),
  422. 0,
  423. 0,
  424. this
  425. );
  426. }
  427.  
  428. // Now draw other content, such as the race
  429. if (race != null) {
  430. race.paintRace(g); // Draw the race content on top
  431. }
  432. }
  433.  
  434.  
  435. };
  436.  
  437. watchRace.setBounds(50, 50, 700, 380); // Set the race panel size
  438. raceContainer.add(watchRace);
  439.  
  440. if(imageIcon == null){
  441. //System.out.println("No image selected, proceeding with basics");
  442. imageIcon = trackImages.get("Grass");
  443. }
  444.  
  445. race = new Race(distance, laps, watchRace, imageIcon); // Initialize the race with the panel
  446. for (int i = 0; i < numHorses; i++) {
  447. Character symbol = (Character) symbolSelectors[i].getSelectedItem(); // Get the horse symbol
  448. double confidence = (double) confidenceSliders[i].getValue() / 10;
  449. String name = nameFields[i].getText(); // Get the horse name
  450.  
  451. Horse horse = new Horse(symbol, name, confidence); // Create the horse
  452. race.addHorse(horse); // Add to the race
  453. }
  454.  
  455. //System.out.println(imageIcon);
  456. race.startRace(); // Start the race
  457. }
  458.  
  459.  
  460. public class TitleScreenHandler implements ActionListener {
  461. public void actionPerformed(ActionEvent e) {
  462. if(horseCustomizationPanel != null){
  463. storeInfo.setVisible(false);
  464. storeSymbol.setVisible(false);
  465. horseCustomizationPanel.setVisible(false);
  466. nextBackPanel.setVisible(false);}
  467. customiseRace();
  468. }
  469. }
  470.  
  471. public class RaceCustomiseHandler implements ActionListener {
  472. public void actionPerformed(ActionEvent e) {
  473. preview.setVisible(false);
  474. customiseRacePanel.setVisible(false);
  475. trackSelectorPanel.setVisible(false);
  476. customiseHorses();
  477. }
  478. }
  479.  
  480. public class HorseCustomiseHandler implements ActionListener {
  481. public void actionPerformed(ActionEvent e) {
  482. beginRace();
  483. }
  484. }
  485.  
  486. private class ColorChangeHandler implements ActionListener {
  487. @Override
  488. public void actionPerformed(ActionEvent e) {
  489. String selectedTrack = (String) trackComboBox.getSelectedItem();
  490. updatePreview(selectedTrack); // Update the preview with the new image
  491. }
  492. }
  493.  
  494. }
  495.  
Advertisement
Add Comment
Please, Sign In to add comment