Tableaux Java-Continuez à obtenir NullPointerExcpetion


Donc j'essaie de faire un jeu où je fais apparaître 20 ennemis. Les ennemis sont censés être chargé dans un tableau d'ennemis, et puis le jeu est censé sortir dans une boucle for, le seul problème est que je reçois un NullPointerException lorsque j'essaie d'exécuter la boucle for.

La ligne dans le code ci-dessous:

enemy[i] = new Enemy(enemyX, enemyY, enemySize, vx, vy);

Est celui qui jette l'exception. J'énumère également la source complète ci-dessous afin que vous puissiez voir ce que j'essaie de faire, je suis juste coincé et j'ai besoin d'aide à ce sujet, c'est il une autre façon de créer les ennemis et les placer sur l'écran?

Classe principale:

//define package
package auctus;

//imports
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;

//create class
public class Auctus extends BasicGame{
    //Window dimensions and title
    public static final int WIDTH = 800;
    public static final int HEIGHT = 600;
    public static final String TITLE = "Auctus 0.1";

    //Defining the player variables, obviously only one player to create so no need for
    //automation in this area
    public float playerX, playerY, playerSize;
    //Creating the enemy array
    public Enemy enemy[];
    //declaring a global variable for the number of enemies
    public int numberOfEnemies;

    //slick2D API stuff
    public Auctus(String title) {       
            super(TITLE);       
    }


    //initialisation method
    public void init(GameContainer gc) throws SlickException {          
        //setting the number of enemies
        numberOfEnemies = 20; 

        //setting the player variables dynamically each time the game is started
        playerX = (float)Math.random() * WIDTH;
        playerY = (float)Math.random() * HEIGHT;
        playerSize = (float)Math.random() * 50;

        //creating the enemies
        for(int i = 0; i < numberOfEnemies; i++){           
            float enemyX = (float)Math.random() * WIDTH;
            float enemyY = (float)Math.random() * HEIGHT;
            float enemySize = (float)Math.random() * 50;
            float vx = (float)Math.random() * 2;
            float vy = (float)Math.random() * 2;

            //this is the line that's giving me trouble
            enemy[i] = new Enemy(enemyX, enemyY, enemySize, vx, vy);        
        }       
    }

    //from here it doesn't matter, this is error free both syntactically and logically
    public void render(GameContainer gc, Graphics g) throws SlickException    {     
            drawPlayer(g, playerX, playerY, playerSize);
            for(int i = 0; i < numberOfEnemies; i++){       
                enemy[i].drawEnemies(g);        
            }               
        }

    public void update(GameContainer gc, int delta) throws SlickException {     
        updatePlayer(gc, delta, playerX, playerY, playerSize);
        for(int i = 0;i < numberOfEnemies; i++){            
            enemy[i].updateEnemies(delta);      
        }       
    }

    public void drawPlayer(Graphics g, float playerX, float playerY, float playerSize){                 
    }

    public void updatePlayer(GameContainer gc, int delta, float playerX, float playerY, float playerSize){
    }

    public void updateEnemies(GameContainer gc, int delta, float enemyX, float enemyY, float enemySize, float vx, float vy){        
        for(int i = 0; i < numberOfEnemies; i++){           
            enemyX += vx;
            enemyY += vy;
        }       
    }

    public static void main(String[] args){     
        try{    
            AppGameContainer app = new AppGameContainer(new Auctus(TITLE));
            app.start();            
        } catch(SlickException e){          
            e.printStackTrace();            
    }
  }     
} 

Classe ennemie:

package auctus;

//imports
import org.newdawn.slick.Color;
import org.newdawn.slick.Graphics;

//class declaration
public class Enemy {
    //declaring variables
    public float enemyX, enemyY, enemySize, vx, vy;

    public Enemy(float x, float y, float size, float dx, float dy){     
        enemyX = x;
        enemyY = y;
        enemySize = size;    
        vx = dx;
        vy = dy;        
    }

    public float enemyX(){      
        return enemyY;      
    }

    public float enemyY(){
        return enemyY;      
    }

    public float enemySize(){       
        return enemySize;       
    }

    public float vx(){      
        return vx;      
    }

    public float vy(){      
        return vy;      
    }

    public void setX(float x){      
        enemyX = x;     
    }

    public void setY(float y){      
        enemyY = y;     
    }

    public void setSize(float size){    
        enemySize = size;       
    }

    public void setVX(float dx){        
        vx = dx;        
    }

    public void setVY(float dy){        
        vy = dy;        
    }

    public void drawEnemies(Graphics g){        
        g.setColor(Color.red);
        g.fillRect(enemyX, enemyY, enemySize, enemySize);       
    }

    public void updateEnemies(int delta){       
        if(enemyX < 800 || enemyX > 0){         
            enemyX += vx * delta;           
        }

        if(enemyX > 800 || enemyX < 0){         
            vx = -vx;           
        }

        if(enemyY < 600 || enemyY > 0){         
            enemyY += vy * delta;           
        }

        if(enemyY > 600 || enemyY < 0){         
            vy = - vy;          
        }       
    }   
}

La classe ennemie est assez simple. Je ne vois pas pourquoi cela en ferait un NullPointerException, mais peut-être que quelqu'un d'autre peut le repérer.

Qu'est-ce que je fais de mal?

Author: pb2q, 2012-09-25

1 answers

Vous n'instanciez jamais votre tableau enemy.

À un moment donné, avant que vous utilisez enemy, vous aurez besoin de quelque chose comme: enemy = new Enemy[numEnemies];. Vous pouvez le faire dans la déclaration:

// use a constant for the number of enemies:
public static final int NUM_ENEMIES = 20; 
Enemy enemy[] = new Enemy[NUM_ENEMIES];

Autrement, puisque enemy est null - parce que vous n'avez pas instancié - vous obtiendrez un NullPointerException lorsque vous essayez de l'indexer.

 8
Author: pb2q, 2012-09-24 21:39:05