From 1ef9d05ce542213de62a09dcad2edc2ddc0e974a Mon Sep 17 00:00:00 2001
From: Samita Adhikari <sadhika7@myune.edu.au>
Date: Fri, 22 Sep 2023 08:38:05 +0545
Subject: [PATCH] Closes #13 Add main Menu and Guest playable

---
 app/src/main/java/brickbreaker/App.java       |  19 +-
 app/src/main/java/brickbreaker/GamePanel.java |  98 +++++----
 app/src/main/java/brickbreaker/MainMenu.form  | 192 ++++++++++++++++++
 app/src/main/java/brickbreaker/MainMenu.java  | 177 ++++++++++++++++
 app/src/main/java/brickbreaker/Menu.java      | 170 ++++++++++++++++
 5 files changed, 603 insertions(+), 53 deletions(-)
 create mode 100644 app/src/main/java/brickbreaker/MainMenu.form
 create mode 100644 app/src/main/java/brickbreaker/MainMenu.java
 create mode 100644 app/src/main/java/brickbreaker/Menu.java

diff --git a/app/src/main/java/brickbreaker/App.java b/app/src/main/java/brickbreaker/App.java
index 6282541..e36ae75 100644
--- a/app/src/main/java/brickbreaker/App.java
+++ b/app/src/main/java/brickbreaker/App.java
@@ -2,16 +2,19 @@
 package brickbreaker;
 
 import javax.swing.JFrame;
+import javax.swing.JPanel;
 
 public class App {
     public static void main(String[] args) {
-        JFrame obj = new JFrame();
-        GamePanel gamePanel = new GamePanel();
-	obj.setBounds(10, 10, 700, 600);
-	obj.setTitle("Brick Breaker");
-	obj.setResizable(false);
-	obj.setVisible(true);
-	obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-	obj.add(gamePanel);
+        
+        JFrame frame = new JFrame();
+        JPanel panel = new JPanel();
+        new Menu(frame);
+	frame.setBounds(10, 10, 700, 600);
+	frame.setTitle("Brick Breaker");
+	frame.setResizable(false);
+	frame.setVisible(true);
+	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+	frame.add(panel);
     }
 }
