Java滑动冲突检测空指针异常
我正在尝试制作一个基本的自上而下的射击游戏,但是我的敌人的繁殖有点困难。我已经设法使生成正确工作,但是当尝试添加碰撞矩形时,在初始化它时,它希望变成静态的,如果我使它成为静态的,那么它希望X和Y变成静态的,这不是一个选项 我有一个player类,它表示可播放的角色,矩形在该类中运行良好,因此我假设它与类实例有关Java滑动冲突检测空指针异常,java,static,nullpointerexception,collision-detection,slick,Java,Static,Nullpointerexception,Collision Detection,Slick,我正在尝试制作一个基本的自上而下的射击游戏,但是我的敌人的繁殖有点困难。我已经设法使生成正确工作,但是当尝试添加碰撞矩形时,在初始化它时,它希望变成静态的,如果我使它成为静态的,那么它希望X和Y变成静态的,这不是一个选项 我有一个player类,它表示可播放的角色,矩形在该类中运行良好,因此我假设它与类实例有关 package com.space.shooter; import org.newdawn.slick.GameContainer; import org.newdawn.slick.
package com.space.shooter;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;
public class Enemy extends Entity{
int carPosX;
float carPosY;
static Rectangle enemyCollisionBox;
static Image car;
Enemy(int x, int y) {
super(x, y);
carPosX = x;
carPosY = y;
}
static void init () throws SlickException{
car = new Image ("src/data/Car.png");
enemyCollisionBox = new Rectangle(carPosX, -36, car.getWidth(), car.getHeight());
}
boolean isDestroyed(){
if (carPosY > Engine.height){
return true;
}
return false;
}
static void spawn(int x) throws SlickException{
switch (x){
case (0):
x = Engine.width/2-40;
break;
case (1):
x = Engine.width/2-10;
break;
case (2):
x = Engine.width/2+20;
break;
}
Play.enemies.add(new Enemy(x, -36));
//System.out.println(Play.enemies.size());
init();
}
void update (GameContainer gc){
Input input = gc.getInput();
if (input.isKeyDown(Input.KEY_SPACE)){
carPosY += 6 + (1 * Play.level);
} else {
carPosY += 0.95 + (1 * Play.level); // was 0.95;
}
}
void render(GameContainer gc, Graphics g){
g.drawImage(car, carPosX, carPosY);
}
}
请不要太苛刻地评判我的代码,这是我第一次尝试一个完整的游戏,加上我一直在添加代码出于绝望,它变得有点混乱。在这篇文章中,我不得不在最后一分钟对代码进行一些修改,所以可能有点不正确
我想不出矩形问题的解决方案是什么
谢谢我会将您的init方法的内容更改为这样工作
package com.space.shooter;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Rectangle;
public class Enemy extends Entity{
int carPosX;
float carPosY;
Rectangle enemyCollisionBox;
static Image car=null;
Enemy(int x, int y) {
super(x, y);
carPosX = x;
carPosY = y;
enemyCollisionBox = new Rectangle(carPosX, -36, car.getWidth(), car.getHeight());
}
static void init () throws SlickException{
if(car==null)car = new Image ("src/data/Car.png");
}
boolean isDestroyed(){
if (carPosY > Engine.height){
return true;
}
return false;
}
static void spawn(int x) throws SlickException{
switch (x){
case (0):
x = Engine.width/2-40;
break;
case (1):
x = Engine.width/2-10;
break;
case (2):
x = Engine.width/2+20;
break;
}
init();
Play.enemies.add(new Enemy(x, -36));
//System.out.println(Play.enemies.size());
}
void update (GameContainer gc){
Input input = gc.getInput();
if (input.isKeyDown(Input.KEY_SPACE)){
carPosY += 6 + (1 * Play.level);
} else {
carPosY += 0.95 + (1 * Play.level); // was 0.95;
}
}
void render(GameContainer gc, Graphics g){
g.drawImage(car, carPosX, carPosY);
}
}
这将解决冲突框必须是静态的问题,但是您尚未提供有关NullPointerException
的任何详细信息。我还添加了一个检查,以防止每次创建新敌人时重新加载汽车Image
。如果你有很多资源,你应该在游戏开始前预装它们
更好地解释静态
关键字是如何工作的
静态
方法和变量属于类
,而不是类
(一个对象
)的实例。这意味着可以从任何需要访问的地方访问静态
方法/var(私有
/公共
/受保护
)。由于静态
方法未连接到对象,因此它无法访问实例(非静态)变量,除非您将对象
传递给它,并且它通过该对象
访问它们“它希望是静态的”是什么意思?你从哪里得到NPE?你有堆栈跟踪要共享吗?很抱歉我没有解释。当我说它希望是静态的时,我的意思是我的IDE(Eclipse)突出显示了语法并建议它成为静态的。请原谅我不知情,但是堆栈跟踪是指定行号的错误列表。我将尝试对该类进行完全重写,看看这是否有帮助。如果重写后仍然存在问题,请使用新代码和堆栈跟踪的输出来回答问题。这种方法很有效。它确实消除了我的碰撞矩形是静态的需要。但现在当我跑的时候,我仍然会得到一个NPE,在那里它会产生一个敌人。我认为这与carPosX有关,我将尝试重写这个类,现在我知道如何停止静态冲突。再次感谢。你所说的“在哪里会滋生敌人”是指哪一行?如果是Play.敌人。添加(新敌人(x,-36))代码>然后播放。敌人必须为空。