如何用Java重新启动游戏
我正在写一个类似游戏的东西,我在重新启动游戏时遇到了问题 当飞船坠毁时,我想让它能够按空格键重新启动游戏 问题是我把一切都画在了JPanel上。如何用Java重新启动游戏,java,swing,Java,Swing,我正在写一个类似游戏的东西,我在重新启动游戏时遇到了问题 当飞船坠毁时,我想让它能够按空格键重新启动游戏 问题是我把一切都画在了JPanel上。 我的研究: 当我试图将一个游戏对象传递给Panel类并处理最后一个窗口时,出现了一个NullPointerException private void restart() { game.dispose(); new Game(); repaint(); } 我认为这是调用构造函数的问题。。但是我不确定 当我尝试重新初始化JP
我的研究:
- 当我试图将一个游戏对象传递给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时,它根本不起作用。。。当我按空格键时,试图打印出字符串,但什么也没发生
/*
* 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);
敌人:敌人