diff --git a/app/src/main/java/brickbreaker/GamePanel.java b/app/src/main/java/brickbreaker/GamePanel.java
index c8c18c0..10f8acf 100644
--- a/app/src/main/java/brickbreaker/GamePanel.java
+++ b/app/src/main/java/brickbreaker/GamePanel.java
@@ -9,12 +9,11 @@ import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-public class GamePanel extends JPanel implements KeyListener, ActionListener {
+public class GamePanel extends JPanel implements ActionListener {
     private boolean play = true;
     private int score = 0;
 
@@ -32,18 +31,19 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
 
     private GameMapBuilder gameMap;
 
-    public GamePanel() {
+    public GamePanel(JFrame frame) {
         Color color = Color.decode("#8B4513");
         this.balls.add(new Ball(350, 450, 2, -2, 20, color));
         this.totalBricks = rows * columns;
 
         BrickFactory brickfactory = new DefaultBrickFactory();
         gameMap = new GameMapBuilder(rows, columns, brickfactory);
-        addKeyListener(this);
         setFocusable(true);
         setFocusTraversalKeysEnabled(false);
         timer = new Timer(delay, this);
         timer.start();
+        frame.add(this);
+        addKeyBindings();
     }
 
     private List<GameObserver> observers = new ArrayList<>();
@@ -56,6 +56,54 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
         observers.remove(observer);
     }
     
+    private void addKeyBindings() {
+        InputMap inputMap = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+        ActionMap actionMap = getActionMap();
+
+        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "moveLeft");
+        actionMap.put("moveLeft", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (paddle < 10) {
+                    paddle = 10;
+                } else {
+                    moveLeft();
+                }
+            }
+        });
+
+        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "moveRight");
+        actionMap.put("moveRight", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (paddle >= 600) {
+                    paddle = 600;
+                } else {
+                    moveRight();
+                }
+            }
+        });
+        
+        inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "Enter");
+        actionMap.put("Enter", new AbstractAction() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (!play) {
+                    play = true;
+                    Color color = Color.decode("#8B4513");
+                    balls.clear();
+                    balls.add(new Ball(350, 450, 2, -2, 20, color)); 
+                    score = 0;
+                    totalBricks = rows * columns;
+                    BrickFactory brickfactory = new DefaultBrickFactory();
+                    gameMap = new GameMapBuilder(rows, columns, brickfactory);
+
+                    repaint();
+                }
+            }
+        });
+    }
+    
     protected void paintComponent(Graphics graphics) {
         super.paintComponent(graphics);
         if (balls.isEmpty()) {
@@ -143,7 +191,6 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
                                 
                                 if(brick.hasPowerUp) {
                                     int noOfBallsToSpawn = (int) (Math.random() * 5);
-                                    System.out.println(noOfBallsToSpawn);
                                     for (int k=0; k<noOfBallsToSpawn; k++) {
                                         boolean positiveXDirection = Math.random() > 0.5;
                                         boolean positiveYDirection = Math.random() > 0.5;
@@ -174,43 +221,6 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
         repaint();
     }
 
-    @Override
-    public void keyTyped(KeyEvent arg0) {
-    }
-
-    @Override
-    public void keyPressed(KeyEvent arg0) {
-        if (arg0.getKeyCode() == KeyEvent.VK_RIGHT) {
-            if (paddle >= 600) {
-                paddle = 600;
-            } else {
-                moveRight();
-            }
-        }
-        if (arg0.getKeyCode() == KeyEvent.VK_LEFT) {
-            if (paddle < 10) {
-                paddle = 10;
-            } else {
-                moveLeft();
-            }
-        }
-
-        if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
-            if (!play) {
-                play = true;
-                Color color = Color.decode("#8B4513");
-                this.balls.clear();
-                this.balls.add(new Ball(350, 450, 2, -2, 20, color)); 
-                score = 0;
-                totalBricks = rows * columns;
-                BrickFactory brickfactory = new DefaultBrickFactory();
-                gameMap = new GameMapBuilder(rows, columns, brickfactory);
-
-                repaint();
-            }
-        }
-    }
-
     public void moveRight() {
         play = true;
         paddle += 50;
@@ -221,7 +231,5 @@ public class GamePanel extends JPanel implements KeyListener, ActionListener {
         paddle -= 50;
     }
 
-    @Override
-    public void keyReleased(KeyEvent arg0) {
-    }
+ 
 }
diff --git a/app/src/main/java/brickbreaker/MainMenu.form b/app/src/main/java/brickbreaker/MainMenu.form
new file mode 100644
index 0000000..caedbec
--- /dev/null
+++ b/app/src/main/java/brickbreaker/MainMenu.form
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.9" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+  <Properties>
+    <Property name="defaultCloseOperation" type="int" value="3"/>
+    <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+      <Color blue="ff" green="ff" red="ff" type="rgb"/>
+    </Property>
+  </Properties>
+  <SyntheticProperties>
+    <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+    <SyntheticProperty name="generateCenter" type="boolean" value="false"/>
+  </SyntheticProperties>
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="310" max="-2" attributes="0"/>
+                      <Component id="loginButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="301" max="-2" attributes="0"/>
+                      <Component id="registerButton" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="282" max="-2" attributes="0"/>
+                      <Component id="guest" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="290" max="-2" attributes="0"/>
+                      <Component id="highScore" min="-2" max="-2" attributes="0"/>
+                  </Group>
+                  <Group type="102" alignment="0" attributes="0">
+                      <EmptySpace min="-2" pref="122" max="-2" attributes="0"/>
+                      <Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
+                  </Group>
+              </Group>
+              <EmptySpace pref="143" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" alignment="1" attributes="0">
+              <EmptySpace min="-2" pref="117" max="-2" attributes="0"/>
+              <Component id="jScrollPane1" min="-2" max="-2" attributes="0"/>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="loginButton" max="-2" attributes="0"/>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="registerButton" max="-2" attributes="0"/>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="guest" max="-2" attributes="0"/>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="highScore" max="-2" attributes="0"/>
+              <EmptySpace pref="228" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JButton" name="loginButton">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="e2" green="ac" red="24" type="rgb"/>
+        </Property>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="MV Boli" size="14" style="0"/>
+        </Property>
+        <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="e2" green="ac" red="24" type="rgb"/>
+        </Property>
+        <Property name="toolTipText" type="java.lang.String" value="login"/>
+        <Property name="actionCommand" type="java.lang.String" value="Login"/>
+        <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+          <Color id="Hand Cursor"/>
+        </Property>
+        <Property name="horizontalTextPosition" type="int" value="0"/>
+        <Property name="label" type="java.lang.String" value="Login"/>
+        <Property name="opaque" type="boolean" value="false"/>
+      </Properties>
+    </Component>
+    <Component class="javax.swing.JButton" name="registerButton">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="e2" green="ac" red="24" type="rgb"/>
+        </Property>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="MV Boli" size="14" style="0"/>
+        </Property>
+        <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="ff" type="rgb"/>
+        </Property>
+        <Property name="text" type="java.lang.String" value="Register"/>
+        <Property name="actionCommand" type="java.lang.String" value="Login"/>
+        <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+          <Color id="Hand Cursor"/>
+        </Property>
+        <Property name="horizontalTextPosition" type="int" value="0"/>
+      </Properties>
+      <Events>
+        <EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="registerButtonMouseEntered"/>
+        <EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="registerButtonMouseExited"/>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="registerButtonActionPerformed"/>
+      </Events>
+    </Component>
+    <Container class="javax.swing.JScrollPane" name="jScrollPane1">
+      <AuxValues>
+        <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+      </AuxValues>
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+      <SubComponents>
+        <Component class="javax.swing.JTextPane" name="welconText">
+          <Properties>
+            <Property name="editable" type="boolean" value="false"/>
+            <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+              <Border info="null"/>
+            </Property>
+            <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+              <Font name="MV Boli" size="36" style="1"/>
+            </Property>
+            <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+              <Color blue="0" green="c0" red="ff" type="rgb"/>
+            </Property>
+            <Property name="text" type="java.lang.String" value="Welcome to Brick Breaker"/>
+            <Property name="toolTipText" type="java.lang.String" value=""/>
+            <Property name="focusable" type="boolean" value="false"/>
+            <Property name="opaque" type="boolean" value="false"/>
+          </Properties>
+        </Component>
+      </SubComponents>
+    </Container>
+    <Component class="javax.swing.JButton" name="guest">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="e2" green="ac" red="24" type="rgb"/>
+        </Property>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="MV Boli" size="14" style="0"/>
+        </Property>
+        <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="ff" type="rgb"/>
+        </Property>
+        <Property name="actionCommand" type="java.lang.String" value="play"/>
+        <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+          <Color id="Hand Cursor"/>
+        </Property>
+        <Property name="horizontalTextPosition" type="int" value="0"/>
+        <Property name="label" type="java.lang.String" value="Play as Guest"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="guestActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JButton" name="highScore">
+      <Properties>
+        <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="e2" green="ac" red="24" type="rgb"/>
+        </Property>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="MV Boli" size="14" style="0"/>
+        </Property>
+        <Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+          <Color blue="ff" green="ff" red="ff" type="rgb"/>
+        </Property>
+        <Property name="text" type="java.lang.String" value="High Scores"/>
+        <Property name="actionCommand" type="java.lang.String" value="play"/>
+        <Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor">
+          <Color id="Hand Cursor"/>
+        </Property>
+        <Property name="horizontalTextPosition" type="int" value="0"/>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="highScoreActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>
diff --git a/app/src/main/java/brickbreaker/MainMenu.java b/app/src/main/java/brickbreaker/MainMenu.java
new file mode 100644
index 0000000..05091a6
--- /dev/null
+++ b/app/src/main/java/brickbreaker/MainMenu.java
@@ -0,0 +1,177 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/GUIForms/JFrame.java to edit this template
+ */
+package brickbreaker;
+
+/**
+ *
+ * @author Suman
+ */
+public class MainMenu extends javax.swing.JFrame {
+
+    /**
+     * Creates new form MainMenu
+     */
+    public MainMenu() {
+        initComponents();
+    }
+
+    /**
+     * This method is called from within the constructor to initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is always
+     * regenerated by the Form Editor.
+     */
+    @SuppressWarnings("unchecked")
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        loginButton = new javax.swing.JButton();
+        registerButton = new javax.swing.JButton();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        welconText = new javax.swing.JTextPane();
+        guest = new javax.swing.JButton();
+        highScore = new javax.swing.JButton();
+
+        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
+        setBackground(new java.awt.Color(255, 255, 255));
+
+        loginButton.setBackground(new java.awt.Color(36, 172, 226));
+        loginButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        loginButton.setForeground(new java.awt.Color(36, 172, 226));
+        loginButton.setToolTipText("login");
+        loginButton.setActionCommand("Login");
+        loginButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        loginButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        loginButton.setLabel("Login");
+        loginButton.setOpaque(false);
+
+        registerButton.setBackground(new java.awt.Color(36, 172, 226));
+        registerButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        registerButton.setForeground(new java.awt.Color(255, 255, 255));
+        registerButton.setText("Register");
+        registerButton.setActionCommand("Login");
+        registerButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        registerButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        registerButton.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseEntered(java.awt.event.MouseEvent evt) {
+                registerButtonMouseEntered(evt);
+            }
+            public void mouseExited(java.awt.event.MouseEvent evt) {
+                registerButtonMouseExited(evt);
+            }
+        });
+        registerButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                registerButtonActionPerformed(evt);
+            }
+        });
+
+        welconText.setEditable(false);
+        welconText.setBorder(null);
+        welconText.setFont(new java.awt.Font("MV Boli", 1, 36)); // NOI18N
+        welconText.setForeground(new java.awt.Color(255, 192, 0));
+        welconText.setText("Welcome to Brick Breaker");
+        welconText.setToolTipText("");
+        welconText.setFocusable(false);
+        welconText.setOpaque(false);
+        jScrollPane1.setViewportView(welconText);
+
+        guest.setBackground(new java.awt.Color(36, 172, 226));
+        guest.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        guest.setForeground(new java.awt.Color(255, 255, 255));
+        guest.setActionCommand("play");
+        guest.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        guest.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        guest.setLabel("Play as Guest");
+        guest.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                guestActionPerformed(evt);
+            }
+        });
+
+        highScore.setBackground(new java.awt.Color(36, 172, 226));
+        highScore.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        highScore.setForeground(new java.awt.Color(255, 255, 255));
+        highScore.setText("High Scores");
+        highScore.setActionCommand("play");
+        highScore.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        highScore.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        highScore.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                highScoreActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+        getContentPane().setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(310, 310, 310)
+                        .addComponent(loginButton))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(301, 301, 301)
+                        .addComponent(registerButton))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(282, 282, 282)
+                        .addComponent(guest))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(290, 290, 290)
+                        .addComponent(highScore))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(122, 122, 122)
+                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap(143, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addGap(117, 117, 117)
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(18, 18, 18)
+                .addComponent(loginButton)
+                .addGap(18, 18, 18)
+                .addComponent(registerButton)
+                .addGap(18, 18, 18)
+                .addComponent(guest)
+                .addGap(18, 18, 18)
+                .addComponent(highScore)
+                .addContainerGap(228, Short.MAX_VALUE))
+        );
+
+        pack();
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void registerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_registerButtonActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_registerButtonActionPerformed
+
+    private void guestActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_guestActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_guestActionPerformed
+
+    private void highScoreActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_highScoreActionPerformed
+        // TODO add your handling code here:
+    }//GEN-LAST:event_highScoreActionPerformed
+
+    private void registerButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_registerButtonMouseEntered
+        // TODO add your handling code here:
+    }//GEN-LAST:event_registerButtonMouseEntered
+
+    private void registerButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_registerButtonMouseExited
+        // TODO add your handling code here:
+    }//GEN-LAST:event_registerButtonMouseExited
+
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JButton guest;
+    private javax.swing.JButton highScore;
+    private javax.swing.JScrollPane jScrollPane1;
+    private javax.swing.JButton loginButton;
+    private javax.swing.JButton registerButton;
+    private javax.swing.JTextPane welconText;
+    // End of variables declaration//GEN-END:variables
+}
diff --git a/app/src/main/java/brickbreaker/Menu.java b/app/src/main/java/brickbreaker/Menu.java
new file mode 100644
index 0000000..50abab3
--- /dev/null
+++ b/app/src/main/java/brickbreaker/Menu.java
@@ -0,0 +1,170 @@
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
+package brickbreaker;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextPane;
+
+/**
+ *
+ * @author Suman
+ */
+public class Menu extends JPanel {
+    private JButton guest;
+    private JButton highScore;
+    private JScrollPane jScrollPane1;
+    private JButton loginButton;
+    private JButton registerButton;
+    private JTextPane welconText;
+    private JFrame frame;
+    
+    public Menu(JFrame frame) {
+        this.frame = frame;
+        initComponents();
+    }
+    
+    private void initComponents() {
+        loginButton = new javax.swing.JButton();
+        registerButton = new javax.swing.JButton();
+        jScrollPane1 = new javax.swing.JScrollPane();
+        welconText = new javax.swing.JTextPane();
+        guest = new javax.swing.JButton();
+        highScore = new javax.swing.JButton();
+
+        loginButton.setBackground(new java.awt.Color(36, 172, 226));
+        loginButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        loginButton.setForeground(new java.awt.Color(36, 172, 226));
+        loginButton.setToolTipText("login");
+        loginButton.setActionCommand("Login");
+        loginButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        loginButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        loginButton.setLabel("Login");
+        loginButton.setOpaque(false);
+
+        registerButton.setBackground(new java.awt.Color(36, 172, 226));
+        registerButton.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        registerButton.setForeground(new java.awt.Color(255, 255, 255));
+        registerButton.setText("Register");
+        registerButton.setActionCommand("Login");
+        registerButton.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        registerButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        registerButton.addMouseListener(new java.awt.event.MouseAdapter() {
+            public void mouseEntered(java.awt.event.MouseEvent evt) {
+                registerButtonMouseEntered(evt);
+            }
+            public void mouseExited(java.awt.event.MouseEvent evt) {
+                registerButtonMouseExited(evt);
+            }
+        });
+        registerButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                registerButtonActionPerformed(evt);
+            }
+        });
+
+        welconText.setEditable(false);
+        welconText.setBorder(null);
+        welconText.setFont(new java.awt.Font("MV Boli", 1, 36)); // NOI18N
+        welconText.setForeground(new java.awt.Color(255, 192, 0));
+        welconText.setText("Welcome to Brick Breaker");
+        welconText.setToolTipText("");
+        welconText.setFocusable(false);
+        welconText.setOpaque(false);
+        jScrollPane1.setViewportView(welconText);
+        jScrollPane1.setBorder(BorderFactory.createEmptyBorder());
+
+        guest.setBackground(new java.awt.Color(36, 172, 226));
+        guest.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        guest.setForeground(new java.awt.Color(255, 255, 255));
+        guest.setActionCommand("play");
+        guest.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        guest.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        guest.setLabel("Play as Guest");
+        guest.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                guestActionPerformed(evt);
+            }
+        });
+
+        highScore.setBackground(new java.awt.Color(36, 172, 226));
+        highScore.setFont(new java.awt.Font("MV Boli", 0, 14)); // NOI18N
+        highScore.setForeground(new java.awt.Color(255, 255, 255));
+        highScore.setText("High Scores");
+        highScore.setActionCommand("play");
+        highScore.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
+        highScore.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
+        highScore.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                highScoreActionPerformed(evt);
+            }
+        });
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(310, 310, 310)
+                        .addComponent(loginButton))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(301, 301, 301)
+                        .addComponent(registerButton))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(282, 282, 282)
+                        .addComponent(guest))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(290, 290, 290)
+                        .addComponent(highScore))
+                    .addGroup(layout.createSequentialGroup()
+                        .addGap(122, 122, 122)
+                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                .addContainerGap(143, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+                .addGap(117, 117, 117)
+                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addGap(43, 43, 43)
+                .addComponent(loginButton)
+                .addGap(18, 18, 18)
+                .addComponent(registerButton)
+                .addGap(18, 18, 18)
+                .addComponent(guest)
+                .addGap(18, 18, 18)
+                .addComponent(highScore)
+                .addContainerGap(228, Short.MAX_VALUE))
+        );
+
+        frame.add(this);
+    }
+    
+    private void registerButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
+        // TODO add your handling code here:
+    }                                              
+
+    private void guestActionPerformed(java.awt.event.ActionEvent evt) {                                      
+        this.setVisible(false);
+        GamePanel game = new GamePanel(frame);
+    }                                     
+
+    private void highScoreActionPerformed(java.awt.event.ActionEvent evt) {                                          
+        // TODO add your handling code here:
+    }                                         
+
+    private void registerButtonMouseEntered(java.awt.event.MouseEvent evt) {                                            
+        // TODO add your handling code here:
+    }                                           
+
+    private void registerButtonMouseExited(java.awt.event.MouseEvent evt) {                                           
+        // TODO add your handling code here:
+    }                       
+}
-- 
GitLab