我正在尝试为这个程序制作一个重置按钮,我到处寻找,我找不到一个有效的方法。我试图在游戏结束时这样做,当你输了,你按“重新启动”游戏将从草图的开头开始。该程序工作正常但是一旦你按下Restart按钮,我在控制台区域出现NullPointerException错误,游戏不会重启。我在“if(!drop [i] .finished){”行中得到NullPointerException错误。我已经读过它与构造函数没有初始化数组有关,但它已经初始化了它。这是否与重置按钮和构造函数没有重新初始化数组有关,还是其他什么?我不知道为什么,但很少有人工作,但是所有的文字都转移到了左边,它离开了屏幕。谢谢你的帮助。
boolean button = false;
Catcher catcher;
Timer timer;
Drop[] drops;
int totalDrops = 0;
int x = 200;
int y = 100;
int w = 150;
int h = 60;
// Is the game over?
boolean gameOver = false;
// Variables for score level lives and level counter
int score = 0;
int level = 1;
int lives = 10; //10 lives per level, resets at next level
int levelCounter = 0;
PFont f;
void reset() {
score = 0;
level = 1;
levelCounter = 0;
lives = 10;
timer.setTime(constrain(300-level*25,0,300));
totalDrops = 0;
gameOver = false;
button = false;
}
void setup() {
size(400,400);
smooth();
catcher = new Catcher(32);
drops = new Drop[50];
timer = new Timer(300);
timer.start();
gameOver = false;
finished = false;
level = 1;
score = 0;
f = createFont("Arial",12,true);
}
void draw() {
background(255);
// If the game is over
rectMode (CENTER);
if (gameOver) {
textFont(f,48);
textAlign(CENTER);
fill(0);
text("GAME OVER",width/2,height/2);
textFont(f,24);
text("Your score was "+ score,200,225);
textFont(f,16);
text("You reached level "+ level,200,245);
fill(255);
stroke(0);
rect(200,100,150,60);
stroke(255);
fill(0);
textFont(f,20);
text("Restart",200,107);
}
else {
// Set catcher location
catcher.setLocation(mouseX,mouseY);
catcher.display();
// Check the timer
if (timer.isFinished()) {
if (totalDrops < drops.length) {
drops[totalDrops] = new Drop();
totalDrops++;
}
timer.start();
}
// Move and display all drops
for (int i = 0; i < totalDrops; i++ ) {
if (!drops[i].finished) {
drops[i].move();
drops[i].display();
if (drops[i].reachedBottom()) {
levelCounter++;
drops[i].finished();
// If the drop reaches the bottom a live is lost and you lose 5 points
lives--;
score=score-5;
// If lives reach 0 the game is over
if (lives <= 0) {
gameOver = true;
}
}
// Everytime you catch a drop, the score goes up
if (catcher.intersect(drops[i])) {
drops[i].finished();
levelCounter++;
score=score+10;
}
}
}
// If all the drops are done, that level is over!
if (levelCounter >= drops.length) {
// Go up a level
level++;
// Reset all game elements
levelCounter = 0;
lives = 10;
timer.setTime(constrain(300-level*25,0,300));
totalDrops = 0;
}
// Display number of lives left
rectMode(CORNER);
textFont(f,14);
fill(0);
text("Lives left: " + lives,10,20);
rect(10,24,lives*10,10);
text("Level: " + level,300,20);
text("Score: " + score,300,40);
}
if (mousePressed) {
if (mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h && gameOver == true){
setup();
}
}
println();
}
//----------------------Drop Class-----------------------------
class Drop {
float x,y;
float speed;
color c;
float r;
//Is the drop used?
boolean finished = false;
Drop() {
r = 8;
x = random(width);
y = -r*4;
speed = random(2,5);
c = color(random(255),random(255),random(255));
}
void move() {
y += speed;
}
// Check if it hits the bottom
boolean reachedBottom() {
// If it passes the bottom
if (y > height + r*4) {
return true;
}
else {
return false;
}
}
void display() {
fill(c);
noStroke();
for (int i = 2; i < r; i++ ) {
ellipse(x,y + i*4,i*2,i*2);
}
}
// If the drop is caught
void finished() {
finished = true;
}
}
这是堆栈跟踪:
Exception in thread "Animation Thread" java.lang.NullPointerException
at Raindrop_Catcher.draw(Raindrop_Catcher.java:113)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)
答案 0 :(得分:1)
看起来你只是用if语句中的对象填充数组drops
:
// Check the timer
if (timer.isFinished()) {
if (totalDrops < drops.length) {
drops[totalDrops] = new Drop();
totalDrops++;
}
timer.start();
}
因此,如果if语句的计算结果为false,则数组仍然填充空值,从而导致NullPointerException
。在尝试使用它们之前,请确保该数组包含对象。
在你的setup方法中,添加它以确保你的数组填充了非空值:
for (int i = 0; i < drops.length; i++)
{
drops[i] = new Drop();
}