Java Slick Collision Detection空指针异常

时间:2013-08-09 10:06:29

标签: java static nullpointerexception collision-detection slick

我正在尝试制作一个基本的自上而下的射击游戏,我的敌人产卵会遇到一些麻烦。我已经设法使产卵正常工作但是当试图添加碰撞矩形时,在初始化它时,它想要变为静态,如果我使它静止,那么它希望X和Y变为静态,这不是'一个选项。

我有一个代表可玩角色的玩家类,矩形在该类中工作得很好,所以我假设它与类实例有关。

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);
}
}

请不要过于严厉地判断我的代码,这是我第一次尝试一个完整的游戏加上我已经绝望地添加代码而且它有点乱。

。在这篇文章中,我不得不对代码进行最后一分钟的操作,因此可能有点不正确。

我无法弄清楚矩形问题的解决方案是什么。

由于

1 个答案:

答案 0 :(得分:0)

我会改变你的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);
    }
}

这可以解决您的碰撞盒需要static的问题,但是您没有提供有关NullPointerException的任何详细信息。我还添加了一个检查,以防止您每次创建新敌人时重新加载汽车Image。如果你有很多资源,你应该在游戏开始之前加载它们。


更好地解释static关键字的工作原理;

static方法和变量属于class,而不是classobject)的实例。这意味着可以从需要访问的任何位置(static / private / public)访问protected个方法/变量。由于static方法未连接到对象,因此它无法访问实例(非静态)变量,除非您将Object传递给它,并且它通过Object访问它们。 / p>