如何用Java重新启动游戏

如何用Java重新启动游戏,java,swing,Java,Swing,我正在写一个类似游戏的东西,我在重新启动游戏时遇到了问题 当飞船坠毁时,我想让它能够按空格键重新启动游戏 问题是我把一切都画在了JPanel上。 我的研究: 当我试图将一个游戏对象传递给Panel类并处理最后一个窗口时,出现了一个NullPointerException private void restart() { game.dispose(); new Game(); repaint(); } 我认为这是调用构造函数的问题。。但是我不确定 当我尝试重新初始化JP

我正在写一个类似游戏的东西,我在重新启动游戏时遇到了问题

当飞船坠毁时,我想让它能够按空格键重新启动游戏

问题是我把一切都画在了JPanel上。

我的研究:

  • 当我试图将一个游戏对象传递给Panel类并处理最后一个窗口时,出现了一个NullPointerException

    private void restart()
    {
        game.dispose();
        new Game();
        repaint();
    }
    
    我认为这是调用构造函数的问题。。但是我不确定

  • 当我尝试重新初始化JPanel时,它只会重新绘制所有内容,但不会删除旧内容

    private void initBoard() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.PINK);
        setLayout(new GridBagLayout());
        craft = new Craft(ICRAFT_X, ICRAFT_Y);
    
        setMinimumSize(new Dimension(WIDTH, HEIGHT));
        initEnemiesAndAddThem();
        czas = new Timer(delay, this);
        czas.start();
    
    }
    
    private void initEnemiesAndAddThem() {
        enemy = new EnemyJet(0, -600);
        enemies.add(enemy);
        fuel = new Fuel(0, 0);
        fuels.add(fuel);
        obstacle = new Obstacle(0, -600);
        obst.add(obstacle);
    }
    private void restart()
    {
        initBoard();
    }
    
  • 最后,当我尝试将KeyListener实现到JFrame时,它根本不起作用。。。当我按空格键时,试图打印出字符串,但什么也没发生

我所能做的就是停止计时器并重新启动它,但它会暂停游戏,但不会重新启动

这些是JFrame类和JPanel类:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package riverraid2;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 *
 * @author Michał
 */
public class Game extends JFrame implements KeyListener {

    private final static int WIDTH = 1024;
    private final static int HEIGHT = 768;
    Plansza panel;

    Game() {
        initGame();
    }

    private void initGame() {
        Plansza panel = new Plansza();
        setTitle("Reeevah Raaid");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(WIDTH, HEIGHT);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setMinimumSize(new Dimension(800, 600));
        setMaximumSize(new Dimension(1680, 1050));
        setLocationRelativeTo(null);

        // panel.setState(new StartScreen(panel));
        this.add(panel, BorderLayout.CENTER);

        pack();
        setVisible(true);
        //setExtendedState(JFrame.MAXIMIZED_BOTH);
        //setResizable(false);
    }

    public static void main(String[] args) {

        new Game();
        //ex.setVisible(true);
        // ex.pack();

    }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
     public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            System.out.print("Spacja!");
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package riverraid2;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.AffineTransform;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.JLabel;

/**
 *
 * @author Michał
 */
public class Plansza extends JPanel implements ActionListener {
    private boolean paused = false;
    private int ileWcisniec = 0;
    private int slowDownSally = 0;
    private int finalScore = 1;
    private Game game;
    private Timer czas;
    private Thread thread;
    private Craft craft;
    private Fuel fuel;
    private Obstacle obstacle;
    private EnemyJet enemy;
    private final int delay = 10;
    private final int ICRAFT_X = 450;
    private final int ICRAFT_Y = 600;
    private final ArrayList<Fuel> fuels = new ArrayList<>();
    private final ArrayList<EnemyJet> enemies = new ArrayList<>();
    private final ArrayList<Obstacle> obst = new ArrayList<>();
    boolean running = true;
    long licznik = System.nanoTime();

    public Plansza() {
        // setBackground(Color.WHITE);
        initBoard();
    }

    private void initBoard() {
        addKeyListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.PINK);
        setLayout(new GridBagLayout());
        craft = new Craft(ICRAFT_X, ICRAFT_Y);

        setMinimumSize(new Dimension(WIDTH, HEIGHT));
        initEnemiesAndAddThem();
        czas = new Timer(delay, this);
        czas.start();

    }

    private void initEnemiesAndAddThem() {
        enemy = new EnemyJet(0, -600);
        enemies.add(enemy);
        fuel = new Fuel(0, 0);
        fuels.add(fuel);
        obstacle = new Obstacle(0, -600);
        obst.add(obstacle);
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        doDrawing(g);
        if (!running) {
            drawGameOver(g, "");
            g.drawString("Press SPACE to restart the game!", getWidth()/4, getHeight()/2);
        }
        Toolkit.getDefaultToolkit().sync();
    }

