Ask Me Help Desk

Ask Me Help Desk (https://www.askmehelpdesk.com/forum.php)
-   Java (https://www.askmehelpdesk.com/forumdisplay.php?f=440)
-   -   How to open one Jframe from main method call (https://www.askmehelpdesk.com/showthread.php?t=768985)

  • Sep 27, 2013, 05:28 AM
    ankushpruthi
    How to open one Jframe from main method call
    I have downloaded a snake game project in java. Initially the project contains three java files i.e "

    Engine.java

    Snake.java

    GameBoard.java

    And Engine.java have the main() method, when i run this Engine.java class game starts running.

    And to improve the user iteractivity i have created two JFrames :"PlayGame.java", Rules.java

    Now this project having five java classes in this project-

    Engine.java(containing main() method)
    Snake.java
    GameBoard.java
    PlayGame.java(is a JFrame)
    Rules.java(is a JFrame)

    PlayGame.java have three buttons

    Play - i want when play button getclicked snake game start/run.
    Rules - when clicked Rules.java Jframe should be opened
    Exit - exits the application

    Now what i want is at first "PlayGame.java" JFrame should appear and throw this game should start i.e when I click play button game should start But problem I am facing on running theapplication 'PlayGame.java' Jframe displaying on the window but when I click 'play button' SnakeFrame appears but snake is not moving. So please give me solution so that I can make project in running state.

    For better understandability of the prolem I am attachig some code in my question

    Main() method code:

    Code:

    public static void main(String[] args)  {
                    new PlayGame().setVisible(true);
     
                    /**JFrame frame = new JFrame("SnakeGame");
                    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                    frame.setResizable(false);
     
                    Canvas canvas = new Canvas();
                    canvas.setBackground(Color.black);
                    canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
     
                    frame.getContentPane().add(canvas);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
     
                    new Engine(canvas).startGame();*/
     
     
                }

    ActionPerformed() method of Play Button

    Code:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
     
                    JFrame frame = new JFrame("SnakeGame");
                    frame.setVisible(true);
                    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                    frame.setResizable(true);
                    Canvas canvas = new Canvas();
                    canvas.setBackground(Color.black);
                    canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
     
                    frame.getContentPane().add(canvas);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                    new Engine(canvas).startGame();
        }

    And also I am attaching two classes which are major I this project or which involve the functioning of snake game

    First is Engie.java

    Code:

    package org.psnbtech;

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.RenderingHints;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import javax.swing.JFrame;
    import org.psnbtech.GameBoard.TileType;
    import org.psnbtech.Snake.Direction;


    public class Engine extends KeyAdapter {

            private static final int UPDATES_PER_SECOND = 15;
           
            private static final Font FONT_SMALL = new Font("Arial", Font.BOLD, 20);
           
            private static final Font FONT_LARGE = new Font("Arial", Font.BOLD, 40);
                   
            public Canvas canvas;
           
            public GameBoard board;
           
            public Snake snake;
           
            public int score;
           
            public boolean gameOver;
         
                                   
            public Engine(Canvas canvas) {
                    this.canvas = canvas;
                    this.board = new GameBoard();
                    this.snake = new Snake(board);
                   
                    resetGame();
                   
                    canvas.addKeyListener(this);
                    //new Engine(canvas).startGame();
            }

           
            public void startGame() {
                    canvas.createBufferStrategy(2);
                   
                    Graphics2D g = (Graphics2D)canvas.getBufferStrategy().getDrawGraphics();
                    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                   
                    long start = 0L;
                    long sleepDuration = 0L;
                    while(true) {
                            start = System.currentTimeMillis();

                            update();
                            render(g);

                            canvas.getBufferStrategy().show();

                            g.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
                           
                            sleepDuration = (1500L / UPDATES_PER_SECOND) - (System.currentTimeMillis() - start);

                            if(sleepDuration > 0) {
                                    try {
                                            Thread.sleep(sleepDuration);
                                    } catch(Exception e) {
                                        e.printStackTrace();
                                    }
                            }
                    }
            }
               
            public void update() {
                    if(gameOver || !canvas.isFocusable()) {
                            return;
                    }
                    TileType snakeTile = snake.updateSnake();
                    if(snakeTile == null || snakeTile.equals(TileType.SNAKE)) {
                            gameOver = true;
                    } else if(snakeTile.equals(TileType.FRUIT)) {
                            score += 10;
                            spawnFruit();
                    }
            }
           
            public void render(Graphics2D g) {
                    board.draw(g);
                   
                    g.setColor(Color.WHITE);
                   
                    if(gameOver) {
                            g.setFont(FONT_LARGE);
                            String message = new String("Your Score: " + score);
                            g.drawString(message, canvas.getWidth() / 2 - (g.getFontMetrics().stringWidth(message) / 2), 250);
                           
                            g.setFont(FONT_SMALL);
                            message = new String("Press Enter to Restart the Game");
                            g.drawString(message, canvas.getWidth() / 2 - (g.getFontMetrics().stringWidth(message) / 2), 350);
                    } else {
                            g.setFont(FONT_SMALL);
                            g.drawString("Score:" + score, 10, 20);
                    }
            }
           
            public void resetGame() {
                    board.resetBoard();
                    snake.resetSnake();
                    score = 0;
                    gameOver = false;
                    spawnFruit();
            }
           
            public void spawnFruit() {
                    int random = (int)(Math.random() * ((GameBoard.MAP_SIZE * GameBoard.MAP_SIZE) - snake.getSnakeLength())); // if '*' replace by '/' then only one fruit is there for snake
                   
                    int emptyFound = 0;
                    int index = 0;
                    while(emptyFound < random) {
                            index++;
                            if(board.getTile(index % GameBoard.MAP_SIZE, index / GameBoard.MAP_SIZE).equals(TileType.EMPTY)) { // if '/' replaced by '*' then nothing displays on the board
                                    emptyFound++;
                            }
                    }
                    board.setTile(index % GameBoard.MAP_SIZE, index / GameBoard.MAP_SIZE, TileType.FRUIT); // it also show nothing when replacing '/' by '/'
            }
           
            @Override
            public void keyPressed(KeyEvent e) {
                    if((e.getKeyCode() == KeyEvent.VK_UP)||(e.getKeyCode() == KeyEvent.VK_W)) {
                            snake.setDirection(Direction.UP);
                    }
                    if((e.getKeyCode() == KeyEvent.VK_DOWN)||(e.getKeyCode() == KeyEvent.VK_S)) {
                            snake.setDirection(Direction.DOWN);
                    }
                    if((e.getKeyCode() == KeyEvent.VK_LEFT)||(e.getKeyCode() == KeyEvent.VK_A)) {
                            snake.setDirection(Direction.LEFT);
                    }
                    if((e.getKeyCode() == KeyEvent.VK_RIGHT)||(e.getKeyCode() == KeyEvent.VK_D)) {
                            snake.setDirection(Direction.RIGHT);
                    }
                    if(e.getKeyCode() == KeyEvent.VK_ENTER && gameOver) {
                            resetGame();
                    }
            }
           
                public static void main(String[] args)  {
                    new PlayGame().setVisible(true);
                 
                    /**JFrame frame = new JFrame("SnakeGame");
                    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
                    frame.setResizable(false);
                   
                    Canvas canvas = new Canvas();
                    canvas.setBackground(Color.black);
                    canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE * GameBoard.TILE_SIZE, GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
                   
                    frame.getContentPane().add(canvas);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                   
                    new Engine(canvas).startGame();*/
     
                   
                }       
    }

    Second is PlayGame.java

    Code:


    package org.psnbtech;

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Dimension;
    import javax.swing.JFrame;


    public class PlayGame extends javax.swing.JDialog {

     
        public PlayGame(java.awt.Frame parent, boolean modal) {
            super(parent, modal);
            initComponents();
        }
     public PlayGame() {
            initComponents();
         
        }
       
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        private void initComponents() {

            jButton1 = new javax.swing.JButton();
            jButton2 = new javax.swing.JButton();
            jButton3 = new javax.swing.JButton();

            setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

            jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/play.png"))); // NOI18N
            jButton1.setText("Play");
            jButton1.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton1ActionPerformed(evt);
                }
            });

            jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/GUID-4ED364DF-2D44-40F5-9F05-31D451F15EF1-low.png"))); // NOI18N
            jButton2.setText("Rules");
            jButton2.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton2ActionPerformed(evt);
                }
            });

            jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/exit.png"))); // NOI18N
            jButton3.setText("Exit");
            jButton3.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jButton3ActionPerformed(evt);
                }
            });

            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                    .addContainerGap(223, Short.MAX_VALUE)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGap(74, 74, 74))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(45, 45, 45)
                    .addComponent(jButton1)
                    .addGap(40, 40, 40)
                    .addComponent(jButton2)
                    .addGap(40, 40, 40)
                    .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(53, Short.MAX_VALUE))
            );

            pack();
        }// </editor-fold>                       

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
        JFrame frame = new JFrame("SnakeGame");
        frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        frame.setResizable(false);
     
        Canvas canvas = new Canvas();
        canvas.setBackground(Color.black);
        canvas.setPreferredSize(new Dimension(GameBoard.MAP_SIZE *GameBoard.TILE_SIZE,GameBoard.MAP_SIZE * GameBoard.TILE_SIZE));
     
        frame.add(canvas);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
     
        new Engine(canvas).startGame();
       
        }                                       

        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                       
                    this.dispose();
                    new RulesDialog().setVisible(true);
        }                                       

        private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                       
                    System.exit(0);
        }                                       

       
     
        // Variables declaration - do not modify                   
        private javax.swing.JButton jButton1;
        private javax.swing.JButton jButton2;
        private javax.swing.JButton jButton3;
        // End of variables declaration                 
    }

    Please suggest me with some solution so that it would be helpful to me in order to complete the game

  • All times are GMT -7. The time now is 05:08 AM.