Java扫描程序问题(JFrame) [英] Java Scanner issues (JFrame)
问题描述
我正在尝试使用扫描仪编辑塔防游戏的等级。但是它不会将级别(平铺图像)更新为自定义文件的级别(0是草1是石头-1是什么,等等)。我发现了错误但我该如何修复它,我需要添加/更改什么来摆脱这个?
I am trying to use a scanner to edit the level of my tower defense game. However it will not update the level (the tile images) to that of the custom file (0 is grass 1 is stone -1 is nothing, etc.). I have found the error but how do i fix it, what do i need to add/change to get rid of this?
java.lang.NullPointerException
at Levels.loadLevels(Levels.java:11)
at Window.define(Window.java:28)
at Window.paintComponent(Window.java:44)
第11行: for(int y = 0; y< Window.room .block.length; y ++){
第28行: levels.loadLevels(新文件(levels / level1.level));
第44行: define();
这是扫描文件:
import java.io.*;
import java.util.*;
public class Levels {
public void loadLevels(File loadPath) {
try {
Scanner loadLevelsScanner = new Scanner(loadPath);
while(loadLevelsScanner.hasNext()) {
for(int y=0;y<Window.room.block.length;y++) {
for(int x=0;x<Window.room.block[0].length;x++) {
Window.room.block[y][x].groundID = loadLevelsScanner.nextInt();
}
}
for(int y=0;y<Window.room.block.length;y++) {
for(int x=0;x<Window.room.block[0].length;x++) {
Window.room.block[y][x].airID = loadLevelsScanner.nextInt();
}
}
}
loadLevelsScanner.close();
} catch(Exception e) {
}
}
}
这是窗口文件:
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
public class Window extends JPanel implements Runnable {
public Thread thread = new Thread(this);
public static Image[] tileset_ground = new Image[100];
public static Image[] tileset_air = new Image[100];
public static int myWidth, myHeight;
public static boolean isFirst = true;
public static Room room;
public static Levels levels;
public Window() {
thread.start();
}
public void define() {
room = new Room();
levels = new Levels();
levels.loadLevels(new File("levels/level1.level"));
for(int i=0;i<tileset_ground.length; i++) {
tileset_ground[i] = new ImageIcon("resources/tileset_ground.png").getImage();
tileset_ground[i] = createImage(new FilteredImageSource(tileset_ground[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32)));
}
for(int i=0;i<tileset_air.length; i++) {
tileset_air[i] = new ImageIcon("resources/tileset_air.png").getImage();
tileset_air[i] = createImage(new FilteredImageSource(tileset_air[i].getSource(), new CropImageFilter(0, 32 * i, 32, 32)));
}
}
public void paintComponent(Graphics g) {
if(isFirst) {
define();
isFirst = false;
}
g.clearRect(0, 0, getWidth(), getHeight());
room.draw(g);
}
public void run() {
while(true) {
if(!isFirst) {
room.physic();
}
repaint();
try {
Thread.sleep(1);
} catch(Exception e) {
}
}
}
}
这是房间文件:
import java.awt.*;
public class Room {
public int worldWidth = 40;
public int worldHeight = 20;
public int blockSize = 32;
public Block[][] block;
public Room () { }
public void define () { }
public void physic () { }
public void draw(Graphics g) {
block = new Block[worldHeight][worldWidth];
for(int y=0;y<block.length;y++) {
for(int x=0;x<block[0].length;x++) {
block[y][x] = new Block(x * blockSize, y * blockSize, blockSize, blockSize, Value.groundGrass, Value.airAir);
block[y][x].draw(g);
}
}
}
}
this是块文件:
import java.awt.*;
public class Block extends Rectangle {
public int groundID;
public int airID;
public Block(int x, int y, int width, int height, int groundID, int airID) {
setBounds(x, y, width, height);
this.groundID = groundID;
this.airID = airID;
}
public void draw(Graphics g) {
g.drawImage(Window.tileset_ground[groundID], x, y, width, height, null);
if(airID != Value.airAir) {
g.drawImage(Window.tileset_air[airID], x, y, width, height, null);
}
}
}
最后这是自定义文件扫描仪应该读取:
And lastly this is the custom file the scanner is supposed to read:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
抱歉这个愚蠢的问题,我是初学者。
sorry for the stupid question, i'm a beginner.
推荐答案
一个快速而肮脏的解决方案是,测试Window.room不为null,以及.block:
A quick-and-dirty solution is, to test for Window.room not to be null, as well as .block:
Scanner loadLevelsScanner = new Scanner (loadPath);
if ((Window.room != null) &&
(Window.room.block != null)) {
// ... block until catch block
}
一个简单的Testapp我写的作品到目前为止,如果这样做了。
A simple Testapp I've written works so far, if done so.
但是你需要了解静态是什么,以及为什么以及如何使用它。一个常见的初学者错误是,为了使编译器保持沉默而使用静态关键字。
But you need to understand what "static" is, and why and how to use it. A common beginner mistake is, to instert "static" keywords just to make the compiler silent.
调查,按顺序初始化您的类及其属性。
Investigate, in which order to initialize your classes and their attributes.
在Block中,要访问Window,您必须有一个引用。该引用可以传递给Block的ctor:
In Block, to access the Window, you have to have a reference. The reference can be passed to the ctor of Block:
class Block extends Rectangle {
public int groundID;
public int airID;
Window window;
public Block (int x, int y, int width, int height, int groundID, int airID, Window window) {
setBounds (x, y, width, height);
this.groundID = groundID;
this.airID = airID;
this.window = window;
}
public void draw (Graphics g) {
g.drawImage (window.tileset_ground [groundID], x, y, width, height, null);
if (airID != Value.airAir) {
g.drawImage (window.tileset_air [airID], x, y, width, height, null);
}
}
}
谁创建了块?这是Room,所以Room本身需要了解Window(只要你不从根本上改变你的设计)。
Who creates Blocks? It is Room, so Room itself needs to know about the Window (as long as you don't change your design fundamentally).
public Room (Window w) {
block = new Block [worldHeight] [worldWidth];
for (int y=0; y <block.length; y++) {
for (int x=0; x <block [0].length; x++) {
block [y] [x] = new Block (x * blockSize, y * blockSize, blockSize, blockSize, Value.groundGrass, Value.airAir, w);
}
}
}
创建一个块数组,初始化,块传递Window参数。
A block array is created, initialized, and the Blocks are passed the Window-parameter.
在绘制中,你不会一遍又一遍地重新创建数组,也不重新创建块,只是重绘它们:
In draw, you don't recreate the array over and over again, nor do you recreate the Blocks, but just redraw them:
public void draw (Graphics g) {
for (int y=0; y <block.length; y++) {
for (int x=0; x <block [0].length; x++) {
block [y] [x].draw (g);
}
}
}
在Window中,您创建了房间,并传递窗口参考:
In Window, you create the Room, and pass it the window-reference:
public void define () {
room = new Room (this);
levels = new Levels ();
这篇关于Java扫描程序问题(JFrame)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!