2013-09-24 4 views
-1

Я загрузил проект игры с змеей в java и попытаюсь изменить его. Первоначально проект содержит три java-файла i.e «Engine.jav a», «Snake.java», «GameBoard.java». И у Engine.java есть метод main(), и когда я запускаю эту игру класса Engine.java, она начинает работать.Как открыть один Jframe из основного вызова метода

Для улучшения iteractivity пользователя к проекту я создал два JFrames: «PlayGame.java», Rules.java

Теперь этот проект, имеющий пять классов Java -

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 get clicked snake game start/run. 
Rules - when clicked Rules.java Jframe should be opened 
Exit - exits the application 

Теперь то, что я хочу в первый " PlayGame.java «JFrame должен появиться (и это появляется в качестве основного выхода игрового проекта) и бросить эту игру следует начинать, то есть, когда я нажимаю кнопку воспроизведения от PlayGame JFrame, игра должна начинаться Проблема, с которой я столкнулся, - это когда я нажимаю кнопку play то gamescreen появляется на окне, но snake is not moving.

Вот код, который я включил в actionPerformed() метод Play button

 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(); 
}   

, а также я хочу показать код startGame() метода, который находится в Engine.java классе

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(); 
      } 
     } 
    } 
} 

Вот и я прилагаю класс Engine.java и PlayGame.java в моем вопросе для лучшего понимания проблемы

Engine.java

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.isFocusOwner()) { 
      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();*/ 


      }   
} 

PlayGame.java

package org.psnbtech; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 


import javax.swing.JFrame; 


public class PlayGame extends javax.swing.JFrame { 



    public PlayGame() { 

     initComponents();  
    } 


    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

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

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/psnbtech/GUID-4ED364DF-2D44-40F5-9F05-31D451F15EF1-low.png"))); // NOI18N 
     jButton2.setText("Rules"); 
     jButton2.setMaximumSize(new java.awt.Dimension(89, 39)); 
     jButton2.setMinimumSize(new java.awt.Dimension(89, 39)); 
     jButton2.setPreferredSize(new java.awt.Dimension(89, 41)); 
     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 (1).png"))); // NOI18N 
     jButton3.setText("Exit"); 
     jButton3.setPreferredSize(new java.awt.Dimension(89, 41)); 
     jButton3.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton3ActionPerformed(evt); 
      } 
     }); 

     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); 
      } 
     }); 

     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); 
     jPanel1.setLayout(jPanel1Layout); 
     jPanel1Layout.setHorizontalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 
       .addContainerGap(277, Short.MAX_VALUE) 
       .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(jPanel1Layout.createSequentialGroup() 
         .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addContainerGap()) 
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 
         .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
          .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGap(27, 27, 27)))) 
     ); 
     jPanel1Layout.setVerticalGroup(
      jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() 
       .addGap(40, 40, 40) 
       .addComponent(jButton1) 
       .addGap(35, 35, 35) 
       .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addGap(27, 27, 27) 
       .addComponent(jButton3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addContainerGap(75, Short.MAX_VALUE)) 
     ); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
     ); 

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

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

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           

     this.dispose(); 
     new Rules().setVisible(true); 

    }           



    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)); 
       //canvas.addKeyListener((KeyListener) this); 
       frame.getContentPane().add(canvas); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
       new Engine(canvas).startGame(); 
    }           


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

Возможный дубликат [когда я нажимаю JButton, я хочу, чтобы эта игра начиналась] (http: // stackoverflow.com/questions/18956965/when-i-click-jbutton-i-want-that-game-should-start) – rebeliagamer

ответ

2

Тахт происходит потому, что вы называете

new PlayGame().setVisible(true); 

и

frame.setVisible(true); 

Показать только первый кадр и нажать кнопку на втором.

Рекомендуемый подход состоит в том, чтобы использовать только один кадр всегда, но несколько панелей 1. где игра отображается и 2. панель параметров. Поменяйте их, например. используя CardLayout.

Также не используют CanvasJPanel вместо этого переопределяют paintComponent() метод.

+0

thats ok. теперь скажите мне, хочу ли я отображать игровой кадр на экране при нажатии кнопки воспроизведения. для этой цели, какой код я должен добавить в actionPerformed() метод кнопки воспроизведения. Я тот же код, который присутствует в основном() методе класса Engine.java, или –

+0

Это может быть тот же код. Или, если вы хотите повторно использовать фрейм (создать один раз), вы можете сохранить ференцию в фрейме и просто сделать его видимым при щелчке – StanislavL

+0

точно, я использую тот же код в методе actionPerformed(), но проблема связана с тем, что змея не движется и также выход игрового фрейма висит –

0

Попробуйте follwing:

JFrameAdd ja = new JFrameAdd(); 
ja.setVisible(true); 
ja.setLocationRelativeTo(null); 

Надеется, что это поможет!

Смежные вопросы