    private void doDrawing(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        drawStrings(g2);

        ArrayList ms = craft.getMissiles();

        for (Object m1 : ms) {
            Missile m = (Missile) m1;
            g2.drawImage(m.getImage(), m.getX(), m.getY(), this);
        }
        g2.drawImage(craft.getImage(), craft.getX(), craft.getY(), this);
        for (EnemyJet enemy : enemies) {
            g2.drawImage(enemy.getImage(), enemy.getX(), enemy.getY(), this);
        }
        for (Fuel fuel : fuels) {
            g2.drawImage(fuel.getImage(), fuel.getX(), fuel.getY(), fuel.getHeight(), fuel.getHeight(), this);
        }
        for (Obstacle o : obst) {
            g2.drawImage(o.getImage(), o.getX(), o.getY(), this);
        }
        drawStrings(g2);

    }

    private void drawGameOver(Graphics g, String msg) {
        Font small = new Font("Helvetica", Font.BOLD, 36);
        FontMetrics fm = getFontMetrics(small);

        g.setColor(Color.white);
        g.setFont(small);
        g.drawString("GAME OVER", getWidth()/4, (getHeight()/2)-50);
        g.drawString(msg, (1024 - fm.stringWidth(msg)) / 2,
                800 / 2);
    }

    public void drawStrings(Graphics2D g) {
        String score;
        String fuelString;
        score = "Score: " + finalScore;
        g.setColor(Color.WHITE);
        g.setFont(new Font("Consolas", Font.PLAIN, 48));
        g.drawString(score, 150, 48);
        fuelString = "Fuel: " + craft.getFuel();
        g.drawString(fuelString, 650, 48);
    }

    public String gameOver() {
        String msg = "";
        if (craft.getFuel() <= 0) {
            running = false;
            msg = "Zabrakło ci paliwa!";
        }
        if (finalScore == 1000000) {
            running = false;
            msg = "Gra ukończona, jesteś mistrzem River Raid, oto Twój medal Mistrza River Raid";
        }
        return msg;
    }
    private void restart()
    {
        initBoard();
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        removeAll();
        gameRunning();
        updateMissiles();
        updateCraft();
        updateEnemy();
        updateFuel();
        updateObstacles();
        checkCollision();
        gameOver();
        if (slowDownSally % 100 == 0) {
            updateArrays();
        }
        if (finalScore % 2000 == 0) {
            levelUpJets();
        }
        repaint();
        slowDownSally++;
    }
    public boolean gameState()
    {
       return running;
    }
    private void updateMissiles() {

        ArrayList ms = craft.getMissiles();

        for (int i = 0; i < ms.size(); i++) {

            Missile m = (Missile) ms.get(i);

            if (m.isVisible()) {

                m.move();
            } else {
                ms.remove(i);
            }
        }
    }

    private void updateArrays() {
        EnemyJet e = new EnemyJet(0, -600);
        enemies.add(e);
        Fuel f = new Fuel(0, -500);
        fuels.add(f);
        Obstacle o = new Obstacle(0, -600);
        obst.add(o);
    }

    private void updateEnemy() {

        for (int i = 0; i < enemies.size(); i++) {

            EnemyJet e = enemies.get(i);

            if (e.isVisible()) {

                e.move();
            } else {
                enemies.remove(i);
            }
        }
    }

    private void updateFuel() {
        for (int i = 0; i < fuels.size(); i++) {

            Fuel e = fuels.get(i);

            if (e.isVisible()) {
                e.move();
            } else {
                fuels.remove(i);
            }
        }
    }

    private void updateObstacles() {
        for (int i = 0; i < obst.size(); i++) {

            Obstacle o = obst.get(i);

            if (o.isVisible()) {
                o.move();
            } else {
                obst.remove(i);
            }
        }
    }

    private void updateCraft() {

        craft.move();
    }

    public void gameRunning() {
        if (running == false) {
            czas.stop();
        }
    }

    void checkCollision() {
        Rectangle r3 = craft.getBounds();

        for (EnemyJet enemy : enemies) {
            Rectangle r2 = enemy.getBounds();

            if (r3.intersects(r2)) {
                craft.setVisible(false);
                enemy.setVisible(false);
                running = false;
            }
        }

        ArrayList<Missile> ms = craft.getMissiles();

        for (Missile m : ms) {

            Rectangle r1 = m.getBounds();

            for (EnemyJet enemy : enemies) {

                Rectangle r2 = enemy.getBounds();

                if (r1.intersects(r2)) {
                    m.setVisible(false);
                    enemy.setVisible(false);
                    enemy.vis = false;
                    finalScore += 100;
                }
            }
        }

        for (Fuel fuel : fuels) {
            Rectangle r4 = fuel.getBounds();
            if (r3.intersects(r4)) {
                craft.addFuel(50);
                fuel.setVisible(false);
            }
        }
        for (Obstacle o : obst) {
            Rectangle r5 = o.getBounds();
            for (Missile m : ms) {

                Rectangle r1 = m.getBounds();
                if (r1.intersects(r5)) {
                    m.setVisible(false);
                }
            }
            if(r5.intersects(r3))
            {
                running = false;
            }
        }
    }

    private void levelUpJets() {
        for (EnemyJet e : enemies) {
            e.levelUp();
        }
    }

    private class TAdapter extends KeyAdapter {

        @Override
        public void keyReleased(KeyEvent e) {
            craft.keyReleased(e);

        }

        @Override
        public void keyPressed(KeyEvent e) {
           craft.keyPressed(e);    
           restart();
        }
    }
}
/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
包2;
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入javax.swing.BoxLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
/**
*
*@作者Michał
*/
公共类游戏扩展JFrame实现KeyListener{
私有最终静态整数宽度=1024;
专用最终静态内部高度=768;
Plansza小组;
游戏(){
initGame();
}
私人游戏(){
Plansza面板=新的Plansza();
片名(“Reeevah Raaid”);
setDefaultCloseOperation(关闭时退出);
设置尺寸(宽度、高度);
setPreferredSize(新尺寸(宽度、高度));
设置最小尺寸(新尺寸(800600));
setMaximumSize(新尺寸(16801050));
setLocationRelativeTo(空);
//面板设置状态(新开始屏幕(面板));
添加(面板、边框布局、中心);
包装();
setVisible(真);
//setExtendedState(JFrame.MAXIMIZED_两者);
//可设置大小(假);
}
公共静态void main(字符串[]args){
新游戏();
//例如,setVisible(真);
//例如包装();
}
@凌驾
public void keyTyped(KeyEvent e){
抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
@凌驾
按下公共无效键(按键事件e){
if(例如getKeyCode()==KeyEvent.VK_空间){
系统输出打印(“Spacja!”);
}
}
@凌驾
公共无效密钥已释放(密钥事件e){
抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
}
}
/*
*要更改此许可证标题,请在“项目属性”中选择“许可证标题”。
*要更改此模板文件,请选择工具|模板
*然后在编辑器中打开模板。
*/
包2;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.GridBagLayout;
导入java.awt.Rectangle;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.KeyAdapter;
导入java.awt.event.KeyEvent;
导入java.awt.geom.AffineTransform;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入java.util.ArrayList;
导入javax.swing.Icon;
导入javax.swing.JLabel;
/**
*
*@作者Michał
*/
公共类Plansza扩展JPanel实现ActionListener{
private=false;
private int-ileWcisniec=0;
private int slowDownSally=0;
private int finalScore=1;
私人游戏;
私人定时器;
私有线程;
私人工艺品;
私人燃料;
私人障碍;
私人敌机;
私人最终整数延迟=10;
私人最终int ICRAFT_X=450;
私人最终int ICRAFT_Y=600;
私有最终ArrayList燃料=新ArrayList();
私有最终ArrayList=新ArrayList();
private final ArrayList obst=new ArrayList();
布尔运行=真;
long-licznik=System.nanoTime();
公共计划(a){
//挫折地面(颜色:白色);
initBoard();
}
私人董事会(){
addKeyListener(新的TAdapter());
设置聚焦(真);
挫折背景(颜色:粉红色);
setLayout(新的GridBagLayout());
工艺=新工艺(ICRAFT_X,ICRAFT_Y);
设置最小尺寸(新尺寸(宽度、高度));
initenemies和addthem();
czas=新定时器(延迟,此);
czas.start();
}
私有void initenemies和addthem(){
敌人=新的敌机(0,-600);
敌人。添加(敌人);
燃料=新燃料(0,0);
燃料。添加(燃料);
障碍物=新障碍物(0,-600);
增加障碍物;
}
@凌驾
公共组件(图形g){
超级组件(g);
doDrawing(g);
如果(!正在运行){
提款权(g,“”);
g、 抽绳(“按空格键重新启动游戏!”,getWidth()/4,getHeight()/2);
}
getDefaultToolkit().sync();
}
私人空间绘制(图g){
图形2d g2=(图形2d)g;
拉丝(g2);
ArrayList ms=craft.get飞弹();
用于(对象m1:ms){
导弹m=(导弹)m1;
g2.drawImage(m.getImage(),m.getX(),m.getY(),this);
}
g2.drawImage(craft.getImage(),craft.getX(),craft.getY(),this);
敌人:敌人